diff options
| author | Thomas Lively <tlively@google.com> | 2018-10-11 00:01:25 +0000 |
|---|---|---|
| committer | Thomas Lively <tlively@google.com> | 2018-10-11 00:01:25 +0000 |
| commit | 2ebacb107bfebc7b60b238edea538570ad44cef9 (patch) | |
| tree | e2dcbd81ba4e02e85be7096afe91d40b1ea5dce3 /llvm/test/CodeGen/WebAssembly/conv.ll | |
| parent | 7b2b0185ba6c4b21906310183e92e8b32f43a0d7 (diff) | |
| download | bcm5719-llvm-2ebacb107bfebc7b60b238edea538570ad44cef9.tar.gz bcm5719-llvm-2ebacb107bfebc7b60b238edea538570ad44cef9.zip | |
[WebAssembly] Saturating float to int intrinsics
Summary:
Although the saturating float to int instructions are already
emitted from normal IR, the fpto{s,u}i instructions produce poison
values if the argument cannot fit in the result type. These intrinsics
are therefore necessary to get guaranteed defined saturating behavior.
Reviewers: aheejin, dschuff
Subscribers: sbc100, jgravelle-google, sunfish, llvm-commits
Differential Revision: https://reviews.llvm.org/D53004
llvm-svn: 344204
Diffstat (limited to 'llvm/test/CodeGen/WebAssembly/conv.ll')
| -rw-r--r-- | llvm/test/CodeGen/WebAssembly/conv.ll | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/WebAssembly/conv.ll b/llvm/test/CodeGen/WebAssembly/conv.ll index bd3ae29e28e..ea1ef9737c0 100644 --- a/llvm/test/CodeGen/WebAssembly/conv.ll +++ b/llvm/test/CodeGen/WebAssembly/conv.ll @@ -45,6 +45,17 @@ define i32 @i32_trunc_s_f32(float %x) { ret i32 %a } +; CHECK-LABEL: i32_trunc_sat_s_f32: +; CHECK-NEXT: .param f32{{$}} +; CHECK-NEXT: .result i32{{$}} +; CHECK-NEXT: i32.trunc_s:sat/f32 $push[[NUM:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} +declare i32 @llvm.wasm.trunc.saturate.signed.i32.f32(float) +define i32 @i32_trunc_sat_s_f32(float %x) { + %a = call i32 @llvm.wasm.trunc.saturate.signed.i32.f32(float %x) + ret i32 %a +} + ; CHECK-LABEL: i32_trunc_u_f32: ; CHECK-NEXT: .param f32{{$}} ; CHECK-NEXT: .result i32{{$}} @@ -55,6 +66,17 @@ define i32 @i32_trunc_u_f32(float %x) { ret i32 %a } +; CHECK-LABEL: i32_trunc_sat_u_f32: +; CHECK-NEXT: .param f32{{$}} +; CHECK-NEXT: .result i32{{$}} +; CHECK-NEXT: i32.trunc_u:sat/f32 $push[[NUM:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} +declare i32 @llvm.wasm.trunc.saturate.unsigned.i32.f32(float) +define i32 @i32_trunc_sat_u_f32(float %x) { + %a = call i32 @llvm.wasm.trunc.saturate.unsigned.i32.f32(float %x) + ret i32 %a +} + ; CHECK-LABEL: i32_trunc_s_f64: ; CHECK-NEXT: .param f64{{$}} ; CHECK-NEXT: .result i32{{$}} @@ -65,6 +87,17 @@ define i32 @i32_trunc_s_f64(double %x) { ret i32 %a } +; CHECK-LABEL: i32_trunc_sat_s_f64: +; CHECK-NEXT: .param f64{{$}} +; CHECK-NEXT: .result i32{{$}} +; CHECK-NEXT: i32.trunc_s:sat/f64 $push[[NUM:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} +declare i32 @llvm.wasm.trunc.saturate.signed.i32.f64(double) +define i32 @i32_trunc_sat_s_f64(double %x) { + %a = call i32 @llvm.wasm.trunc.saturate.signed.i32.f64(double %x) + ret i32 %a +} + ; CHECK-LABEL: i32_trunc_u_f64: ; CHECK-NEXT: .param f64{{$}} ; CHECK-NEXT: .result i32{{$}} @@ -75,6 +108,17 @@ define i32 @i32_trunc_u_f64(double %x) { ret i32 %a } +; CHECK-LABEL: i32_trunc_sat_u_f64: +; CHECK-NEXT: .param f64{{$}} +; CHECK-NEXT: .result i32{{$}} +; CHECK-NEXT: i32.trunc_u:sat/f64 $push[[NUM:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} +declare i32 @llvm.wasm.trunc.saturate.unsigned.i32.f64(double) +define i32 @i32_trunc_sat_u_f64(double %x) { + %a = call i32 @llvm.wasm.trunc.saturate.unsigned.i32.f64(double %x) + ret i32 %a +} + ; CHECK-LABEL: i64_trunc_s_f32: ; CHECK-NEXT: .param f32{{$}} ; CHECK-NEXT: .result i64{{$}} @@ -85,6 +129,17 @@ define i64 @i64_trunc_s_f32(float %x) { ret i64 %a } +; CHECK-LABEL: i64_trunc_sat_s_f32: +; CHECK-NEXT: .param f32{{$}} +; CHECK-NEXT: .result i64{{$}} +; CHECK-NEXT: i64.trunc_s:sat/f32 $push[[NUM:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} +declare i64 @llvm.wasm.trunc.saturate.signed.i64.f32(float) +define i64 @i64_trunc_sat_s_f32(float %x) { + %a = call i64 @llvm.wasm.trunc.saturate.signed.i64.f32(float %x) + ret i64 %a +} + ; CHECK-LABEL: i64_trunc_u_f32: ; CHECK-NEXT: .param f32{{$}} ; CHECK-NEXT: .result i64{{$}} @@ -95,6 +150,17 @@ define i64 @i64_trunc_u_f32(float %x) { ret i64 %a } +; CHECK-LABEL: i64_trunc_sat_u_f32: +; CHECK-NEXT: .param f32{{$}} +; CHECK-NEXT: .result i64{{$}} +; CHECK-NEXT: i64.trunc_u:sat/f32 $push[[NUM:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} +declare i64 @llvm.wasm.trunc.saturate.unsigned.i64.f32(float) +define i64 @i64_trunc_sat_u_f32(float %x) { + %a = call i64 @llvm.wasm.trunc.saturate.unsigned.i64.f32(float %x) + ret i64 %a +} + ; CHECK-LABEL: i64_trunc_s_f64: ; CHECK-NEXT: .param f64{{$}} ; CHECK-NEXT: .result i64{{$}} @@ -105,6 +171,17 @@ define i64 @i64_trunc_s_f64(double %x) { ret i64 %a } +; CHECK-LABEL: i64_trunc_sat_s_f64: +; CHECK-NEXT: .param f64{{$}} +; CHECK-NEXT: .result i64{{$}} +; CHECK-NEXT: i64.trunc_s:sat/f64 $push[[NUM:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} +declare i64 @llvm.wasm.trunc.saturate.signed.i64.f64(double) +define i64 @i64_trunc_sat_s_f64(double %x) { + %a = call i64 @llvm.wasm.trunc.saturate.signed.i64.f64(double %x) + ret i64 %a +} + ; CHECK-LABEL: i64_trunc_u_f64: ; CHECK-NEXT: .param f64{{$}} ; CHECK-NEXT: .result i64{{$}} @@ -115,6 +192,17 @@ define i64 @i64_trunc_u_f64(double %x) { ret i64 %a } +; CHECK-LABEL: i64_trunc_sat_u_f64: +; CHECK-NEXT: .param f64{{$}} +; CHECK-NEXT: .result i64{{$}} +; CHECK-NEXT: i64.trunc_u:sat/f64 $push[[NUM:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} +declare i64 @llvm.wasm.trunc.saturate.unsigned.i64.f64(double) +define i64 @i64_trunc_sat_u_f64(double %x) { + %a = call i64 @llvm.wasm.trunc.saturate.unsigned.i64.f64(double %x) + ret i64 %a +} + ; CHECK-LABEL: f32_convert_s_i32: ; CHECK-NEXT: .param i32{{$}} ; CHECK-NEXT: .result f32{{$}} |

