; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve < %s | FileCheck %s define @sel_8_positive( %p) { ; CHECK-LABEL: sel_8_positive: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.b, p0/z, #3 // =0x3 ; CHECK-NEXT: ret %sel = select %p, splat (i8 3), zeroinitializer ret %sel } define @sel_16_positive( %p) { ; CHECK-LABEL: sel_16_positive: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.h, p0/z, #3 // =0x3 ; CHECK-NEXT: ret %sel = select %p, splat (i16 3), zeroinitializer ret %sel } define @sel_32_positive( %p) { ; CHECK-LABEL: sel_32_positive: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.s, p0/z, #3 // =0x3 ; CHECK-NEXT: ret %sel = select %p, splat (i32 3), zeroinitializer ret %sel } define @sel_64_positive( %p) { ; CHECK-LABEL: sel_64_positive: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.d, p0/z, #3 // =0x3 ; CHECK-NEXT: ret %sel = select %p, splat (i64 3), zeroinitializer ret %sel } define @sel_8_negative( %p) { ; CHECK-LABEL: sel_8_negative: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.b, p0/z, #-128 // =0xffffffffffffff80 ; CHECK-NEXT: ret %sel = select %p, splat (i8 -128), zeroinitializer ret %sel } define @sel_16_negative( %p) { ; CHECK-LABEL: sel_16_negative: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.h, p0/z, #-128 // =0xffffffffffffff80 ; CHECK-NEXT: ret %sel = select %p, splat (i16 -128), zeroinitializer ret %sel } define @sel_32_negative( %p) { ; CHECK-LABEL: sel_32_negative: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.s, p0/z, #-128 // =0xffffffffffffff80 ; CHECK-NEXT: ret %sel = select %p, splat (i32 -128), zeroinitializer ret %sel } define @sel_64_negative( %p) { ; CHECK-LABEL: sel_64_negative: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.d, p0/z, #-128 // =0xffffffffffffff80 ; CHECK-NEXT: ret %sel = select %p, splat (i64 -128), zeroinitializer ret %sel } define @sel_16_shifted( %p) { ; CHECK-LABEL: sel_16_shifted: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.h, p0/z, #512 // =0x200 ; CHECK-NEXT: ret %sel = select %p, splat (i16 512), zeroinitializer ret %sel } define @sel_32_shifted( %p) { ; CHECK-LABEL: sel_32_shifted: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.s, p0/z, #512 // =0x200 ; CHECK-NEXT: ret %sel = select %p, splat (i32 512), zeroinitializer ret %sel } define @sel_64_shifted( %p) { ; CHECK-LABEL: sel_64_shifted: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.d, p0/z, #512 // =0x200 ; CHECK-NEXT: ret %sel = select %p, splat (i64 512), zeroinitializer ret %sel } ; TODO: We could actually use something like "cpy z0.b, p0/z, #-128". But it's ; a little tricky to prove correctness: we're using the predicate with the ; wrong width, so we'd have to prove the bits which would normally be unused ; are actually zero. define @sel_16_illegal_wrong_extension( %p) { ; CHECK-LABEL: sel_16_illegal_wrong_extension: ; CHECK: // %bb.0: ; CHECK-NEXT: movi v0.2d, #0000000000000000 ; CHECK-NEXT: mov z1.h, #128 // =0x80 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret %sel = select %p, splat (i16 128), zeroinitializer ret %sel } define @sel_32_illegal_wrong_extension( %p) { ; CHECK-LABEL: sel_32_illegal_wrong_extension: ; CHECK: // %bb.0: ; CHECK-NEXT: movi v0.2d, #0000000000000000 ; CHECK-NEXT: mov z1.s, #128 // =0x80 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret %sel = select %p, splat (i32 128), zeroinitializer ret %sel } define @sel_64_illegal_wrong_extension( %p) { ; CHECK-LABEL: sel_64_illegal_wrong_extension: ; CHECK: // %bb.0: ; CHECK-NEXT: movi v0.2d, #0000000000000000 ; CHECK-NEXT: mov z1.d, #128 // =0x80 ; CHECK-NEXT: mov z0.d, p0/m, z1.d ; CHECK-NEXT: ret %sel = select %p, splat (i64 128), zeroinitializer ret %sel } define @sel_16_illegal_shifted( %p) { ; CHECK-LABEL: sel_16_illegal_shifted: ; CHECK: // %bb.0: ; CHECK-NEXT: movi v0.2d, #0000000000000000 ; CHECK-NEXT: mov w8, #513 // =0x201 ; CHECK-NEXT: mov z1.h, w8 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret %sel = select %p, splat (i16 513), zeroinitializer ret %sel } define @sel_32_illegal_shifted( %p) { ; CHECK-LABEL: sel_32_illegal_shifted: ; CHECK: // %bb.0: ; CHECK-NEXT: movi v0.2d, #0000000000000000 ; CHECK-NEXT: mov w8, #513 // =0x201 ; CHECK-NEXT: mov z1.s, w8 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret %sel = select %p, splat (i32 513), zeroinitializer ret %sel } define @sel_64_illegal_shifted( %p) { ; CHECK-LABEL: sel_64_illegal_shifted: ; CHECK: // %bb.0: ; CHECK-NEXT: movi v0.2d, #0000000000000000 ; CHECK-NEXT: mov w8, #513 // =0x201 ; CHECK-NEXT: mov z1.d, x8 ; CHECK-NEXT: mov z0.d, p0/m, z1.d ; CHECK-NEXT: ret %sel = select %p, splat (i64 513), zeroinitializer ret %sel } define @sel_merge_8_positive( %p, %in) { ; CHECK-LABEL: sel_merge_8_positive: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.b, p0/m, #3 // =0x3 ; CHECK-NEXT: ret %sel = select %p, splat (i8 3), %in ret %sel } define @sel_merge_16_positive( %p, %in) { ; CHECK-LABEL: sel_merge_16_positive: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.h, p0/m, #3 // =0x3 ; CHECK-NEXT: ret %sel = select %p, splat (i16 3), %in ret %sel } define @sel_merge_32_positive( %p, %in) { ; CHECK-LABEL: sel_merge_32_positive: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.s, p0/m, #3 // =0x3 ; CHECK-NEXT: ret %sel = select %p, splat (i32 3), %in ret %sel } define @sel_merge_64_positive( %p, %in) { ; CHECK-LABEL: sel_merge_64_positive: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.d, p0/m, #3 // =0x3 ; CHECK-NEXT: ret %sel = select %p, splat (i64 3), %in ret %sel } define @sel_merge_8_negative( %p, %in) { ; CHECK-LABEL: sel_merge_8_negative: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.b, p0/m, #-128 // =0xffffffffffffff80 ; CHECK-NEXT: ret %sel = select %p, splat (i8 -128), %in ret %sel } define @sel_merge_16_negative( %p, %in) { ; CHECK-LABEL: sel_merge_16_negative: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.h, p0/m, #-128 // =0xffffffffffffff80 ; CHECK-NEXT: ret %sel = select %p, splat (i16 -128), %in ret %sel } define @sel_merge_32_negative( %p, %in) { ; CHECK-LABEL: sel_merge_32_negative: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.s, p0/m, #-128 // =0xffffffffffffff80 ; CHECK-NEXT: ret %sel = select %p, splat (i32 -128), %in ret %sel } define @sel_merge_64_negative( %p, %in) { ; CHECK-LABEL: sel_merge_64_negative: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.d, p0/m, #-128 // =0xffffffffffffff80 ; CHECK-NEXT: ret %sel = select %p, splat (i64 -128), %in ret %sel } define @sel_merge_8_zero( %p, %in) { ; CHECK-LABEL: sel_merge_8_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.b, p0/m, #0 // =0x0 ; CHECK-NEXT: ret %sel = select %p, zeroinitializer, %in ret %sel } define @sel_merge_16_zero( %p, %in) { ; CHECK-LABEL: sel_merge_16_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.h, p0/m, #0 // =0x0 ; CHECK-NEXT: ret %sel = select %p, zeroinitializer, %in ret %sel } define @sel_merge_32_zero( %p, %in) { ; CHECK-LABEL: sel_merge_32_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.s, p0/m, #0 // =0x0 ; CHECK-NEXT: ret %sel = select %p, zeroinitializer, %in ret %sel } define @sel_merge_64_zero( %p, %in) { ; CHECK-LABEL: sel_merge_64_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.d, p0/m, #0 // =0x0 ; CHECK-NEXT: ret %sel = select %p, zeroinitializer, %in ret %sel } define @sel_merge_nxv8f16_zero( %p, %in) { ; CHECK-LABEL: sel_merge_nxv8f16_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.h, p0/m, #0 // =0x0 ; CHECK-NEXT: ret %sel = select %p, zeroinitializer, %in ret %sel } define @sel_merge_nx4f16_zero( %p, %in) { ; CHECK-LABEL: sel_merge_nx4f16_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.s, p0/m, #0 // =0x0 ; CHECK-NEXT: ret %sel = select %p, zeroinitializer, %in ret %sel } define @sel_merge_nx2f16_zero( %p, %in) { ; CHECK-LABEL: sel_merge_nx2f16_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.d, p0/m, #0 // =0x0 ; CHECK-NEXT: ret %sel = select %p, zeroinitializer, %in ret %sel } define @sel_merge_nx4f32_zero( %p, %in) { ; CHECK-LABEL: sel_merge_nx4f32_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.s, p0/m, #0 // =0x0 ; CHECK-NEXT: ret %sel = select %p, zeroinitializer, %in ret %sel } define @sel_merge_nx2f32_zero( %p, %in) { ; CHECK-LABEL: sel_merge_nx2f32_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.d, p0/m, #0 // =0x0 ; CHECK-NEXT: ret %sel = select %p, zeroinitializer, %in ret %sel } define @sel_merge_nx2f64_zero( %p, %in) { ; CHECK-LABEL: sel_merge_nx2f64_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.d, p0/m, #0 // =0x0 ; CHECK-NEXT: ret %sel = select %p, zeroinitializer, %in ret %sel } define @sel_merge_nxv8f16_negative_zero( %p, %in) { ; CHECK-LABEL: sel_merge_nxv8f16_negative_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: dupm z1.h, #0x8000 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret %sel = select %p, splat (half -0.0), %in ret %sel } define @sel_merge_nx4f16_negative_zero( %p, %in) { ; CHECK-LABEL: sel_merge_nx4f16_negative_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: dupm z1.h, #0x8000 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret %sel = select %p, splat (half -0.0), %in ret %sel } define @sel_merge_nx2f16_negative_zero( %p, %in) { ; CHECK-LABEL: sel_merge_nx2f16_negative_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: dupm z1.h, #0x8000 ; CHECK-NEXT: mov z0.d, p0/m, z1.d ; CHECK-NEXT: ret %sel = select %p, splat (half -0.0), %in ret %sel } define @sel_merge_nx4f32_negative_zero( %p, %in) { ; CHECK-LABEL: sel_merge_nx4f32_negative_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z1.s, #0x80000000 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret %sel = select %p, splat (float -0.0), %in ret %sel } define @sel_merge_nx2f32_negative_zero( %p, %in) { ; CHECK-LABEL: sel_merge_nx2f32_negative_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z1.s, #0x80000000 ; CHECK-NEXT: mov z0.d, p0/m, z1.d ; CHECK-NEXT: ret %sel = select %p, splat (float -0.0), %in ret %sel } define @sel_merge_nx2f64_negative_zero( %p, %in) { ; CHECK-LABEL: sel_merge_nx2f64_negative_zero: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z1.d, #0x8000000000000000 ; CHECK-NEXT: mov z0.d, p0/m, z1.d ; CHECK-NEXT: ret %sel = select %p, splat (double -0.0), %in ret %sel } define @sel_merge_16_shifted( %p, %in) { ; CHECK-LABEL: sel_merge_16_shifted: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.h, p0/m, #512 // =0x200 ; CHECK-NEXT: ret %sel = select %p, splat (i16 512), %in ret %sel } define @sel_merge_32_shifted( %p, %in) { ; CHECK-LABEL: sel_merge_32_shifted: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.s, p0/m, #512 // =0x200 ; CHECK-NEXT: ret %sel = select %p, splat (i32 512), %in ret %sel } define @sel_merge_64_shifted( %p, %in) { ; CHECK-LABEL: sel_merge_64_shifted: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z0.d, p0/m, #512 // =0x200 ; CHECK-NEXT: ret %sel = select %p, splat (i64 512), %in ret %sel } ; TODO: We could actually use something like "cpy z0.b, p0/m, #-128". But it's ; a little tricky to prove correctness: we're using the predicate with the ; wrong width, so we'd have to prove the bits which would normally be unused ; are actually zero. define @sel_merge_16_illegal_wrong_extension( %p, %in) { ; CHECK-LABEL: sel_merge_16_illegal_wrong_extension: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z1.h, #128 // =0x80 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret %sel = select %p, splat (i16 128), %in ret %sel } define @sel_merge_32_illegal_wrong_extension( %p, %in) { ; CHECK-LABEL: sel_merge_32_illegal_wrong_extension: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z1.s, #128 // =0x80 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret %sel = select %p, splat (i32 128), %in ret %sel } define @sel_merge_64_illegal_wrong_extension( %p, %in) { ; CHECK-LABEL: sel_merge_64_illegal_wrong_extension: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z1.d, #128 // =0x80 ; CHECK-NEXT: mov z0.d, p0/m, z1.d ; CHECK-NEXT: ret %sel = select %p, splat (i64 128), %in ret %sel } define @sel_merge_16_illegal_shifted( %p, %in) { ; CHECK-LABEL: sel_merge_16_illegal_shifted: ; CHECK: // %bb.0: ; CHECK-NEXT: mov w8, #513 // =0x201 ; CHECK-NEXT: mov z1.h, w8 ; CHECK-NEXT: mov z0.h, p0/m, z1.h ; CHECK-NEXT: ret %sel = select %p, splat (i16 513), %in ret %sel } define @sel_merge_32_illegal_shifted( %p, %in) { ; CHECK-LABEL: sel_merge_32_illegal_shifted: ; CHECK: // %bb.0: ; CHECK-NEXT: mov w8, #513 // =0x201 ; CHECK-NEXT: mov z1.s, w8 ; CHECK-NEXT: mov z0.s, p0/m, z1.s ; CHECK-NEXT: ret %sel = select %p, splat (i32 513), %in ret %sel } define @sel_merge_64_illegal_shifted( %p, %in) { ; CHECK-LABEL: sel_merge_64_illegal_shifted: ; CHECK: // %bb.0: ; CHECK-NEXT: mov w8, #513 // =0x201 ; CHECK-NEXT: mov z1.d, x8 ; CHECK-NEXT: mov z0.d, p0/m, z1.d ; CHECK-NEXT: ret %sel = select %p, splat (i64 513), %in ret %sel }