Files
clang-p2996/llvm/test/CodeGen/WebAssembly/simd-select.ll
Thomas Lively 45783d0e8a [WebAssembly] Implement i64x2 comparisons
Removes the prototype builtin and intrinsic for i64x2.eq and implements that
instruction as well as the other i64x2 comparison instructions in the final SIMD
spec. Unsigned comparisons were not included in the final spec, so they still
need to be scalarized via a custom lowering.

Differential Revision: https://reviews.llvm.org/D99623
2021-03-31 10:46:17 -07:00

556 lines
18 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -verify-machineinstrs -mattr=+simd128 | FileCheck %s
; Test that vector selects of various varieties lower correctly.
target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
target triple = "wasm32-unknown-unknown"
; ==============================================================================
; 16 x i8
; ==============================================================================
define <16 x i8> @vselect_v16i8(<16 x i1> %c, <16 x i8> %x, <16 x i8> %y) {
; CHECK-LABEL: vselect_v16i8:
; CHECK: .functype vselect_v16i8 (v128, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 0
; CHECK-NEXT: i32.const 7
; CHECK-NEXT: i8x16.shl
; CHECK-NEXT: i32.const 7
; CHECK-NEXT: i8x16.shr_s
; CHECK-NEXT: v128.bitselect
; CHECK-NEXT: # fallthrough-return
%res = select <16 x i1> %c, <16 x i8> %x, <16 x i8> %y
ret <16 x i8> %res
}
define <16 x i8> @vselect_cmp_v16i8(<16 x i8> %a, <16 x i8> %b,
; CHECK-LABEL: vselect_cmp_v16i8:
; CHECK: .functype vselect_cmp_v16i8 (v128, v128, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 3
; CHECK-NEXT: local.get 0
; CHECK-NEXT: local.get 1
; CHECK-NEXT: i8x16.lt_s
; CHECK-NEXT: v128.bitselect
; CHECK-NEXT: # fallthrough-return
<16 x i8> %x, <16 x i8> %y) {
%c = icmp slt <16 x i8> %a, %b
%res = select <16 x i1> %c, <16 x i8> %x, <16 x i8> %y
ret <16 x i8> %res
}
define <16 x i8> @select_v16i8(i1 zeroext %c, <16 x i8> %x, <16 x i8> %y) {
; CHECK-LABEL: select_v16i8:
; CHECK: .functype select_v16i8 (i32, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 0
; CHECK-NEXT: v128.select
; CHECK-NEXT: # fallthrough-return
%res = select i1 %c, <16 x i8> %x, <16 x i8> %y
ret <16 x i8> %res
}
define <16 x i8> @select_cmp_v16i8(i32 %i, <16 x i8> %x, <16 x i8> %y) {
; CHECK-LABEL: select_cmp_v16i8:
; CHECK: .functype select_cmp_v16i8 (i32, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 0
; CHECK-NEXT: i32.const 0
; CHECK-NEXT: i32.lt_s
; CHECK-NEXT: v128.select
; CHECK-NEXT: # fallthrough-return
%c = icmp slt i32 %i, 0
%res = select i1 %c, <16 x i8> %x, <16 x i8> %y
ret <16 x i8> %res
}
define <16 x i8> @select_ne_v16i8(i32 %i, <16 x i8> %x, <16 x i8> %y) {
; CHECK-LABEL: select_ne_v16i8:
; CHECK: .functype select_ne_v16i8 (i32, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 0
; CHECK-NEXT: v128.select
; CHECK-NEXT: # fallthrough-return
%c = icmp ne i32 %i, 0
%res = select i1 %c, <16 x i8> %x, <16 x i8> %y
ret <16 x i8> %res
}
define <16 x i8> @select_eq_v16i8(i32 %i, <16 x i8> %x, <16 x i8> %y) {
; CHECK-LABEL: select_eq_v16i8:
; CHECK: .functype select_eq_v16i8 (i32, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 0
; CHECK-NEXT: v128.select
; CHECK-NEXT: # fallthrough-return
%c = icmp eq i32 %i, 0
%res = select i1 %c, <16 x i8> %x, <16 x i8> %y
ret <16 x i8> %res
}
define <8 x i16> @vselect_v8i16(<8 x i1> %c, <8 x i16> %x, <8 x i16> %y) {
; CHECK-LABEL: vselect_v8i16:
; CHECK: .functype vselect_v8i16 (v128, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 0
; CHECK-NEXT: i32.const 15
; CHECK-NEXT: i16x8.shl
; CHECK-NEXT: i32.const 15
; CHECK-NEXT: i16x8.shr_s
; CHECK-NEXT: v128.bitselect
; CHECK-NEXT: # fallthrough-return
%res = select <8 x i1> %c, <8 x i16> %x, <8 x i16> %y
ret <8 x i16> %res
}
define <8 x i16> @vselect_cmp_v8i16(<8 x i16> %a, <8 x i16> %b,
; CHECK-LABEL: vselect_cmp_v8i16:
; CHECK: .functype vselect_cmp_v8i16 (v128, v128, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 3
; CHECK-NEXT: local.get 0
; CHECK-NEXT: local.get 1
; CHECK-NEXT: i16x8.lt_s
; CHECK-NEXT: v128.bitselect
; CHECK-NEXT: # fallthrough-return
<8 x i16> %x, <8 x i16> %y) {
%c = icmp slt <8 x i16> %a, %b
%res = select <8 x i1> %c, <8 x i16> %x, <8 x i16> %y
ret <8 x i16> %res
}
define <8 x i16> @select_v8i16(i1 zeroext %c, <8 x i16> %x, <8 x i16> %y) {
; CHECK-LABEL: select_v8i16:
; CHECK: .functype select_v8i16 (i32, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 0
; CHECK-NEXT: v128.select
; CHECK-NEXT: # fallthrough-return
%res = select i1 %c, <8 x i16> %x, <8 x i16> %y
ret <8 x i16> %res
}
define <8 x i16> @select_cmp_v8i16(i32 %i, <8 x i16> %x, <8 x i16> %y) {
; CHECK-LABEL: select_cmp_v8i16:
; CHECK: .functype select_cmp_v8i16 (i32, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 0
; CHECK-NEXT: i32.const 0
; CHECK-NEXT: i32.lt_s
; CHECK-NEXT: v128.select
; CHECK-NEXT: # fallthrough-return
%c = icmp slt i32 %i, 0
%res = select i1 %c, <8 x i16> %x, <8 x i16> %y
ret <8 x i16> %res
}
define <8 x i16> @select_ne_v8i16(i32 %i, <8 x i16> %x, <8 x i16> %y) {
; CHECK-LABEL: select_ne_v8i16:
; CHECK: .functype select_ne_v8i16 (i32, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 0
; CHECK-NEXT: v128.select
; CHECK-NEXT: # fallthrough-return
%c = icmp ne i32 %i, 0
%res = select i1 %c, <8 x i16> %x, <8 x i16> %y
ret <8 x i16> %res
}
define <8 x i16> @select_eq_v8i16(i32 %i, <8 x i16> %x, <8 x i16> %y) {
; CHECK-LABEL: select_eq_v8i16:
; CHECK: .functype select_eq_v8i16 (i32, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 0
; CHECK-NEXT: v128.select
; CHECK-NEXT: # fallthrough-return
%c = icmp eq i32 %i, 0
%res = select i1 %c, <8 x i16> %x, <8 x i16> %y
ret <8 x i16> %res
}
define <4 x i32> @vselect_v4i32(<4 x i1> %c, <4 x i32> %x, <4 x i32> %y) {
; CHECK-LABEL: vselect_v4i32:
; CHECK: .functype vselect_v4i32 (v128, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 0
; CHECK-NEXT: i32.const 31
; CHECK-NEXT: i32x4.shl
; CHECK-NEXT: i32.const 31
; CHECK-NEXT: i32x4.shr_s
; CHECK-NEXT: v128.bitselect
; CHECK-NEXT: # fallthrough-return
%res = select <4 x i1> %c, <4 x i32> %x, <4 x i32> %y
ret <4 x i32> %res
}
define <4 x i32> @vselect_cmp_v4i32(<4 x i32> %a, <4 x i32> %b,
; CHECK-LABEL: vselect_cmp_v4i32:
; CHECK: .functype vselect_cmp_v4i32 (v128, v128, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 3
; CHECK-NEXT: local.get 0
; CHECK-NEXT: local.get 1
; CHECK-NEXT: i32x4.lt_s
; CHECK-NEXT: v128.bitselect
; CHECK-NEXT: # fallthrough-return
<4 x i32> %x, <4 x i32> %y) {
%c = icmp slt <4 x i32> %a, %b
%res = select <4 x i1> %c, <4 x i32> %x, <4 x i32> %y
ret <4 x i32> %res
}
define <4 x i32> @select_v4i32(i1 zeroext %c, <4 x i32> %x, <4 x i32> %y) {
; CHECK-LABEL: select_v4i32:
; CHECK: .functype select_v4i32 (i32, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 0
; CHECK-NEXT: v128.select
; CHECK-NEXT: # fallthrough-return
%res = select i1 %c, <4 x i32> %x, <4 x i32> %y
ret <4 x i32> %res
}
define <4 x i32> @select_cmp_v4i32(i32 %i, <4 x i32> %x, <4 x i32> %y) {
; CHECK-LABEL: select_cmp_v4i32:
; CHECK: .functype select_cmp_v4i32 (i32, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 0
; CHECK-NEXT: i32.const 0
; CHECK-NEXT: i32.lt_s
; CHECK-NEXT: v128.select
; CHECK-NEXT: # fallthrough-return
%c = icmp slt i32 %i, 0
%res = select i1 %c, <4 x i32> %x, <4 x i32> %y
ret <4 x i32> %res
}
define <4 x i32> @select_ne_v4i32(i32 %i, <4 x i32> %x, <4 x i32> %y) {
; CHECK-LABEL: select_ne_v4i32:
; CHECK: .functype select_ne_v4i32 (i32, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 0
; CHECK-NEXT: v128.select
; CHECK-NEXT: # fallthrough-return
%c = icmp ne i32 %i, 0
%res = select i1 %c, <4 x i32> %x, <4 x i32> %y
ret <4 x i32> %res
}
define <4 x i32> @select_eq_v4i32(i32 %i, <4 x i32> %x, <4 x i32> %y) {
; CHECK-LABEL: select_eq_v4i32:
; CHECK: .functype select_eq_v4i32 (i32, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 0
; CHECK-NEXT: v128.select
; CHECK-NEXT: # fallthrough-return
%c = icmp eq i32 %i, 0
%res = select i1 %c, <4 x i32> %x, <4 x i32> %y
ret <4 x i32> %res
}
define <2 x i64> @vselect_v2i64(<2 x i1> %c, <2 x i64> %x, <2 x i64> %y) {
; CHECK-LABEL: vselect_v2i64:
; CHECK: .functype vselect_v2i64 (v128, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 0
; CHECK-NEXT: i32.const 63
; CHECK-NEXT: i64x2.shl
; CHECK-NEXT: i32.const 63
; CHECK-NEXT: i64x2.shr_s
; CHECK-NEXT: v128.bitselect
; CHECK-NEXT: # fallthrough-return
%res = select <2 x i1> %c, <2 x i64> %x, <2 x i64> %y
ret <2 x i64> %res
}
define <2 x i64> @vselect_cmp_v2i64(<2 x i64> %a, <2 x i64> %b, <2 x i64> %x, <2 x i64> %y) {
; CHECK-LABEL: vselect_cmp_v2i64:
; CHECK: .functype vselect_cmp_v2i64 (v128, v128, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 3
; CHECK-NEXT: local.get 0
; CHECK-NEXT: local.get 1
; CHECK-NEXT: i64x2.lt_s
; CHECK-NEXT: v128.bitselect
; CHECK-NEXT: # fallthrough-return
%c = icmp slt <2 x i64> %a, %b
%res = select <2 x i1> %c, <2 x i64> %x, <2 x i64> %y
ret <2 x i64> %res
}
define <2 x i64> @select_v2i64(i1 zeroext %c, <2 x i64> %x, <2 x i64> %y) {
; CHECK-LABEL: select_v2i64:
; CHECK: .functype select_v2i64 (i32, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 0
; CHECK-NEXT: v128.select
; CHECK-NEXT: # fallthrough-return
%res = select i1 %c, <2 x i64> %x, <2 x i64> %y
ret <2 x i64> %res
}
define <2 x i64> @select_cmp_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) {
; CHECK-LABEL: select_cmp_v2i64:
; CHECK: .functype select_cmp_v2i64 (i32, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 0
; CHECK-NEXT: i32.const 0
; CHECK-NEXT: i32.lt_s
; CHECK-NEXT: v128.select
; CHECK-NEXT: # fallthrough-return
%c = icmp slt i32 %i, 0
%res = select i1 %c, <2 x i64> %x, <2 x i64> %y
ret <2 x i64> %res
}
define <2 x i64> @select_ne_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) {
; CHECK-LABEL: select_ne_v2i64:
; CHECK: .functype select_ne_v2i64 (i32, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 0
; CHECK-NEXT: v128.select
; CHECK-NEXT: # fallthrough-return
%c = icmp ne i32 %i, 0
%res = select i1 %c, <2 x i64> %x, <2 x i64> %y
ret <2 x i64> %res
}
define <2 x i64> @select_eq_v2i64(i32 %i, <2 x i64> %x, <2 x i64> %y) {
; CHECK-LABEL: select_eq_v2i64:
; CHECK: .functype select_eq_v2i64 (i32, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 0
; CHECK-NEXT: v128.select
; CHECK-NEXT: # fallthrough-return
%c = icmp eq i32 %i, 0
%res = select i1 %c, <2 x i64> %x, <2 x i64> %y
ret <2 x i64> %res
}
define <4 x float> @vselect_v4f32(<4 x i1> %c, <4 x float> %x, <4 x float> %y) {
; CHECK-LABEL: vselect_v4f32:
; CHECK: .functype vselect_v4f32 (v128, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 0
; CHECK-NEXT: i32.const 31
; CHECK-NEXT: i32x4.shl
; CHECK-NEXT: i32.const 31
; CHECK-NEXT: i32x4.shr_s
; CHECK-NEXT: v128.bitselect
; CHECK-NEXT: # fallthrough-return
%res = select <4 x i1> %c, <4 x float> %x, <4 x float> %y
ret <4 x float> %res
}
define <4 x float> @vselect_cmp_v4f32(<4 x float> %a, <4 x float> %b,
; CHECK-LABEL: vselect_cmp_v4f32:
; CHECK: .functype vselect_cmp_v4f32 (v128, v128, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 3
; CHECK-NEXT: local.get 0
; CHECK-NEXT: local.get 1
; CHECK-NEXT: f32x4.lt
; CHECK-NEXT: v128.bitselect
; CHECK-NEXT: # fallthrough-return
<4 x float> %x, <4 x float> %y) {
%c = fcmp olt <4 x float> %a, %b
%res = select <4 x i1> %c, <4 x float> %x, <4 x float> %y
ret <4 x float> %res
}
define <4 x float> @select_v4f32(i1 zeroext %c, <4 x float> %x, <4 x float> %y) {
; CHECK-LABEL: select_v4f32:
; CHECK: .functype select_v4f32 (i32, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 0
; CHECK-NEXT: v128.select
; CHECK-NEXT: # fallthrough-return
%res = select i1 %c, <4 x float> %x, <4 x float> %y
ret <4 x float> %res
}
define <4 x float> @select_cmp_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) {
; CHECK-LABEL: select_cmp_v4f32:
; CHECK: .functype select_cmp_v4f32 (i32, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 0
; CHECK-NEXT: i32.const 0
; CHECK-NEXT: i32.lt_s
; CHECK-NEXT: v128.select
; CHECK-NEXT: # fallthrough-return
%c = icmp slt i32 %i, 0
%res = select i1 %c, <4 x float> %x, <4 x float> %y
ret <4 x float> %res
}
define <4 x float> @select_ne_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) {
; CHECK-LABEL: select_ne_v4f32:
; CHECK: .functype select_ne_v4f32 (i32, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 0
; CHECK-NEXT: v128.select
; CHECK-NEXT: # fallthrough-return
%c = icmp ne i32 %i, 0
%res = select i1 %c, <4 x float> %x, <4 x float> %y
ret <4 x float> %res
}
define <4 x float> @select_eq_v4f32(i32 %i, <4 x float> %x, <4 x float> %y) {
; CHECK-LABEL: select_eq_v4f32:
; CHECK: .functype select_eq_v4f32 (i32, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 0
; CHECK-NEXT: v128.select
; CHECK-NEXT: # fallthrough-return
%c = icmp eq i32 %i, 0
%res = select i1 %c, <4 x float> %x, <4 x float> %y
ret <4 x float> %res
}
define <2 x double> @vselect_v2f64(<2 x i1> %c, <2 x double> %x, <2 x double> %y) {
; CHECK-LABEL: vselect_v2f64:
; CHECK: .functype vselect_v2f64 (v128, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 0
; CHECK-NEXT: i32.const 63
; CHECK-NEXT: i64x2.shl
; CHECK-NEXT: i32.const 63
; CHECK-NEXT: i64x2.shr_s
; CHECK-NEXT: v128.bitselect
; CHECK-NEXT: # fallthrough-return
%res = select <2 x i1> %c, <2 x double> %x, <2 x double> %y
ret <2 x double> %res
}
define <2 x double> @vselect_cmp_v2f64(<2 x double> %a, <2 x double> %b,
; CHECK-LABEL: vselect_cmp_v2f64:
; CHECK: .functype vselect_cmp_v2f64 (v128, v128, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 3
; CHECK-NEXT: local.get 0
; CHECK-NEXT: local.get 1
; CHECK-NEXT: f64x2.lt
; CHECK-NEXT: v128.bitselect
; CHECK-NEXT: # fallthrough-return
<2 x double> %x, <2 x double> %y) {
%c = fcmp olt <2 x double> %a, %b
%res = select <2 x i1> %c, <2 x double> %x, <2 x double> %y
ret <2 x double> %res
}
define <2 x double> @select_v2f64(i1 zeroext %c, <2 x double> %x, <2 x double> %y) {
; CHECK-LABEL: select_v2f64:
; CHECK: .functype select_v2f64 (i32, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 0
; CHECK-NEXT: v128.select
; CHECK-NEXT: # fallthrough-return
%res = select i1 %c, <2 x double> %x, <2 x double> %y
ret <2 x double> %res
}
define <2 x double> @select_cmp_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) {
; CHECK-LABEL: select_cmp_v2f64:
; CHECK: .functype select_cmp_v2f64 (i32, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 0
; CHECK-NEXT: i32.const 0
; CHECK-NEXT: i32.lt_s
; CHECK-NEXT: v128.select
; CHECK-NEXT: # fallthrough-return
%c = icmp slt i32 %i, 0
%res = select i1 %c, <2 x double> %x, <2 x double> %y
ret <2 x double> %res
}
define <2 x double> @select_ne_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) {
; CHECK-LABEL: select_ne_v2f64:
; CHECK: .functype select_ne_v2f64 (i32, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 0
; CHECK-NEXT: v128.select
; CHECK-NEXT: # fallthrough-return
%c = icmp ne i32 %i, 0
%res = select i1 %c, <2 x double> %x, <2 x double> %y
ret <2 x double> %res
}
define <2 x double> @select_eq_v2f64(i32 %i, <2 x double> %x, <2 x double> %y) {
; CHECK-LABEL: select_eq_v2f64:
; CHECK: .functype select_eq_v2f64 (i32, v128, v128) -> (v128)
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get 2
; CHECK-NEXT: local.get 1
; CHECK-NEXT: local.get 0
; CHECK-NEXT: v128.select
; CHECK-NEXT: # fallthrough-return
%c = icmp eq i32 %i, 0
%res = select i1 %c, <2 x double> %x, <2 x double> %y
ret <2 x double> %res
}