| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | |
| ; RUN: llc -mtriple=aarch64-none-elf %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-LE | |
| ; RUN: llc -mtriple=aarch64_be-none-linux-gnu %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-BE | |
| define void @if_then_else8(ptr %out, i8 %mask, ptr %if_true, ptr %if_false) { | |
| ; CHECK-LE-LABEL: if_then_else8: | |
| ; CHECK-LE: // %bb.0: // %start | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI0_1 | |
| ; CHECK-LE-NEXT: dup v0.4s, w1 | |
| ; CHECK-LE-NEXT: ldr q1, [x8, :lo12:.LCPI0_1] | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI0_0 | |
| ; CHECK-LE-NEXT: ldr q2, [x8, :lo12:.LCPI0_0] | |
| ; CHECK-LE-NEXT: ldp q4, q3, [x2] | |
| ; CHECK-LE-NEXT: cmtst v1.4s, v0.4s, v1.4s | |
| ; CHECK-LE-NEXT: cmtst v0.4s, v0.4s, v2.4s | |
| ; CHECK-LE-NEXT: ldp q5, q2, [x3] | |
| ; CHECK-LE-NEXT: bsl v1.16b, v3.16b, v2.16b | |
| ; CHECK-LE-NEXT: bsl v0.16b, v4.16b, v5.16b | |
| ; CHECK-LE-NEXT: stp q0, q1, [x0] | |
| ; CHECK-LE-NEXT: ret | |
| ; | |
| ; CHECK-BE-LABEL: if_then_else8: | |
| ; CHECK-BE: // %bb.0: // %start | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI0_1 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI0_1 | |
| ; CHECK-BE-NEXT: dup v0.4s, w1 | |
| ; CHECK-BE-NEXT: ld1 { v1.4s }, [x8] | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI0_0 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI0_0 | |
| ; CHECK-BE-NEXT: ld1 { v2.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x2, #16 | |
| ; CHECK-BE-NEXT: add x9, x3, #16 | |
| ; CHECK-BE-NEXT: ld1 { v3.4s }, [x8] | |
| ; CHECK-BE-NEXT: ld1 { v4.4s }, [x9] | |
| ; CHECK-BE-NEXT: ld1 { v5.4s }, [x3] | |
| ; CHECK-BE-NEXT: cmtst v1.4s, v0.4s, v1.4s | |
| ; CHECK-BE-NEXT: add x8, x0, #16 | |
| ; CHECK-BE-NEXT: cmtst v0.4s, v0.4s, v2.4s | |
| ; CHECK-BE-NEXT: ld1 { v2.4s }, [x2] | |
| ; CHECK-BE-NEXT: bsl v1.16b, v3.16b, v4.16b | |
| ; CHECK-BE-NEXT: bsl v0.16b, v2.16b, v5.16b | |
| ; CHECK-BE-NEXT: st1 { v1.4s }, [x8] | |
| ; CHECK-BE-NEXT: st1 { v0.4s }, [x0] | |
| ; CHECK-BE-NEXT: ret | |
| start: | |
| %t = load <8 x i32>, ptr %if_true, align 4 | |
| %f = load <8 x i32>, ptr %if_false, align 4 | |
| %m = bitcast i8 %mask to <8 x i1> | |
| %s = select <8 x i1> %m, <8 x i32> %t, <8 x i32> %f | |
| store <8 x i32> %s, ptr %out, align 4 | |
| ret void | |
| } | |
| define void @if_then_else16(ptr %out, i16 %mask, ptr %if_true, ptr %if_false) { | |
| ; CHECK-LE-LABEL: if_then_else16: | |
| ; CHECK-LE: // %bb.0: // %start | |
| ; CHECK-LE-NEXT: dup v0.4s, w1 | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI1_3 | |
| ; CHECK-LE-NEXT: ldr q1, [x8, :lo12:.LCPI1_3] | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI1_2 | |
| ; CHECK-LE-NEXT: ldr q2, [x8, :lo12:.LCPI1_2] | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI1_1 | |
| ; CHECK-LE-NEXT: ldr q3, [x8, :lo12:.LCPI1_1] | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI1_0 | |
| ; CHECK-LE-NEXT: cmtst v1.4s, v0.4s, v1.4s | |
| ; CHECK-LE-NEXT: ldr q4, [x8, :lo12:.LCPI1_0] | |
| ; CHECK-LE-NEXT: ldp q5, q16, [x3, #32] | |
| ; CHECK-LE-NEXT: ldp q6, q7, [x2, #32] | |
| ; CHECK-LE-NEXT: cmtst v2.4s, v0.4s, v2.4s | |
| ; CHECK-LE-NEXT: cmtst v3.4s, v0.4s, v3.4s | |
| ; CHECK-LE-NEXT: cmtst v0.4s, v0.4s, v4.4s | |
| ; CHECK-LE-NEXT: ldp q4, q17, [x3] | |
| ; CHECK-LE-NEXT: bsl v1.16b, v6.16b, v5.16b | |
| ; CHECK-LE-NEXT: ldp q5, q6, [x2] | |
| ; CHECK-LE-NEXT: bsl v2.16b, v7.16b, v16.16b | |
| ; CHECK-LE-NEXT: bsl v3.16b, v5.16b, v4.16b | |
| ; CHECK-LE-NEXT: bsl v0.16b, v6.16b, v17.16b | |
| ; CHECK-LE-NEXT: stp q1, q2, [x0, #32] | |
| ; CHECK-LE-NEXT: stp q3, q0, [x0] | |
| ; CHECK-LE-NEXT: ret | |
| ; | |
| ; CHECK-BE-LABEL: if_then_else16: | |
| ; CHECK-BE: // %bb.0: // %start | |
| ; CHECK-BE-NEXT: add x9, x2, #48 | |
| ; CHECK-BE-NEXT: dup v3.4s, w1 | |
| ; CHECK-BE-NEXT: add x8, x2, #32 | |
| ; CHECK-BE-NEXT: ld1 { v2.4s }, [x9] | |
| ; CHECK-BE-NEXT: adrp x9, .LCPI1_3 | |
| ; CHECK-BE-NEXT: add x9, x9, :lo12:.LCPI1_3 | |
| ; CHECK-BE-NEXT: ld1 { v4.4s }, [x9] | |
| ; CHECK-BE-NEXT: adrp x9, .LCPI1_2 | |
| ; CHECK-BE-NEXT: add x9, x9, :lo12:.LCPI1_2 | |
| ; CHECK-BE-NEXT: ld1 { v0.4s }, [x8] | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI1_0 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI1_0 | |
| ; CHECK-BE-NEXT: ld1 { v5.4s }, [x9] | |
| ; CHECK-BE-NEXT: adrp x9, .LCPI1_1 | |
| ; CHECK-BE-NEXT: add x9, x9, :lo12:.LCPI1_1 | |
| ; CHECK-BE-NEXT: ld1 { v6.4s }, [x9] | |
| ; CHECK-BE-NEXT: add x9, x3, #32 | |
| ; CHECK-BE-NEXT: ld1 { v7.4s }, [x8] | |
| ; CHECK-BE-NEXT: cmtst v4.4s, v3.4s, v4.4s | |
| ; CHECK-BE-NEXT: ld1 { v16.4s }, [x9] | |
| ; CHECK-BE-NEXT: add x8, x3, #48 | |
| ; CHECK-BE-NEXT: cmtst v5.4s, v3.4s, v5.4s | |
| ; CHECK-BE-NEXT: add x9, x2, #16 | |
| ; CHECK-BE-NEXT: ld1 { v17.4s }, [x8] | |
| ; CHECK-BE-NEXT: cmtst v6.4s, v3.4s, v6.4s | |
| ; CHECK-BE-NEXT: cmtst v3.4s, v3.4s, v7.4s | |
| ; CHECK-BE-NEXT: add x8, x3, #16 | |
| ; CHECK-BE-NEXT: ld1 { v1.4s }, [x2] | |
| ; CHECK-BE-NEXT: ld1 { v7.4s }, [x3] | |
| ; CHECK-BE-NEXT: bif v0.16b, v16.16b, v4.16b | |
| ; CHECK-BE-NEXT: ld1 { v4.4s }, [x9] | |
| ; CHECK-BE-NEXT: ld1 { v16.4s }, [x8] | |
| ; CHECK-BE-NEXT: bif v2.16b, v17.16b, v5.16b | |
| ; CHECK-BE-NEXT: add x8, x0, #32 | |
| ; CHECK-BE-NEXT: bif v1.16b, v7.16b, v6.16b | |
| ; CHECK-BE-NEXT: bsl v3.16b, v4.16b, v16.16b | |
| ; CHECK-BE-NEXT: st1 { v0.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x0, #48 | |
| ; CHECK-BE-NEXT: st1 { v2.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x0, #16 | |
| ; CHECK-BE-NEXT: st1 { v1.4s }, [x0] | |
| ; CHECK-BE-NEXT: st1 { v3.4s }, [x8] | |
| ; CHECK-BE-NEXT: ret | |
| start: | |
| %t = load <16 x i32>, ptr %if_true, align 4 | |
| %f = load <16 x i32>, ptr %if_false, align 4 | |
| %m = bitcast i16 %mask to <16 x i1> | |
| %s = select <16 x i1> %m, <16 x i32> %t, <16 x i32> %f | |
| store <16 x i32> %s, ptr %out, align 4 | |
| ret void | |
| } | |
| define void @if_then_else32(ptr %out, i32 %mask, ptr %if_true, ptr %if_false) { | |
| ; CHECK-LE-LABEL: if_then_else32: | |
| ; CHECK-LE: // %bb.0: // %start | |
| ; CHECK-LE-NEXT: dup v6.4s, w1 | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI2_5 | |
| ; CHECK-LE-NEXT: adrp x9, .LCPI2_6 | |
| ; CHECK-LE-NEXT: ldr q17, [x8, :lo12:.LCPI2_5] | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI2_7 | |
| ; CHECK-LE-NEXT: ldr q23, [x9, :lo12:.LCPI2_6] | |
| ; CHECK-LE-NEXT: ldr q20, [x8, :lo12:.LCPI2_7] | |
| ; CHECK-LE-NEXT: ldp q5, q2, [x2, #64] | |
| ; CHECK-LE-NEXT: cmtst v17.4s, v6.4s, v17.4s | |
| ; CHECK-LE-NEXT: ldp q21, q22, [x3, #64] | |
| ; CHECK-LE-NEXT: adrp x9, .LCPI2_4 | |
| ; CHECK-LE-NEXT: cmtst v20.4s, v6.4s, v20.4s | |
| ; CHECK-LE-NEXT: cmtst v23.4s, v6.4s, v23.4s | |
| ; CHECK-LE-NEXT: ldp q4, q3, [x2, #96] | |
| ; CHECK-LE-NEXT: ldr q24, [x9, :lo12:.LCPI2_4] | |
| ; CHECK-LE-NEXT: ldp q18, q19, [x3, #96] | |
| ; CHECK-LE-NEXT: adrp x9, .LCPI2_3 | |
| ; CHECK-LE-NEXT: ldr q25, [x9, :lo12:.LCPI2_3] | |
| ; CHECK-LE-NEXT: adrp x9, .LCPI2_2 | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI2_0 | |
| ; CHECK-LE-NEXT: bif v5.16b, v21.16b, v17.16b | |
| ; CHECK-LE-NEXT: ldr q17, [x9, :lo12:.LCPI2_2] | |
| ; CHECK-LE-NEXT: adrp x9, .LCPI2_1 | |
| ; CHECK-LE-NEXT: cmtst v21.4s, v6.4s, v24.4s | |
| ; CHECK-LE-NEXT: ldr q24, [x9, :lo12:.LCPI2_1] | |
| ; CHECK-LE-NEXT: bif v4.16b, v18.16b, v20.16b | |
| ; CHECK-LE-NEXT: ldr q18, [x8, :lo12:.LCPI2_0] | |
| ; CHECK-LE-NEXT: cmtst v25.4s, v6.4s, v25.4s | |
| ; CHECK-LE-NEXT: cmtst v17.4s, v6.4s, v17.4s | |
| ; CHECK-LE-NEXT: bif v3.16b, v19.16b, v23.16b | |
| ; CHECK-LE-NEXT: cmtst v23.4s, v6.4s, v24.4s | |
| ; CHECK-LE-NEXT: cmtst v6.4s, v6.4s, v18.4s | |
| ; CHECK-LE-NEXT: ldp q1, q0, [x2, #32] | |
| ; CHECK-LE-NEXT: ldp q7, q16, [x2] | |
| ; CHECK-LE-NEXT: bif v2.16b, v22.16b, v21.16b | |
| ; CHECK-LE-NEXT: ldp q19, q20, [x3, #32] | |
| ; CHECK-LE-NEXT: ldp q18, q21, [x3] | |
| ; CHECK-LE-NEXT: stp q4, q3, [x0, #96] | |
| ; CHECK-LE-NEXT: mov v3.16b, v23.16b | |
| ; CHECK-LE-NEXT: mov v4.16b, v6.16b | |
| ; CHECK-LE-NEXT: bif v1.16b, v19.16b, v25.16b | |
| ; CHECK-LE-NEXT: bif v0.16b, v20.16b, v17.16b | |
| ; CHECK-LE-NEXT: stp q5, q2, [x0, #64] | |
| ; CHECK-LE-NEXT: bsl v3.16b, v7.16b, v18.16b | |
| ; CHECK-LE-NEXT: bsl v4.16b, v16.16b, v21.16b | |
| ; CHECK-LE-NEXT: stp q1, q0, [x0, #32] | |
| ; CHECK-LE-NEXT: stp q3, q4, [x0] | |
| ; CHECK-LE-NEXT: ret | |
| ; | |
| ; CHECK-BE-LABEL: if_then_else32: | |
| ; CHECK-BE: // %bb.0: // %start | |
| ; CHECK-BE-NEXT: add x9, x2, #112 | |
| ; CHECK-BE-NEXT: add x8, x2, #96 | |
| ; CHECK-BE-NEXT: dup v19.4s, w1 | |
| ; CHECK-BE-NEXT: ld1 { v6.4s }, [x9] | |
| ; CHECK-BE-NEXT: add x9, x2, #32 | |
| ; CHECK-BE-NEXT: ld1 { v4.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x2, #64 | |
| ; CHECK-BE-NEXT: ld1 { v3.4s }, [x9] | |
| ; CHECK-BE-NEXT: add x9, x3, #112 | |
| ; CHECK-BE-NEXT: ld1 { v7.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x2, #80 | |
| ; CHECK-BE-NEXT: ld1 { v17.4s }, [x9] | |
| ; CHECK-BE-NEXT: adrp x9, .LCPI2_5 | |
| ; CHECK-BE-NEXT: add x9, x9, :lo12:.LCPI2_5 | |
| ; CHECK-BE-NEXT: ld1 { v5.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x2, #48 | |
| ; CHECK-BE-NEXT: ld1 { v20.4s }, [x9] | |
| ; CHECK-BE-NEXT: adrp x9, .LCPI2_6 | |
| ; CHECK-BE-NEXT: add x9, x9, :lo12:.LCPI2_6 | |
| ; CHECK-BE-NEXT: ld1 { v2.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x2, #16 | |
| ; CHECK-BE-NEXT: ld1 { v22.4s }, [x9] | |
| ; CHECK-BE-NEXT: adrp x10, .LCPI2_7 | |
| ; CHECK-BE-NEXT: add x10, x10, :lo12:.LCPI2_7 | |
| ; CHECK-BE-NEXT: ld1 { v0.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x3, #96 | |
| ; CHECK-BE-NEXT: ld1 { v23.4s }, [x10] | |
| ; CHECK-BE-NEXT: ld1 { v16.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x3, #64 | |
| ; CHECK-BE-NEXT: cmtst v20.4s, v19.4s, v20.4s | |
| ; CHECK-BE-NEXT: adrp x10, .LCPI2_3 | |
| ; CHECK-BE-NEXT: add x10, x10, :lo12:.LCPI2_3 | |
| ; CHECK-BE-NEXT: ld1 { v18.4s }, [x8] | |
| ; CHECK-BE-NEXT: cmtst v22.4s, v19.4s, v22.4s | |
| ; CHECK-BE-NEXT: ld1 { v24.4s }, [x10] | |
| ; CHECK-BE-NEXT: adrp x10, .LCPI2_4 | |
| ; CHECK-BE-NEXT: add x10, x10, :lo12:.LCPI2_4 | |
| ; CHECK-BE-NEXT: cmtst v23.4s, v19.4s, v23.4s | |
| ; CHECK-BE-NEXT: add x8, x3, #80 | |
| ; CHECK-BE-NEXT: ld1 { v25.4s }, [x10] | |
| ; CHECK-BE-NEXT: adrp x10, .LCPI2_2 | |
| ; CHECK-BE-NEXT: add x10, x10, :lo12:.LCPI2_2 | |
| ; CHECK-BE-NEXT: ld1 { v21.4s }, [x8] | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI2_0 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI2_0 | |
| ; CHECK-BE-NEXT: adrp x9, .LCPI2_1 | |
| ; CHECK-BE-NEXT: add x9, x9, :lo12:.LCPI2_1 | |
| ; CHECK-BE-NEXT: bif v7.16b, v18.16b, v20.16b | |
| ; CHECK-BE-NEXT: ld1 { v20.4s }, [x10] | |
| ; CHECK-BE-NEXT: bif v6.16b, v17.16b, v22.16b | |
| ; CHECK-BE-NEXT: ld1 { v17.4s }, [x8] | |
| ; CHECK-BE-NEXT: ld1 { v22.4s }, [x9] | |
| ; CHECK-BE-NEXT: cmtst v25.4s, v19.4s, v25.4s | |
| ; CHECK-BE-NEXT: add x11, x3, #32 | |
| ; CHECK-BE-NEXT: cmtst v24.4s, v19.4s, v24.4s | |
| ; CHECK-BE-NEXT: bif v4.16b, v16.16b, v23.16b | |
| ; CHECK-BE-NEXT: ld1 { v18.4s }, [x11] | |
| ; CHECK-BE-NEXT: add x8, x3, #48 | |
| ; CHECK-BE-NEXT: cmtst v20.4s, v19.4s, v20.4s | |
| ; CHECK-BE-NEXT: cmtst v17.4s, v19.4s, v17.4s | |
| ; CHECK-BE-NEXT: ld1 { v16.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x3, #16 | |
| ; CHECK-BE-NEXT: cmtst v19.4s, v19.4s, v22.4s | |
| ; CHECK-BE-NEXT: ld1 { v1.4s }, [x2] | |
| ; CHECK-BE-NEXT: ld1 { v23.4s }, [x3] | |
| ; CHECK-BE-NEXT: ld1 { v22.4s }, [x8] | |
| ; CHECK-BE-NEXT: bif v5.16b, v21.16b, v25.16b | |
| ; CHECK-BE-NEXT: add x8, x0, #96 | |
| ; CHECK-BE-NEXT: bif v3.16b, v18.16b, v24.16b | |
| ; CHECK-BE-NEXT: st1 { v4.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x0, #112 | |
| ; CHECK-BE-NEXT: bif v2.16b, v16.16b, v20.16b | |
| ; CHECK-BE-NEXT: st1 { v6.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x0, #64 | |
| ; CHECK-BE-NEXT: bif v1.16b, v23.16b, v19.16b | |
| ; CHECK-BE-NEXT: st1 { v7.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x0, #80 | |
| ; CHECK-BE-NEXT: bif v0.16b, v22.16b, v17.16b | |
| ; CHECK-BE-NEXT: st1 { v5.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x0, #32 | |
| ; CHECK-BE-NEXT: st1 { v3.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x0, #48 | |
| ; CHECK-BE-NEXT: st1 { v2.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x0, #16 | |
| ; CHECK-BE-NEXT: st1 { v1.4s }, [x0] | |
| ; CHECK-BE-NEXT: st1 { v0.4s }, [x8] | |
| ; CHECK-BE-NEXT: ret | |
| start: | |
| %t = load <32 x i32>, ptr %if_true, align 4 | |
| %f = load <32 x i32>, ptr %if_false, align 4 | |
| %m = bitcast i32 %mask to <32 x i1> | |
| %s = select <32 x i1> %m, <32 x i32> %t, <32 x i32> %f | |
| store <32 x i32> %s, ptr %out, align 4 | |
| ret void | |
| } | |
| define void @if_then_else64(ptr %out, i64 %mask, ptr %if_true, ptr %if_false) nounwind { | |
| ; CHECK-LE-LABEL: if_then_else64: | |
| ; CHECK-LE: // %bb.0: // %start | |
| ; CHECK-LE-NEXT: sub sp, sp, #176 | |
| ; CHECK-LE-NEXT: fmov d16, x1 | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI3_3 | |
| ; CHECK-LE-NEXT: stp d13, d12, [sp, #128] // 16-byte Folded Spill | |
| ; CHECK-LE-NEXT: ldr q25, [x8, :lo12:.LCPI3_3] | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI3_5 | |
| ; CHECK-LE-NEXT: stp d11, d10, [sp, #144] // 16-byte Folded Spill | |
| ; CHECK-LE-NEXT: ldr q31, [x8, :lo12:.LCPI3_5] | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI3_6 | |
| ; CHECK-LE-NEXT: stp d9, d8, [sp, #160] // 16-byte Folded Spill | |
| ; CHECK-LE-NEXT: dup v26.4s, v16.s[1] | |
| ; CHECK-LE-NEXT: ldp q1, q22, [x2, #160] | |
| ; CHECK-LE-NEXT: ldp q8, q13, [x3, #176] | |
| ; CHECK-LE-NEXT: ldr q10, [x8, :lo12:.LCPI3_6] | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI3_7 | |
| ; CHECK-LE-NEXT: stp d15, d14, [sp, #112] // 16-byte Folded Spill | |
| ; CHECK-LE-NEXT: adrp x9, .LCPI3_4 | |
| ; CHECK-LE-NEXT: cmtst v30.4s, v26.4s, v25.4s | |
| ; CHECK-LE-NEXT: ldr q14, [x8, :lo12:.LCPI3_7] | |
| ; CHECK-LE-NEXT: cmtst v11.4s, v26.4s, v31.4s | |
| ; CHECK-LE-NEXT: ldp q3, q2, [x2, #128] | |
| ; CHECK-LE-NEXT: ldr q27, [x9, :lo12:.LCPI3_4] | |
| ; CHECK-LE-NEXT: ldp q21, q18, [x2, #192] | |
| ; CHECK-LE-NEXT: ldr q12, [x3, #208] | |
| ; CHECK-LE-NEXT: ldp q17, q7, [x2, #224] | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI3_0 | |
| ; CHECK-LE-NEXT: bif v22.16b, v8.16b, v30.16b | |
| ; CHECK-LE-NEXT: cmtst v30.4s, v26.4s, v10.4s | |
| ; CHECK-LE-NEXT: cmtst v8.4s, v26.4s, v14.4s | |
| ; CHECK-LE-NEXT: ldp q29, q28, [x3, #224] | |
| ; CHECK-LE-NEXT: stp q1, q2, [sp] // 32-byte Folded Spill | |
| ; CHECK-LE-NEXT: ldp q2, q1, [x2, #96] | |
| ; CHECK-LE-NEXT: cmtst v9.4s, v26.4s, v27.4s | |
| ; CHECK-LE-NEXT: bif v18.16b, v12.16b, v11.16b | |
| ; CHECK-LE-NEXT: ldr q11, [x8, :lo12:.LCPI3_0] | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI3_1 | |
| ; CHECK-LE-NEXT: adrp x9, .LCPI3_2 | |
| ; CHECK-LE-NEXT: ldr q12, [x8, :lo12:.LCPI3_1] | |
| ; CHECK-LE-NEXT: bif v17.16b, v29.16b, v30.16b | |
| ; CHECK-LE-NEXT: ldr q29, [x9, :lo12:.LCPI3_2] | |
| ; CHECK-LE-NEXT: bif v7.16b, v28.16b, v8.16b | |
| ; CHECK-LE-NEXT: stp q3, q1, [sp, #32] // 32-byte Folded Spill | |
| ; CHECK-LE-NEXT: ldp q0, q1, [x2, #64] | |
| ; CHECK-LE-NEXT: dup v16.4s, v16.s[0] | |
| ; CHECK-LE-NEXT: cmtst v30.4s, v26.4s, v11.4s | |
| ; CHECK-LE-NEXT: cmtst v28.4s, v26.4s, v12.4s | |
| ; CHECK-LE-NEXT: cmtst v26.4s, v26.4s, v29.4s | |
| ; CHECK-LE-NEXT: bif v21.16b, v13.16b, v9.16b | |
| ; CHECK-LE-NEXT: ldp q9, q15, [x3, #144] | |
| ; CHECK-LE-NEXT: stp q2, q1, [sp, #64] // 32-byte Folded Spill | |
| ; CHECK-LE-NEXT: ldp q19, q20, [x2, #32] | |
| ; CHECK-LE-NEXT: str q0, [sp, #96] // 16-byte Spill | |
| ; CHECK-LE-NEXT: ldp q23, q24, [x2] | |
| ; CHECK-LE-NEXT: ldp q8, q13, [x3, #112] | |
| ; CHECK-LE-NEXT: ldr q6, [x3] | |
| ; CHECK-LE-NEXT: ldp q1, q0, [x3, #80] | |
| ; CHECK-LE-NEXT: ldp q3, q2, [x3, #48] | |
| ; CHECK-LE-NEXT: ldp q5, q4, [x3, #16] | |
| ; CHECK-LE-NEXT: stp q21, q18, [x0, #192] | |
| ; CHECK-LE-NEXT: stp q17, q7, [x0, #224] | |
| ; CHECK-LE-NEXT: cmtst v7.4s, v16.4s, v14.4s | |
| ; CHECK-LE-NEXT: ldr q14, [sp] // 16-byte Reload | |
| ; CHECK-LE-NEXT: cmtst v18.4s, v16.4s, v31.4s | |
| ; CHECK-LE-NEXT: cmtst v17.4s, v16.4s, v10.4s | |
| ; CHECK-LE-NEXT: cmtst v21.4s, v16.4s, v27.4s | |
| ; CHECK-LE-NEXT: bsl v26.16b, v14.16b, v15.16b | |
| ; CHECK-LE-NEXT: ldr q27, [sp, #48] // 16-byte Reload | |
| ; CHECK-LE-NEXT: ldr q10, [sp, #16] // 16-byte Reload | |
| ; CHECK-LE-NEXT: ldr q31, [sp, #32] // 16-byte Reload | |
| ; CHECK-LE-NEXT: ldp d15, d14, [sp, #112] // 16-byte Folded Reload | |
| ; CHECK-LE-NEXT: bsl v7.16b, v27.16b, v8.16b | |
| ; CHECK-LE-NEXT: bsl v28.16b, v10.16b, v9.16b | |
| ; CHECK-LE-NEXT: bsl v30.16b, v31.16b, v13.16b | |
| ; CHECK-LE-NEXT: ldp d9, d8, [sp, #160] // 16-byte Folded Reload | |
| ; CHECK-LE-NEXT: stp q26, q22, [x0, #160] | |
| ; CHECK-LE-NEXT: cmtst v22.4s, v16.4s, v25.4s | |
| ; CHECK-LE-NEXT: ldp q26, q25, [sp, #64] // 32-byte Folded Reload | |
| ; CHECK-LE-NEXT: stp q30, q28, [x0, #128] | |
| ; CHECK-LE-NEXT: bit v1.16b, v25.16b, v18.16b | |
| ; CHECK-LE-NEXT: ldr q25, [sp, #96] // 16-byte Reload | |
| ; CHECK-LE-NEXT: bit v0.16b, v26.16b, v17.16b | |
| ; CHECK-LE-NEXT: cmtst v17.4s, v16.4s, v29.4s | |
| ; CHECK-LE-NEXT: cmtst v18.4s, v16.4s, v12.4s | |
| ; CHECK-LE-NEXT: cmtst v16.4s, v16.4s, v11.4s | |
| ; CHECK-LE-NEXT: bit v2.16b, v25.16b, v21.16b | |
| ; CHECK-LE-NEXT: bit v3.16b, v20.16b, v22.16b | |
| ; CHECK-LE-NEXT: ldp d11, d10, [sp, #144] // 16-byte Folded Reload | |
| ; CHECK-LE-NEXT: stp q0, q7, [x0, #96] | |
| ; CHECK-LE-NEXT: ldp d13, d12, [sp, #128] // 16-byte Folded Reload | |
| ; CHECK-LE-NEXT: mov v0.16b, v18.16b | |
| ; CHECK-LE-NEXT: bit v4.16b, v19.16b, v17.16b | |
| ; CHECK-LE-NEXT: stp q2, q1, [x0, #64] | |
| ; CHECK-LE-NEXT: mov v1.16b, v16.16b | |
| ; CHECK-LE-NEXT: bsl v0.16b, v24.16b, v5.16b | |
| ; CHECK-LE-NEXT: bsl v1.16b, v23.16b, v6.16b | |
| ; CHECK-LE-NEXT: stp q4, q3, [x0, #32] | |
| ; CHECK-LE-NEXT: stp q1, q0, [x0] | |
| ; CHECK-LE-NEXT: add sp, sp, #176 | |
| ; CHECK-LE-NEXT: ret | |
| ; | |
| ; CHECK-BE-LABEL: if_then_else64: | |
| ; CHECK-BE: // %bb.0: // %start | |
| ; CHECK-BE-NEXT: str d14, [sp, #-64]! // 8-byte Folded Spill | |
| ; CHECK-BE-NEXT: add x8, x2, #240 | |
| ; CHECK-BE-NEXT: fmov d16, x1 | |
| ; CHECK-BE-NEXT: add x9, x2, #224 | |
| ; CHECK-BE-NEXT: ld1 { v5.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x2, #192 | |
| ; CHECK-BE-NEXT: ld1 { v6.4s }, [x9] | |
| ; CHECK-BE-NEXT: ld1 { v7.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x2, #176 | |
| ; CHECK-BE-NEXT: add x9, x2, #160 | |
| ; CHECK-BE-NEXT: ld1 { v18.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x2, #128 | |
| ; CHECK-BE-NEXT: rev64 v29.4s, v16.4s | |
| ; CHECK-BE-NEXT: ld1 { v4.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x2, #80 | |
| ; CHECK-BE-NEXT: ld1 { v3.4s }, [x9] | |
| ; CHECK-BE-NEXT: ld1 { v23.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x2, #32 | |
| ; CHECK-BE-NEXT: add x9, x2, #112 | |
| ; CHECK-BE-NEXT: ld1 { v19.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x3, #240 | |
| ; CHECK-BE-NEXT: ld1 { v20.4s }, [x9] | |
| ; CHECK-BE-NEXT: ld1 { v26.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x3, #224 | |
| ; CHECK-BE-NEXT: add x9, x2, #64 | |
| ; CHECK-BE-NEXT: ld1 { v25.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x3, #208 | |
| ; CHECK-BE-NEXT: ld1 { v27.4s }, [x9] | |
| ; CHECK-BE-NEXT: ld1 { v24.4s }, [x8] | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI3_4 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI3_4 | |
| ; CHECK-BE-NEXT: add x9, x2, #16 | |
| ; CHECK-BE-NEXT: dup v21.4s, v29.s[0] | |
| ; CHECK-BE-NEXT: ld1 { v31.4s }, [x8] | |
| ; CHECK-BE-NEXT: ld1 { v17.4s }, [x9] | |
| ; CHECK-BE-NEXT: add x9, x3, #96 | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI3_5 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI3_5 | |
| ; CHECK-BE-NEXT: ld1 { v30.4s }, [x9] | |
| ; CHECK-BE-NEXT: adrp x9, .LCPI3_6 | |
| ; CHECK-BE-NEXT: add x9, x9, :lo12:.LCPI3_6 | |
| ; CHECK-BE-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill | |
| ; CHECK-BE-NEXT: ld1 { v8.4s }, [x8] | |
| ; CHECK-BE-NEXT: ld1 { v9.4s }, [x9] | |
| ; CHECK-BE-NEXT: add x9, x3, #64 | |
| ; CHECK-BE-NEXT: cmtst v28.4s, v21.4s, v31.4s | |
| ; CHECK-BE-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill | |
| ; CHECK-BE-NEXT: add x10, x2, #208 | |
| ; CHECK-BE-NEXT: add x8, x3, #80 | |
| ; CHECK-BE-NEXT: ld1 { v11.4s }, [x9] | |
| ; CHECK-BE-NEXT: ld1 { v2.4s }, [x10] | |
| ; CHECK-BE-NEXT: add x10, x2, #144 | |
| ; CHECK-BE-NEXT: ld1 { v10.4s }, [x8] | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI3_7 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI3_7 | |
| ; CHECK-BE-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill | |
| ; CHECK-BE-NEXT: ld1 { v1.4s }, [x10] | |
| ; CHECK-BE-NEXT: add x10, x2, #96 | |
| ; CHECK-BE-NEXT: cmtst v12.4s, v21.4s, v8.4s | |
| ; CHECK-BE-NEXT: ld1 { v13.4s }, [x8] | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI3_3 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI3_3 | |
| ; CHECK-BE-NEXT: cmtst v14.4s, v21.4s, v9.4s | |
| ; CHECK-BE-NEXT: ld1 { v22.4s }, [x10] | |
| ; CHECK-BE-NEXT: bif v27.16b, v11.16b, v28.16b | |
| ; CHECK-BE-NEXT: ld1 { v28.4s }, [x8] | |
| ; CHECK-BE-NEXT: dup v29.4s, v29.s[1] | |
| ; CHECK-BE-NEXT: add x8, x3, #192 | |
| ; CHECK-BE-NEXT: add x9, x3, #112 | |
| ; CHECK-BE-NEXT: cmtst v11.4s, v21.4s, v13.4s | |
| ; CHECK-BE-NEXT: bif v23.16b, v10.16b, v12.16b | |
| ; CHECK-BE-NEXT: ld1 { v10.4s }, [x8] | |
| ; CHECK-BE-NEXT: ld1 { v12.4s }, [x9] | |
| ; CHECK-BE-NEXT: add x8, x3, #176 | |
| ; CHECK-BE-NEXT: bif v22.16b, v30.16b, v14.16b | |
| ; CHECK-BE-NEXT: cmtst v30.4s, v29.4s, v28.4s | |
| ; CHECK-BE-NEXT: ld1 { v14.4s }, [x8] | |
| ; CHECK-BE-NEXT: cmtst v31.4s, v29.4s, v31.4s | |
| ; CHECK-BE-NEXT: add x9, x3, #144 | |
| ; CHECK-BE-NEXT: cmtst v13.4s, v29.4s, v13.4s | |
| ; CHECK-BE-NEXT: add x8, x3, #160 | |
| ; CHECK-BE-NEXT: bif v20.16b, v12.16b, v11.16b | |
| ; CHECK-BE-NEXT: ld1 { v12.4s }, [x9] | |
| ; CHECK-BE-NEXT: add x9, x3, #48 | |
| ; CHECK-BE-NEXT: ld1 { v11.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x3, #128 | |
| ; CHECK-BE-NEXT: bif v18.16b, v14.16b, v30.16b | |
| ; CHECK-BE-NEXT: ld1 { v14.4s }, [x9] | |
| ; CHECK-BE-NEXT: adrp x9, .LCPI3_2 | |
| ; CHECK-BE-NEXT: add x9, x9, :lo12:.LCPI3_2 | |
| ; CHECK-BE-NEXT: cmtst v9.4s, v29.4s, v9.4s | |
| ; CHECK-BE-NEXT: ld1 { v30.4s }, [x8] | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI3_0 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI3_0 | |
| ; CHECK-BE-NEXT: bif v7.16b, v10.16b, v31.16b | |
| ; CHECK-BE-NEXT: ld1 { v31.4s }, [x9] | |
| ; CHECK-BE-NEXT: cmtst v8.4s, v29.4s, v8.4s | |
| ; CHECK-BE-NEXT: adrp x9, .LCPI3_1 | |
| ; CHECK-BE-NEXT: add x9, x9, :lo12:.LCPI3_1 | |
| ; CHECK-BE-NEXT: bif v5.16b, v26.16b, v13.16b | |
| ; CHECK-BE-NEXT: ld1 { v10.4s }, [x9] | |
| ; CHECK-BE-NEXT: ld1 { v26.4s }, [x8] | |
| ; CHECK-BE-NEXT: bif v6.16b, v25.16b, v9.16b | |
| ; CHECK-BE-NEXT: cmtst v25.4s, v29.4s, v31.4s | |
| ; CHECK-BE-NEXT: add x8, x3, #16 | |
| ; CHECK-BE-NEXT: add x10, x2, #48 | |
| ; CHECK-BE-NEXT: bif v2.16b, v24.16b, v8.16b | |
| ; CHECK-BE-NEXT: add x9, x3, #32 | |
| ; CHECK-BE-NEXT: ld1 { v24.4s }, [x8] | |
| ; CHECK-BE-NEXT: cmtst v9.4s, v29.4s, v10.4s | |
| ; CHECK-BE-NEXT: cmtst v29.4s, v29.4s, v26.4s | |
| ; CHECK-BE-NEXT: add x8, x0, #240 | |
| ; CHECK-BE-NEXT: ld1 { v0.4s }, [x10] | |
| ; CHECK-BE-NEXT: ld1 { v16.4s }, [x2] | |
| ; CHECK-BE-NEXT: ld1 { v13.4s }, [x9] | |
| ; CHECK-BE-NEXT: ld1 { v8.4s }, [x3] | |
| ; CHECK-BE-NEXT: st1 { v5.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x0, #224 | |
| ; CHECK-BE-NEXT: bif v3.16b, v11.16b, v25.16b | |
| ; CHECK-BE-NEXT: st1 { v6.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x0, #208 | |
| ; CHECK-BE-NEXT: st1 { v2.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x0, #192 | |
| ; CHECK-BE-NEXT: mov v2.16b, v29.16b | |
| ; CHECK-BE-NEXT: st1 { v7.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x0, #176 | |
| ; CHECK-BE-NEXT: bif v1.16b, v12.16b, v9.16b | |
| ; CHECK-BE-NEXT: st1 { v18.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x0, #160 | |
| ; CHECK-BE-NEXT: cmtst v5.4s, v21.4s, v26.4s | |
| ; CHECK-BE-NEXT: bsl v2.16b, v4.16b, v30.16b | |
| ; CHECK-BE-NEXT: st1 { v3.4s }, [x8] | |
| ; CHECK-BE-NEXT: cmtst v3.4s, v21.4s, v31.4s | |
| ; CHECK-BE-NEXT: cmtst v4.4s, v21.4s, v28.4s | |
| ; CHECK-BE-NEXT: add x8, x0, #144 | |
| ; CHECK-BE-NEXT: st1 { v1.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x0, #128 | |
| ; CHECK-BE-NEXT: cmtst v1.4s, v21.4s, v10.4s | |
| ; CHECK-BE-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload | |
| ; CHECK-BE-NEXT: st1 { v2.4s }, [x8] | |
| ; CHECK-BE-NEXT: mov v2.16b, v3.16b | |
| ; CHECK-BE-NEXT: add x8, x0, #112 | |
| ; CHECK-BE-NEXT: mov v3.16b, v5.16b | |
| ; CHECK-BE-NEXT: bif v0.16b, v14.16b, v4.16b | |
| ; CHECK-BE-NEXT: st1 { v20.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x0, #96 | |
| ; CHECK-BE-NEXT: bsl v1.16b, v17.16b, v24.16b | |
| ; CHECK-BE-NEXT: bsl v2.16b, v19.16b, v13.16b | |
| ; CHECK-BE-NEXT: st1 { v22.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x0, #80 | |
| ; CHECK-BE-NEXT: st1 { v23.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x0, #64 | |
| ; CHECK-BE-NEXT: bsl v3.16b, v16.16b, v8.16b | |
| ; CHECK-BE-NEXT: st1 { v27.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x0, #48 | |
| ; CHECK-BE-NEXT: st1 { v0.4s }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x0, #32 | |
| ; CHECK-BE-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload | |
| ; CHECK-BE-NEXT: st1 { v2.4s }, [x8] | |
| ; CHECK-BE-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload | |
| ; CHECK-BE-NEXT: add x8, x0, #16 | |
| ; CHECK-BE-NEXT: st1 { v1.4s }, [x8] | |
| ; CHECK-BE-NEXT: st1 { v3.4s }, [x0] | |
| ; CHECK-BE-NEXT: ldr d14, [sp], #64 // 8-byte Folded Reload | |
| ; CHECK-BE-NEXT: ret | |
| start: | |
| %if_true.val = load <64 x i32>, ptr %if_true, align 4 | |
| %if_false.val = load <64 x i32>, ptr %if_false, align 4 | |
| %0 = bitcast i64 %mask to <64 x i1> | |
| %1 = select <64 x i1> %0, <64 x i32> %if_true.val, <64 x i32> %if_false.val | |
| store <64 x i32> %1, ptr %out, align 4 | |
| ret void | |
| } | |
| define <8 x i8> @broadcast_u8_to_v8i8_zext(i8 %x) { | |
| ; CHECK-LE-LABEL: broadcast_u8_to_v8i8_zext: | |
| ; CHECK-LE: // %bb.0: | |
| ; CHECK-LE-NEXT: dup v0.8b, w0 | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI4_0 | |
| ; CHECK-LE-NEXT: ldr d1, [x8, :lo12:.LCPI4_0] | |
| ; CHECK-LE-NEXT: cmtst v0.8b, v0.8b, v1.8b | |
| ; CHECK-LE-NEXT: ushr v0.8b, v0.8b, #7 | |
| ; CHECK-LE-NEXT: ret | |
| ; | |
| ; CHECK-BE-LABEL: broadcast_u8_to_v8i8_zext: | |
| ; CHECK-BE: // %bb.0: | |
| ; CHECK-BE-NEXT: dup v0.8b, w0 | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI4_0 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI4_0 | |
| ; CHECK-BE-NEXT: ld1 { v1.8b }, [x8] | |
| ; CHECK-BE-NEXT: cmtst v0.8b, v0.8b, v1.8b | |
| ; CHECK-BE-NEXT: ushr v0.8b, v0.8b, #7 | |
| ; CHECK-BE-NEXT: rev64 v0.8b, v0.8b | |
| ; CHECK-BE-NEXT: ret | |
| %v1 = bitcast i8 %x to <8 x i1> | |
| %v8 = zext <8 x i1> %v1 to <8 x i8> | |
| ret <8 x i8> %v8 | |
| } | |
| define <8 x i8> @broadcast_u8_to_v8i8_sext(i8 %x) { | |
| ; CHECK-LE-LABEL: broadcast_u8_to_v8i8_sext: | |
| ; CHECK-LE: // %bb.0: | |
| ; CHECK-LE-NEXT: dup v0.8b, w0 | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI5_0 | |
| ; CHECK-LE-NEXT: ldr d1, [x8, :lo12:.LCPI5_0] | |
| ; CHECK-LE-NEXT: cmtst v0.8b, v0.8b, v1.8b | |
| ; CHECK-LE-NEXT: ret | |
| ; | |
| ; CHECK-BE-LABEL: broadcast_u8_to_v8i8_sext: | |
| ; CHECK-BE: // %bb.0: | |
| ; CHECK-BE-NEXT: dup v0.8b, w0 | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI5_0 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI5_0 | |
| ; CHECK-BE-NEXT: ld1 { v1.8b }, [x8] | |
| ; CHECK-BE-NEXT: cmtst v0.8b, v0.8b, v1.8b | |
| ; CHECK-BE-NEXT: rev64 v0.8b, v0.8b | |
| ; CHECK-BE-NEXT: ret | |
| %v1 = bitcast i8 %x to <8 x i1> | |
| %v8 = sext <8 x i1> %v1 to <8 x i8> | |
| ret <8 x i8> %v8 | |
| } | |
| define <16 x i8> @broadcast_u16_to_v16i8_zext(i16 %x) { | |
| ; CHECK-LE-LABEL: broadcast_u16_to_v16i8_zext: | |
| ; CHECK-LE: // %bb.0: | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI6_0 | |
| ; CHECK-LE-NEXT: fmov s1, w0 | |
| ; CHECK-LE-NEXT: ldr q0, [x8, :lo12:.LCPI6_0] | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI6_1 | |
| ; CHECK-LE-NEXT: tbl v0.16b, { v1.16b }, v0.16b | |
| ; CHECK-LE-NEXT: ldr q1, [x8, :lo12:.LCPI6_1] | |
| ; CHECK-LE-NEXT: cmtst v0.16b, v0.16b, v1.16b | |
| ; CHECK-LE-NEXT: ushr v0.16b, v0.16b, #7 | |
| ; CHECK-LE-NEXT: ret | |
| ; | |
| ; CHECK-BE-LABEL: broadcast_u16_to_v16i8_zext: | |
| ; CHECK-BE: // %bb.0: | |
| ; CHECK-BE-NEXT: fmov s0, w0 | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI6_0 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI6_0 | |
| ; CHECK-BE-NEXT: ld1 { v1.16b }, [x8] | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI6_1 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI6_1 | |
| ; CHECK-BE-NEXT: rev16 v0.16b, v0.16b | |
| ; CHECK-BE-NEXT: tbl v0.16b, { v0.16b }, v1.16b | |
| ; CHECK-BE-NEXT: ld1 { v1.16b }, [x8] | |
| ; CHECK-BE-NEXT: cmtst v0.16b, v0.16b, v1.16b | |
| ; CHECK-BE-NEXT: ushr v0.16b, v0.16b, #7 | |
| ; CHECK-BE-NEXT: rev64 v0.16b, v0.16b | |
| ; CHECK-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8 | |
| ; CHECK-BE-NEXT: ret | |
| %v1 = bitcast i16 %x to <16 x i1> | |
| %v8 = zext <16 x i1> %v1 to <16 x i8> | |
| ret <16 x i8> %v8 | |
| } | |
| define <16 x i8> @broadcast_u16_to_v16i8_sext(i16 %x) { | |
| ; CHECK-LE-LABEL: broadcast_u16_to_v16i8_sext: | |
| ; CHECK-LE: // %bb.0: | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI7_0 | |
| ; CHECK-LE-NEXT: fmov s1, w0 | |
| ; CHECK-LE-NEXT: ldr q0, [x8, :lo12:.LCPI7_0] | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI7_1 | |
| ; CHECK-LE-NEXT: tbl v0.16b, { v1.16b }, v0.16b | |
| ; CHECK-LE-NEXT: ldr q1, [x8, :lo12:.LCPI7_1] | |
| ; CHECK-LE-NEXT: cmtst v0.16b, v0.16b, v1.16b | |
| ; CHECK-LE-NEXT: ret | |
| ; | |
| ; CHECK-BE-LABEL: broadcast_u16_to_v16i8_sext: | |
| ; CHECK-BE: // %bb.0: | |
| ; CHECK-BE-NEXT: fmov s0, w0 | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI7_0 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI7_0 | |
| ; CHECK-BE-NEXT: ld1 { v1.16b }, [x8] | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI7_1 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI7_1 | |
| ; CHECK-BE-NEXT: rev16 v0.16b, v0.16b | |
| ; CHECK-BE-NEXT: tbl v0.16b, { v0.16b }, v1.16b | |
| ; CHECK-BE-NEXT: ld1 { v1.16b }, [x8] | |
| ; CHECK-BE-NEXT: cmtst v0.16b, v0.16b, v1.16b | |
| ; CHECK-BE-NEXT: rev64 v0.16b, v0.16b | |
| ; CHECK-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8 | |
| ; CHECK-BE-NEXT: ret | |
| %v1 = bitcast i16 %x to <16 x i1> | |
| %v8 = sext <16 x i1> %v1 to <16 x i8> | |
| ret <16 x i8> %v8 | |
| } | |
| define <32 x i8> @broadcast_u32_to_v32i8_zext(i32 %x) { | |
| ; CHECK-LE-LABEL: broadcast_u32_to_v32i8_zext: | |
| ; CHECK-LE: // %bb.0: | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI8_0 | |
| ; CHECK-LE-NEXT: adrp x9, .LCPI8_2 | |
| ; CHECK-LE-NEXT: fmov s2, w0 | |
| ; CHECK-LE-NEXT: ldr q0, [x8, :lo12:.LCPI8_0] | |
| ; CHECK-LE-NEXT: ldr q1, [x9, :lo12:.LCPI8_2] | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI8_1 | |
| ; CHECK-LE-NEXT: tbl v0.16b, { v2.16b }, v0.16b | |
| ; CHECK-LE-NEXT: tbl v1.16b, { v2.16b }, v1.16b | |
| ; CHECK-LE-NEXT: ldr q2, [x8, :lo12:.LCPI8_1] | |
| ; CHECK-LE-NEXT: cmtst v0.16b, v0.16b, v2.16b | |
| ; CHECK-LE-NEXT: cmtst v1.16b, v1.16b, v2.16b | |
| ; CHECK-LE-NEXT: ushr v0.16b, v0.16b, #7 | |
| ; CHECK-LE-NEXT: ushr v1.16b, v1.16b, #7 | |
| ; CHECK-LE-NEXT: ret | |
| ; | |
| ; CHECK-BE-LABEL: broadcast_u32_to_v32i8_zext: | |
| ; CHECK-BE: // %bb.0: | |
| ; CHECK-BE-NEXT: fmov s0, w0 | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI8_0 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI8_0 | |
| ; CHECK-BE-NEXT: ld1 { v1.16b }, [x8] | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI8_2 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI8_2 | |
| ; CHECK-BE-NEXT: ld1 { v2.16b }, [x8] | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI8_1 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI8_1 | |
| ; CHECK-BE-NEXT: rev32 v0.16b, v0.16b | |
| ; CHECK-BE-NEXT: tbl v1.16b, { v0.16b }, v1.16b | |
| ; CHECK-BE-NEXT: tbl v0.16b, { v0.16b }, v2.16b | |
| ; CHECK-BE-NEXT: ld1 { v2.16b }, [x8] | |
| ; CHECK-BE-NEXT: cmtst v1.16b, v1.16b, v2.16b | |
| ; CHECK-BE-NEXT: cmtst v0.16b, v0.16b, v2.16b | |
| ; CHECK-BE-NEXT: ushr v1.16b, v1.16b, #7 | |
| ; CHECK-BE-NEXT: ushr v0.16b, v0.16b, #7 | |
| ; CHECK-BE-NEXT: rev64 v0.16b, v0.16b | |
| ; CHECK-BE-NEXT: rev64 v1.16b, v1.16b | |
| ; CHECK-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8 | |
| ; CHECK-BE-NEXT: ext v1.16b, v1.16b, v1.16b, #8 | |
| ; CHECK-BE-NEXT: ret | |
| %v1 = bitcast i32 %x to <32 x i1> | |
| %v8 = zext <32 x i1> %v1 to <32 x i8> | |
| ret <32 x i8> %v8 | |
| } | |
| define <32 x i8> @broadcast_u32_to_v32i8_sext(i32 %x) { | |
| ; CHECK-LE-LABEL: broadcast_u32_to_v32i8_sext: | |
| ; CHECK-LE: // %bb.0: | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI9_0 | |
| ; CHECK-LE-NEXT: adrp x9, .LCPI9_2 | |
| ; CHECK-LE-NEXT: fmov s2, w0 | |
| ; CHECK-LE-NEXT: ldr q0, [x8, :lo12:.LCPI9_0] | |
| ; CHECK-LE-NEXT: ldr q1, [x9, :lo12:.LCPI9_2] | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI9_1 | |
| ; CHECK-LE-NEXT: tbl v0.16b, { v2.16b }, v0.16b | |
| ; CHECK-LE-NEXT: tbl v1.16b, { v2.16b }, v1.16b | |
| ; CHECK-LE-NEXT: ldr q2, [x8, :lo12:.LCPI9_1] | |
| ; CHECK-LE-NEXT: cmtst v0.16b, v0.16b, v2.16b | |
| ; CHECK-LE-NEXT: cmtst v1.16b, v1.16b, v2.16b | |
| ; CHECK-LE-NEXT: ret | |
| ; | |
| ; CHECK-BE-LABEL: broadcast_u32_to_v32i8_sext: | |
| ; CHECK-BE: // %bb.0: | |
| ; CHECK-BE-NEXT: fmov s0, w0 | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI9_0 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI9_0 | |
| ; CHECK-BE-NEXT: ld1 { v1.16b }, [x8] | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI9_2 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI9_2 | |
| ; CHECK-BE-NEXT: ld1 { v2.16b }, [x8] | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI9_1 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI9_1 | |
| ; CHECK-BE-NEXT: rev32 v0.16b, v0.16b | |
| ; CHECK-BE-NEXT: tbl v1.16b, { v0.16b }, v1.16b | |
| ; CHECK-BE-NEXT: tbl v0.16b, { v0.16b }, v2.16b | |
| ; CHECK-BE-NEXT: ld1 { v2.16b }, [x8] | |
| ; CHECK-BE-NEXT: cmtst v1.16b, v1.16b, v2.16b | |
| ; CHECK-BE-NEXT: cmtst v0.16b, v0.16b, v2.16b | |
| ; CHECK-BE-NEXT: rev64 v0.16b, v0.16b | |
| ; CHECK-BE-NEXT: rev64 v1.16b, v1.16b | |
| ; CHECK-BE-NEXT: ext v0.16b, v0.16b, v0.16b, #8 | |
| ; CHECK-BE-NEXT: ext v1.16b, v1.16b, v1.16b, #8 | |
| ; CHECK-BE-NEXT: ret | |
| %v1 = bitcast i32 %x to <32 x i1> | |
| %v8 = sext <32 x i1> %v1 to <32 x i8> | |
| ret <32 x i8> %v8 | |
| } | |
| define <64 x i8> @broadcast_u64_to_v64i8_zext(i64 %x) { | |
| ; CHECK-LE-LABEL: broadcast_u64_to_v64i8_zext: | |
| ; CHECK-LE: // %bb.0: | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI10_0 | |
| ; CHECK-LE-NEXT: adrp x9, .LCPI10_2 | |
| ; CHECK-LE-NEXT: fmov d0, x0 | |
| ; CHECK-LE-NEXT: adrp x10, .LCPI10_3 | |
| ; CHECK-LE-NEXT: ldr q1, [x8, :lo12:.LCPI10_0] | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI10_4 | |
| ; CHECK-LE-NEXT: ldr q2, [x9, :lo12:.LCPI10_2] | |
| ; CHECK-LE-NEXT: ldr q3, [x10, :lo12:.LCPI10_3] | |
| ; CHECK-LE-NEXT: ldr q4, [x8, :lo12:.LCPI10_4] | |
| ; CHECK-LE-NEXT: tbl v1.16b, { v0.16b }, v1.16b | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI10_1 | |
| ; CHECK-LE-NEXT: tbl v2.16b, { v0.16b }, v2.16b | |
| ; CHECK-LE-NEXT: tbl v3.16b, { v0.16b }, v3.16b | |
| ; CHECK-LE-NEXT: tbl v0.16b, { v0.16b }, v4.16b | |
| ; CHECK-LE-NEXT: ldr q4, [x8, :lo12:.LCPI10_1] | |
| ; CHECK-LE-NEXT: cmtst v1.16b, v1.16b, v4.16b | |
| ; CHECK-LE-NEXT: cmtst v2.16b, v2.16b, v4.16b | |
| ; CHECK-LE-NEXT: cmtst v3.16b, v3.16b, v4.16b | |
| ; CHECK-LE-NEXT: cmtst v4.16b, v0.16b, v4.16b | |
| ; CHECK-LE-NEXT: ushr v0.16b, v1.16b, #7 | |
| ; CHECK-LE-NEXT: ushr v1.16b, v2.16b, #7 | |
| ; CHECK-LE-NEXT: ushr v2.16b, v3.16b, #7 | |
| ; CHECK-LE-NEXT: ushr v3.16b, v4.16b, #7 | |
| ; CHECK-LE-NEXT: ret | |
| ; | |
| ; CHECK-BE-LABEL: broadcast_u64_to_v64i8_zext: | |
| ; CHECK-BE: // %bb.0: | |
| ; CHECK-BE-NEXT: fmov d0, x0 | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI10_0 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI10_0 | |
| ; CHECK-BE-NEXT: ld1 { v1.16b }, [x8] | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI10_4 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI10_4 | |
| ; CHECK-BE-NEXT: adrp x9, .LCPI10_2 | |
| ; CHECK-BE-NEXT: add x9, x9, :lo12:.LCPI10_2 | |
| ; CHECK-BE-NEXT: ld1 { v3.16b }, [x8] | |
| ; CHECK-BE-NEXT: rev64 v0.16b, v0.16b | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI10_3 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI10_3 | |
| ; CHECK-BE-NEXT: ld1 { v2.16b }, [x9] | |
| ; CHECK-BE-NEXT: ld1 { v4.16b }, [x8] | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI10_1 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI10_1 | |
| ; CHECK-BE-NEXT: ld1 { v5.16b }, [x8] | |
| ; CHECK-BE-NEXT: tbl v3.16b, { v0.16b }, v3.16b | |
| ; CHECK-BE-NEXT: tbl v1.16b, { v0.16b }, v1.16b | |
| ; CHECK-BE-NEXT: tbl v2.16b, { v0.16b }, v2.16b | |
| ; CHECK-BE-NEXT: tbl v0.16b, { v0.16b }, v4.16b | |
| ; CHECK-BE-NEXT: cmtst v3.16b, v3.16b, v5.16b | |
| ; CHECK-BE-NEXT: cmtst v1.16b, v1.16b, v5.16b | |
| ; CHECK-BE-NEXT: cmtst v2.16b, v2.16b, v5.16b | |
| ; CHECK-BE-NEXT: cmtst v0.16b, v0.16b, v5.16b | |
| ; CHECK-BE-NEXT: ushr v3.16b, v3.16b, #7 | |
| ; CHECK-BE-NEXT: ushr v1.16b, v1.16b, #7 | |
| ; CHECK-BE-NEXT: ushr v2.16b, v2.16b, #7 | |
| ; CHECK-BE-NEXT: ushr v0.16b, v0.16b, #7 | |
| ; CHECK-BE-NEXT: rev64 v3.16b, v3.16b | |
| ; CHECK-BE-NEXT: rev64 v2.16b, v2.16b | |
| ; CHECK-BE-NEXT: rev64 v5.16b, v1.16b | |
| ; CHECK-BE-NEXT: rev64 v4.16b, v0.16b | |
| ; CHECK-BE-NEXT: ext v0.16b, v3.16b, v3.16b, #8 | |
| ; CHECK-BE-NEXT: ext v2.16b, v2.16b, v2.16b, #8 | |
| ; CHECK-BE-NEXT: ext v3.16b, v5.16b, v5.16b, #8 | |
| ; CHECK-BE-NEXT: ext v1.16b, v4.16b, v4.16b, #8 | |
| ; CHECK-BE-NEXT: ret | |
| %v1 = bitcast i64 %x to <64 x i1> | |
| %v8 = zext <64 x i1> %v1 to <64 x i8> | |
| ret <64 x i8> %v8 | |
| } | |
| define <64 x i8> @broadcast_u64_to_v64i8_sext(i64 %x) { | |
| ; CHECK-LE-LABEL: broadcast_u64_to_v64i8_sext: | |
| ; CHECK-LE: // %bb.0: | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI11_0 | |
| ; CHECK-LE-NEXT: adrp x9, .LCPI11_2 | |
| ; CHECK-LE-NEXT: fmov d0, x0 | |
| ; CHECK-LE-NEXT: adrp x10, .LCPI11_3 | |
| ; CHECK-LE-NEXT: ldr q1, [x8, :lo12:.LCPI11_0] | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI11_4 | |
| ; CHECK-LE-NEXT: ldr q2, [x9, :lo12:.LCPI11_2] | |
| ; CHECK-LE-NEXT: ldr q3, [x10, :lo12:.LCPI11_3] | |
| ; CHECK-LE-NEXT: ldr q4, [x8, :lo12:.LCPI11_4] | |
| ; CHECK-LE-NEXT: tbl v1.16b, { v0.16b }, v1.16b | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI11_1 | |
| ; CHECK-LE-NEXT: tbl v2.16b, { v0.16b }, v2.16b | |
| ; CHECK-LE-NEXT: tbl v3.16b, { v0.16b }, v3.16b | |
| ; CHECK-LE-NEXT: tbl v4.16b, { v0.16b }, v4.16b | |
| ; CHECK-LE-NEXT: ldr q5, [x8, :lo12:.LCPI11_1] | |
| ; CHECK-LE-NEXT: cmtst v0.16b, v1.16b, v5.16b | |
| ; CHECK-LE-NEXT: cmtst v1.16b, v2.16b, v5.16b | |
| ; CHECK-LE-NEXT: cmtst v2.16b, v3.16b, v5.16b | |
| ; CHECK-LE-NEXT: cmtst v3.16b, v4.16b, v5.16b | |
| ; CHECK-LE-NEXT: ret | |
| ; | |
| ; CHECK-BE-LABEL: broadcast_u64_to_v64i8_sext: | |
| ; CHECK-BE: // %bb.0: | |
| ; CHECK-BE-NEXT: fmov d0, x0 | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI11_0 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI11_0 | |
| ; CHECK-BE-NEXT: ld1 { v1.16b }, [x8] | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI11_4 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI11_4 | |
| ; CHECK-BE-NEXT: adrp x9, .LCPI11_2 | |
| ; CHECK-BE-NEXT: add x9, x9, :lo12:.LCPI11_2 | |
| ; CHECK-BE-NEXT: ld1 { v3.16b }, [x8] | |
| ; CHECK-BE-NEXT: rev64 v0.16b, v0.16b | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI11_3 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI11_3 | |
| ; CHECK-BE-NEXT: ld1 { v2.16b }, [x9] | |
| ; CHECK-BE-NEXT: ld1 { v4.16b }, [x8] | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI11_1 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI11_1 | |
| ; CHECK-BE-NEXT: ld1 { v5.16b }, [x8] | |
| ; CHECK-BE-NEXT: tbl v3.16b, { v0.16b }, v3.16b | |
| ; CHECK-BE-NEXT: tbl v1.16b, { v0.16b }, v1.16b | |
| ; CHECK-BE-NEXT: tbl v2.16b, { v0.16b }, v2.16b | |
| ; CHECK-BE-NEXT: tbl v0.16b, { v0.16b }, v4.16b | |
| ; CHECK-BE-NEXT: cmtst v3.16b, v3.16b, v5.16b | |
| ; CHECK-BE-NEXT: cmtst v1.16b, v1.16b, v5.16b | |
| ; CHECK-BE-NEXT: cmtst v2.16b, v2.16b, v5.16b | |
| ; CHECK-BE-NEXT: cmtst v0.16b, v0.16b, v5.16b | |
| ; CHECK-BE-NEXT: rev64 v3.16b, v3.16b | |
| ; CHECK-BE-NEXT: rev64 v2.16b, v2.16b | |
| ; CHECK-BE-NEXT: rev64 v5.16b, v1.16b | |
| ; CHECK-BE-NEXT: rev64 v4.16b, v0.16b | |
| ; CHECK-BE-NEXT: ext v0.16b, v3.16b, v3.16b, #8 | |
| ; CHECK-BE-NEXT: ext v2.16b, v2.16b, v2.16b, #8 | |
| ; CHECK-BE-NEXT: ext v3.16b, v5.16b, v5.16b, #8 | |
| ; CHECK-BE-NEXT: ext v1.16b, v4.16b, v4.16b, #8 | |
| ; CHECK-BE-NEXT: ret | |
| %v1 = bitcast i64 %x to <64 x i1> | |
| %v8 = sext <64 x i1> %v1 to <64 x i8> | |
| ret <64 x i8> %v8 | |
| } | |
| define void @if_then_else8_i8(ptr %out, i8 %mask, ptr %if_true, ptr %if_false) { | |
| ; CHECK-LE-LABEL: if_then_else8_i8: | |
| ; CHECK-LE: // %bb.0: // %start | |
| ; CHECK-LE-NEXT: dup v0.8b, w1 | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI12_0 | |
| ; CHECK-LE-NEXT: ldr d2, [x3] | |
| ; CHECK-LE-NEXT: ldr d1, [x8, :lo12:.LCPI12_0] | |
| ; CHECK-LE-NEXT: cmtst v0.8b, v0.8b, v1.8b | |
| ; CHECK-LE-NEXT: ldr d1, [x2] | |
| ; CHECK-LE-NEXT: bsl v0.8b, v1.8b, v2.8b | |
| ; CHECK-LE-NEXT: str d0, [x0] | |
| ; CHECK-LE-NEXT: ret | |
| ; | |
| ; CHECK-BE-LABEL: if_then_else8_i8: | |
| ; CHECK-BE: // %bb.0: // %start | |
| ; CHECK-BE-NEXT: dup v0.8b, w1 | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI12_0 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI12_0 | |
| ; CHECK-BE-NEXT: ld1 { v1.8b }, [x8] | |
| ; CHECK-BE-NEXT: ld1 { v2.8b }, [x3] | |
| ; CHECK-BE-NEXT: cmtst v0.8b, v0.8b, v1.8b | |
| ; CHECK-BE-NEXT: ld1 { v1.8b }, [x2] | |
| ; CHECK-BE-NEXT: bsl v0.8b, v1.8b, v2.8b | |
| ; CHECK-BE-NEXT: st1 { v0.8b }, [x0] | |
| ; CHECK-BE-NEXT: ret | |
| start: | |
| %t = load <8 x i8>, ptr %if_true, align 4 | |
| %f = load <8 x i8>, ptr %if_false, align 4 | |
| %m = bitcast i8 %mask to <8 x i1> | |
| %s = select <8 x i1> %m, <8 x i8> %t, <8 x i8> %f | |
| store <8 x i8> %s, ptr %out, align 4 | |
| ret void | |
| } | |
| define void @if_then_else16_i16(ptr %out, i16 %mask, ptr %if_true, ptr %if_false) { | |
| ; CHECK-LE-LABEL: if_then_else16_i16: | |
| ; CHECK-LE: // %bb.0: // %start | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI13_1 | |
| ; CHECK-LE-NEXT: dup v0.8h, w1 | |
| ; CHECK-LE-NEXT: ldr q1, [x8, :lo12:.LCPI13_1] | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI13_0 | |
| ; CHECK-LE-NEXT: ldr q2, [x8, :lo12:.LCPI13_0] | |
| ; CHECK-LE-NEXT: ldp q4, q3, [x2] | |
| ; CHECK-LE-NEXT: cmtst v1.8h, v0.8h, v1.8h | |
| ; CHECK-LE-NEXT: cmtst v0.8h, v0.8h, v2.8h | |
| ; CHECK-LE-NEXT: ldp q5, q2, [x3] | |
| ; CHECK-LE-NEXT: bsl v1.16b, v3.16b, v2.16b | |
| ; CHECK-LE-NEXT: bsl v0.16b, v4.16b, v5.16b | |
| ; CHECK-LE-NEXT: stp q0, q1, [x0] | |
| ; CHECK-LE-NEXT: ret | |
| ; | |
| ; CHECK-BE-LABEL: if_then_else16_i16: | |
| ; CHECK-BE: // %bb.0: // %start | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI13_1 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI13_1 | |
| ; CHECK-BE-NEXT: dup v0.8h, w1 | |
| ; CHECK-BE-NEXT: ld1 { v1.8h }, [x8] | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI13_0 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI13_0 | |
| ; CHECK-BE-NEXT: ld1 { v2.8h }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x2, #16 | |
| ; CHECK-BE-NEXT: add x9, x3, #16 | |
| ; CHECK-BE-NEXT: ld1 { v3.8h }, [x8] | |
| ; CHECK-BE-NEXT: ld1 { v4.8h }, [x9] | |
| ; CHECK-BE-NEXT: ld1 { v5.8h }, [x3] | |
| ; CHECK-BE-NEXT: cmtst v1.8h, v0.8h, v1.8h | |
| ; CHECK-BE-NEXT: add x8, x0, #16 | |
| ; CHECK-BE-NEXT: cmtst v0.8h, v0.8h, v2.8h | |
| ; CHECK-BE-NEXT: ld1 { v2.8h }, [x2] | |
| ; CHECK-BE-NEXT: bsl v1.16b, v3.16b, v4.16b | |
| ; CHECK-BE-NEXT: bsl v0.16b, v2.16b, v5.16b | |
| ; CHECK-BE-NEXT: st1 { v1.8h }, [x8] | |
| ; CHECK-BE-NEXT: st1 { v0.8h }, [x0] | |
| ; CHECK-BE-NEXT: ret | |
| start: | |
| %t = load <16 x i16>, ptr %if_true, align 4 | |
| %f = load <16 x i16>, ptr %if_false, align 4 | |
| %m = bitcast i16 %mask to <16 x i1> | |
| %s = select <16 x i1> %m, <16 x i16> %t, <16 x i16> %f | |
| store <16 x i16> %s, ptr %out, align 4 | |
| ret void | |
| } | |
| define void @if_then_else32_i8(ptr %out, i32 %mask, ptr %if_true, ptr %if_false) { | |
| ; CHECK-LE-LABEL: if_then_else32_i8: | |
| ; CHECK-LE: // %bb.0: // %start | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI14_2 | |
| ; CHECK-LE-NEXT: fmov s1, w1 | |
| ; CHECK-LE-NEXT: ldr q0, [x8, :lo12:.LCPI14_2] | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI14_0 | |
| ; CHECK-LE-NEXT: ldr q2, [x8, :lo12:.LCPI14_0] | |
| ; CHECK-LE-NEXT: adrp x8, .LCPI14_1 | |
| ; CHECK-LE-NEXT: tbl v0.16b, { v1.16b }, v0.16b | |
| ; CHECK-LE-NEXT: ldp q4, q3, [x2] | |
| ; CHECK-LE-NEXT: tbl v1.16b, { v1.16b }, v2.16b | |
| ; CHECK-LE-NEXT: ldr q2, [x8, :lo12:.LCPI14_1] | |
| ; CHECK-LE-NEXT: cmtst v0.16b, v0.16b, v2.16b | |
| ; CHECK-LE-NEXT: cmtst v1.16b, v1.16b, v2.16b | |
| ; CHECK-LE-NEXT: ldp q5, q2, [x3] | |
| ; CHECK-LE-NEXT: bsl v0.16b, v3.16b, v2.16b | |
| ; CHECK-LE-NEXT: bsl v1.16b, v4.16b, v5.16b | |
| ; CHECK-LE-NEXT: stp q1, q0, [x0] | |
| ; CHECK-LE-NEXT: ret | |
| ; | |
| ; CHECK-BE-LABEL: if_then_else32_i8: | |
| ; CHECK-BE: // %bb.0: // %start | |
| ; CHECK-BE-NEXT: fmov s0, w1 | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI14_2 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI14_2 | |
| ; CHECK-BE-NEXT: ld1 { v1.16b }, [x8] | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI14_0 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI14_0 | |
| ; CHECK-BE-NEXT: ld1 { v2.16b }, [x8] | |
| ; CHECK-BE-NEXT: adrp x8, .LCPI14_1 | |
| ; CHECK-BE-NEXT: add x8, x8, :lo12:.LCPI14_1 | |
| ; CHECK-BE-NEXT: rev32 v0.16b, v0.16b | |
| ; CHECK-BE-NEXT: ld1 { v3.16b }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x2, #16 | |
| ; CHECK-BE-NEXT: add x9, x3, #16 | |
| ; CHECK-BE-NEXT: ld1 { v5.16b }, [x3] | |
| ; CHECK-BE-NEXT: ld1 { v4.16b }, [x9] | |
| ; CHECK-BE-NEXT: tbl v1.16b, { v0.16b }, v1.16b | |
| ; CHECK-BE-NEXT: tbl v0.16b, { v0.16b }, v2.16b | |
| ; CHECK-BE-NEXT: ld1 { v2.16b }, [x8] | |
| ; CHECK-BE-NEXT: add x8, x0, #16 | |
| ; CHECK-BE-NEXT: cmtst v1.16b, v1.16b, v3.16b | |
| ; CHECK-BE-NEXT: cmtst v0.16b, v0.16b, v3.16b | |
| ; CHECK-BE-NEXT: ld1 { v3.16b }, [x2] | |
| ; CHECK-BE-NEXT: bsl v1.16b, v2.16b, v4.16b | |
| ; CHECK-BE-NEXT: bsl v0.16b, v3.16b, v5.16b | |
| ; CHECK-BE-NEXT: st1 { v1.16b }, [x8] | |
| ; CHECK-BE-NEXT: st1 { v0.16b }, [x0] | |
| ; CHECK-BE-NEXT: ret | |
| start: | |
| %t = load <32 x i8>, ptr %if_true, align 4 | |
| %f = load <32 x i8>, ptr %if_false, align 4 | |
| %m = bitcast i32 %mask to <32 x i1> | |
| %s = select <32 x i1> %m, <32 x i8> %t, <32 x i8> %f | |
| store <32 x i8> %s, ptr %out, align 4 | |
| ret void | |
| } | |
| ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: | |
| ; CHECK: {{.*}} |