diff options
| author | Thomas Lively <tlively@google.com> | 2019-12-13 17:08:04 -0800 |
|---|---|---|
| committer | Thomas Lively <tlively@google.com> | 2019-12-16 11:48:49 -0800 |
| commit | 3a93756dfbb0dcb7c62fcbe5b0ab8f8591fc9721 (patch) | |
| tree | 25092e97aee0e2bc19cf499520ed7693722f9e56 /llvm/test/CodeGen/WebAssembly | |
| parent | cc802ea67beb66d2f8a935e647c3aedcf7848211 (diff) | |
| download | bcm5719-llvm-3a93756dfbb0dcb7c62fcbe5b0ab8f8591fc9721.tar.gz bcm5719-llvm-3a93756dfbb0dcb7c62fcbe5b0ab8f8591fc9721.zip | |
[WebAssembly] Replace SIMD int min/max builtins with patterns
Summary:
The instructions were originally implemented via builtins and
intrinsics so users would have to explicitly opt-in to using
them. This was useful while were validating whether these instructions
should have been merged into the spec proposal. Now that they have
been, we can use normal codegen patterns, so the intrinsics and
builtins are no longer useful.
Reviewers: aheejin
Subscribers: dschuff, sbc100, jgravelle-google, hiraditya, sunfish, cfe-commits, llvm-commits
Tags: #clang, #llvm
Differential Revision: https://reviews.llvm.org/D71500
Diffstat (limited to 'llvm/test/CodeGen/WebAssembly')
| -rw-r--r-- | llvm/test/CodeGen/WebAssembly/simd-arith.ll | 132 | ||||
| -rw-r--r-- | llvm/test/CodeGen/WebAssembly/simd-intrinsics.ll | 120 |
2 files changed, 132 insertions, 120 deletions
diff --git a/llvm/test/CodeGen/WebAssembly/simd-arith.ll b/llvm/test/CodeGen/WebAssembly/simd-arith.ll index acbb1f9d5c4..f087249534d 100644 --- a/llvm/test/CodeGen/WebAssembly/simd-arith.ll +++ b/llvm/test/CodeGen/WebAssembly/simd-arith.ll @@ -47,6 +47,50 @@ define <16 x i8> @mul_v16i8(<16 x i8> %x, <16 x i8> %y) { ret <16 x i8> %a } +; CHECK-LABEL: min_s_v16i8: +; NO-SIMD128-NOT: i8x16 +; SIMD128-NEXT: .functype min_s_v16i8 (v128, v128) -> (v128){{$}} +; SIMD128-NEXT: i8x16.min_s $push[[R:[0-9]+]]=, $0, $1{{$}} +; SIMD128-NEXT: return $pop[[R]]{{$}} +define <16 x i8> @min_s_v16i8(<16 x i8> %x, <16 x i8> %y) { + %c = icmp slt <16 x i8> %x, %y + %a = select <16 x i1> %c, <16 x i8> %x, <16 x i8> %y + ret <16 x i8> %a +} + +; CHECK-LABEL: min_u_v16i8: +; NO-SIMD128-NOT: i8x16 +; SIMD128-NEXT: .functype min_u_v16i8 (v128, v128) -> (v128){{$}} +; SIMD128-NEXT: i8x16.min_u $push[[R:[0-9]+]]=, $0, $1{{$}} +; SIMD128-NEXT: return $pop[[R]]{{$}} +define <16 x i8> @min_u_v16i8(<16 x i8> %x, <16 x i8> %y) { + %c = icmp ult <16 x i8> %x, %y + %a = select <16 x i1> %c, <16 x i8> %x, <16 x i8> %y + ret <16 x i8> %a +} + +; CHECK-LABEL: max_s_v16i8: +; NO-SIMD128-NOT: i8x16 +; SIMD128-NEXT: .functype max_s_v16i8 (v128, v128) -> (v128){{$}} +; SIMD128-NEXT: i8x16.max_s $push[[R:[0-9]+]]=, $0, $1{{$}} +; SIMD128-NEXT: return $pop[[R]]{{$}} +define <16 x i8> @max_s_v16i8(<16 x i8> %x, <16 x i8> %y) { + %c = icmp sgt <16 x i8> %x, %y + %a = select <16 x i1> %c, <16 x i8> %x, <16 x i8> %y + ret <16 x i8> %a +} + +; CHECK-LABEL: max_u_v16i8: +; NO-SIMD128-NOT: i8x16 +; SIMD128-NEXT: .functype max_u_v16i8 (v128, v128) -> (v128){{$}} +; SIMD128-NEXT: i8x16.max_u $push[[R:[0-9]+]]=, $0, $1{{$}} +; SIMD128-NEXT: return $pop[[R]]{{$}} +define <16 x i8> @max_u_v16i8(<16 x i8> %x, <16 x i8> %y) { + %c = icmp ugt <16 x i8> %x, %y + %a = select <16 x i1> %c, <16 x i8> %x, <16 x i8> %y + ret <16 x i8> %a +} + ; CHECK-LABEL: neg_v16i8: ; NO-SIMD128-NOT: i8x16 ; SIMD128-NEXT: .functype neg_v16i8 (v128) -> (v128){{$}} @@ -293,6 +337,50 @@ define <8 x i16> @mul_v8i16(<8 x i16> %x, <8 x i16> %y) { ret <8 x i16> %a } +; CHECK-LABEL: min_s_v8i16: +; NO-SIMD128-NOT: i16x8 +; SIMD128-NEXT: .functype min_s_v8i16 (v128, v128) -> (v128){{$}} +; SIMD128-NEXT: i16x8.min_s $push[[R:[0-9]+]]=, $0, $1{{$}} +; SIMD128-NEXT: return $pop[[R]]{{$}} +define <8 x i16> @min_s_v8i16(<8 x i16> %x, <8 x i16> %y) { + %c = icmp slt <8 x i16> %x, %y + %a = select <8 x i1> %c, <8 x i16> %x, <8 x i16> %y + ret <8 x i16> %a +} + +; CHECK-LABEL: min_u_v8i16: +; NO-SIMD128-NOT: i16x8 +; SIMD128-NEXT: .functype min_u_v8i16 (v128, v128) -> (v128){{$}} +; SIMD128-NEXT: i16x8.min_u $push[[R:[0-9]+]]=, $0, $1{{$}} +; SIMD128-NEXT: return $pop[[R]]{{$}} +define <8 x i16> @min_u_v8i16(<8 x i16> %x, <8 x i16> %y) { + %c = icmp ult <8 x i16> %x, %y + %a = select <8 x i1> %c, <8 x i16> %x, <8 x i16> %y + ret <8 x i16> %a +} + +; CHECK-LABEL: max_s_v8i16: +; NO-SIMD128-NOT: i16x8 +; SIMD128-NEXT: .functype max_s_v8i16 (v128, v128) -> (v128){{$}} +; SIMD128-NEXT: i16x8.max_s $push[[R:[0-9]+]]=, $0, $1{{$}} +; SIMD128-NEXT: return $pop[[R]]{{$}} +define <8 x i16> @max_s_v8i16(<8 x i16> %x, <8 x i16> %y) { + %c = icmp sgt <8 x i16> %x, %y + %a = select <8 x i1> %c, <8 x i16> %x, <8 x i16> %y + ret <8 x i16> %a +} + +; CHECK-LABEL: max_u_v8i16: +; NO-SIMD128-NOT: i16x8 +; SIMD128-NEXT: .functype max_u_v8i16 (v128, v128) -> (v128){{$}} +; SIMD128-NEXT: i16x8.max_u $push[[R:[0-9]+]]=, $0, $1{{$}} +; SIMD128-NEXT: return $pop[[R]]{{$}} +define <8 x i16> @max_u_v8i16(<8 x i16> %x, <8 x i16> %y) { + %c = icmp ugt <8 x i16> %x, %y + %a = select <8 x i1> %c, <8 x i16> %x, <8 x i16> %y + ret <8 x i16> %a +} + ; CHECK-LABEL: neg_v8i16: ; NO-SIMD128-NOT: i16x8 ; SIMD128-NEXT: .functype neg_v8i16 (v128) -> (v128){{$}} @@ -531,6 +619,50 @@ define <4 x i32> @mul_v4i32(<4 x i32> %x, <4 x i32> %y) { ret <4 x i32> %a } +; CHECK-LABEL: min_s_v4i32: +; NO-SIMD128-NOT: i32x4 +; SIMD128-NEXT: .functype min_s_v4i32 (v128, v128) -> (v128){{$}} +; SIMD128-NEXT: i32x4.min_s $push[[R:[0-9]+]]=, $0, $1{{$}} +; SIMD128-NEXT: return $pop[[R]]{{$}} +define <4 x i32> @min_s_v4i32(<4 x i32> %x, <4 x i32> %y) { + %c = icmp slt <4 x i32> %x, %y + %a = select <4 x i1> %c, <4 x i32> %x, <4 x i32> %y + ret <4 x i32> %a +} + +; CHECK-LABEL: min_u_v4i32: +; NO-SIMD128-NOT: i32x4 +; SIMD128-NEXT: .functype min_u_v4i32 (v128, v128) -> (v128){{$}} +; SIMD128-NEXT: i32x4.min_u $push[[R:[0-9]+]]=, $0, $1{{$}} +; SIMD128-NEXT: return $pop[[R]]{{$}} +define <4 x i32> @min_u_v4i32(<4 x i32> %x, <4 x i32> %y) { + %c = icmp ult <4 x i32> %x, %y + %a = select <4 x i1> %c, <4 x i32> %x, <4 x i32> %y + ret <4 x i32> %a +} + +; CHECK-LABEL: max_s_v4i32: +; NO-SIMD128-NOT: i32x4 +; SIMD128-NEXT: .functype max_s_v4i32 (v128, v128) -> (v128){{$}} +; SIMD128-NEXT: i32x4.max_s $push[[R:[0-9]+]]=, $0, $1{{$}} +; SIMD128-NEXT: return $pop[[R]]{{$}} +define <4 x i32> @max_s_v4i32(<4 x i32> %x, <4 x i32> %y) { + %c = icmp sgt <4 x i32> %x, %y + %a = select <4 x i1> %c, <4 x i32> %x, <4 x i32> %y + ret <4 x i32> %a +} + +; CHECK-LABEL: max_u_v4i32: +; NO-SIMD128-NOT: i32x4 +; SIMD128-NEXT: .functype max_u_v4i32 (v128, v128) -> (v128){{$}} +; SIMD128-NEXT: i32x4.max_u $push[[R:[0-9]+]]=, $0, $1{{$}} +; SIMD128-NEXT: return $pop[[R]]{{$}} +define <4 x i32> @max_u_v4i32(<4 x i32> %x, <4 x i32> %y) { + %c = icmp ugt <4 x i32> %x, %y + %a = select <4 x i1> %c, <4 x i32> %x, <4 x i32> %y + ret <4 x i32> %a +} + ; CHECK-LABEL: neg_v4i32: ; NO-SIMD128-NOT: i32x4 ; SIMD128-NEXT: .functype neg_v4i32 (v128) -> (v128){{$}} diff --git a/llvm/test/CodeGen/WebAssembly/simd-intrinsics.ll b/llvm/test/CodeGen/WebAssembly/simd-intrinsics.ll index 757152407a8..8019fc5c686 100644 --- a/llvm/test/CodeGen/WebAssembly/simd-intrinsics.ll +++ b/llvm/test/CodeGen/WebAssembly/simd-intrinsics.ll @@ -65,46 +65,6 @@ define <16 x i8> @sub_sat_u_v16i8(<16 x i8> %x, <16 x i8> %y) { ret <16 x i8> %a } -; CHECK-LABEL: min_s_v16i8: -; SIMD128-NEXT: .functype min_s_v16i8 (v128, v128) -> (v128){{$}} -; SIMD128-NEXT: i8x16.min_s $push[[R:[0-9]+]]=, $0, $1{{$}} -; SIMD128-NEXT: return $pop[[R]]{{$}} -declare <16 x i8> @llvm.wasm.min.signed.v16i8(<16 x i8>, <16 x i8>) -define <16 x i8> @min_s_v16i8(<16 x i8> %x, <16 x i8> %y) { - %a = call <16 x i8> @llvm.wasm.min.signed.v16i8(<16 x i8> %x, <16 x i8> %y) - ret <16 x i8> %a -} - -; CHECK-LABEL: min_u_v16i8: -; SIMD128-NEXT: .functype min_u_v16i8 (v128, v128) -> (v128){{$}} -; SIMD128-NEXT: i8x16.min_u $push[[R:[0-9]+]]=, $0, $1{{$}} -; SIMD128-NEXT: return $pop[[R]]{{$}} -declare <16 x i8> @llvm.wasm.min.unsigned.v16i8(<16 x i8>, <16 x i8>) -define <16 x i8> @min_u_v16i8(<16 x i8> %x, <16 x i8> %y) { - %a = call <16 x i8> @llvm.wasm.min.unsigned.v16i8(<16 x i8> %x, <16 x i8> %y) - ret <16 x i8> %a -} - -; CHECK-LABEL: max_s_v16i8: -; SIMD128-NEXT: .functype max_s_v16i8 (v128, v128) -> (v128){{$}} -; SIMD128-NEXT: i8x16.max_s $push[[R:[0-9]+]]=, $0, $1{{$}} -; SIMD128-NEXT: return $pop[[R]]{{$}} -declare <16 x i8> @llvm.wasm.max.signed.v16i8(<16 x i8>, <16 x i8>) -define <16 x i8> @max_s_v16i8(<16 x i8> %x, <16 x i8> %y) { - %a = call <16 x i8> @llvm.wasm.max.signed.v16i8(<16 x i8> %x, <16 x i8> %y) - ret <16 x i8> %a -} - -; CHECK-LABEL: max_u_v16i8: -; SIMD128-NEXT: .functype max_u_v16i8 (v128, v128) -> (v128){{$}} -; SIMD128-NEXT: i8x16.max_u $push[[R:[0-9]+]]=, $0, $1{{$}} -; SIMD128-NEXT: return $pop[[R]]{{$}} -declare <16 x i8> @llvm.wasm.max.unsigned.v16i8(<16 x i8>, <16 x i8>) -define <16 x i8> @max_u_v16i8(<16 x i8> %x, <16 x i8> %y) { - %a = call <16 x i8> @llvm.wasm.max.unsigned.v16i8(<16 x i8> %x, <16 x i8> %y) - ret <16 x i8> %a -} - ; CHECK-LABEL: any_v16i8: ; SIMD128-NEXT: .functype any_v16i8 (v128) -> (i32){{$}} ; SIMD128-NEXT: i8x16.any_true $push[[R:[0-9]+]]=, $0{{$}} @@ -208,46 +168,6 @@ define <8 x i16> @sub_sat_u_v8i16(<8 x i16> %x, <8 x i16> %y) { ret <8 x i16> %a } -; CHECK-LABEL: min_s_v8i16: -; SIMD128-NEXT: .functype min_s_v8i16 (v128, v128) -> (v128){{$}} -; SIMD128-NEXT: i16x8.min_s $push[[R:[0-9]+]]=, $0, $1{{$}} -; SIMD128-NEXT: return $pop[[R]]{{$}} -declare <8 x i16> @llvm.wasm.min.signed.v8i16(<8 x i16>, <8 x i16>) -define <8 x i16> @min_s_v8i16(<8 x i16> %x, <8 x i16> %y) { - %a = call <8 x i16> @llvm.wasm.min.signed.v8i16(<8 x i16> %x, <8 x i16> %y) - ret <8 x i16> %a -} - -; CHECK-LABEL: min_u_v8i16: -; SIMD128-NEXT: .functype min_u_v8i16 (v128, v128) -> (v128){{$}} -; SIMD128-NEXT: i16x8.min_u $push[[R:[0-9]+]]=, $0, $1{{$}} -; SIMD128-NEXT: return $pop[[R]]{{$}} -declare <8 x i16> @llvm.wasm.min.unsigned.v8i16(<8 x i16>, <8 x i16>) -define <8 x i16> @min_u_v8i16(<8 x i16> %x, <8 x i16> %y) { - %a = call <8 x i16> @llvm.wasm.min.unsigned.v8i16(<8 x i16> %x, <8 x i16> %y) - ret <8 x i16> %a -} - -; CHECK-LABEL: max_s_v8i16: -; SIMD128-NEXT: .functype max_s_v8i16 (v128, v128) -> (v128){{$}} -; SIMD128-NEXT: i16x8.max_s $push[[R:[0-9]+]]=, $0, $1{{$}} -; SIMD128-NEXT: return $pop[[R]]{{$}} -declare <8 x i16> @llvm.wasm.max.signed.v8i16(<8 x i16>, <8 x i16>) -define <8 x i16> @max_s_v8i16(<8 x i16> %x, <8 x i16> %y) { - %a = call <8 x i16> @llvm.wasm.max.signed.v8i16(<8 x i16> %x, <8 x i16> %y) - ret <8 x i16> %a -} - -; CHECK-LABEL: max_u_v8i16: -; SIMD128-NEXT: .functype max_u_v8i16 (v128, v128) -> (v128){{$}} -; SIMD128-NEXT: i16x8.max_u $push[[R:[0-9]+]]=, $0, $1{{$}} -; SIMD128-NEXT: return $pop[[R]]{{$}} -declare <8 x i16> @llvm.wasm.max.unsigned.v8i16(<8 x i16>, <8 x i16>) -define <8 x i16> @max_u_v8i16(<8 x i16> %x, <8 x i16> %y) { - %a = call <8 x i16> @llvm.wasm.max.unsigned.v8i16(<8 x i16> %x, <8 x i16> %y) - ret <8 x i16> %a -} - ; CHECK-LABEL: any_v8i16: ; SIMD128-NEXT: .functype any_v8i16 (v128) -> (i32){{$}} ; SIMD128-NEXT: i16x8.any_true $push[[R:[0-9]+]]=, $0{{$}} @@ -347,46 +267,6 @@ define <8 x i16> @widen_high_unsigned_v8i16(<16 x i8> %v) { ; ============================================================================== ; 4 x i32 ; ============================================================================== -; CHECK-LABEL: min_s_v4i32: -; SIMD128-NEXT: .functype min_s_v4i32 (v128, v128) -> (v128){{$}} -; SIMD128-NEXT: i32x4.min_s $push[[R:[0-9]+]]=, $0, $1{{$}} -; SIMD128-NEXT: return $pop[[R]]{{$}} -declare <4 x i32> @llvm.wasm.min.signed.v4i32(<4 x i32>, <4 x i32>) -define <4 x i32> @min_s_v4i32(<4 x i32> %x, <4 x i32> %y) { - %a = call <4 x i32> @llvm.wasm.min.signed.v4i32(<4 x i32> %x, <4 x i32> %y) - ret <4 x i32> %a -} - -; CHECK-LABEL: min_u_v4i32: -; SIMD128-NEXT: .functype min_u_v4i32 (v128, v128) -> (v128){{$}} -; SIMD128-NEXT: i32x4.min_u $push[[R:[0-9]+]]=, $0, $1{{$}} -; SIMD128-NEXT: return $pop[[R]]{{$}} -declare <4 x i32> @llvm.wasm.min.unsigned.v4i32(<4 x i32>, <4 x i32>) -define <4 x i32> @min_u_v4i32(<4 x i32> %x, <4 x i32> %y) { - %a = call <4 x i32> @llvm.wasm.min.unsigned.v4i32(<4 x i32> %x, <4 x i32> %y) - ret <4 x i32> %a -} - -; CHECK-LABEL: max_s_v4i32: -; SIMD128-NEXT: .functype max_s_v4i32 (v128, v128) -> (v128){{$}} -; SIMD128-NEXT: i32x4.max_s $push[[R:[0-9]+]]=, $0, $1{{$}} -; SIMD128-NEXT: return $pop[[R]]{{$}} -declare <4 x i32> @llvm.wasm.max.signed.v4i32(<4 x i32>, <4 x i32>) -define <4 x i32> @max_s_v4i32(<4 x i32> %x, <4 x i32> %y) { - %a = call <4 x i32> @llvm.wasm.max.signed.v4i32(<4 x i32> %x, <4 x i32> %y) - ret <4 x i32> %a -} - -; CHECK-LABEL: max_u_v4i32: -; SIMD128-NEXT: .functype max_u_v4i32 (v128, v128) -> (v128){{$}} -; SIMD128-NEXT: i32x4.max_u $push[[R:[0-9]+]]=, $0, $1{{$}} -; SIMD128-NEXT: return $pop[[R]]{{$}} -declare <4 x i32> @llvm.wasm.max.unsigned.v4i32(<4 x i32>, <4 x i32>) -define <4 x i32> @max_u_v4i32(<4 x i32> %x, <4 x i32> %y) { - %a = call <4 x i32> @llvm.wasm.max.unsigned.v4i32(<4 x i32> %x, <4 x i32> %y) - ret <4 x i32> %a -} - ; CHECK-LABEL: dot: ; SIMD128-NEXT: .functype dot (v128, v128) -> (v128){{$}} ; SIMD128-NEXT: i32x4.dot_i16x8_s $push[[R:[0-9]+]]=, $0, $1{{$}} |

