| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: llc -mtriple=aarch64-linux-gnu < %s | FileCheck %s --check-prefixes=NEON,NEON-IAENABLED | |
| ; RUN: llc -mtriple=aarch64-linux-gnu --lower-interleaved-accesses=false < %s | FileCheck %s --check-prefixes=NEON,NEON-IADISABLED | |
| ; RUN: llc -mtriple=aarch64-linux-gnu < %s -mattr=-neon | FileCheck %s --check-prefixes=NO_NEON,NO_NEON-IAENABLED | |
| ; RUN: llc -mtriple=aarch64-linux-gnu --lower-interleaved-accesses=false < %s -mattr=-neon | FileCheck %s --check-prefixes=NO_NEON,NO_NEON-IADISABLED | |
| define void @load_factor2(ptr %ptr) { | |
| ; NEON-IAENABLED-LABEL: load_factor2: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: ld2 { v0.8b, v1.8b }, [x0] | |
| ; NEON-IAENABLED-NEXT: // fake_use: $d0 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $d1 $d0_d1 | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: load_factor2: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: ldr q0, [x0] | |
| ; NEON-IADISABLED-NEXT: xtn v1.8b, v0.8h | |
| ; NEON-IADISABLED-NEXT: uzp2 v0.16b, v0.16b, v0.16b | |
| ; NEON-IADISABLED-NEXT: // fake_use: $d1 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $d0 $q0 | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: load_factor2: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldrb w2, [x0] | |
| ; NO_NEON-NEXT: ldrb w8, [x0, #15] | |
| ; NO_NEON-NEXT: ldrb w9, [x0, #13] | |
| ; NO_NEON-NEXT: ldrb w10, [x0, #11] | |
| ; NO_NEON-NEXT: ldrb w11, [x0, #9] | |
| ; NO_NEON-NEXT: ldrb w12, [x0, #7] | |
| ; NO_NEON-NEXT: ldrb w13, [x0, #5] | |
| ; NO_NEON-NEXT: ldrb w14, [x0, #3] | |
| ; NO_NEON-NEXT: ldrb w15, [x0, #1] | |
| ; NO_NEON-NEXT: ldrb w16, [x0, #14] | |
| ; NO_NEON-NEXT: ldrb w17, [x0, #12] | |
| ; NO_NEON-NEXT: ldrb w18, [x0, #10] | |
| ; NO_NEON-NEXT: ldrb w1, [x0, #8] | |
| ; NO_NEON-NEXT: ldrb w3, [x0, #6] | |
| ; NO_NEON-NEXT: ldrb w4, [x0, #4] | |
| ; NO_NEON-NEXT: ldrb w0, [x0, #2] | |
| ; NO_NEON-NEXT: // fake_use: $w2 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w4 | |
| ; NO_NEON-NEXT: // fake_use: $w3 | |
| ; NO_NEON-NEXT: // fake_use: $w1 | |
| ; NO_NEON-NEXT: // fake_use: $w18 | |
| ; NO_NEON-NEXT: // fake_use: $w17 | |
| ; NO_NEON-NEXT: // fake_use: $w16 | |
| ; NO_NEON-NEXT: // fake_use: $w15 | |
| ; NO_NEON-NEXT: // fake_use: $w14 | |
| ; NO_NEON-NEXT: // fake_use: $w13 | |
| ; NO_NEON-NEXT: // fake_use: $w12 | |
| ; NO_NEON-NEXT: // fake_use: $w11 | |
| ; NO_NEON-NEXT: // fake_use: $w10 | |
| ; NO_NEON-NEXT: // fake_use: $w9 | |
| ; NO_NEON-NEXT: // fake_use: $w8 | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = load <16 x i8>, ptr %ptr, align 4 | |
| %v0 = shufflevector <16 x i8> %interleaved.vec, <16 x i8> poison, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14> | |
| %v1 = shufflevector <16 x i8> %interleaved.vec, <16 x i8> poison, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15> | |
| tail call void (...) @llvm.fake.use(<8 x i8> %v0) | |
| tail call void (...) @llvm.fake.use(<8 x i8> %v1) | |
| ret void | |
| } | |
| define void @load_factor3(ptr %ptr) { | |
| ; NEON-IAENABLED-LABEL: load_factor3: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: ld3 { v0.4s, v1.4s, v2.4s }, [x0] | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q0 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q1 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q2 $q0_q1_q2 | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: load_factor3: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: ldp q0, q2, [x0] | |
| ; NEON-IADISABLED-NEXT: ldr q4, [x0, #32] | |
| ; NEON-IADISABLED-NEXT: mov v1.16b, v0.16b | |
| ; NEON-IADISABLED-NEXT: rev64 v3.4s, v2.4s | |
| ; NEON-IADISABLED-NEXT: mov v1.s[1], v0.s[3] | |
| ; NEON-IADISABLED-NEXT: mov v3.s[0], v0.s[1] | |
| ; NEON-IADISABLED-NEXT: mov v1.s[2], v2.s[2] | |
| ; NEON-IADISABLED-NEXT: mov v2.s[0], v0.s[2] | |
| ; NEON-IADISABLED-NEXT: mov v3.s[3], v4.s[2] | |
| ; NEON-IADISABLED-NEXT: mov v2.s[2], v4.s[0] | |
| ; NEON-IADISABLED-NEXT: mov v1.s[3], v4.s[1] | |
| ; NEON-IADISABLED-NEXT: mov v2.s[3], v4.s[3] | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q1 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q3 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q2 | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: load_factor3: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldp w15, w14, [x0] | |
| ; NO_NEON-NEXT: ldp w9, w8, [x0, #40] | |
| ; NO_NEON-NEXT: ldp w11, w10, [x0, #16] | |
| ; NO_NEON-NEXT: ldp w12, w13, [x0, #32] | |
| ; NO_NEON-NEXT: ldp w17, w16, [x0, #24] | |
| ; NO_NEON-NEXT: ldp w18, w0, [x0, #8] | |
| ; NO_NEON-NEXT: // fake_use: $w15 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w17 | |
| ; NO_NEON-NEXT: // fake_use: $w13 | |
| ; NO_NEON-NEXT: // fake_use: $w14 | |
| ; NO_NEON-NEXT: // fake_use: $w11 | |
| ; NO_NEON-NEXT: // fake_use: $w16 | |
| ; NO_NEON-NEXT: // fake_use: $w9 | |
| ; NO_NEON-NEXT: // fake_use: $w18 | |
| ; NO_NEON-NEXT: // fake_use: $w10 | |
| ; NO_NEON-NEXT: // fake_use: $w12 | |
| ; NO_NEON-NEXT: // fake_use: $w8 | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = load <12 x i32>, ptr %ptr, align 4 | |
| %v0 = shufflevector <12 x i32> %interleaved.vec, <12 x i32> poison, <4 x i32> <i32 0, i32 3, i32 6, i32 9> | |
| %v1 = shufflevector <12 x i32> %interleaved.vec, <12 x i32> poison, <4 x i32> <i32 1, i32 4, i32 7, i32 10> | |
| %v2 = shufflevector <12 x i32> %interleaved.vec, <12 x i32> poison, <4 x i32> <i32 2, i32 5, i32 8, i32 11> | |
| tail call void (...) @llvm.fake.use(<4 x i32> %v0) | |
| tail call void (...) @llvm.fake.use(<4 x i32> %v1) | |
| tail call void (...) @llvm.fake.use(<4 x i32> %v2) | |
| ret void | |
| } | |
| define void @load_factor4(ptr %ptr) { | |
| ; NEON-IAENABLED-LABEL: load_factor4: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: ld4 { v0.4s, v1.4s, v2.4s, v3.4s }, [x0] | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q0 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q1 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q2 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q2 $q0_q1_q2_q3 | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: load_factor4: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: ldp q1, q0, [x0, #32] | |
| ; NEON-IADISABLED-NEXT: ldp q4, q3, [x0] | |
| ; NEON-IADISABLED-NEXT: zip1 v2.4s, v1.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: trn1 v0.4s, v1.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: zip1 v5.4s, v4.4s, v3.4s | |
| ; NEON-IADISABLED-NEXT: trn2 v7.4s, v4.4s, v3.4s | |
| ; NEON-IADISABLED-NEXT: ext v6.16b, v1.16b, v2.16b, #8 | |
| ; NEON-IADISABLED-NEXT: zip2 v1.4s, v4.4s, v3.4s | |
| ; NEON-IADISABLED-NEXT: mov v7.d[1], v2.d[1] | |
| ; NEON-IADISABLED-NEXT: mov v5.d[1], v6.d[1] | |
| ; NEON-IADISABLED-NEXT: mov v1.d[1], v0.d[1] | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q5 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q7 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q1 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q1 | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: load_factor4: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldp w12, w8, [x0, #52] | |
| ; NO_NEON-NEXT: ldp w16, w9, [x0, #36] | |
| ; NO_NEON-NEXT: ldp w18, w10, [x0, #20] | |
| ; NO_NEON-NEXT: ldp w14, w11, [x0, #4] | |
| ; NO_NEON-NEXT: ldr w15, [x0] | |
| ; NO_NEON-NEXT: ldr w13, [x0, #48] | |
| ; NO_NEON-NEXT: ldr w17, [x0, #32] | |
| ; NO_NEON-NEXT: ldr w0, [x0, #16] | |
| ; NO_NEON-NEXT: // fake_use: $w15 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w17 | |
| ; NO_NEON-NEXT: // fake_use: $w13 | |
| ; NO_NEON-NEXT: // fake_use: $w14 | |
| ; NO_NEON-NEXT: // fake_use: $w18 | |
| ; NO_NEON-NEXT: // fake_use: $w16 | |
| ; NO_NEON-NEXT: // fake_use: $w12 | |
| ; NO_NEON-NEXT: // fake_use: $w11 | |
| ; NO_NEON-NEXT: // fake_use: $w10 | |
| ; NO_NEON-NEXT: // fake_use: $w9 | |
| ; NO_NEON-NEXT: // fake_use: $w8 | |
| ; NO_NEON-NEXT: // fake_use: $w11 | |
| ; NO_NEON-NEXT: // fake_use: $w10 | |
| ; NO_NEON-NEXT: // fake_use: $w9 | |
| ; NO_NEON-NEXT: // fake_use: $w8 | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = load <16 x i32>, ptr %ptr, align 4 | |
| %v0 = shufflevector <16 x i32> %interleaved.vec, <16 x i32> poison, <4 x i32> <i32 0, i32 4, i32 8, i32 12> | |
| %v1 = shufflevector <16 x i32> %interleaved.vec, <16 x i32> poison, <4 x i32> <i32 1, i32 5, i32 9, i32 13> | |
| %v2 = shufflevector <16 x i32> %interleaved.vec, <16 x i32> poison, <4 x i32> <i32 2, i32 6, i32 10, i32 14> | |
| %v3 = shufflevector <16 x i32> %interleaved.vec, <16 x i32> poison, <4 x i32> <i32 3, i32 7, i32 11, i32 15> | |
| tail call void (...) @llvm.fake.use(<4 x i32> %v0) | |
| tail call void (...) @llvm.fake.use(<4 x i32> %v1) | |
| tail call void (...) @llvm.fake.use(<4 x i32> %v2) | |
| tail call void (...) @llvm.fake.use(<4 x i32> %v2) | |
| ret void | |
| } | |
| define void @store_factor2(ptr %ptr, <8 x i8> %v0, <8 x i8> %v1) { | |
| ; NEON-IAENABLED-LABEL: store_factor2: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: // kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1 | |
| ; NEON-IAENABLED-NEXT: // kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1 | |
| ; NEON-IAENABLED-NEXT: st2 { v0.8b, v1.8b }, [x0] | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: store_factor2: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: // kill: def $d0 killed $d0 def $q0 | |
| ; NEON-IADISABLED-NEXT: // kill: def $d1 killed $d1 def $q1 | |
| ; NEON-IADISABLED-NEXT: zip1 v0.16b, v0.16b, v1.16b | |
| ; NEON-IADISABLED-NEXT: str q0, [x0] | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_factor2: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldrb w8, [sp, #64] | |
| ; NO_NEON-NEXT: ldrb w9, [sp] | |
| ; NO_NEON-NEXT: ldrb w10, [sp, #56] | |
| ; NO_NEON-NEXT: strb w7, [x0, #12] | |
| ; NO_NEON-NEXT: strb w8, [x0, #15] | |
| ; NO_NEON-NEXT: ldrb w8, [sp, #48] | |
| ; NO_NEON-NEXT: strb w9, [x0, #14] | |
| ; NO_NEON-NEXT: ldrb w9, [sp, #40] | |
| ; NO_NEON-NEXT: strb w8, [x0, #11] | |
| ; NO_NEON-NEXT: ldrb w8, [sp, #32] | |
| ; NO_NEON-NEXT: strb w9, [x0, #9] | |
| ; NO_NEON-NEXT: ldrb w9, [sp, #24] | |
| ; NO_NEON-NEXT: strb w8, [x0, #7] | |
| ; NO_NEON-NEXT: ldrb w8, [sp, #16] | |
| ; NO_NEON-NEXT: strb w9, [x0, #5] | |
| ; NO_NEON-NEXT: ldrb w9, [sp, #8] | |
| ; NO_NEON-NEXT: strb w10, [x0, #13] | |
| ; NO_NEON-NEXT: strb w6, [x0, #10] | |
| ; NO_NEON-NEXT: strb w5, [x0, #8] | |
| ; NO_NEON-NEXT: strb w4, [x0, #6] | |
| ; NO_NEON-NEXT: strb w3, [x0, #4] | |
| ; NO_NEON-NEXT: strb w8, [x0, #3] | |
| ; NO_NEON-NEXT: strb w2, [x0, #2] | |
| ; NO_NEON-NEXT: strb w9, [x0, #1] | |
| ; NO_NEON-NEXT: strb w1, [x0] | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = shufflevector <8 x i8> %v0, <8 x i8> %v1, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15> | |
| store <16 x i8> %interleaved.vec, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_factor3(ptr %ptr, <4 x i32> %v0, <4 x i32> %v1, <4 x i32> %v2) { | |
| ; NEON-IAENABLED-LABEL: store_factor3: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2 | |
| ; NEON-IAENABLED-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2 | |
| ; NEON-IAENABLED-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2 | |
| ; NEON-IAENABLED-NEXT: st3 { v0.4s, v1.4s, v2.4s }, [x0] | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: store_factor3: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: trn2 v3.4s, v0.4s, v1.4s | |
| ; NEON-IADISABLED-NEXT: uzp1 v4.4s, v0.4s, v1.4s | |
| ; NEON-IADISABLED-NEXT: trn1 v5.4s, v0.4s, v1.4s | |
| ; NEON-IADISABLED-NEXT: ext v3.16b, v3.16b, v0.16b, #4 | |
| ; NEON-IADISABLED-NEXT: uzp2 v1.4s, v1.4s, v4.4s | |
| ; NEON-IADISABLED-NEXT: mov v5.d[1], v0.d[0] | |
| ; NEON-IADISABLED-NEXT: mov v3.s[0], v2.s[2] | |
| ; NEON-IADISABLED-NEXT: mov v1.s[1], v2.s[1] | |
| ; NEON-IADISABLED-NEXT: mov v5.s[2], v2.s[0] | |
| ; NEON-IADISABLED-NEXT: mov v3.s[3], v2.s[3] | |
| ; NEON-IADISABLED-NEXT: stp q5, q1, [x0] | |
| ; NEON-IADISABLED-NEXT: str q3, [x0, #32] | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_factor3: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldr w8, [sp] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #32] | |
| ; NO_NEON-NEXT: // kill: def $w4 killed $w4 def $x4 | |
| ; NO_NEON-NEXT: mov w12, w3 | |
| ; NO_NEON-NEXT: ldr w10, [sp, #24] | |
| ; NO_NEON-NEXT: ldr w11, [sp, #16] | |
| ; NO_NEON-NEXT: mov w13, w6 | |
| ; NO_NEON-NEXT: orr x8, x8, x9, lsl #32 | |
| ; NO_NEON-NEXT: ldr w9, [sp, #8] | |
| ; NO_NEON-NEXT: // kill: def $w7 killed $w7 def $x7 | |
| ; NO_NEON-NEXT: // kill: def $w5 killed $w5 def $x5 | |
| ; NO_NEON-NEXT: // kill: def $w2 killed $w2 def $x2 | |
| ; NO_NEON-NEXT: orr x12, x12, x7, lsl #32 | |
| ; NO_NEON-NEXT: orr x10, x10, x4, lsl #32 | |
| ; NO_NEON-NEXT: orr x9, x9, x2, lsl #32 | |
| ; NO_NEON-NEXT: stp x10, x8, [x0, #32] | |
| ; NO_NEON-NEXT: mov w10, w1 | |
| ; NO_NEON-NEXT: orr x8, x13, x11, lsl #32 | |
| ; NO_NEON-NEXT: orr x10, x10, x5, lsl #32 | |
| ; NO_NEON-NEXT: stp x8, x12, [x0, #16] | |
| ; NO_NEON-NEXT: stp x10, x9, [x0] | |
| ; NO_NEON-NEXT: ret | |
| %s0 = shufflevector <4 x i32> %v0, <4 x i32> %v1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> | |
| %s1 = shufflevector <4 x i32> %v2, <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison> | |
| %interleaved.vec = shufflevector <8 x i32> %s0, <8 x i32> %s1, <12 x i32> <i32 0, i32 4, i32 8, i32 1, i32 5, i32 9, i32 2, i32 6, i32 10, i32 3, i32 7, i32 11> | |
| store <12 x i32> %interleaved.vec, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_factor4(ptr %ptr, <4 x i32> %v0, <4 x i32> %v1, <4 x i32> %v2, <4 x i32> %v3) { | |
| ; NEON-IAENABLED-LABEL: store_factor4: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: // kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3 | |
| ; NEON-IAENABLED-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3 | |
| ; NEON-IAENABLED-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3 | |
| ; NEON-IAENABLED-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3 | |
| ; NEON-IAENABLED-NEXT: st4 { v0.4s, v1.4s, v2.4s, v3.4s }, [x0] | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: store_factor4: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: uzp2 v4.4s, v0.4s, v1.4s | |
| ; NEON-IADISABLED-NEXT: zip1 v5.4s, v2.4s, v3.4s | |
| ; NEON-IADISABLED-NEXT: trn1 v6.4s, v2.4s, v3.4s | |
| ; NEON-IADISABLED-NEXT: zip2 v7.4s, v0.4s, v1.4s | |
| ; NEON-IADISABLED-NEXT: zip2 v3.4s, v2.4s, v3.4s | |
| ; NEON-IADISABLED-NEXT: trn2 v16.4s, v0.4s, v1.4s | |
| ; NEON-IADISABLED-NEXT: uzp2 v4.4s, v4.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: zip1 v0.4s, v0.4s, v1.4s | |
| ; NEON-IADISABLED-NEXT: ext v1.16b, v2.16b, v5.16b, #8 | |
| ; NEON-IADISABLED-NEXT: mov v7.d[1], v6.d[1] | |
| ; NEON-IADISABLED-NEXT: mov v16.d[1], v5.d[1] | |
| ; NEON-IADISABLED-NEXT: mov v4.d[1], v3.d[1] | |
| ; NEON-IADISABLED-NEXT: mov v0.d[1], v1.d[1] | |
| ; NEON-IADISABLED-NEXT: stp q0, q16, [x0] | |
| ; NEON-IADISABLED-NEXT: stp q7, q4, [x0, #32] | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_factor4: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldr w8, [sp, #64] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #32] | |
| ; NO_NEON-NEXT: ldr w10, [sp] | |
| ; NO_NEON-NEXT: str w7, [x0, #36] | |
| ; NO_NEON-NEXT: stp w9, w8, [x0, #56] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #56] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #24] | |
| ; NO_NEON-NEXT: str w10, [x0, #52] | |
| ; NO_NEON-NEXT: stp w8, w4, [x0, #44] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #48] | |
| ; NO_NEON-NEXT: str w9, [x0, #40] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #16] | |
| ; NO_NEON-NEXT: stp w8, w3, [x0, #28] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #40] | |
| ; NO_NEON-NEXT: str w9, [x0, #24] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #8] | |
| ; NO_NEON-NEXT: str w6, [x0, #20] | |
| ; NO_NEON-NEXT: stp w8, w2, [x0, #12] | |
| ; NO_NEON-NEXT: stp w5, w9, [x0, #4] | |
| ; NO_NEON-NEXT: str w1, [x0] | |
| ; NO_NEON-NEXT: ret | |
| %s0 = shufflevector <4 x i32> %v0, <4 x i32> %v1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> | |
| %s1 = shufflevector <4 x i32> %v2, <4 x i32> %v3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> | |
| %interleaved.vec = shufflevector <8 x i32> %s0, <8 x i32> %s1, <16 x i32> <i32 0, i32 4, i32 8, i32 12, i32 1, i32 5, i32 9, i32 13, i32 2, i32 6, i32 10, i32 14, i32 3, i32 7, i32 11, i32 15> | |
| store <16 x i32> %interleaved.vec, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @load_ptrvec_factor2(ptr %ptr) { | |
| ; NEON-IAENABLED-LABEL: load_ptrvec_factor2: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: ld2 { v0.2d, v1.2d }, [x0] | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q0 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q1 $q0_q1 | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: load_ptrvec_factor2: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: ldp q1, q0, [x0] | |
| ; NEON-IADISABLED-NEXT: zip1 v2.2d, v1.2d, v0.2d | |
| ; NEON-IADISABLED-NEXT: zip2 v0.2d, v1.2d, v0.2d | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q2 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q0 | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: load_ptrvec_factor2: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldp x8, x9, [x0] | |
| ; NO_NEON-NEXT: ldp x11, x10, [x0, #16] | |
| ; NO_NEON-NEXT: // fake_use: $x8 | |
| ; NO_NEON-NEXT: // fake_use: $x11 | |
| ; NO_NEON-NEXT: // fake_use: $x9 | |
| ; NO_NEON-NEXT: // fake_use: $x10 | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = load <4 x ptr>, ptr %ptr, align 4 | |
| %v0 = shufflevector <4 x ptr> %interleaved.vec, <4 x ptr> poison, <2 x i32> <i32 0, i32 2> | |
| %v1 = shufflevector <4 x ptr> %interleaved.vec, <4 x ptr> poison, <2 x i32> <i32 1, i32 3> | |
| tail call void (...) @llvm.fake.use(<2 x ptr> %v0) | |
| tail call void (...) @llvm.fake.use(<2 x ptr> %v1) | |
| ret void | |
| } | |
| define void @load_ptrvec_factor3(ptr %ptr) { | |
| ; NEON-IAENABLED-LABEL: load_ptrvec_factor3: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: ld3 { v0.2d, v1.2d, v2.2d }, [x0] | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q0 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q1 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q2 $q0_q1_q2 | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: load_ptrvec_factor3: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: ldp q1, q0, [x0, #16] | |
| ; NEON-IADISABLED-NEXT: ldr q2, [x0] | |
| ; NEON-IADISABLED-NEXT: ext v3.16b, v2.16b, v0.16b, #8 | |
| ; NEON-IADISABLED-NEXT: mov v2.d[1], v1.d[1] | |
| ; NEON-IADISABLED-NEXT: mov v1.d[1], v0.d[1] | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q2 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q3 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q1 | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: load_ptrvec_factor3: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldp x9, x8, [x0] | |
| ; NO_NEON-NEXT: ldp x11, x10, [x0, #32] | |
| ; NO_NEON-NEXT: ldp x12, x13, [x0, #16] | |
| ; NO_NEON-NEXT: // fake_use: $x9 | |
| ; NO_NEON-NEXT: // fake_use: $x13 | |
| ; NO_NEON-NEXT: // fake_use: $x8 | |
| ; NO_NEON-NEXT: // fake_use: $x11 | |
| ; NO_NEON-NEXT: // fake_use: $x12 | |
| ; NO_NEON-NEXT: // fake_use: $x10 | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = load <6 x ptr>, ptr %ptr, align 4 | |
| %v0 = shufflevector <6 x ptr> %interleaved.vec, <6 x ptr> poison, <2 x i32> <i32 0, i32 3> | |
| %v1 = shufflevector <6 x ptr> %interleaved.vec, <6 x ptr> poison, <2 x i32> <i32 1, i32 4> | |
| %v2 = shufflevector <6 x ptr> %interleaved.vec, <6 x ptr> poison, <2 x i32> <i32 2, i32 5> | |
| tail call void (...) @llvm.fake.use(<2 x ptr> %v0) | |
| tail call void (...) @llvm.fake.use(<2 x ptr> %v1) | |
| tail call void (...) @llvm.fake.use(<2 x ptr> %v2) | |
| ret void | |
| } | |
| define void @load_ptrvec_factor4(ptr %ptr) { | |
| ; NEON-IAENABLED-LABEL: load_ptrvec_factor4: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: ld4 { v0.2d, v1.2d, v2.2d, v3.2d }, [x0] | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q0 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q1 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q2 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q3 $q0_q1_q2_q3 | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: load_ptrvec_factor4: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: ldp q0, q3, [x0] | |
| ; NEON-IADISABLED-NEXT: ldp q1, q2, [x0, #32] | |
| ; NEON-IADISABLED-NEXT: zip1 v4.2d, v0.2d, v1.2d | |
| ; NEON-IADISABLED-NEXT: zip2 v0.2d, v0.2d, v1.2d | |
| ; NEON-IADISABLED-NEXT: zip1 v1.2d, v3.2d, v2.2d | |
| ; NEON-IADISABLED-NEXT: zip2 v2.2d, v3.2d, v2.2d | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q4 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q0 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q1 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q2 | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: load_ptrvec_factor4: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldp x11, x10, [x0] | |
| ; NO_NEON-NEXT: ldp x9, x8, [x0, #48] | |
| ; NO_NEON-NEXT: ldp x13, x12, [x0, #16] | |
| ; NO_NEON-NEXT: ldp x15, x14, [x0, #32] | |
| ; NO_NEON-NEXT: // fake_use: $x11 | |
| ; NO_NEON-NEXT: // fake_use: $x15 | |
| ; NO_NEON-NEXT: // fake_use: $x10 | |
| ; NO_NEON-NEXT: // fake_use: $x14 | |
| ; NO_NEON-NEXT: // fake_use: $x13 | |
| ; NO_NEON-NEXT: // fake_use: $x9 | |
| ; NO_NEON-NEXT: // fake_use: $x12 | |
| ; NO_NEON-NEXT: // fake_use: $x8 | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = load <8 x ptr>, ptr %ptr, align 4 | |
| %v0 = shufflevector <8 x ptr> %interleaved.vec, <8 x ptr> poison, <2 x i32> <i32 0, i32 4> | |
| %v1 = shufflevector <8 x ptr> %interleaved.vec, <8 x ptr> poison, <2 x i32> <i32 1, i32 5> | |
| %v2 = shufflevector <8 x ptr> %interleaved.vec, <8 x ptr> poison, <2 x i32> <i32 2, i32 6> | |
| %v3 = shufflevector <8 x ptr> %interleaved.vec, <8 x ptr> poison, <2 x i32> <i32 3, i32 7> | |
| tail call void (...) @llvm.fake.use(<2 x ptr> %v0) | |
| tail call void (...) @llvm.fake.use(<2 x ptr> %v1) | |
| tail call void (...) @llvm.fake.use(<2 x ptr> %v2) | |
| tail call void (...) @llvm.fake.use(<2 x ptr> %v3) | |
| ret void | |
| } | |
| define void @store_ptrvec_factor2(ptr %ptr, <2 x ptr> %v0, <2 x ptr> %v1) { | |
| ; NEON-IAENABLED-LABEL: store_ptrvec_factor2: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1 | |
| ; NEON-IAENABLED-NEXT: // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1 | |
| ; NEON-IAENABLED-NEXT: st2 { v0.2d, v1.2d }, [x0] | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: store_ptrvec_factor2: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: zip2 v2.2d, v0.2d, v1.2d | |
| ; NEON-IADISABLED-NEXT: zip1 v0.2d, v0.2d, v1.2d | |
| ; NEON-IADISABLED-NEXT: stp q0, q2, [x0] | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_ptrvec_factor2: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: stp x3, x5, [x0, #16] | |
| ; NO_NEON-NEXT: stp x2, x4, [x0] | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = shufflevector <2 x ptr> %v0, <2 x ptr> %v1, <4 x i32> <i32 0, i32 2, i32 1, i32 3> | |
| store <4 x ptr> %interleaved.vec, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_ptrvec_factor3(ptr %ptr, <2 x ptr> %v0, <2 x ptr> %v1, <2 x ptr> %v2) { | |
| ; NEON-IAENABLED-LABEL: store_ptrvec_factor3: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2 | |
| ; NEON-IAENABLED-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2 | |
| ; NEON-IAENABLED-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2 | |
| ; NEON-IAENABLED-NEXT: st3 { v0.2d, v1.2d, v2.2d }, [x0] | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: store_ptrvec_factor3: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: zip2 v3.2d, v1.2d, v2.2d | |
| ; NEON-IADISABLED-NEXT: zip1 v1.2d, v0.2d, v1.2d | |
| ; NEON-IADISABLED-NEXT: mov v0.d[0], v2.d[0] | |
| ; NEON-IADISABLED-NEXT: stp q0, q3, [x0, #16] | |
| ; NEON-IADISABLED-NEXT: str q1, [x0] | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_ptrvec_factor3: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: stp x5, x7, [x0, #32] | |
| ; NO_NEON-NEXT: stp x6, x3, [x0, #16] | |
| ; NO_NEON-NEXT: stp x2, x4, [x0] | |
| ; NO_NEON-NEXT: ret | |
| %s0 = shufflevector <2 x ptr> %v0, <2 x ptr> %v1, <4 x i32> <i32 0, i32 1, i32 2, i32 3> | |
| %s1 = shufflevector <2 x ptr> %v2, <2 x ptr> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison> | |
| %interleaved.vec = shufflevector <4 x ptr> %s0, <4 x ptr> %s1, <6 x i32> <i32 0, i32 2, i32 4, i32 1, i32 3, i32 5> | |
| store <6 x ptr> %interleaved.vec, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_ptrvec_factor4(ptr %ptr, <2 x ptr> %v0, <2 x ptr> %v1, <2 x ptr> %v2, <2 x ptr> %v3) { | |
| ; NEON-IAENABLED-LABEL: store_ptrvec_factor4: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: // kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3 | |
| ; NEON-IAENABLED-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3 | |
| ; NEON-IAENABLED-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3 | |
| ; NEON-IAENABLED-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3 | |
| ; NEON-IAENABLED-NEXT: st4 { v0.2d, v1.2d, v2.2d, v3.2d }, [x0] | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: store_ptrvec_factor4: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: zip2 v4.2d, v2.2d, v3.2d | |
| ; NEON-IADISABLED-NEXT: zip2 v5.2d, v0.2d, v1.2d | |
| ; NEON-IADISABLED-NEXT: zip1 v2.2d, v2.2d, v3.2d | |
| ; NEON-IADISABLED-NEXT: zip1 v0.2d, v0.2d, v1.2d | |
| ; NEON-IADISABLED-NEXT: stp q5, q4, [x0, #32] | |
| ; NEON-IADISABLED-NEXT: stp q0, q2, [x0] | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_ptrvec_factor4: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldr x8, [sp, #8] | |
| ; NO_NEON-NEXT: stp x3, x5, [x0, #32] | |
| ; NO_NEON-NEXT: stp x2, x4, [x0] | |
| ; NO_NEON-NEXT: stp x7, x8, [x0, #48] | |
| ; NO_NEON-NEXT: ldr x8, [sp] | |
| ; NO_NEON-NEXT: stp x6, x8, [x0, #16] | |
| ; NO_NEON-NEXT: ret | |
| %s0 = shufflevector <2 x ptr> %v0, <2 x ptr> %v1, <4 x i32> <i32 0, i32 1, i32 2, i32 3> | |
| %s1 = shufflevector <2 x ptr> %v2, <2 x ptr> %v3, <4 x i32> <i32 0, i32 1, i32 2, i32 3> | |
| %interleaved.vec = shufflevector <4 x ptr> %s0, <4 x ptr> %s1, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 1, i32 3, i32 5, i32 7> | |
| store <8 x ptr> %interleaved.vec, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @load_undef_mask_factor2(ptr %ptr) { | |
| ; NEON-IAENABLED-LABEL: load_undef_mask_factor2: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: ld2 { v0.4s, v1.4s }, [x0] | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q0 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q1 $q0_q1 | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: load_undef_mask_factor2: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: ldp q1, q0, [x0] | |
| ; NEON-IADISABLED-NEXT: uzp1 v2.4s, v1.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: uzp2 v0.4s, v1.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q2 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q0 | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: load_undef_mask_factor2: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldp w9, w8, [x0, #24] | |
| ; NO_NEON-NEXT: ldp w11, w10, [x0, #8] | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w11 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w9 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w10 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w8 | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = load <8 x i32>, ptr %ptr, align 4 | |
| %v0 = shufflevector <8 x i32> %interleaved.vec, <8 x i32> poison, <4 x i32> <i32 poison, i32 2, i32 poison, i32 6> | |
| %v1 = shufflevector <8 x i32> %interleaved.vec, <8 x i32> poison, <4 x i32> <i32 poison, i32 3, i32 poison, i32 7> | |
| tail call void (...) @llvm.fake.use(<4 x i32> %v0) | |
| tail call void (...) @llvm.fake.use(<4 x i32> %v1) | |
| ret void | |
| } | |
| define void @load_undef_mask_factor3(ptr %ptr) { | |
| ; NEON-IAENABLED-LABEL: load_undef_mask_factor3: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: ld3 { v0.4s, v1.4s, v2.4s }, [x0] | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q0 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q1 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q2 $q0_q1_q2 | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: load_undef_mask_factor3: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: ldp q0, q1, [x0] | |
| ; NEON-IADISABLED-NEXT: mov v2.16b, v0.16b | |
| ; NEON-IADISABLED-NEXT: rev64 v3.4s, v1.4s | |
| ; NEON-IADISABLED-NEXT: mov v2.s[1], v0.s[3] | |
| ; NEON-IADISABLED-NEXT: mov v3.s[0], v0.s[1] | |
| ; NEON-IADISABLED-NEXT: dup v0.4s, v0.s[2] | |
| ; NEON-IADISABLED-NEXT: mov v2.s[2], v1.s[2] | |
| ; NEON-IADISABLED-NEXT: ldr q1, [x0, #32] | |
| ; NEON-IADISABLED-NEXT: mov v3.s[3], v1.s[2] | |
| ; NEON-IADISABLED-NEXT: mov v2.s[3], v1.s[1] | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q2 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q3 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q0 | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: load_undef_mask_factor3: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldp w12, w11, [x0] | |
| ; NO_NEON-NEXT: ldp w16, w8, [x0, #12] | |
| ; NO_NEON-NEXT: ldp w10, w9, [x0, #36] | |
| ; NO_NEON-NEXT: ldp w14, w13, [x0, #24] | |
| ; NO_NEON-NEXT: ldr w15, [x0, #8] | |
| ; NO_NEON-NEXT: // fake_use: $w12 | |
| ; NO_NEON-NEXT: // fake_use: $w16 | |
| ; NO_NEON-NEXT: // fake_use: $w14 | |
| ; NO_NEON-NEXT: // fake_use: $w10 | |
| ; NO_NEON-NEXT: // fake_use: $w11 | |
| ; NO_NEON-NEXT: // fake_use: $w8 | |
| ; NO_NEON-NEXT: // fake_use: $w13 | |
| ; NO_NEON-NEXT: // fake_use: $w9 | |
| ; NO_NEON-NEXT: // fake_use: $w15 | |
| ; NO_NEON-NEXT: // fake_use: $w16 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = load <12 x i32>, ptr %ptr, align 4 | |
| %v0 = shufflevector <12 x i32> %interleaved.vec, <12 x i32> poison, <4 x i32> <i32 0, i32 3, i32 6, i32 9> | |
| %v1 = shufflevector <12 x i32> %interleaved.vec, <12 x i32> poison, <4 x i32> <i32 1, i32 4, i32 7, i32 10> | |
| %v2 = shufflevector <12 x i32> %interleaved.vec, <12 x i32> poison, <4 x i32> <i32 2, i32 poison, i32 poison, i32 poison> | |
| tail call void (...) @llvm.fake.use(<4 x i32> %v0) | |
| tail call void (...) @llvm.fake.use(<4 x i32> %v1) | |
| tail call void (...) @llvm.fake.use(<4 x i32> %v2) | |
| ret void | |
| } | |
| define void @load_undef_mask_factor4(ptr %ptr) { | |
| ; NEON-IAENABLED-LABEL: load_undef_mask_factor4: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: ld4 { v0.4s, v1.4s, v2.4s, v3.4s }, [x0] | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q0 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q1 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q2 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q3 $q0_q1_q2_q3 | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: load_undef_mask_factor4: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: ldp q1, q0, [x0] | |
| ; NEON-IADISABLED-NEXT: uzp2 v2.4s, v1.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: zip1 v3.4s, v1.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: trn2 v4.4s, v1.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: zip2 v0.4s, v1.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: uzp2 v1.4s, v2.4s, v1.4s | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q3 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q4 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q0 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q1 | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: load_undef_mask_factor4: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldp w11, w10, [x0] | |
| ; NO_NEON-NEXT: ldp w9, w8, [x0, #24] | |
| ; NO_NEON-NEXT: ldp w13, w12, [x0, #8] | |
| ; NO_NEON-NEXT: ldp w15, w14, [x0, #16] | |
| ; NO_NEON-NEXT: // fake_use: $w11 | |
| ; NO_NEON-NEXT: // fake_use: $w15 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w10 | |
| ; NO_NEON-NEXT: // fake_use: $w14 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w13 | |
| ; NO_NEON-NEXT: // fake_use: $w9 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w12 | |
| ; NO_NEON-NEXT: // fake_use: $w8 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = load <16 x i32>, ptr %ptr, align 4 | |
| %v0 = shufflevector <16 x i32> %interleaved.vec, <16 x i32> poison, <4 x i32> <i32 0, i32 4, i32 poison, i32 poison> | |
| %v1 = shufflevector <16 x i32> %interleaved.vec, <16 x i32> poison, <4 x i32> <i32 1, i32 5, i32 poison, i32 poison> | |
| %v2 = shufflevector <16 x i32> %interleaved.vec, <16 x i32> poison, <4 x i32> <i32 2, i32 6, i32 poison, i32 poison> | |
| %v3 = shufflevector <16 x i32> %interleaved.vec, <16 x i32> poison, <4 x i32> <i32 3, i32 7, i32 poison, i32 poison> | |
| tail call void (...) @llvm.fake.use(<4 x i32> %v0) | |
| tail call void (...) @llvm.fake.use(<4 x i32> %v1) | |
| tail call void (...) @llvm.fake.use(<4 x i32> %v2) | |
| tail call void (...) @llvm.fake.use(<4 x i32> %v3) | |
| ret void | |
| } | |
| define void @store_undef_mask_factor2(ptr %ptr, <4 x i32> %v0, <4 x i32> %v1) { | |
| ; NEON-IAENABLED-LABEL: store_undef_mask_factor2: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1 | |
| ; NEON-IAENABLED-NEXT: // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1 | |
| ; NEON-IAENABLED-NEXT: st2 { v0.4s, v1.4s }, [x0] | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: store_undef_mask_factor2: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: zip2 v0.4s, v0.4s, v1.4s | |
| ; NEON-IADISABLED-NEXT: str q0, [x0, #16] | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_undef_mask_factor2: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldr w8, [sp] | |
| ; NO_NEON-NEXT: stp w3, w7, [x0, #16] | |
| ; NO_NEON-NEXT: stp w4, w8, [x0, #24] | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = shufflevector <4 x i32> %v0, <4 x i32> %v1, <8 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 2, i32 6, i32 3, i32 7> | |
| store <8 x i32> %interleaved.vec, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_undef_mask_factor3(ptr %ptr, <4 x i32> %v0, <4 x i32> %v1, <4 x i32> %v2) { | |
| ; NEON-IAENABLED-LABEL: store_undef_mask_factor3: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2 | |
| ; NEON-IAENABLED-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2 | |
| ; NEON-IAENABLED-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2 | |
| ; NEON-IAENABLED-NEXT: st3 { v0.4s, v1.4s, v2.4s }, [x0] | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: store_undef_mask_factor3: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: trn2 v3.4s, v0.4s, v1.4s | |
| ; NEON-IADISABLED-NEXT: trn1 v1.4s, v0.4s, v1.4s | |
| ; NEON-IADISABLED-NEXT: ext v3.16b, v3.16b, v0.16b, #4 | |
| ; NEON-IADISABLED-NEXT: mov v4.16b, v1.16b | |
| ; NEON-IADISABLED-NEXT: mov v1.s[1], v2.s[1] | |
| ; NEON-IADISABLED-NEXT: mov v4.d[1], v0.d[0] | |
| ; NEON-IADISABLED-NEXT: mov v3.s[0], v2.s[2] | |
| ; NEON-IADISABLED-NEXT: stp q4, q1, [x0] | |
| ; NEON-IADISABLED-NEXT: mov v3.s[3], v2.s[3] | |
| ; NEON-IADISABLED-NEXT: str q3, [x0, #32] | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_undef_mask_factor3: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldr w8, [sp] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #32] | |
| ; NO_NEON-NEXT: // kill: def $w4 killed $w4 def $x4 | |
| ; NO_NEON-NEXT: mov w11, w3 | |
| ; NO_NEON-NEXT: ldr w10, [sp, #24] | |
| ; NO_NEON-NEXT: // kill: def $w7 killed $w7 def $x7 | |
| ; NO_NEON-NEXT: // kill: def $w5 killed $w5 def $x5 | |
| ; NO_NEON-NEXT: // kill: def $w2 killed $w2 def $x2 | |
| ; NO_NEON-NEXT: orr x8, x8, x9, lsl #32 | |
| ; NO_NEON-NEXT: ldr w9, [sp, #16] | |
| ; NO_NEON-NEXT: orr x10, x10, x4, lsl #32 | |
| ; NO_NEON-NEXT: lsl x9, x9, #32 | |
| ; NO_NEON-NEXT: stp x10, x8, [x0, #32] | |
| ; NO_NEON-NEXT: orr x8, x11, x7, lsl #32 | |
| ; NO_NEON-NEXT: mov w10, w1 | |
| ; NO_NEON-NEXT: lsl x11, x2, #32 | |
| ; NO_NEON-NEXT: stp x9, x8, [x0, #16] | |
| ; NO_NEON-NEXT: orr x9, x10, x5, lsl #32 | |
| ; NO_NEON-NEXT: stp x9, x11, [x0] | |
| ; NO_NEON-NEXT: ret | |
| %s0 = shufflevector <4 x i32> %v0, <4 x i32> %v1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> | |
| %s1 = shufflevector <4 x i32> %v2, <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison> | |
| %interleaved.vec = shufflevector <8 x i32> %s0, <8 x i32> %s1, <12 x i32> <i32 0, i32 4, i32 poison, i32 1, i32 poison, i32 9, i32 2, i32 6, i32 10, i32 3, i32 7, i32 11> | |
| store <12 x i32> %interleaved.vec, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_undef_mask_factor4(ptr %ptr, <4 x i32> %v0, <4 x i32> %v1, <4 x i32> %v2, <4 x i32> %v3) { | |
| ; NEON-IAENABLED-LABEL: store_undef_mask_factor4: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: // kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3 | |
| ; NEON-IAENABLED-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3 | |
| ; NEON-IAENABLED-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3 | |
| ; NEON-IAENABLED-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3 | |
| ; NEON-IAENABLED-NEXT: st4 { v0.4s, v1.4s, v2.4s, v3.4s }, [x0] | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: store_undef_mask_factor4: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: uzp2 v4.4s, v0.4s, v1.4s | |
| ; NEON-IADISABLED-NEXT: zip2 v5.4s, v0.4s, v1.4s | |
| ; NEON-IADISABLED-NEXT: zip1 v6.4s, v0.4s, v1.4s | |
| ; NEON-IADISABLED-NEXT: mov v1.s[2], v2.s[1] | |
| ; NEON-IADISABLED-NEXT: trn1 v7.4s, v2.4s, v3.4s | |
| ; NEON-IADISABLED-NEXT: uzp2 v0.4s, v4.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: zip2 v4.4s, v2.4s, v3.4s | |
| ; NEON-IADISABLED-NEXT: mov v6.s[2], v2.s[0] | |
| ; NEON-IADISABLED-NEXT: mov v1.s[3], v3.s[1] | |
| ; NEON-IADISABLED-NEXT: mov v5.d[1], v7.d[1] | |
| ; NEON-IADISABLED-NEXT: mov v0.d[1], v4.d[1] | |
| ; NEON-IADISABLED-NEXT: stp q6, q1, [x0] | |
| ; NEON-IADISABLED-NEXT: stp q5, q0, [x0, #32] | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_undef_mask_factor4: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldr w8, [sp, #64] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #32] | |
| ; NO_NEON-NEXT: ldr w10, [sp] | |
| ; NO_NEON-NEXT: str w7, [x0, #36] | |
| ; NO_NEON-NEXT: stp w9, w8, [x0, #56] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #56] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #24] | |
| ; NO_NEON-NEXT: str w10, [x0, #52] | |
| ; NO_NEON-NEXT: stp w8, w4, [x0, #44] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #48] | |
| ; NO_NEON-NEXT: str w9, [x0, #40] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #16] | |
| ; NO_NEON-NEXT: stp w8, w3, [x0, #28] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #8] | |
| ; NO_NEON-NEXT: stp w6, w9, [x0, #20] | |
| ; NO_NEON-NEXT: stp w1, w5, [x0] | |
| ; NO_NEON-NEXT: str w8, [x0, #8] | |
| ; NO_NEON-NEXT: ret | |
| %s0 = shufflevector <4 x i32> %v0, <4 x i32> %v1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> | |
| %s1 = shufflevector <4 x i32> %v2, <4 x i32> %v3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> | |
| %interleaved.vec = shufflevector <8 x i32> %s0, <8 x i32> %s1, <16 x i32> <i32 0, i32 4, i32 8, i32 poison, i32 poison, i32 5, i32 9, i32 13, i32 2, i32 6, i32 10, i32 14, i32 3, i32 7, i32 11, i32 15> | |
| store <16 x i32> %interleaved.vec, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @load_illegal_factor2(ptr %ptr) nounwind { | |
| ; NEON-LABEL: load_illegal_factor2: | |
| ; NEON: // %bb.0: | |
| ; NEON-NEXT: ldr q0, [x0] | |
| ; NEON-NEXT: uzp1 v0.4s, v0.4s, v0.4s | |
| ; NEON-NEXT: // fake_use: $q0 | |
| ; NEON-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: load_illegal_factor2: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldr s0, [x0] | |
| ; NO_NEON-NEXT: ldr s1, [x0, #8] | |
| ; NO_NEON-NEXT: // fake_use: $s0 | |
| ; NO_NEON-NEXT: // fake_use: $s1 | |
| ; NO_NEON-NEXT: // fake_use: $s0 | |
| ; NO_NEON-NEXT: // fake_use: $s0 | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = load <3 x float>, ptr %ptr, align 16 | |
| %v0 = shufflevector <3 x float> %interleaved.vec, <3 x float> poison, <3 x i32> <i32 0, i32 2, i32 poison> | |
| tail call void (...) @llvm.fake.use(<3 x float> %v0) | |
| ret void | |
| } | |
| define void @store_illegal_factor2(ptr %ptr, <3 x float> %v0) nounwind { | |
| ; NEON-LABEL: store_illegal_factor2: | |
| ; NEON: // %bb.0: | |
| ; NEON-NEXT: uzp1 v0.4s, v0.4s, v0.4s | |
| ; NEON-NEXT: str d0, [x0] | |
| ; NEON-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_illegal_factor2: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: fmov w8, s0 | |
| ; NO_NEON-NEXT: fmov w9, s2 | |
| ; NO_NEON-NEXT: orr x8, x8, x9, lsl #32 | |
| ; NO_NEON-NEXT: str x8, [x0] | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = shufflevector <3 x float> %v0, <3 x float> poison, <3 x i32> <i32 0, i32 2, i32 poison> | |
| store <3 x float> %interleaved.vec, ptr %ptr, align 16 | |
| ret void | |
| } | |
| define void @store_general_mask_factor4(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { | |
| ; NEON-IAENABLED-LABEL: store_general_mask_factor4: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: // kill: def $q4 killed $q4 def $q3_q4_q5_q6 | |
| ; NEON-IAENABLED-NEXT: mov v6.16b, v2.16b | |
| ; NEON-IAENABLED-NEXT: mov v3.16b, v1.16b | |
| ; NEON-IAENABLED-NEXT: ldr d5, [sp] | |
| ; NEON-IAENABLED-NEXT: st4 { v3.2s, v4.2s, v5.2s, v6.2s }, [x0] | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: store_general_mask_factor4: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: ldr q0, [sp] | |
| ; NEON-IADISABLED-NEXT: trn2 v3.4s, v1.4s, v4.4s | |
| ; NEON-IADISABLED-NEXT: zip1 v1.4s, v1.4s, v4.4s | |
| ; NEON-IADISABLED-NEXT: zip1 v2.4s, v0.4s, v2.4s | |
| ; NEON-IADISABLED-NEXT: ext v0.16b, v0.16b, v2.16b, #8 | |
| ; NEON-IADISABLED-NEXT: mov v3.d[1], v2.d[1] | |
| ; NEON-IADISABLED-NEXT: mov v1.d[1], v0.d[1] | |
| ; NEON-IADISABLED-NEXT: stp q1, q3, [x0] | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_general_mask_factor4: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill | |
| ; NO_NEON-NEXT: .cfi_def_cfa_offset 16 | |
| ; NO_NEON-NEXT: .cfi_offset w29, -16 | |
| ; NO_NEON-NEXT: ldr w8, [sp, #32] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #224] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #96] | |
| ; NO_NEON-NEXT: str w6, [x0, #16] | |
| ; NO_NEON-NEXT: stp w9, w8, [x0, #24] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #24] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #216] | |
| ; NO_NEON-NEXT: str w10, [x0, #20] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #88] | |
| ; NO_NEON-NEXT: stp w9, w8, [x0, #8] | |
| ; NO_NEON-NEXT: stp w5, w10, [x0] | |
| ; NO_NEON-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = shufflevector <32 x i32> %v0, <32 x i32> %v1, <8 x i32> <i32 4, i32 16, i32 32, i32 8, i32 5, i32 17, i32 33, i32 9> | |
| store <8 x i32> %interleaved.vec, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_general_mask_factor4_undefbeg(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { | |
| ; NEON-IAENABLED-LABEL: store_general_mask_factor4_undefbeg: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: // kill: def $q4 killed $q4 def $q3_q4_q5_q6 | |
| ; NEON-IAENABLED-NEXT: mov v6.16b, v2.16b | |
| ; NEON-IAENABLED-NEXT: mov v3.16b, v1.16b | |
| ; NEON-IAENABLED-NEXT: ldr d5, [sp] | |
| ; NEON-IAENABLED-NEXT: st4 { v3.2s, v4.2s, v5.2s, v6.2s }, [x0] | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: store_general_mask_factor4_undefbeg: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: uzp2 v0.4s, v2.4s, v1.4s | |
| ; NEON-IADISABLED-NEXT: mov v5.16b, v4.16b | |
| ; NEON-IADISABLED-NEXT: ldr q1, [sp] | |
| ; NEON-IADISABLED-NEXT: trn1 v3.4s, v4.4s, v1.4s | |
| ; NEON-IADISABLED-NEXT: ext v0.16b, v0.16b, v2.16b, #8 | |
| ; NEON-IADISABLED-NEXT: ext v3.16b, v4.16b, v3.16b, #12 | |
| ; NEON-IADISABLED-NEXT: mov v5.s[0], v0.s[0] | |
| ; NEON-IADISABLED-NEXT: mov v3.s[3], v2.s[0] | |
| ; NEON-IADISABLED-NEXT: mov v5.s[2], v1.s[1] | |
| ; NEON-IADISABLED-NEXT: mov v5.s[3], v0.s[3] | |
| ; NEON-IADISABLED-NEXT: stp q3, q5, [x0] | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_general_mask_factor4_undefbeg: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill | |
| ; NO_NEON-NEXT: .cfi_def_cfa_offset 16 | |
| ; NO_NEON-NEXT: .cfi_offset w29, -16 | |
| ; NO_NEON-NEXT: ldr w8, [sp, #32] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #224] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #96] | |
| ; NO_NEON-NEXT: str w6, [x0, #16] | |
| ; NO_NEON-NEXT: stp w9, w8, [x0, #24] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #24] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #216] | |
| ; NO_NEON-NEXT: str w10, [x0, #20] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #88] | |
| ; NO_NEON-NEXT: stp w9, w8, [x0, #8] | |
| ; NO_NEON-NEXT: str w10, [x0, #4] | |
| ; NO_NEON-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = shufflevector <32 x i32> %v0, <32 x i32> %v1, <8 x i32> <i32 poison, i32 16, i32 32, i32 8, i32 5, i32 17, i32 33, i32 9> | |
| store <8 x i32> %interleaved.vec, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_general_mask_factor4_undefend(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { | |
| ; NEON-IAENABLED-LABEL: store_general_mask_factor4_undefend: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: // kill: def $q4 killed $q4 def $q3_q4_q5_q6 | |
| ; NEON-IAENABLED-NEXT: mov v6.16b, v2.16b | |
| ; NEON-IAENABLED-NEXT: mov v3.16b, v1.16b | |
| ; NEON-IAENABLED-NEXT: ldr d5, [sp] | |
| ; NEON-IAENABLED-NEXT: st4 { v3.2s, v4.2s, v5.2s, v6.2s }, [x0] | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: store_general_mask_factor4_undefend: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: ldr q0, [sp] | |
| ; NEON-IADISABLED-NEXT: trn2 v3.4s, v1.4s, v4.4s | |
| ; NEON-IADISABLED-NEXT: zip1 v1.4s, v1.4s, v4.4s | |
| ; NEON-IADISABLED-NEXT: zip1 v2.4s, v0.4s, v2.4s | |
| ; NEON-IADISABLED-NEXT: mov v3.s[2], v0.s[1] | |
| ; NEON-IADISABLED-NEXT: ext v2.16b, v0.16b, v2.16b, #8 | |
| ; NEON-IADISABLED-NEXT: mov v1.d[1], v2.d[1] | |
| ; NEON-IADISABLED-NEXT: stp q1, q3, [x0] | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_general_mask_factor4_undefend: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill | |
| ; NO_NEON-NEXT: .cfi_def_cfa_offset 16 | |
| ; NO_NEON-NEXT: .cfi_offset w29, -16 | |
| ; NO_NEON-NEXT: ldr w8, [sp, #96] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #224] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #216] | |
| ; NO_NEON-NEXT: str w6, [x0, #16] | |
| ; NO_NEON-NEXT: str w8, [x0, #20] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #24] | |
| ; NO_NEON-NEXT: str w9, [x0, #24] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #88] | |
| ; NO_NEON-NEXT: stp w10, w8, [x0, #8] | |
| ; NO_NEON-NEXT: stp w5, w9, [x0] | |
| ; NO_NEON-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = shufflevector <32 x i32> %v0, <32 x i32> %v1, <8 x i32> <i32 4, i32 16, i32 32, i32 8, i32 5, i32 17, i32 33, i32 poison> | |
| store <8 x i32> %interleaved.vec, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_general_mask_factor4_undefmid(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { | |
| ; NEON-IAENABLED-LABEL: store_general_mask_factor4_undefmid: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: // kill: def $q4 killed $q4 def $q3_q4_q5_q6 | |
| ; NEON-IAENABLED-NEXT: mov v6.16b, v2.16b | |
| ; NEON-IAENABLED-NEXT: mov v3.16b, v1.16b | |
| ; NEON-IAENABLED-NEXT: ldr d5, [sp] | |
| ; NEON-IAENABLED-NEXT: st4 { v3.2s, v4.2s, v5.2s, v6.2s }, [x0] | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: store_general_mask_factor4_undefmid: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: zip1 v0.4s, v1.4s, v2.4s | |
| ; NEON-IADISABLED-NEXT: ldr q3, [sp] | |
| ; NEON-IADISABLED-NEXT: uzp1 v3.4s, v1.4s, v3.4s | |
| ; NEON-IADISABLED-NEXT: uzp2 v0.4s, v1.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: mov v3.s[3], v2.s[0] | |
| ; NEON-IADISABLED-NEXT: mov v0.s[1], v4.s[1] | |
| ; NEON-IADISABLED-NEXT: stp q3, q0, [x0] | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_general_mask_factor4_undefmid: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill | |
| ; NO_NEON-NEXT: .cfi_def_cfa_offset 16 | |
| ; NO_NEON-NEXT: .cfi_offset w29, -16 | |
| ; NO_NEON-NEXT: ldr w8, [sp, #96] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #32] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #216] | |
| ; NO_NEON-NEXT: str w6, [x0, #16] | |
| ; NO_NEON-NEXT: str w8, [x0, #20] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #24] | |
| ; NO_NEON-NEXT: str w9, [x0, #28] | |
| ; NO_NEON-NEXT: stp w10, w8, [x0, #8] | |
| ; NO_NEON-NEXT: str w5, [x0] | |
| ; NO_NEON-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = shufflevector <32 x i32> %v0, <32 x i32> %v1, <8 x i32> <i32 4, i32 poison, i32 32, i32 8, i32 5, i32 17, i32 poison, i32 9> | |
| store <8 x i32> %interleaved.vec, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_general_mask_factor4_undefmulti(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { | |
| ; NEON-IAENABLED-LABEL: store_general_mask_factor4_undefmulti: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: mov v5.16b, v2.16b | |
| ; NEON-IAENABLED-NEXT: mov v2.16b, v1.16b | |
| ; NEON-IAENABLED-NEXT: mov v3.16b, v0.16b | |
| ; NEON-IAENABLED-NEXT: fmov d4, d3 | |
| ; NEON-IAENABLED-NEXT: st4 { v2.2s, v3.2s, v4.2s, v5.2s }, [x0] | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: store_general_mask_factor4_undefmulti: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: mov v1.s[3], v2.s[0] | |
| ; NEON-IADISABLED-NEXT: dup v0.4s, v2.s[1] | |
| ; NEON-IADISABLED-NEXT: stp q1, q0, [x0] | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_general_mask_factor4_undefmulti: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill | |
| ; NO_NEON-NEXT: .cfi_def_cfa_offset 16 | |
| ; NO_NEON-NEXT: .cfi_offset w29, -16 | |
| ; NO_NEON-NEXT: ldr w8, [sp, #24] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #32] | |
| ; NO_NEON-NEXT: str w5, [x0] | |
| ; NO_NEON-NEXT: str w8, [x0, #12] | |
| ; NO_NEON-NEXT: str w9, [x0, #28] | |
| ; NO_NEON-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = shufflevector <32 x i32> %v0, <32 x i32> %v1, <8 x i32> <i32 4, i32 poison, i32 poison, i32 8, i32 poison, i32 poison, i32 poison, i32 9> | |
| store <8 x i32> %interleaved.vec, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_general_mask_factor3(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { | |
| ; NEON-IAENABLED-LABEL: store_general_mask_factor3: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: // kill: def $q4 killed $q4 def $q2_q3_q4 | |
| ; NEON-IAENABLED-NEXT: mov v2.16b, v1.16b | |
| ; NEON-IAENABLED-NEXT: ldr q3, [sp] | |
| ; NEON-IAENABLED-NEXT: st3 { v2.4s, v3.4s, v4.4s }, [x0] | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: store_general_mask_factor3: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: ldr q0, [sp] | |
| ; NEON-IADISABLED-NEXT: trn2 v2.4s, v1.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: uzp1 v3.4s, v1.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: trn1 v5.4s, v1.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: ext v2.16b, v2.16b, v1.16b, #4 | |
| ; NEON-IADISABLED-NEXT: uzp2 v0.4s, v0.4s, v3.4s | |
| ; NEON-IADISABLED-NEXT: mov v5.d[1], v1.d[0] | |
| ; NEON-IADISABLED-NEXT: mov v2.s[0], v4.s[2] | |
| ; NEON-IADISABLED-NEXT: mov v0.s[1], v4.s[1] | |
| ; NEON-IADISABLED-NEXT: mov v5.s[2], v4.s[0] | |
| ; NEON-IADISABLED-NEXT: mov v2.s[3], v4.s[3] | |
| ; NEON-IADISABLED-NEXT: stp q5, q0, [x0] | |
| ; NEON-IADISABLED-NEXT: str q2, [x0, #32] | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_general_mask_factor3: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill | |
| ; NO_NEON-NEXT: .cfi_def_cfa_offset 16 | |
| ; NO_NEON-NEXT: .cfi_offset w29, -16 | |
| ; NO_NEON-NEXT: ldr w8, [sp, #240] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #112] | |
| ; NO_NEON-NEXT: // kill: def $w6 killed $w6 def $x6 | |
| ; NO_NEON-NEXT: ldr w11, [sp, #224] | |
| ; NO_NEON-NEXT: ldr w12, [sp, #96] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #104] | |
| ; NO_NEON-NEXT: ldr w13, [sp, #16] | |
| ; NO_NEON-NEXT: orr x8, x8, x10, lsl #32 | |
| ; NO_NEON-NEXT: orr x10, x11, x12, lsl #32 | |
| ; NO_NEON-NEXT: ldr w11, [sp, #232] | |
| ; NO_NEON-NEXT: orr x9, x9, x13, lsl #32 | |
| ; NO_NEON-NEXT: mov w13, w7 | |
| ; NO_NEON-NEXT: ldr w12, [sp, #88] | |
| ; NO_NEON-NEXT: str x8, [x0, #40] | |
| ; NO_NEON-NEXT: orr x11, x13, x11, lsl #32 | |
| ; NO_NEON-NEXT: ldr w8, [sp, #216] | |
| ; NO_NEON-NEXT: orr x12, x12, x6, lsl #32 | |
| ; NO_NEON-NEXT: stp x11, x9, [x0, #24] | |
| ; NO_NEON-NEXT: mov w9, w5 | |
| ; NO_NEON-NEXT: orr x8, x9, x8, lsl #32 | |
| ; NO_NEON-NEXT: stp x12, x10, [x0, #8] | |
| ; NO_NEON-NEXT: str x8, [x0] | |
| ; NO_NEON-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = shufflevector <32 x i32> %v0, <32 x i32> %v1, <12 x i32> <i32 4, i32 32, i32 16, i32 5, i32 33, i32 17, i32 6, i32 34, i32 18, i32 7, i32 35, i32 19> | |
| store <12 x i32> %interleaved.vec, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_general_mask_factor3_undefmultimid(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { | |
| ; NEON-IAENABLED-LABEL: store_general_mask_factor3_undefmultimid: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: // kill: def $q4 killed $q4 def $q2_q3_q4 | |
| ; NEON-IAENABLED-NEXT: mov v2.16b, v1.16b | |
| ; NEON-IAENABLED-NEXT: ldr q3, [sp] | |
| ; NEON-IAENABLED-NEXT: st3 { v2.4s, v3.4s, v4.4s }, [x0] | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: store_general_mask_factor3_undefmultimid: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: ldr q0, [sp] | |
| ; NEON-IADISABLED-NEXT: trn2 v2.4s, v1.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: uzp2 v3.4s, v0.4s, v4.4s | |
| ; NEON-IADISABLED-NEXT: ext v2.16b, v2.16b, v1.16b, #4 | |
| ; NEON-IADISABLED-NEXT: zip1 v1.4s, v1.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: uzp1 v0.4s, v3.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: mov v2.s[0], v4.s[2] | |
| ; NEON-IADISABLED-NEXT: mov v1.s[2], v4.s[0] | |
| ; NEON-IADISABLED-NEXT: mov v2.s[3], v4.s[3] | |
| ; NEON-IADISABLED-NEXT: stp q1, q0, [x0] | |
| ; NEON-IADISABLED-NEXT: str q2, [x0, #32] | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_general_mask_factor3_undefmultimid: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill | |
| ; NO_NEON-NEXT: .cfi_def_cfa_offset 16 | |
| ; NO_NEON-NEXT: .cfi_offset w29, -16 | |
| ; NO_NEON-NEXT: ldr w8, [sp, #240] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #112] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #104] | |
| ; NO_NEON-NEXT: ldr w11, [sp, #16] | |
| ; NO_NEON-NEXT: ldr w12, [sp, #232] | |
| ; NO_NEON-NEXT: orr x8, x8, x9, lsl #32 | |
| ; NO_NEON-NEXT: ldr w9, [sp, #224] | |
| ; NO_NEON-NEXT: orr x10, x10, x11, lsl #32 | |
| ; NO_NEON-NEXT: ldr w11, [sp, #96] | |
| ; NO_NEON-NEXT: lsl x12, x12, #32 | |
| ; NO_NEON-NEXT: str x8, [x0, #40] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #216] | |
| ; NO_NEON-NEXT: orr x9, x9, x11, lsl #32 | |
| ; NO_NEON-NEXT: mov w11, w5 | |
| ; NO_NEON-NEXT: str x10, [x0, #32] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #88] | |
| ; NO_NEON-NEXT: orr x8, x11, x8, lsl #32 | |
| ; NO_NEON-NEXT: stp x9, x12, [x0, #16] | |
| ; NO_NEON-NEXT: stp x8, x10, [x0] | |
| ; NO_NEON-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = shufflevector <32 x i32> %v0, <32 x i32> %v1, <12 x i32> <i32 4, i32 32, i32 16, i32 poison, i32 33, i32 17, i32 poison, i32 34, i32 18, i32 7, i32 35, i32 19> | |
| store <12 x i32> %interleaved.vec, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_general_mask_factor3_undef_fail(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { | |
| ; NEON-LABEL: store_general_mask_factor3_undef_fail: | |
| ; NEON: // %bb.0: | |
| ; NEON-NEXT: ldr q0, [sp] | |
| ; NEON-NEXT: trn2 v3.4s, v0.4s, v4.4s | |
| ; NEON-NEXT: uzp2 v5.4s, v0.4s, v4.4s | |
| ; NEON-NEXT: zip1 v1.4s, v1.4s, v0.4s | |
| ; NEON-NEXT: mov v3.s[0], v4.s[2] | |
| ; NEON-NEXT: uzp1 v0.4s, v5.4s, v0.4s | |
| ; NEON-NEXT: mov v1.s[2], v4.s[0] | |
| ; NEON-NEXT: mov v3.s[1], v2.s[0] | |
| ; NEON-NEXT: stp q1, q0, [x0] | |
| ; NEON-NEXT: str q3, [x0, #32] | |
| ; NEON-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_general_mask_factor3_undef_fail: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill | |
| ; NO_NEON-NEXT: .cfi_def_cfa_offset 16 | |
| ; NO_NEON-NEXT: .cfi_offset w29, -16 | |
| ; NO_NEON-NEXT: ldr w8, [sp, #240] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #112] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #104] | |
| ; NO_NEON-NEXT: ldr w11, [sp, #24] | |
| ; NO_NEON-NEXT: ldr w12, [sp, #232] | |
| ; NO_NEON-NEXT: orr x8, x8, x9, lsl #32 | |
| ; NO_NEON-NEXT: ldr w9, [sp, #224] | |
| ; NO_NEON-NEXT: orr x10, x10, x11, lsl #32 | |
| ; NO_NEON-NEXT: ldr w11, [sp, #96] | |
| ; NO_NEON-NEXT: lsl x12, x12, #32 | |
| ; NO_NEON-NEXT: str x8, [x0, #40] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #216] | |
| ; NO_NEON-NEXT: orr x9, x9, x11, lsl #32 | |
| ; NO_NEON-NEXT: mov w11, w5 | |
| ; NO_NEON-NEXT: str x10, [x0, #32] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #88] | |
| ; NO_NEON-NEXT: orr x8, x11, x8, lsl #32 | |
| ; NO_NEON-NEXT: stp x9, x12, [x0, #16] | |
| ; NO_NEON-NEXT: stp x8, x10, [x0] | |
| ; NO_NEON-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = shufflevector <32 x i32> %v0, <32 x i32> %v1, <12 x i32> <i32 4, i32 32, i32 16, i32 poison, i32 33, i32 17, i32 poison, i32 34, i32 18, i32 8, i32 35, i32 19> | |
| store <12 x i32> %interleaved.vec, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_general_mask_factor3_undeflane(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { | |
| ; NEON-IAENABLED-LABEL: store_general_mask_factor3_undeflane: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: // kill: def $q4 killed $q4 def $q2_q3_q4 | |
| ; NEON-IAENABLED-NEXT: mov v2.16b, v0.16b | |
| ; NEON-IAENABLED-NEXT: ldr q3, [sp] | |
| ; NEON-IAENABLED-NEXT: st3 { v2.4s, v3.4s, v4.4s }, [x0] | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: store_general_mask_factor3_undeflane: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: ldr q0, [sp] | |
| ; NEON-IADISABLED-NEXT: trn2 v1.4s, v0.4s, v4.4s | |
| ; NEON-IADISABLED-NEXT: uzp2 v2.4s, v0.4s, v4.4s | |
| ; NEON-IADISABLED-NEXT: ext v3.16b, v4.16b, v0.16b, #4 | |
| ; NEON-IADISABLED-NEXT: mov v1.s[0], v4.s[2] | |
| ; NEON-IADISABLED-NEXT: uzp1 v0.4s, v2.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: ext v2.16b, v3.16b, v4.16b, #8 | |
| ; NEON-IADISABLED-NEXT: stp q0, q1, [x0, #16] | |
| ; NEON-IADISABLED-NEXT: str q2, [x0] | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_general_mask_factor3_undeflane: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill | |
| ; NO_NEON-NEXT: .cfi_def_cfa_offset 16 | |
| ; NO_NEON-NEXT: .cfi_offset w29, -16 | |
| ; NO_NEON-NEXT: ldr w8, [sp, #240] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #112] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #104] | |
| ; NO_NEON-NEXT: ldr w11, [sp, #232] | |
| ; NO_NEON-NEXT: ldr w12, [sp, #224] | |
| ; NO_NEON-NEXT: ldr w13, [sp, #96] | |
| ; NO_NEON-NEXT: orr x8, x8, x9, lsl #32 | |
| ; NO_NEON-NEXT: str x10, [x0, #32] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #216] | |
| ; NO_NEON-NEXT: lsl x9, x11, #32 | |
| ; NO_NEON-NEXT: orr x11, x12, x13, lsl #32 | |
| ; NO_NEON-NEXT: str x8, [x0, #40] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #88] | |
| ; NO_NEON-NEXT: stp x11, x9, [x0, #16] | |
| ; NO_NEON-NEXT: lsl x9, x10, #32 | |
| ; NO_NEON-NEXT: stp x9, x8, [x0] | |
| ; NO_NEON-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = shufflevector <32 x i32> %v0, <32 x i32> %v1, <12 x i32> <i32 poison, i32 32, i32 16, i32 poison, i32 33, i32 17, i32 poison, i32 34, i32 18, i32 poison, i32 35, i32 19> | |
| store <12 x i32> %interleaved.vec, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_general_mask_factor3_negativestart(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { | |
| ; NEON-LABEL: store_general_mask_factor3_negativestart: | |
| ; NEON: // %bb.0: | |
| ; NEON-NEXT: ldr q1, [sp] | |
| ; NEON-NEXT: trn2 v2.4s, v1.4s, v4.4s | |
| ; NEON-NEXT: uzp2 v3.4s, v1.4s, v4.4s | |
| ; NEON-NEXT: trn1 v5.4s, v1.4s, v4.4s | |
| ; NEON-NEXT: mov v2.s[0], v4.s[2] | |
| ; NEON-NEXT: uzp1 v3.4s, v3.4s, v1.4s | |
| ; NEON-NEXT: ext v1.16b, v1.16b, v5.16b, #12 | |
| ; NEON-NEXT: mov v2.s[1], v0.s[2] | |
| ; NEON-NEXT: stp q1, q3, [x0] | |
| ; NEON-NEXT: str q2, [x0, #32] | |
| ; NEON-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_general_mask_factor3_negativestart: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill | |
| ; NO_NEON-NEXT: .cfi_def_cfa_offset 16 | |
| ; NO_NEON-NEXT: .cfi_offset w29, -16 | |
| ; NO_NEON-NEXT: ldr w8, [sp, #240] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #112] | |
| ; NO_NEON-NEXT: // kill: def $w3 killed $w3 def $x3 | |
| ; NO_NEON-NEXT: ldr w10, [sp, #104] | |
| ; NO_NEON-NEXT: ldr w11, [sp, #232] | |
| ; NO_NEON-NEXT: ldr w12, [sp, #96] | |
| ; NO_NEON-NEXT: orr x8, x8, x9, lsl #32 | |
| ; NO_NEON-NEXT: ldr w9, [sp, #224] | |
| ; NO_NEON-NEXT: orr x10, x10, x3, lsl #32 | |
| ; NO_NEON-NEXT: lsl x11, x11, #32 | |
| ; NO_NEON-NEXT: str x8, [x0, #40] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #216] | |
| ; NO_NEON-NEXT: orr x9, x9, x12, lsl #32 | |
| ; NO_NEON-NEXT: str x10, [x0, #32] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #88] | |
| ; NO_NEON-NEXT: lsl x8, x8, #32 | |
| ; NO_NEON-NEXT: stp x9, x11, [x0, #16] | |
| ; NO_NEON-NEXT: stp x8, x10, [x0] | |
| ; NO_NEON-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = shufflevector <32 x i32> %v0, <32 x i32> %v1, <12 x i32> <i32 poison, i32 32, i32 16, i32 poison, i32 33, i32 17, i32 poison, i32 34, i32 18, i32 2, i32 35, i32 19> | |
| store <12 x i32> %interleaved.vec, ptr %ptr, align 4 | |
| ret void | |
| } | |
| @g = external global <4 x float> | |
| ; The following does not give a valid interleaved store | |
| define void @no_interleave(<4 x float> %a0) { | |
| ; NEON-LABEL: no_interleave: | |
| ; NEON: // %bb.0: | |
| ; NEON-NEXT: dup v1.4s, v0.s[3] | |
| ; NEON-NEXT: adrp x8, :got:g | |
| ; NEON-NEXT: ldr x8, [x8, :got_lo12:g] | |
| ; NEON-NEXT: mov v1.s[0], v0.s[0] | |
| ; NEON-NEXT: str q1, [x8] | |
| ; NEON-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: no_interleave: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: adrp x8, :got:g | |
| ; NO_NEON-NEXT: ldr x8, [x8, :got_lo12:g] | |
| ; NO_NEON-NEXT: stp s0, s3, [x8] | |
| ; NO_NEON-NEXT: str s3, [x8, #8] | |
| ; NO_NEON-NEXT: ret | |
| %v0 = shufflevector <4 x float> %a0, <4 x float> %a0, <4 x i32> <i32 0, i32 3, i32 7, i32 poison> | |
| store <4 x float> %v0, ptr @g, align 16 | |
| ret void | |
| } | |
| define void @load_factor2_wide2(ptr %ptr) { | |
| ; NEON-IAENABLED-LABEL: load_factor2_wide2: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: ld2 { v0.4s, v1.4s }, [x0], #32 | |
| ; NEON-IAENABLED-NEXT: ld2 { v2.4s, v3.4s }, [x0] | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q0 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q2 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q1 $q0_q1 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q3 $q2_q3 | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: load_factor2_wide2: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: ldp q1, q0, [x0] | |
| ; NEON-IADISABLED-NEXT: ldp q3, q2, [x0, #32] | |
| ; NEON-IADISABLED-NEXT: uzp1 v4.4s, v1.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: uzp2 v0.4s, v1.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: uzp1 v5.4s, v3.4s, v2.4s | |
| ; NEON-IADISABLED-NEXT: uzp2 v2.4s, v3.4s, v2.4s | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q4 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q5 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q0 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q2 | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: load_factor2_wide2: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldp w1, w18, [x0] | |
| ; NO_NEON-NEXT: ldp w9, w8, [x0, #56] | |
| ; NO_NEON-NEXT: ldp w11, w10, [x0, #48] | |
| ; NO_NEON-NEXT: ldp w13, w12, [x0, #40] | |
| ; NO_NEON-NEXT: ldp w15, w14, [x0, #32] | |
| ; NO_NEON-NEXT: ldp w17, w16, [x0, #24] | |
| ; NO_NEON-NEXT: ldp w3, w2, [x0, #16] | |
| ; NO_NEON-NEXT: ldp w0, w4, [x0, #8] | |
| ; NO_NEON-NEXT: // fake_use: $w1 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w3 | |
| ; NO_NEON-NEXT: // fake_use: $w17 | |
| ; NO_NEON-NEXT: // fake_use: $w15 | |
| ; NO_NEON-NEXT: // fake_use: $w13 | |
| ; NO_NEON-NEXT: // fake_use: $w11 | |
| ; NO_NEON-NEXT: // fake_use: $w9 | |
| ; NO_NEON-NEXT: // fake_use: $w18 | |
| ; NO_NEON-NEXT: // fake_use: $w4 | |
| ; NO_NEON-NEXT: // fake_use: $w2 | |
| ; NO_NEON-NEXT: // fake_use: $w16 | |
| ; NO_NEON-NEXT: // fake_use: $w14 | |
| ; NO_NEON-NEXT: // fake_use: $w12 | |
| ; NO_NEON-NEXT: // fake_use: $w10 | |
| ; NO_NEON-NEXT: // fake_use: $w8 | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = load <16 x i32>, ptr %ptr, align 4 | |
| %v0 = shufflevector <16 x i32> %interleaved.vec, <16 x i32> poison, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14> | |
| %v1 = shufflevector <16 x i32> %interleaved.vec, <16 x i32> poison, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15> | |
| tail call void (...) @llvm.fake.use(<8 x i32> %v0) | |
| tail call void (...) @llvm.fake.use(<8 x i32> %v1) | |
| ret void | |
| } | |
| define void @load_factor2_wide3(ptr %ptr) { | |
| ; NEON-IAENABLED-LABEL: load_factor2_wide3: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: add x8, x0, #64 | |
| ; NEON-IAENABLED-NEXT: ld2 { v0.4s, v1.4s }, [x0], #32 | |
| ; NEON-IAENABLED-NEXT: ld2 { v2.4s, v3.4s }, [x0] | |
| ; NEON-IAENABLED-NEXT: ld2 { v4.4s, v5.4s }, [x8] | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q0 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q2 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q4 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q0 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q1 $q0_q1 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q3 $q2_q3 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q5 $q4_q5 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q0 | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: load_factor2_wide3: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: ldp q1, q0, [x0] | |
| ; NEON-IADISABLED-NEXT: ldp q3, q2, [x0, #32] | |
| ; NEON-IADISABLED-NEXT: ldp q5, q4, [x0, #64] | |
| ; NEON-IADISABLED-NEXT: uzp1 v16.4s, v1.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: uzp2 v0.4s, v1.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: uzp1 v7.4s, v3.4s, v2.4s | |
| ; NEON-IADISABLED-NEXT: uzp2 v2.4s, v3.4s, v2.4s | |
| ; NEON-IADISABLED-NEXT: uzp1 v6.4s, v5.4s, v4.4s | |
| ; NEON-IADISABLED-NEXT: uzp2 v4.4s, v5.4s, v4.4s | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q16 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q7 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q6 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q0 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q0 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q2 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q4 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q0 | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: load_factor2_wide3: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: str x23, [sp, #-48]! // 8-byte Folded Spill | |
| ; NO_NEON-NEXT: stp x22, x21, [sp, #16] // 16-byte Folded Spill | |
| ; NO_NEON-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill | |
| ; NO_NEON-NEXT: .cfi_def_cfa_offset 48 | |
| ; NO_NEON-NEXT: .cfi_offset w19, -8 | |
| ; NO_NEON-NEXT: .cfi_offset w20, -16 | |
| ; NO_NEON-NEXT: .cfi_offset w21, -24 | |
| ; NO_NEON-NEXT: .cfi_offset w22, -32 | |
| ; NO_NEON-NEXT: .cfi_offset w23, -48 | |
| ; NO_NEON-NEXT: ldp w20, w19, [x0] | |
| ; NO_NEON-NEXT: ldp w9, w8, [x0, #88] | |
| ; NO_NEON-NEXT: ldp w11, w10, [x0, #80] | |
| ; NO_NEON-NEXT: ldp w13, w12, [x0, #72] | |
| ; NO_NEON-NEXT: ldp w15, w14, [x0, #64] | |
| ; NO_NEON-NEXT: ldp w17, w16, [x0, #56] | |
| ; NO_NEON-NEXT: ldp w1, w18, [x0, #48] | |
| ; NO_NEON-NEXT: ldp w3, w2, [x0, #40] | |
| ; NO_NEON-NEXT: ldp w5, w4, [x0, #32] | |
| ; NO_NEON-NEXT: ldp w7, w6, [x0, #24] | |
| ; NO_NEON-NEXT: ldp w22, w21, [x0, #16] | |
| ; NO_NEON-NEXT: ldp w0, w23, [x0, #8] | |
| ; NO_NEON-NEXT: // fake_use: $w20 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w22 | |
| ; NO_NEON-NEXT: // fake_use: $w7 | |
| ; NO_NEON-NEXT: // fake_use: $w5 | |
| ; NO_NEON-NEXT: // fake_use: $w3 | |
| ; NO_NEON-NEXT: // fake_use: $w1 | |
| ; NO_NEON-NEXT: // fake_use: $w17 | |
| ; NO_NEON-NEXT: // fake_use: $w15 | |
| ; NO_NEON-NEXT: // fake_use: $w13 | |
| ; NO_NEON-NEXT: // fake_use: $w11 | |
| ; NO_NEON-NEXT: // fake_use: $w9 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w19 | |
| ; NO_NEON-NEXT: // fake_use: $w23 | |
| ; NO_NEON-NEXT: // fake_use: $w21 | |
| ; NO_NEON-NEXT: // fake_use: $w6 | |
| ; NO_NEON-NEXT: // fake_use: $w4 | |
| ; NO_NEON-NEXT: // fake_use: $w2 | |
| ; NO_NEON-NEXT: // fake_use: $w18 | |
| ; NO_NEON-NEXT: // fake_use: $w16 | |
| ; NO_NEON-NEXT: // fake_use: $w14 | |
| ; NO_NEON-NEXT: // fake_use: $w12 | |
| ; NO_NEON-NEXT: // fake_use: $w10 | |
| ; NO_NEON-NEXT: // fake_use: $w8 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload | |
| ; NO_NEON-NEXT: ldp x22, x21, [sp, #16] // 16-byte Folded Reload | |
| ; NO_NEON-NEXT: ldr x23, [sp], #48 // 8-byte Folded Reload | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = load <24 x i32>, ptr %ptr, align 4 | |
| %v0 = shufflevector <24 x i32> %interleaved.vec, <24 x i32> poison, <12 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22> | |
| %v1 = shufflevector <24 x i32> %interleaved.vec, <24 x i32> poison, <12 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23> | |
| tail call void (...) @llvm.fake.use(<12 x i32> %v0) | |
| tail call void (...) @llvm.fake.use(<12 x i32> %v1) | |
| ret void | |
| } | |
| define void @load_factor3_wide(ptr %ptr) { | |
| ; NEON-IAENABLED-LABEL: load_factor3_wide: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: ld3 { v0.4s, v1.4s, v2.4s }, [x0], #48 | |
| ; NEON-IAENABLED-NEXT: ld3 { v3.4s, v4.4s, v5.4s }, [x0] | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q0 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q3 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q1 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q4 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q2 $q0_q1_q2 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q5 $q3_q4_q5 | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: load_factor3_wide: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: ldp q0, q4, [x0] | |
| ; NEON-IADISABLED-NEXT: ldr q16, [x0, #32] | |
| ; NEON-IADISABLED-NEXT: ldp q1, q5, [x0, #48] | |
| ; NEON-IADISABLED-NEXT: ldr q17, [x0, #80] | |
| ; NEON-IADISABLED-NEXT: mov v3.16b, v0.16b | |
| ; NEON-IADISABLED-NEXT: rev64 v7.4s, v4.4s | |
| ; NEON-IADISABLED-NEXT: mov v2.16b, v1.16b | |
| ; NEON-IADISABLED-NEXT: rev64 v6.4s, v5.4s | |
| ; NEON-IADISABLED-NEXT: mov v3.s[1], v0.s[3] | |
| ; NEON-IADISABLED-NEXT: mov v2.s[1], v1.s[3] | |
| ; NEON-IADISABLED-NEXT: mov v7.s[0], v0.s[1] | |
| ; NEON-IADISABLED-NEXT: mov v6.s[0], v1.s[1] | |
| ; NEON-IADISABLED-NEXT: mov v3.s[2], v4.s[2] | |
| ; NEON-IADISABLED-NEXT: mov v4.s[0], v0.s[2] | |
| ; NEON-IADISABLED-NEXT: mov v2.s[2], v5.s[2] | |
| ; NEON-IADISABLED-NEXT: mov v5.s[0], v1.s[2] | |
| ; NEON-IADISABLED-NEXT: mov v7.s[3], v16.s[2] | |
| ; NEON-IADISABLED-NEXT: mov v6.s[3], v17.s[2] | |
| ; NEON-IADISABLED-NEXT: mov v4.s[2], v16.s[0] | |
| ; NEON-IADISABLED-NEXT: mov v3.s[3], v16.s[1] | |
| ; NEON-IADISABLED-NEXT: mov v5.s[2], v17.s[0] | |
| ; NEON-IADISABLED-NEXT: mov v2.s[3], v17.s[1] | |
| ; NEON-IADISABLED-NEXT: mov v4.s[3], v16.s[3] | |
| ; NEON-IADISABLED-NEXT: mov v5.s[3], v17.s[3] | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q3 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q2 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q7 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q6 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q4 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q5 | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: load_factor3_wide: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: str x23, [sp, #-48]! // 8-byte Folded Spill | |
| ; NO_NEON-NEXT: stp x22, x21, [sp, #16] // 16-byte Folded Spill | |
| ; NO_NEON-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill | |
| ; NO_NEON-NEXT: .cfi_def_cfa_offset 48 | |
| ; NO_NEON-NEXT: .cfi_offset w19, -8 | |
| ; NO_NEON-NEXT: .cfi_offset w20, -16 | |
| ; NO_NEON-NEXT: .cfi_offset w21, -24 | |
| ; NO_NEON-NEXT: .cfi_offset w22, -32 | |
| ; NO_NEON-NEXT: .cfi_offset w23, -48 | |
| ; NO_NEON-NEXT: ldp w20, w19, [x0] | |
| ; NO_NEON-NEXT: ldp w9, w8, [x0, #88] | |
| ; NO_NEON-NEXT: ldp w11, w10, [x0, #64] | |
| ; NO_NEON-NEXT: ldp w13, w12, [x0, #40] | |
| ; NO_NEON-NEXT: ldp w15, w14, [x0, #16] | |
| ; NO_NEON-NEXT: ldp w16, w17, [x0, #80] | |
| ; NO_NEON-NEXT: ldp w1, w18, [x0, #72] | |
| ; NO_NEON-NEXT: ldp w2, w3, [x0, #56] | |
| ; NO_NEON-NEXT: ldp w5, w4, [x0, #48] | |
| ; NO_NEON-NEXT: ldp w6, w7, [x0, #32] | |
| ; NO_NEON-NEXT: ldp w22, w21, [x0, #24] | |
| ; NO_NEON-NEXT: ldp w23, w0, [x0, #8] | |
| ; NO_NEON-NEXT: // fake_use: $w20 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w22 | |
| ; NO_NEON-NEXT: // fake_use: $w7 | |
| ; NO_NEON-NEXT: // fake_use: $w5 | |
| ; NO_NEON-NEXT: // fake_use: $w3 | |
| ; NO_NEON-NEXT: // fake_use: $w1 | |
| ; NO_NEON-NEXT: // fake_use: $w17 | |
| ; NO_NEON-NEXT: // fake_use: $w19 | |
| ; NO_NEON-NEXT: // fake_use: $w15 | |
| ; NO_NEON-NEXT: // fake_use: $w21 | |
| ; NO_NEON-NEXT: // fake_use: $w13 | |
| ; NO_NEON-NEXT: // fake_use: $w4 | |
| ; NO_NEON-NEXT: // fake_use: $w11 | |
| ; NO_NEON-NEXT: // fake_use: $w18 | |
| ; NO_NEON-NEXT: // fake_use: $w9 | |
| ; NO_NEON-NEXT: // fake_use: $w23 | |
| ; NO_NEON-NEXT: // fake_use: $w14 | |
| ; NO_NEON-NEXT: // fake_use: $w6 | |
| ; NO_NEON-NEXT: // fake_use: $w12 | |
| ; NO_NEON-NEXT: // fake_use: $w2 | |
| ; NO_NEON-NEXT: // fake_use: $w10 | |
| ; NO_NEON-NEXT: // fake_use: $w16 | |
| ; NO_NEON-NEXT: // fake_use: $w8 | |
| ; NO_NEON-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload | |
| ; NO_NEON-NEXT: ldp x22, x21, [sp, #16] // 16-byte Folded Reload | |
| ; NO_NEON-NEXT: ldr x23, [sp], #48 // 8-byte Folded Reload | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = load <24 x i32>, ptr %ptr, align 4 | |
| %v0 = shufflevector <24 x i32> %interleaved.vec, <24 x i32> poison, <8 x i32> <i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 18, i32 21> | |
| %v1 = shufflevector <24 x i32> %interleaved.vec, <24 x i32> poison, <8 x i32> <i32 1, i32 4, i32 7, i32 10, i32 13, i32 16, i32 19, i32 22> | |
| %v2 = shufflevector <24 x i32> %interleaved.vec, <24 x i32> poison, <8 x i32> <i32 2, i32 5, i32 8, i32 11, i32 14, i32 17, i32 20, i32 23> | |
| tail call void (...) @llvm.fake.use(<8 x i32> %v0) | |
| tail call void (...) @llvm.fake.use(<8 x i32> %v1) | |
| tail call void (...) @llvm.fake.use(<8 x i32> %v2) | |
| ret void | |
| } | |
| define void @load_factor4_wide(ptr %ptr) { | |
| ; NEON-IAENABLED-LABEL: load_factor4_wide: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: ld4 { v0.4s, v1.4s, v2.4s, v3.4s }, [x0], #64 | |
| ; NEON-IAENABLED-NEXT: ld4 { v4.4s, v5.4s, v6.4s, v7.4s }, [x0] | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q0 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q4 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q1 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q5 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q2 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q6 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q3 $q0_q1_q2_q3 | |
| ; NEON-IAENABLED-NEXT: // fake_use: $q7 $q4_q5_q6_q7 | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: load_factor4_wide: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: ldp q1, q0, [x0, #32] | |
| ; NEON-IADISABLED-NEXT: ldp q3, q2, [x0, #96] | |
| ; NEON-IADISABLED-NEXT: ldp q5, q4, [x0, #64] | |
| ; NEON-IADISABLED-NEXT: zip1 v17.4s, v1.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: ldp q7, q6, [x0] | |
| ; NEON-IADISABLED-NEXT: zip1 v16.4s, v3.4s, v2.4s | |
| ; NEON-IADISABLED-NEXT: trn1 v23.4s, v3.4s, v2.4s | |
| ; NEON-IADISABLED-NEXT: trn1 v24.4s, v1.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: uzp2 v20.4s, v5.4s, v4.4s | |
| ; NEON-IADISABLED-NEXT: zip1 v18.4s, v5.4s, v4.4s | |
| ; NEON-IADISABLED-NEXT: trn2 v22.4s, v5.4s, v4.4s | |
| ; NEON-IADISABLED-NEXT: zip1 v19.4s, v7.4s, v6.4s | |
| ; NEON-IADISABLED-NEXT: uzp2 v21.4s, v7.4s, v6.4s | |
| ; NEON-IADISABLED-NEXT: zip2 v2.4s, v3.4s, v2.4s | |
| ; NEON-IADISABLED-NEXT: ext v25.16b, v1.16b, v17.16b, #8 | |
| ; NEON-IADISABLED-NEXT: zip2 v0.4s, v1.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: trn2 v1.4s, v7.4s, v6.4s | |
| ; NEON-IADISABLED-NEXT: ext v3.16b, v3.16b, v16.16b, #8 | |
| ; NEON-IADISABLED-NEXT: zip2 v4.4s, v5.4s, v4.4s | |
| ; NEON-IADISABLED-NEXT: zip2 v6.4s, v7.4s, v6.4s | |
| ; NEON-IADISABLED-NEXT: uzp2 v5.4s, v20.4s, v5.4s | |
| ; NEON-IADISABLED-NEXT: mov v22.d[1], v16.d[1] | |
| ; NEON-IADISABLED-NEXT: uzp2 v7.4s, v21.4s, v7.4s | |
| ; NEON-IADISABLED-NEXT: mov v19.d[1], v25.d[1] | |
| ; NEON-IADISABLED-NEXT: mov v1.d[1], v17.d[1] | |
| ; NEON-IADISABLED-NEXT: mov v18.d[1], v3.d[1] | |
| ; NEON-IADISABLED-NEXT: mov v4.d[1], v23.d[1] | |
| ; NEON-IADISABLED-NEXT: mov v6.d[1], v24.d[1] | |
| ; NEON-IADISABLED-NEXT: mov v5.d[1], v2.d[1] | |
| ; NEON-IADISABLED-NEXT: mov v7.d[1], v0.d[1] | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q19 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q18 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q1 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q22 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q6 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q4 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q7 | |
| ; NEON-IADISABLED-NEXT: // fake_use: $q5 | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: load_factor4_wide: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: sub sp, sp, #112 | |
| ; NO_NEON-NEXT: stp x29, x30, [sp, #16] // 16-byte Folded Spill | |
| ; NO_NEON-NEXT: stp x28, x27, [sp, #32] // 16-byte Folded Spill | |
| ; NO_NEON-NEXT: stp x26, x25, [sp, #48] // 16-byte Folded Spill | |
| ; NO_NEON-NEXT: stp x24, x23, [sp, #64] // 16-byte Folded Spill | |
| ; NO_NEON-NEXT: stp x22, x21, [sp, #80] // 16-byte Folded Spill | |
| ; NO_NEON-NEXT: stp x20, x19, [sp, #96] // 16-byte Folded Spill | |
| ; NO_NEON-NEXT: .cfi_def_cfa_offset 112 | |
| ; NO_NEON-NEXT: .cfi_offset w19, -8 | |
| ; NO_NEON-NEXT: .cfi_offset w20, -16 | |
| ; NO_NEON-NEXT: .cfi_offset w21, -24 | |
| ; NO_NEON-NEXT: .cfi_offset w22, -32 | |
| ; NO_NEON-NEXT: .cfi_offset w23, -40 | |
| ; NO_NEON-NEXT: .cfi_offset w24, -48 | |
| ; NO_NEON-NEXT: .cfi_offset w25, -56 | |
| ; NO_NEON-NEXT: .cfi_offset w26, -64 | |
| ; NO_NEON-NEXT: .cfi_offset w27, -72 | |
| ; NO_NEON-NEXT: .cfi_offset w28, -80 | |
| ; NO_NEON-NEXT: .cfi_offset w30, -88 | |
| ; NO_NEON-NEXT: .cfi_offset w29, -96 | |
| ; NO_NEON-NEXT: ldp w12, w8, [x0, #120] | |
| ; NO_NEON-NEXT: ldp w28, w27, [x0] | |
| ; NO_NEON-NEXT: ldp w13, w9, [x0, #104] | |
| ; NO_NEON-NEXT: str w8, [sp, #12] // 4-byte Spill | |
| ; NO_NEON-NEXT: ldp w14, w10, [x0, #88] | |
| ; NO_NEON-NEXT: ldp w15, w11, [x0, #72] | |
| ; NO_NEON-NEXT: ldp w17, w16, [x0, #56] | |
| ; NO_NEON-NEXT: ldp w1, w18, [x0, #40] | |
| ; NO_NEON-NEXT: ldp w3, w2, [x0, #24] | |
| ; NO_NEON-NEXT: ldp w5, w4, [x0, #8] | |
| ; NO_NEON-NEXT: ldp w7, w6, [x0, #112] | |
| ; NO_NEON-NEXT: ldp w20, w19, [x0, #96] | |
| ; NO_NEON-NEXT: ldp w22, w21, [x0, #80] | |
| ; NO_NEON-NEXT: ldp w24, w23, [x0, #64] | |
| ; NO_NEON-NEXT: ldp w26, w25, [x0, #48] | |
| ; NO_NEON-NEXT: ldp w30, w29, [x0, #32] | |
| ; NO_NEON-NEXT: ldp w0, w8, [x0, #16] | |
| ; NO_NEON-NEXT: // fake_use: $w28 | |
| ; NO_NEON-NEXT: // fake_use: $w0 | |
| ; NO_NEON-NEXT: // fake_use: $w30 | |
| ; NO_NEON-NEXT: // fake_use: $w26 | |
| ; NO_NEON-NEXT: // fake_use: $w24 | |
| ; NO_NEON-NEXT: // fake_use: $w22 | |
| ; NO_NEON-NEXT: // fake_use: $w20 | |
| ; NO_NEON-NEXT: // fake_use: $w7 | |
| ; NO_NEON-NEXT: // fake_use: $w27 | |
| ; NO_NEON-NEXT: // fake_use: $w8 | |
| ; NO_NEON-NEXT: // fake_use: $w29 | |
| ; NO_NEON-NEXT: // fake_use: $w25 | |
| ; NO_NEON-NEXT: // fake_use: $w23 | |
| ; NO_NEON-NEXT: // fake_use: $w21 | |
| ; NO_NEON-NEXT: // fake_use: $w19 | |
| ; NO_NEON-NEXT: // fake_use: $w6 | |
| ; NO_NEON-NEXT: // fake_use: $w5 | |
| ; NO_NEON-NEXT: // fake_use: $w3 | |
| ; NO_NEON-NEXT: // fake_use: $w1 | |
| ; NO_NEON-NEXT: // fake_use: $w17 | |
| ; NO_NEON-NEXT: // fake_use: $w15 | |
| ; NO_NEON-NEXT: // fake_use: $w14 | |
| ; NO_NEON-NEXT: // fake_use: $w13 | |
| ; NO_NEON-NEXT: // fake_use: $w12 | |
| ; NO_NEON-NEXT: // fake_use: $w4 | |
| ; NO_NEON-NEXT: // fake_use: $w2 | |
| ; NO_NEON-NEXT: // fake_use: $w18 | |
| ; NO_NEON-NEXT: // fake_use: $w16 | |
| ; NO_NEON-NEXT: // fake_use: $w11 | |
| ; NO_NEON-NEXT: // fake_use: $w10 | |
| ; NO_NEON-NEXT: // fake_use: $w9 | |
| ; NO_NEON-NEXT: ldr w8, [sp, #12] // 4-byte Reload | |
| ; NO_NEON-NEXT: // fake_use: $w8 | |
| ; NO_NEON-NEXT: ldp x20, x19, [sp, #96] // 16-byte Folded Reload | |
| ; NO_NEON-NEXT: ldp x22, x21, [sp, #80] // 16-byte Folded Reload | |
| ; NO_NEON-NEXT: ldp x24, x23, [sp, #64] // 16-byte Folded Reload | |
| ; NO_NEON-NEXT: ldp x26, x25, [sp, #48] // 16-byte Folded Reload | |
| ; NO_NEON-NEXT: ldp x28, x27, [sp, #32] // 16-byte Folded Reload | |
| ; NO_NEON-NEXT: ldp x29, x30, [sp, #16] // 16-byte Folded Reload | |
| ; NO_NEON-NEXT: add sp, sp, #112 | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = load <32 x i32>, ptr %ptr, align 4 | |
| %v0 = shufflevector <32 x i32> %interleaved.vec, <32 x i32> poison, <8 x i32> <i32 0, i32 4, i32 8, i32 12, i32 16, i32 20, i32 24, i32 28> | |
| %v1 = shufflevector <32 x i32> %interleaved.vec, <32 x i32> poison, <8 x i32> <i32 1, i32 5, i32 9, i32 13, i32 17, i32 21, i32 25, i32 29> | |
| %v2 = shufflevector <32 x i32> %interleaved.vec, <32 x i32> poison, <8 x i32> <i32 2, i32 6, i32 10, i32 14, i32 18, i32 22, i32 26, i32 30> | |
| %v3 = shufflevector <32 x i32> %interleaved.vec, <32 x i32> poison, <8 x i32> <i32 3, i32 7, i32 11, i32 15, i32 19, i32 23, i32 27, i32 31> | |
| tail call void (...) @llvm.fake.use(<8 x i32> %v0) | |
| tail call void (...) @llvm.fake.use(<8 x i32> %v1) | |
| tail call void (...) @llvm.fake.use(<8 x i32> %v2) | |
| tail call void (...) @llvm.fake.use(<8 x i32> %v3) | |
| ret void | |
| } | |
| define void @store_factor2_wide(ptr %ptr, <8 x i32> %v0, <8 x i32> %v1) { | |
| ; NEON-IAENABLED-LABEL: store_factor2_wide: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: mov v5.16b, v2.16b | |
| ; NEON-IAENABLED-NEXT: // kill: def $q3 killed $q3 def $q2_q3 | |
| ; NEON-IAENABLED-NEXT: mov v4.16b, v0.16b | |
| ; NEON-IAENABLED-NEXT: mov v2.16b, v1.16b | |
| ; NEON-IAENABLED-NEXT: st2 { v4.4s, v5.4s }, [x0], #32 | |
| ; NEON-IAENABLED-NEXT: st2 { v2.4s, v3.4s }, [x0] | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: store_factor2_wide: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: zip2 v4.4s, v1.4s, v3.4s | |
| ; NEON-IADISABLED-NEXT: zip1 v1.4s, v1.4s, v3.4s | |
| ; NEON-IADISABLED-NEXT: zip2 v3.4s, v0.4s, v2.4s | |
| ; NEON-IADISABLED-NEXT: zip1 v0.4s, v0.4s, v2.4s | |
| ; NEON-IADISABLED-NEXT: stp q1, q4, [x0, #32] | |
| ; NEON-IADISABLED-NEXT: stp q0, q3, [x0] | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_factor2_wide: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldr w8, [sp, #64] | |
| ; NO_NEON-NEXT: ldr w9, [sp] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #56] | |
| ; NO_NEON-NEXT: stp w9, w8, [x0, #56] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #48] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #40] | |
| ; NO_NEON-NEXT: stp w7, w10, [x0, #48] | |
| ; NO_NEON-NEXT: stp w6, w8, [x0, #40] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #32] | |
| ; NO_NEON-NEXT: stp w5, w9, [x0, #32] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #24] | |
| ; NO_NEON-NEXT: stp w4, w8, [x0, #24] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #16] | |
| ; NO_NEON-NEXT: stp w3, w9, [x0, #16] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #8] | |
| ; NO_NEON-NEXT: stp w2, w8, [x0, #8] | |
| ; NO_NEON-NEXT: stp w1, w9, [x0] | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = shufflevector <8 x i32> %v0, <8 x i32> %v1, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15> | |
| store <16 x i32> %interleaved.vec, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_factor3_wide(ptr %ptr, <8 x i32> %v0, <8 x i32> %v1, <8 x i32> %v2) { | |
| ; NEON-IAENABLED-LABEL: store_factor3_wide: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: mov v18.16b, v4.16b | |
| ; NEON-IAENABLED-NEXT: // kill: def $q5 killed $q5 killed $q3_q4_q5 def $q3_q4_q5 | |
| ; NEON-IAENABLED-NEXT: mov v17.16b, v2.16b | |
| ; NEON-IAENABLED-NEXT: mov v4.16b, v3.16b | |
| ; NEON-IAENABLED-NEXT: mov v16.16b, v0.16b | |
| ; NEON-IAENABLED-NEXT: mov v3.16b, v1.16b | |
| ; NEON-IAENABLED-NEXT: st3 { v16.4s, v17.4s, v18.4s }, [x0], #48 | |
| ; NEON-IAENABLED-NEXT: st3 { v3.4s, v4.4s, v5.4s }, [x0] | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: store_factor3_wide: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: trn2 v6.4s, v1.4s, v3.4s | |
| ; NEON-IADISABLED-NEXT: uzp1 v7.4s, v0.4s, v2.4s | |
| ; NEON-IADISABLED-NEXT: trn2 v16.4s, v0.4s, v2.4s | |
| ; NEON-IADISABLED-NEXT: trn1 v17.4s, v0.4s, v2.4s | |
| ; NEON-IADISABLED-NEXT: uzp1 v18.4s, v1.4s, v3.4s | |
| ; NEON-IADISABLED-NEXT: ext v6.16b, v6.16b, v1.16b, #4 | |
| ; NEON-IADISABLED-NEXT: uzp2 v2.4s, v2.4s, v7.4s | |
| ; NEON-IADISABLED-NEXT: trn1 v7.4s, v1.4s, v3.4s | |
| ; NEON-IADISABLED-NEXT: ext v16.16b, v16.16b, v0.16b, #4 | |
| ; NEON-IADISABLED-NEXT: mov v17.d[1], v0.d[0] | |
| ; NEON-IADISABLED-NEXT: uzp2 v0.4s, v3.4s, v18.4s | |
| ; NEON-IADISABLED-NEXT: mov v6.s[0], v5.s[2] | |
| ; NEON-IADISABLED-NEXT: mov v7.d[1], v1.d[0] | |
| ; NEON-IADISABLED-NEXT: mov v2.s[1], v4.s[1] | |
| ; NEON-IADISABLED-NEXT: mov v16.s[0], v4.s[2] | |
| ; NEON-IADISABLED-NEXT: mov v17.s[2], v4.s[0] | |
| ; NEON-IADISABLED-NEXT: mov v0.s[1], v5.s[1] | |
| ; NEON-IADISABLED-NEXT: mov v6.s[3], v5.s[3] | |
| ; NEON-IADISABLED-NEXT: mov v7.s[2], v5.s[0] | |
| ; NEON-IADISABLED-NEXT: mov v16.s[3], v4.s[3] | |
| ; NEON-IADISABLED-NEXT: stp q17, q2, [x0] | |
| ; NEON-IADISABLED-NEXT: stp q0, q6, [x0, #64] | |
| ; NEON-IADISABLED-NEXT: stp q16, q7, [x0, #32] | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_factor3_wide: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldr w10, [sp, #48] | |
| ; NO_NEON-NEXT: ldr w11, [sp, #112] | |
| ; NO_NEON-NEXT: // kill: def $w6 killed $w6 def $x6 | |
| ; NO_NEON-NEXT: // kill: def $w4 killed $w4 def $x4 | |
| ; NO_NEON-NEXT: mov w18, w7 | |
| ; NO_NEON-NEXT: ldr w9, [sp, #64] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #120] | |
| ; NO_NEON-NEXT: mov w17, w5 | |
| ; NO_NEON-NEXT: ldr w14, [sp, #128] | |
| ; NO_NEON-NEXT: orr x10, x10, x11, lsl #32 | |
| ; NO_NEON-NEXT: ldr w11, [sp] | |
| ; NO_NEON-NEXT: ldr w12, [sp, #104] | |
| ; NO_NEON-NEXT: ldr w13, [sp, #32] | |
| ; NO_NEON-NEXT: // kill: def $w2 killed $w2 def $x2 | |
| ; NO_NEON-NEXT: ldr w15, [sp, #88] | |
| ; NO_NEON-NEXT: orr x9, x9, x14, lsl #32 | |
| ; NO_NEON-NEXT: orr x8, x8, x11, lsl #32 | |
| ; NO_NEON-NEXT: ldr w16, [sp, #16] | |
| ; NO_NEON-NEXT: ldr w11, [sp, #56] | |
| ; NO_NEON-NEXT: orr x12, x12, x6, lsl #32 | |
| ; NO_NEON-NEXT: ldr w14, [sp, #40] | |
| ; NO_NEON-NEXT: str x9, [x0, #88] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #96] | |
| ; NO_NEON-NEXT: str x8, [x0, #80] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #80] | |
| ; NO_NEON-NEXT: orr x11, x18, x11, lsl #32 | |
| ; NO_NEON-NEXT: orr x9, x13, x9, lsl #32 | |
| ; NO_NEON-NEXT: orr x13, x15, x4, lsl #32 | |
| ; NO_NEON-NEXT: stp x12, x10, [x0, #56] | |
| ; NO_NEON-NEXT: orr x8, x16, x8, lsl #32 | |
| ; NO_NEON-NEXT: ldr w12, [sp, #24] | |
| ; NO_NEON-NEXT: str x11, [x0, #72] | |
| ; NO_NEON-NEXT: stp x13, x9, [x0, #32] | |
| ; NO_NEON-NEXT: ldr w13, [sp, #72] | |
| ; NO_NEON-NEXT: mov w9, w3 | |
| ; NO_NEON-NEXT: str x8, [x0, #16] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #8] | |
| ; NO_NEON-NEXT: mov w11, w1 | |
| ; NO_NEON-NEXT: orr x10, x17, x14, lsl #32 | |
| ; NO_NEON-NEXT: orr x9, x9, x12, lsl #32 | |
| ; NO_NEON-NEXT: orr x12, x13, x2, lsl #32 | |
| ; NO_NEON-NEXT: orr x8, x11, x8, lsl #32 | |
| ; NO_NEON-NEXT: str x10, [x0, #48] | |
| ; NO_NEON-NEXT: str x9, [x0, #24] | |
| ; NO_NEON-NEXT: stp x8, x12, [x0] | |
| ; NO_NEON-NEXT: ret | |
| %s0 = shufflevector <8 x i32> %v0, <8 x i32> %v1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> | |
| %s1 = shufflevector <8 x i32> %v2, <8 x i32> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison> | |
| %interleaved.vec = shufflevector <16 x i32> %s0, <16 x i32> %s1, <24 x i32> <i32 0, i32 8, i32 16, i32 1, i32 9, i32 17, i32 2, i32 10, i32 18, i32 3, i32 11, i32 19, i32 4, i32 12, i32 20, i32 5, i32 13, i32 21, i32 6, i32 14, i32 22, i32 7, i32 15, i32 23> | |
| store <24 x i32> %interleaved.vec, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_factor4_wide(ptr %ptr, <8 x i32> %v0, <8 x i32> %v1, <8 x i32> %v2, <8 x i32> %v3) { | |
| ; NEON-IAENABLED-LABEL: store_factor4_wide: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: // kill: def $q7 killed $q7 killed $q4_q5_q6_q7 def $q4_q5_q6_q7 | |
| ; NEON-IAENABLED-NEXT: mov v19.16b, v6.16b | |
| ; NEON-IAENABLED-NEXT: mov v18.16b, v4.16b | |
| ; NEON-IAENABLED-NEXT: mov v6.16b, v5.16b | |
| ; NEON-IAENABLED-NEXT: mov v17.16b, v2.16b | |
| ; NEON-IAENABLED-NEXT: mov v5.16b, v3.16b | |
| ; NEON-IAENABLED-NEXT: mov v16.16b, v0.16b | |
| ; NEON-IAENABLED-NEXT: mov v4.16b, v1.16b | |
| ; NEON-IAENABLED-NEXT: st4 { v16.4s, v17.4s, v18.4s, v19.4s }, [x0], #64 | |
| ; NEON-IAENABLED-NEXT: st4 { v4.4s, v5.4s, v6.4s, v7.4s }, [x0] | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: store_factor4_wide: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: uzp2 v16.4s, v1.4s, v3.4s | |
| ; NEON-IADISABLED-NEXT: zip1 v17.4s, v5.4s, v7.4s | |
| ; NEON-IADISABLED-NEXT: trn1 v18.4s, v5.4s, v7.4s | |
| ; NEON-IADISABLED-NEXT: zip2 v19.4s, v1.4s, v3.4s | |
| ; NEON-IADISABLED-NEXT: uzp2 v20.4s, v0.4s, v2.4s | |
| ; NEON-IADISABLED-NEXT: trn2 v21.4s, v1.4s, v3.4s | |
| ; NEON-IADISABLED-NEXT: zip1 v22.4s, v4.4s, v6.4s | |
| ; NEON-IADISABLED-NEXT: zip2 v7.4s, v5.4s, v7.4s | |
| ; NEON-IADISABLED-NEXT: uzp2 v16.4s, v16.4s, v1.4s | |
| ; NEON-IADISABLED-NEXT: zip1 v1.4s, v1.4s, v3.4s | |
| ; NEON-IADISABLED-NEXT: ext v3.16b, v5.16b, v17.16b, #8 | |
| ; NEON-IADISABLED-NEXT: trn1 v5.4s, v4.4s, v6.4s | |
| ; NEON-IADISABLED-NEXT: mov v19.d[1], v18.d[1] | |
| ; NEON-IADISABLED-NEXT: zip2 v18.4s, v0.4s, v2.4s | |
| ; NEON-IADISABLED-NEXT: zip2 v6.4s, v4.4s, v6.4s | |
| ; NEON-IADISABLED-NEXT: uzp2 v20.4s, v20.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: mov v21.d[1], v17.d[1] | |
| ; NEON-IADISABLED-NEXT: trn2 v17.4s, v0.4s, v2.4s | |
| ; NEON-IADISABLED-NEXT: zip1 v0.4s, v0.4s, v2.4s | |
| ; NEON-IADISABLED-NEXT: ext v2.16b, v4.16b, v22.16b, #8 | |
| ; NEON-IADISABLED-NEXT: mov v16.d[1], v7.d[1] | |
| ; NEON-IADISABLED-NEXT: mov v1.d[1], v3.d[1] | |
| ; NEON-IADISABLED-NEXT: mov v18.d[1], v5.d[1] | |
| ; NEON-IADISABLED-NEXT: stp q21, q19, [x0, #80] | |
| ; NEON-IADISABLED-NEXT: mov v20.d[1], v6.d[1] | |
| ; NEON-IADISABLED-NEXT: mov v17.d[1], v22.d[1] | |
| ; NEON-IADISABLED-NEXT: mov v0.d[1], v2.d[1] | |
| ; NEON-IADISABLED-NEXT: str q16, [x0, #112] | |
| ; NEON-IADISABLED-NEXT: stp q20, q1, [x0, #48] | |
| ; NEON-IADISABLED-NEXT: stp q17, q18, [x0, #16] | |
| ; NEON-IADISABLED-NEXT: str q0, [x0] | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_factor4_wide: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldr w8, [sp, #192] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #128] | |
| ; NO_NEON-NEXT: str w7, [x0, #96] | |
| ; NO_NEON-NEXT: str w6, [x0, #80] | |
| ; NO_NEON-NEXT: str w8, [x0, #124] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #64] | |
| ; NO_NEON-NEXT: str w9, [x0, #120] | |
| ; NO_NEON-NEXT: ldr w9, [sp] | |
| ; NO_NEON-NEXT: str w8, [x0, #116] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #184] | |
| ; NO_NEON-NEXT: str w9, [x0, #112] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #120] | |
| ; NO_NEON-NEXT: str w8, [x0, #108] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #56] | |
| ; NO_NEON-NEXT: str w5, [x0, #64] | |
| ; NO_NEON-NEXT: stp w8, w9, [x0, #100] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #176] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #112] | |
| ; NO_NEON-NEXT: str w4, [x0, #48] | |
| ; NO_NEON-NEXT: str w8, [x0, #92] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #48] | |
| ; NO_NEON-NEXT: str w3, [x0, #32] | |
| ; NO_NEON-NEXT: stp w8, w9, [x0, #84] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #168] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #104] | |
| ; NO_NEON-NEXT: str w2, [x0, #16] | |
| ; NO_NEON-NEXT: str w8, [x0, #76] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #40] | |
| ; NO_NEON-NEXT: str w1, [x0] | |
| ; NO_NEON-NEXT: stp w8, w9, [x0, #68] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #160] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #96] | |
| ; NO_NEON-NEXT: str w8, [x0, #60] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #32] | |
| ; NO_NEON-NEXT: stp w8, w9, [x0, #52] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #152] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #88] | |
| ; NO_NEON-NEXT: str w8, [x0, #44] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #24] | |
| ; NO_NEON-NEXT: stp w8, w9, [x0, #36] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #144] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #80] | |
| ; NO_NEON-NEXT: str w8, [x0, #28] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #16] | |
| ; NO_NEON-NEXT: stp w8, w9, [x0, #20] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #136] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #72] | |
| ; NO_NEON-NEXT: str w8, [x0, #12] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #8] | |
| ; NO_NEON-NEXT: stp w8, w9, [x0, #4] | |
| ; NO_NEON-NEXT: ret | |
| %s0 = shufflevector <8 x i32> %v0, <8 x i32> %v1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> | |
| %s1 = shufflevector <8 x i32> %v2, <8 x i32> %v3, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> | |
| %interleaved.vec = shufflevector <16 x i32> %s0, <16 x i32> %s1, <32 x i32> <i32 0, i32 8, i32 16, i32 24, i32 1, i32 9, i32 17, i32 25, i32 2, i32 10, i32 18, i32 26, i32 3, i32 11, i32 19, i32 27, i32 4, i32 12, i32 20, i32 28, i32 5, i32 13, i32 21, i32 29, i32 6, i32 14, i32 22, i32 30, i32 7, i32 15, i32 23, i32 31> | |
| store <32 x i32> %interleaved.vec, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @load_factor2_fp128(ptr %ptr) { | |
| ; NEON-LABEL: load_factor2_fp128: | |
| ; NEON: // %bb.0: | |
| ; NEON-NEXT: ldp q0, q1, [x0] | |
| ; NEON-NEXT: ldp q3, q2, [x0, #32] | |
| ; NEON-NEXT: // fake_use: $q0 | |
| ; NEON-NEXT: // fake_use: $q3 | |
| ; NEON-NEXT: // fake_use: $q1 | |
| ; NEON-NEXT: // fake_use: $q2 | |
| ; NEON-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: load_factor2_fp128: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldp q0, q1, [x0] | |
| ; NO_NEON-NEXT: ldp q3, q2, [x0, #32] | |
| ; NO_NEON-NEXT: // fake_use: $q0 | |
| ; NO_NEON-NEXT: // fake_use: $q3 | |
| ; NO_NEON-NEXT: // fake_use: $q1 | |
| ; NO_NEON-NEXT: // fake_use: $q2 | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.vec = load <4 x fp128>, ptr %ptr, align 16 | |
| %v0 = shufflevector <4 x fp128> %interleaved.vec, <4 x fp128> poison, <2 x i32> <i32 0, i32 2> | |
| %v1 = shufflevector <4 x fp128> %interleaved.vec, <4 x fp128> poison, <2 x i32> <i32 1, i32 3> | |
| tail call void (...) @llvm.fake.use(<2 x fp128> %v0) | |
| tail call void (...) @llvm.fake.use(<2 x fp128> %v1) | |
| ret void | |
| } | |
| define <4 x i1> @load_large_vector(ptr %p) { | |
| ; NEON-IAENABLED-LABEL: load_large_vector: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: ld3 { v0.2d, v1.2d, v2.2d }, [x0], #48 | |
| ; NEON-IAENABLED-NEXT: ld3 { v3.2d, v4.2d, v5.2d }, [x0] | |
| ; NEON-IAENABLED-NEXT: cmeq v0.2d, v0.2d, v1.2d | |
| ; NEON-IAENABLED-NEXT: cmeq v1.2d, v3.2d, v4.2d | |
| ; NEON-IAENABLED-NEXT: uzp1 v0.4s, v0.4s, v1.4s | |
| ; NEON-IAENABLED-NEXT: mvn v0.16b, v0.16b | |
| ; NEON-IAENABLED-NEXT: xtn v0.4h, v0.4s | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: load_large_vector: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: ldp q1, q2, [x0, #32] | |
| ; NEON-IADISABLED-NEXT: add x8, x0, #24 | |
| ; NEON-IADISABLED-NEXT: ldr q0, [x0, #80] | |
| ; NEON-IADISABLED-NEXT: ldr q3, [x0] | |
| ; NEON-IADISABLED-NEXT: add x9, x0, #72 | |
| ; NEON-IADISABLED-NEXT: ext v1.16b, v3.16b, v1.16b, #8 | |
| ; NEON-IADISABLED-NEXT: ext v0.16b, v2.16b, v0.16b, #8 | |
| ; NEON-IADISABLED-NEXT: ld1 { v3.d }[1], [x8] | |
| ; NEON-IADISABLED-NEXT: ld1 { v2.d }[1], [x9] | |
| ; NEON-IADISABLED-NEXT: cmeq v0.2d, v2.2d, v0.2d | |
| ; NEON-IADISABLED-NEXT: cmeq v1.2d, v3.2d, v1.2d | |
| ; NEON-IADISABLED-NEXT: uzp1 v0.4s, v1.4s, v0.4s | |
| ; NEON-IADISABLED-NEXT: mvn v0.16b, v0.16b | |
| ; NEON-IADISABLED-NEXT: xtn v0.4h, v0.4s | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: load_large_vector: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldp x9, x8, [x0] | |
| ; NO_NEON-NEXT: ldp x11, x10, [x0, #24] | |
| ; NO_NEON-NEXT: ldp x13, x12, [x0, #48] | |
| ; NO_NEON-NEXT: cmp x9, x8 | |
| ; NO_NEON-NEXT: ldp x9, x8, [x0, #72] | |
| ; NO_NEON-NEXT: cset w0, ne | |
| ; NO_NEON-NEXT: cmp x11, x10 | |
| ; NO_NEON-NEXT: cset w1, ne | |
| ; NO_NEON-NEXT: cmp x13, x12 | |
| ; NO_NEON-NEXT: cset w2, ne | |
| ; NO_NEON-NEXT: cmp x9, x8 | |
| ; NO_NEON-NEXT: cset w3, ne | |
| ; NO_NEON-NEXT: ret | |
| %l = load <12 x ptr>, ptr %p | |
| %s1 = shufflevector <12 x ptr> %l, <12 x ptr> poison, <4 x i32> <i32 0, i32 3, i32 6, i32 9> | |
| %s2 = shufflevector <12 x ptr> %l, <12 x ptr> poison, <4 x i32> <i32 1, i32 4, i32 7, i32 10> | |
| %ret = icmp ne <4 x ptr> %s1, %s2 | |
| ret <4 x i1> %ret | |
| } | |
| define <4 x i1> @load_large_vector_intrinsic(ptr %p) { | |
| ; NEON-LABEL: load_large_vector_intrinsic: | |
| ; NEON: // %bb.0: | |
| ; NEON-NEXT: ld3 { v0.2d, v1.2d, v2.2d }, [x0], #48 | |
| ; NEON-NEXT: ld3 { v3.2d, v4.2d, v5.2d }, [x0] | |
| ; NEON-NEXT: cmeq v0.2d, v0.2d, v1.2d | |
| ; NEON-NEXT: cmeq v1.2d, v3.2d, v4.2d | |
| ; NEON-NEXT: uzp1 v0.4s, v0.4s, v1.4s | |
| ; NEON-NEXT: mvn v0.16b, v0.16b | |
| ; NEON-NEXT: xtn v0.4h, v0.4s | |
| ; NEON-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: load_large_vector_intrinsic: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldp x9, x8, [x0] | |
| ; NO_NEON-NEXT: ldp x11, x10, [x0, #24] | |
| ; NO_NEON-NEXT: ldp x13, x12, [x0, #48] | |
| ; NO_NEON-NEXT: cmp x9, x8 | |
| ; NO_NEON-NEXT: ldp x9, x8, [x0, #72] | |
| ; NO_NEON-NEXT: cset w0, ne | |
| ; NO_NEON-NEXT: cmp x11, x10 | |
| ; NO_NEON-NEXT: cset w1, ne | |
| ; NO_NEON-NEXT: cmp x13, x12 | |
| ; NO_NEON-NEXT: cset w2, ne | |
| ; NO_NEON-NEXT: cmp x9, x8 | |
| ; NO_NEON-NEXT: cset w3, ne | |
| ; NO_NEON-NEXT: ret | |
| %intrinsic.load.0 = load <6 x i64>, ptr %p, align 1 | |
| %ldN = call { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.vector.deinterleave3.v6i64(<6 x i64> %intrinsic.load.0) | |
| %1 = extractvalue { <2 x i64>, <2 x i64>, <2 x i64> } %ldN, 1 | |
| %2 = inttoptr <2 x i64> %1 to <2 x ptr> | |
| %3 = extractvalue { <2 x i64>, <2 x i64>, <2 x i64> } %ldN, 0 | |
| %4 = inttoptr <2 x i64> %3 to <2 x ptr> | |
| %5 = getelementptr i64, ptr %p, i32 6 | |
| %intrinsic.load.1 = load <6 x i64>, ptr %5, align 1 | |
| %ldN1 = call { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.vector.deinterleave3.v6i64(<6 x i64> %intrinsic.load.1) | |
| %6 = extractvalue { <2 x i64>, <2 x i64>, <2 x i64> } %ldN1, 1 | |
| %7 = inttoptr <2 x i64> %6 to <2 x ptr> | |
| %8 = extractvalue { <2 x i64>, <2 x i64>, <2 x i64> } %ldN1, 0 | |
| %9 = inttoptr <2 x i64> %8 to <2 x ptr> | |
| %10 = shufflevector <2 x ptr> %2, <2 x ptr> %7, <4 x i32> <i32 0, i32 1, i32 2, i32 3> | |
| %11 = shufflevector <2 x ptr> %4, <2 x ptr> %9, <4 x i32> <i32 0, i32 1, i32 2, i32 3> | |
| %ret = icmp ne <4 x ptr> %11, %10 | |
| ret <4 x i1> %ret | |
| } | |
| define void @store_factor2_intrinsic(ptr %ptr, <8 x i8> %v0, <8 x i8> %v1) { | |
| ; NEON-IAENABLED-LABEL: store_factor2_intrinsic: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: // kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1 | |
| ; NEON-IAENABLED-NEXT: // kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1 | |
| ; NEON-IAENABLED-NEXT: st2 { v0.8b, v1.8b }, [x0] | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: store_factor2_intrinsic: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: // kill: def $d0 killed $d0 def $q0 | |
| ; NEON-IADISABLED-NEXT: // kill: def $d1 killed $d1 def $q1 | |
| ; NEON-IADISABLED-NEXT: adrp x8, .LCPI41_0 | |
| ; NEON-IADISABLED-NEXT: mov v0.d[1], v1.d[0] | |
| ; NEON-IADISABLED-NEXT: ldr q1, [x8, :lo12:.LCPI41_0] | |
| ; NEON-IADISABLED-NEXT: tbl v0.16b, { v0.16b }, v1.16b | |
| ; NEON-IADISABLED-NEXT: str q0, [x0] | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_factor2_intrinsic: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldrb w8, [sp, #64] | |
| ; NO_NEON-NEXT: ldrb w9, [sp] | |
| ; NO_NEON-NEXT: ldrb w10, [sp, #56] | |
| ; NO_NEON-NEXT: strb w7, [x0, #12] | |
| ; NO_NEON-NEXT: strb w8, [x0, #15] | |
| ; NO_NEON-NEXT: ldrb w8, [sp, #48] | |
| ; NO_NEON-NEXT: strb w9, [x0, #14] | |
| ; NO_NEON-NEXT: ldrb w9, [sp, #40] | |
| ; NO_NEON-NEXT: strb w8, [x0, #11] | |
| ; NO_NEON-NEXT: ldrb w8, [sp, #32] | |
| ; NO_NEON-NEXT: strb w9, [x0, #9] | |
| ; NO_NEON-NEXT: ldrb w9, [sp, #24] | |
| ; NO_NEON-NEXT: strb w8, [x0, #7] | |
| ; NO_NEON-NEXT: ldrb w8, [sp, #16] | |
| ; NO_NEON-NEXT: strb w9, [x0, #5] | |
| ; NO_NEON-NEXT: ldrb w9, [sp, #8] | |
| ; NO_NEON-NEXT: strb w10, [x0, #13] | |
| ; NO_NEON-NEXT: strb w6, [x0, #10] | |
| ; NO_NEON-NEXT: strb w5, [x0, #8] | |
| ; NO_NEON-NEXT: strb w4, [x0, #6] | |
| ; NO_NEON-NEXT: strb w3, [x0, #4] | |
| ; NO_NEON-NEXT: strb w8, [x0, #3] | |
| ; NO_NEON-NEXT: strb w2, [x0, #2] | |
| ; NO_NEON-NEXT: strb w9, [x0, #1] | |
| ; NO_NEON-NEXT: strb w1, [x0] | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.intrinsic = call <16 x i8> @llvm.vector.interleave2.v16i8(<8 x i8> %v0, <8 x i8> %v1) | |
| store <16 x i8> %interleaved.intrinsic, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_factor2_wide_intrinsic(ptr %ptr, <8 x i32> %v0, <8 x i32> %v1) { | |
| ; NEON-IAENABLED-LABEL: store_factor2_wide_intrinsic: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: mov v5.16b, v2.16b | |
| ; NEON-IAENABLED-NEXT: // kill: def $q3 killed $q3 def $q2_q3 | |
| ; NEON-IAENABLED-NEXT: mov v4.16b, v0.16b | |
| ; NEON-IAENABLED-NEXT: mov v2.16b, v1.16b | |
| ; NEON-IAENABLED-NEXT: st2 { v4.4s, v5.4s }, [x0], #32 | |
| ; NEON-IAENABLED-NEXT: st2 { v2.4s, v3.4s }, [x0] | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: store_factor2_wide_intrinsic: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: zip2 v4.4s, v1.4s, v3.4s | |
| ; NEON-IADISABLED-NEXT: zip1 v1.4s, v1.4s, v3.4s | |
| ; NEON-IADISABLED-NEXT: zip2 v3.4s, v0.4s, v2.4s | |
| ; NEON-IADISABLED-NEXT: zip1 v0.4s, v0.4s, v2.4s | |
| ; NEON-IADISABLED-NEXT: stp q1, q4, [x0, #32] | |
| ; NEON-IADISABLED-NEXT: stp q0, q3, [x0] | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_factor2_wide_intrinsic: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldr w8, [sp, #64] | |
| ; NO_NEON-NEXT: ldr w9, [sp] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #56] | |
| ; NO_NEON-NEXT: stp w9, w8, [x0, #56] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #48] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #40] | |
| ; NO_NEON-NEXT: stp w7, w10, [x0, #48] | |
| ; NO_NEON-NEXT: stp w6, w8, [x0, #40] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #32] | |
| ; NO_NEON-NEXT: stp w5, w9, [x0, #32] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #24] | |
| ; NO_NEON-NEXT: stp w4, w8, [x0, #24] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #16] | |
| ; NO_NEON-NEXT: stp w3, w9, [x0, #16] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #8] | |
| ; NO_NEON-NEXT: stp w2, w8, [x0, #8] | |
| ; NO_NEON-NEXT: stp w1, w9, [x0] | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.intrinsic = call <16 x i32> @llvm.vector.interleave2.v16i32(<8 x i32> %v0, <8 x i32> %v1) | |
| store <16 x i32> %interleaved.intrinsic, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_factor3_intrinsic(ptr %ptr, <4 x i32> %v0, <4 x i32> %v1, <4 x i32> %v2) { | |
| ; NEON-LABEL: store_factor3_intrinsic: | |
| ; NEON: // %bb.0: | |
| ; NEON-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2 | |
| ; NEON-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2 | |
| ; NEON-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2 | |
| ; NEON-NEXT: st3 { v0.4s, v1.4s, v2.4s }, [x0] | |
| ; NEON-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_factor3_intrinsic: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldr w8, [sp] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #32] | |
| ; NO_NEON-NEXT: // kill: def $w4 killed $w4 def $x4 | |
| ; NO_NEON-NEXT: mov w12, w3 | |
| ; NO_NEON-NEXT: ldr w10, [sp, #24] | |
| ; NO_NEON-NEXT: ldr w11, [sp, #16] | |
| ; NO_NEON-NEXT: mov w13, w6 | |
| ; NO_NEON-NEXT: orr x8, x8, x9, lsl #32 | |
| ; NO_NEON-NEXT: ldr w9, [sp, #8] | |
| ; NO_NEON-NEXT: // kill: def $w7 killed $w7 def $x7 | |
| ; NO_NEON-NEXT: // kill: def $w5 killed $w5 def $x5 | |
| ; NO_NEON-NEXT: // kill: def $w2 killed $w2 def $x2 | |
| ; NO_NEON-NEXT: orr x12, x12, x7, lsl #32 | |
| ; NO_NEON-NEXT: orr x10, x10, x4, lsl #32 | |
| ; NO_NEON-NEXT: orr x9, x9, x2, lsl #32 | |
| ; NO_NEON-NEXT: stp x10, x8, [x0, #32] | |
| ; NO_NEON-NEXT: mov w10, w1 | |
| ; NO_NEON-NEXT: orr x8, x13, x11, lsl #32 | |
| ; NO_NEON-NEXT: orr x10, x10, x5, lsl #32 | |
| ; NO_NEON-NEXT: stp x8, x12, [x0, #16] | |
| ; NO_NEON-NEXT: stp x10, x9, [x0] | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.intrinsic = call <12 x i32> @llvm.vector.interleave3.v12i32(<4 x i32> %v0, <4 x i32> %v1, <4 x i32> %v2) | |
| store <12 x i32> %interleaved.intrinsic, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_factor3_wide_intrinsic(ptr %ptr, <8 x i32> %v0, <8 x i32> %v1, <8 x i32> %v2) { | |
| ; NEON-LABEL: store_factor3_wide_intrinsic: | |
| ; NEON: // %bb.0: | |
| ; NEON-NEXT: mov v18.16b, v4.16b | |
| ; NEON-NEXT: // kill: def $q5 killed $q5 killed $q3_q4_q5 def $q3_q4_q5 | |
| ; NEON-NEXT: mov v17.16b, v2.16b | |
| ; NEON-NEXT: mov v4.16b, v3.16b | |
| ; NEON-NEXT: mov v16.16b, v0.16b | |
| ; NEON-NEXT: mov v3.16b, v1.16b | |
| ; NEON-NEXT: st3 { v16.4s, v17.4s, v18.4s }, [x0], #48 | |
| ; NEON-NEXT: st3 { v3.4s, v4.4s, v5.4s }, [x0] | |
| ; NEON-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_factor3_wide_intrinsic: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldr w10, [sp, #48] | |
| ; NO_NEON-NEXT: ldr w11, [sp, #112] | |
| ; NO_NEON-NEXT: // kill: def $w6 killed $w6 def $x6 | |
| ; NO_NEON-NEXT: // kill: def $w4 killed $w4 def $x4 | |
| ; NO_NEON-NEXT: mov w18, w7 | |
| ; NO_NEON-NEXT: ldr w9, [sp, #64] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #120] | |
| ; NO_NEON-NEXT: mov w17, w5 | |
| ; NO_NEON-NEXT: ldr w14, [sp, #128] | |
| ; NO_NEON-NEXT: orr x10, x10, x11, lsl #32 | |
| ; NO_NEON-NEXT: ldr w11, [sp] | |
| ; NO_NEON-NEXT: ldr w12, [sp, #104] | |
| ; NO_NEON-NEXT: ldr w13, [sp, #32] | |
| ; NO_NEON-NEXT: // kill: def $w2 killed $w2 def $x2 | |
| ; NO_NEON-NEXT: ldr w15, [sp, #88] | |
| ; NO_NEON-NEXT: orr x9, x9, x14, lsl #32 | |
| ; NO_NEON-NEXT: orr x8, x8, x11, lsl #32 | |
| ; NO_NEON-NEXT: ldr w16, [sp, #16] | |
| ; NO_NEON-NEXT: ldr w11, [sp, #56] | |
| ; NO_NEON-NEXT: orr x12, x12, x6, lsl #32 | |
| ; NO_NEON-NEXT: ldr w14, [sp, #40] | |
| ; NO_NEON-NEXT: str x9, [x0, #88] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #96] | |
| ; NO_NEON-NEXT: str x8, [x0, #80] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #80] | |
| ; NO_NEON-NEXT: orr x11, x18, x11, lsl #32 | |
| ; NO_NEON-NEXT: orr x9, x13, x9, lsl #32 | |
| ; NO_NEON-NEXT: orr x13, x15, x4, lsl #32 | |
| ; NO_NEON-NEXT: stp x12, x10, [x0, #56] | |
| ; NO_NEON-NEXT: orr x8, x16, x8, lsl #32 | |
| ; NO_NEON-NEXT: ldr w12, [sp, #24] | |
| ; NO_NEON-NEXT: str x11, [x0, #72] | |
| ; NO_NEON-NEXT: stp x13, x9, [x0, #32] | |
| ; NO_NEON-NEXT: ldr w13, [sp, #72] | |
| ; NO_NEON-NEXT: mov w9, w3 | |
| ; NO_NEON-NEXT: str x8, [x0, #16] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #8] | |
| ; NO_NEON-NEXT: mov w11, w1 | |
| ; NO_NEON-NEXT: orr x10, x17, x14, lsl #32 | |
| ; NO_NEON-NEXT: orr x9, x9, x12, lsl #32 | |
| ; NO_NEON-NEXT: orr x12, x13, x2, lsl #32 | |
| ; NO_NEON-NEXT: orr x8, x11, x8, lsl #32 | |
| ; NO_NEON-NEXT: str x10, [x0, #48] | |
| ; NO_NEON-NEXT: str x9, [x0, #24] | |
| ; NO_NEON-NEXT: stp x8, x12, [x0] | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.intrinsic = call <24 x i32> @llvm.vector.interleave3.v24i32(<8 x i32> %v0, <8 x i32> %v1, <8 x i32> %v2) | |
| store <24 x i32> %interleaved.intrinsic, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_factor4_intrinsic(ptr %ptr, <4 x i32> %v0, <4 x i32> %v1, <4 x i32> %v2, <4 x i32> %v3) { | |
| ; NEON-LABEL: store_factor4_intrinsic: | |
| ; NEON: // %bb.0: | |
| ; NEON-NEXT: // kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3 | |
| ; NEON-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3 | |
| ; NEON-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3 | |
| ; NEON-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3 | |
| ; NEON-NEXT: st4 { v0.4s, v1.4s, v2.4s, v3.4s }, [x0] | |
| ; NEON-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_factor4_intrinsic: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldr w8, [sp, #64] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #32] | |
| ; NO_NEON-NEXT: ldr w10, [sp] | |
| ; NO_NEON-NEXT: str w7, [x0, #36] | |
| ; NO_NEON-NEXT: stp w9, w8, [x0, #56] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #56] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #24] | |
| ; NO_NEON-NEXT: str w10, [x0, #52] | |
| ; NO_NEON-NEXT: stp w8, w4, [x0, #44] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #48] | |
| ; NO_NEON-NEXT: str w9, [x0, #40] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #16] | |
| ; NO_NEON-NEXT: stp w8, w3, [x0, #28] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #40] | |
| ; NO_NEON-NEXT: str w9, [x0, #24] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #8] | |
| ; NO_NEON-NEXT: str w6, [x0, #20] | |
| ; NO_NEON-NEXT: stp w8, w2, [x0, #12] | |
| ; NO_NEON-NEXT: stp w5, w9, [x0, #4] | |
| ; NO_NEON-NEXT: str w1, [x0] | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.intrinsic = call <16 x i32> @llvm.vector.interleave4.v16i32(<4 x i32> %v0, <4 x i32> %v1, <4 x i32> %v2, <4 x i32> %v3) | |
| store <16 x i32> %interleaved.intrinsic, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_factor4_wide_intrinsic(ptr %ptr, <8 x i32> %v0, <8 x i32> %v1, <8 x i32> %v2, <8 x i32> %v3) { | |
| ; NEON-LABEL: store_factor4_wide_intrinsic: | |
| ; NEON: // %bb.0: | |
| ; NEON-NEXT: // kill: def $q7 killed $q7 killed $q4_q5_q6_q7 def $q4_q5_q6_q7 | |
| ; NEON-NEXT: mov v19.16b, v6.16b | |
| ; NEON-NEXT: mov v18.16b, v4.16b | |
| ; NEON-NEXT: mov v6.16b, v5.16b | |
| ; NEON-NEXT: mov v17.16b, v2.16b | |
| ; NEON-NEXT: mov v5.16b, v3.16b | |
| ; NEON-NEXT: mov v16.16b, v0.16b | |
| ; NEON-NEXT: mov v4.16b, v1.16b | |
| ; NEON-NEXT: st4 { v16.4s, v17.4s, v18.4s, v19.4s }, [x0], #64 | |
| ; NEON-NEXT: st4 { v4.4s, v5.4s, v6.4s, v7.4s }, [x0] | |
| ; NEON-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_factor4_wide_intrinsic: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldr w8, [sp, #192] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #128] | |
| ; NO_NEON-NEXT: str w7, [x0, #96] | |
| ; NO_NEON-NEXT: str w6, [x0, #80] | |
| ; NO_NEON-NEXT: str w8, [x0, #124] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #64] | |
| ; NO_NEON-NEXT: str w9, [x0, #120] | |
| ; NO_NEON-NEXT: ldr w9, [sp] | |
| ; NO_NEON-NEXT: str w8, [x0, #116] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #184] | |
| ; NO_NEON-NEXT: str w9, [x0, #112] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #120] | |
| ; NO_NEON-NEXT: str w8, [x0, #108] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #56] | |
| ; NO_NEON-NEXT: str w5, [x0, #64] | |
| ; NO_NEON-NEXT: stp w8, w9, [x0, #100] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #176] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #112] | |
| ; NO_NEON-NEXT: str w4, [x0, #48] | |
| ; NO_NEON-NEXT: str w8, [x0, #92] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #48] | |
| ; NO_NEON-NEXT: str w3, [x0, #32] | |
| ; NO_NEON-NEXT: stp w8, w9, [x0, #84] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #168] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #104] | |
| ; NO_NEON-NEXT: str w2, [x0, #16] | |
| ; NO_NEON-NEXT: str w8, [x0, #76] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #40] | |
| ; NO_NEON-NEXT: str w1, [x0] | |
| ; NO_NEON-NEXT: stp w8, w9, [x0, #68] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #160] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #96] | |
| ; NO_NEON-NEXT: str w8, [x0, #60] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #32] | |
| ; NO_NEON-NEXT: stp w8, w9, [x0, #52] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #152] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #88] | |
| ; NO_NEON-NEXT: str w8, [x0, #44] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #24] | |
| ; NO_NEON-NEXT: stp w8, w9, [x0, #36] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #144] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #80] | |
| ; NO_NEON-NEXT: str w8, [x0, #28] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #16] | |
| ; NO_NEON-NEXT: stp w8, w9, [x0, #20] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #136] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #72] | |
| ; NO_NEON-NEXT: str w8, [x0, #12] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #8] | |
| ; NO_NEON-NEXT: stp w8, w9, [x0, #4] | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.intrinsic = call <32 x i32> @llvm.vector.interleave4.v32i32(<8 x i32> %v0, <8 x i32> %v1, <8 x i32> %v2, <8 x i32> %v3) | |
| store <32 x i32> %interleaved.intrinsic, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_general_mask_factor3_intrinsic(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { | |
| ; NEON-LABEL: store_general_mask_factor3_intrinsic: | |
| ; NEON: // %bb.0: | |
| ; NEON-NEXT: // kill: def $q4 killed $q4 def $q2_q3_q4 | |
| ; NEON-NEXT: mov v2.16b, v1.16b | |
| ; NEON-NEXT: ldr q3, [sp] | |
| ; NEON-NEXT: st3 { v2.4s, v3.4s, v4.4s }, [x0] | |
| ; NEON-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_general_mask_factor3_intrinsic: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill | |
| ; NO_NEON-NEXT: .cfi_def_cfa_offset 16 | |
| ; NO_NEON-NEXT: .cfi_offset w29, -16 | |
| ; NO_NEON-NEXT: ldr w8, [sp, #240] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #112] | |
| ; NO_NEON-NEXT: // kill: def $w6 killed $w6 def $x6 | |
| ; NO_NEON-NEXT: ldr w11, [sp, #224] | |
| ; NO_NEON-NEXT: ldr w12, [sp, #96] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #104] | |
| ; NO_NEON-NEXT: ldr w13, [sp, #16] | |
| ; NO_NEON-NEXT: orr x8, x8, x10, lsl #32 | |
| ; NO_NEON-NEXT: orr x10, x11, x12, lsl #32 | |
| ; NO_NEON-NEXT: ldr w11, [sp, #232] | |
| ; NO_NEON-NEXT: orr x9, x9, x13, lsl #32 | |
| ; NO_NEON-NEXT: mov w13, w7 | |
| ; NO_NEON-NEXT: ldr w12, [sp, #88] | |
| ; NO_NEON-NEXT: str x8, [x0, #40] | |
| ; NO_NEON-NEXT: orr x11, x13, x11, lsl #32 | |
| ; NO_NEON-NEXT: ldr w8, [sp, #216] | |
| ; NO_NEON-NEXT: orr x12, x12, x6, lsl #32 | |
| ; NO_NEON-NEXT: stp x11, x9, [x0, #24] | |
| ; NO_NEON-NEXT: mov w9, w5 | |
| ; NO_NEON-NEXT: orr x8, x9, x8, lsl #32 | |
| ; NO_NEON-NEXT: stp x12, x10, [x0, #8] | |
| ; NO_NEON-NEXT: str x8, [x0] | |
| ; NO_NEON-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload | |
| ; NO_NEON-NEXT: ret | |
| %1 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <4 x i32> <i32 4, i32 5, i32 6, i32 7> | |
| %2 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <4 x i32> <i32 32, i32 33, i32 34, i32 35> | |
| %3 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <4 x i32> <i32 16, i32 17, i32 18, i32 19> | |
| %intrinsic.interleave.0 = call <12 x i32> @llvm.vector.interleave3.v12i32(<4 x i32> %1, <4 x i32> %2, <4 x i32> %3) | |
| store <12 x i32> %intrinsic.interleave.0, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_general_mask_factor3_undeflane_intrinsic(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { | |
| ; NEON-LABEL: store_general_mask_factor3_undeflane_intrinsic: | |
| ; NEON: // %bb.0: | |
| ; NEON-NEXT: // kill: def $q4 killed $q4 def $q2_q3_q4 | |
| ; NEON-NEXT: mov v2.16b, v0.16b | |
| ; NEON-NEXT: ldr q3, [sp] | |
| ; NEON-NEXT: st3 { v2.4s, v3.4s, v4.4s }, [x0] | |
| ; NEON-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_general_mask_factor3_undeflane_intrinsic: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill | |
| ; NO_NEON-NEXT: .cfi_def_cfa_offset 16 | |
| ; NO_NEON-NEXT: .cfi_offset w29, -16 | |
| ; NO_NEON-NEXT: ldr w8, [sp, #240] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #112] | |
| ; NO_NEON-NEXT: mov w14, w3 | |
| ; NO_NEON-NEXT: ldr w10, [sp, #104] | |
| ; NO_NEON-NEXT: ldr w11, [sp, #224] | |
| ; NO_NEON-NEXT: // kill: def $w4 killed $w4 def $x4 | |
| ; NO_NEON-NEXT: // kill: def $w2 killed $w2 def $x2 | |
| ; NO_NEON-NEXT: ldr w12, [sp, #96] | |
| ; NO_NEON-NEXT: ldr w13, [sp, #232] | |
| ; NO_NEON-NEXT: orr x8, x8, x9, lsl #32 | |
| ; NO_NEON-NEXT: ldr w9, [sp, #88] | |
| ; NO_NEON-NEXT: orr x10, x10, x4, lsl #32 | |
| ; NO_NEON-NEXT: orr x11, x11, x12, lsl #32 | |
| ; NO_NEON-NEXT: orr x12, x14, x13, lsl #32 | |
| ; NO_NEON-NEXT: str x8, [x0, #40] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #216] | |
| ; NO_NEON-NEXT: orr x9, x9, x2, lsl #32 | |
| ; NO_NEON-NEXT: stp x12, x10, [x0, #24] | |
| ; NO_NEON-NEXT: mov w10, w1 | |
| ; NO_NEON-NEXT: orr x8, x10, x8, lsl #32 | |
| ; NO_NEON-NEXT: stp x9, x11, [x0, #8] | |
| ; NO_NEON-NEXT: str x8, [x0] | |
| ; NO_NEON-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload | |
| ; NO_NEON-NEXT: ret | |
| %1 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <4 x i32> <i32 0, i32 1, i32 2, i32 3> | |
| %2 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <4 x i32> <i32 32, i32 33, i32 34, i32 35> | |
| %3 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <4 x i32> <i32 16, i32 17, i32 18, i32 19> | |
| %intrinsic.interleave.0 = call <12 x i32> @llvm.vector.interleave3.v12i32(<4 x i32> %1, <4 x i32> %2, <4 x i32> %3) | |
| store <12 x i32> %intrinsic.interleave.0, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_general_mask_factor3_undefmultimid_intrinsic(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { | |
| ; NEON-LABEL: store_general_mask_factor3_undefmultimid_intrinsic: | |
| ; NEON: // %bb.0: | |
| ; NEON-NEXT: // kill: def $q4 killed $q4 def $q2_q3_q4 | |
| ; NEON-NEXT: mov v2.16b, v1.16b | |
| ; NEON-NEXT: ldr q3, [sp] | |
| ; NEON-NEXT: st3 { v2.4s, v3.4s, v4.4s }, [x0] | |
| ; NEON-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_general_mask_factor3_undefmultimid_intrinsic: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill | |
| ; NO_NEON-NEXT: .cfi_def_cfa_offset 16 | |
| ; NO_NEON-NEXT: .cfi_offset w29, -16 | |
| ; NO_NEON-NEXT: ldr w8, [sp, #240] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #112] | |
| ; NO_NEON-NEXT: // kill: def $w6 killed $w6 def $x6 | |
| ; NO_NEON-NEXT: ldr w11, [sp, #224] | |
| ; NO_NEON-NEXT: ldr w12, [sp, #96] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #104] | |
| ; NO_NEON-NEXT: ldr w13, [sp, #16] | |
| ; NO_NEON-NEXT: orr x8, x8, x10, lsl #32 | |
| ; NO_NEON-NEXT: orr x10, x11, x12, lsl #32 | |
| ; NO_NEON-NEXT: ldr w11, [sp, #232] | |
| ; NO_NEON-NEXT: orr x9, x9, x13, lsl #32 | |
| ; NO_NEON-NEXT: mov w13, w7 | |
| ; NO_NEON-NEXT: ldr w12, [sp, #88] | |
| ; NO_NEON-NEXT: str x8, [x0, #40] | |
| ; NO_NEON-NEXT: orr x11, x13, x11, lsl #32 | |
| ; NO_NEON-NEXT: ldr w8, [sp, #216] | |
| ; NO_NEON-NEXT: orr x12, x12, x6, lsl #32 | |
| ; NO_NEON-NEXT: stp x11, x9, [x0, #24] | |
| ; NO_NEON-NEXT: mov w9, w5 | |
| ; NO_NEON-NEXT: orr x8, x9, x8, lsl #32 | |
| ; NO_NEON-NEXT: stp x12, x10, [x0, #8] | |
| ; NO_NEON-NEXT: str x8, [x0] | |
| ; NO_NEON-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload | |
| ; NO_NEON-NEXT: ret | |
| %1 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <4 x i32> <i32 4, i32 5, i32 6, i32 7> | |
| %2 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <4 x i32> <i32 32, i32 33, i32 34, i32 35> | |
| %3 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <4 x i32> <i32 16, i32 17, i32 18, i32 19> | |
| %intrinsic.interleave.0 = call <12 x i32> @llvm.vector.interleave3.v12i32(<4 x i32> %1, <4 x i32> %2, <4 x i32> %3) | |
| store <12 x i32> %intrinsic.interleave.0, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_general_mask_factor4_intrinsic(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { | |
| ; NEON-LABEL: store_general_mask_factor4_intrinsic: | |
| ; NEON: // %bb.0: | |
| ; NEON-NEXT: // kill: def $q4 killed $q4 def $q3_q4_q5_q6 | |
| ; NEON-NEXT: mov v6.16b, v2.16b | |
| ; NEON-NEXT: mov v3.16b, v1.16b | |
| ; NEON-NEXT: ldr d5, [sp] | |
| ; NEON-NEXT: st4 { v3.2s, v4.2s, v5.2s, v6.2s }, [x0] | |
| ; NEON-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_general_mask_factor4_intrinsic: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill | |
| ; NO_NEON-NEXT: .cfi_def_cfa_offset 16 | |
| ; NO_NEON-NEXT: .cfi_offset w29, -16 | |
| ; NO_NEON-NEXT: ldr w8, [sp, #32] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #224] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #96] | |
| ; NO_NEON-NEXT: str w6, [x0, #16] | |
| ; NO_NEON-NEXT: stp w9, w8, [x0, #24] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #24] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #216] | |
| ; NO_NEON-NEXT: str w10, [x0, #20] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #88] | |
| ; NO_NEON-NEXT: stp w9, w8, [x0, #8] | |
| ; NO_NEON-NEXT: stp w5, w10, [x0] | |
| ; NO_NEON-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload | |
| ; NO_NEON-NEXT: ret | |
| %1 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> <i32 4, i32 5> | |
| %2 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> <i32 16, i32 17> | |
| %3 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> <i32 32, i32 33> | |
| %4 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> <i32 8, i32 9> | |
| %intrinsic.interleave.0 = call <8 x i32> @llvm.vector.interleave4.v8i32(<2 x i32> %1, <2 x i32> %2, <2 x i32> %3, <2 x i32> %4) | |
| store <8 x i32> %intrinsic.interleave.0, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_general_mask_factor4_undefbeg_intrinsic(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { | |
| ; NEON-LABEL: store_general_mask_factor4_undefbeg_intrinsic: | |
| ; NEON: // %bb.0: | |
| ; NEON-NEXT: // kill: def $q4 killed $q4 def $q3_q4_q5_q6 | |
| ; NEON-NEXT: mov v6.16b, v2.16b | |
| ; NEON-NEXT: mov v3.16b, v1.16b | |
| ; NEON-NEXT: ldr d5, [sp] | |
| ; NEON-NEXT: st4 { v3.2s, v4.2s, v5.2s, v6.2s }, [x0] | |
| ; NEON-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_general_mask_factor4_undefbeg_intrinsic: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill | |
| ; NO_NEON-NEXT: .cfi_def_cfa_offset 16 | |
| ; NO_NEON-NEXT: .cfi_offset w29, -16 | |
| ; NO_NEON-NEXT: ldr w8, [sp, #32] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #224] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #96] | |
| ; NO_NEON-NEXT: str w6, [x0, #16] | |
| ; NO_NEON-NEXT: stp w9, w8, [x0, #24] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #24] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #216] | |
| ; NO_NEON-NEXT: str w10, [x0, #20] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #88] | |
| ; NO_NEON-NEXT: stp w9, w8, [x0, #8] | |
| ; NO_NEON-NEXT: stp w5, w10, [x0] | |
| ; NO_NEON-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload | |
| ; NO_NEON-NEXT: ret | |
| %1 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> <i32 4, i32 5> | |
| %2 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> <i32 16, i32 17> | |
| %3 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> <i32 32, i32 33> | |
| %4 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> <i32 8, i32 9> | |
| %intrinsic.interleave.0 = call <8 x i32> @llvm.vector.interleave4.v8i32(<2 x i32> %1, <2 x i32> %2, <2 x i32> %3, <2 x i32> %4) | |
| store <8 x i32> %intrinsic.interleave.0, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_general_mask_factor4_undefend_intrinsic(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { | |
| ; NEON-LABEL: store_general_mask_factor4_undefend_intrinsic: | |
| ; NEON: // %bb.0: | |
| ; NEON-NEXT: // kill: def $q4 killed $q4 def $q3_q4_q5_q6 | |
| ; NEON-NEXT: mov v6.16b, v2.16b | |
| ; NEON-NEXT: mov v3.16b, v1.16b | |
| ; NEON-NEXT: ldr d5, [sp] | |
| ; NEON-NEXT: st4 { v3.2s, v4.2s, v5.2s, v6.2s }, [x0] | |
| ; NEON-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_general_mask_factor4_undefend_intrinsic: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill | |
| ; NO_NEON-NEXT: .cfi_def_cfa_offset 16 | |
| ; NO_NEON-NEXT: .cfi_offset w29, -16 | |
| ; NO_NEON-NEXT: ldr w8, [sp, #32] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #224] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #96] | |
| ; NO_NEON-NEXT: str w6, [x0, #16] | |
| ; NO_NEON-NEXT: stp w9, w8, [x0, #24] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #24] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #216] | |
| ; NO_NEON-NEXT: str w10, [x0, #20] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #88] | |
| ; NO_NEON-NEXT: stp w9, w8, [x0, #8] | |
| ; NO_NEON-NEXT: stp w5, w10, [x0] | |
| ; NO_NEON-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload | |
| ; NO_NEON-NEXT: ret | |
| %1 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> <i32 4, i32 5> | |
| %2 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> <i32 16, i32 17> | |
| %3 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> <i32 32, i32 33> | |
| %4 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> <i32 8, i32 9> | |
| %intrinsic.interleave.0 = call <8 x i32> @llvm.vector.interleave4.v8i32(<2 x i32> %1, <2 x i32> %2, <2 x i32> %3, <2 x i32> %4) | |
| store <8 x i32> %intrinsic.interleave.0, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_general_mask_factor4_undefmid_intrinsic(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { | |
| ; NEON-LABEL: store_general_mask_factor4_undefmid_intrinsic: | |
| ; NEON: // %bb.0: | |
| ; NEON-NEXT: // kill: def $q4 killed $q4 def $q3_q4_q5_q6 | |
| ; NEON-NEXT: mov v6.16b, v2.16b | |
| ; NEON-NEXT: mov v3.16b, v1.16b | |
| ; NEON-NEXT: ldr d5, [sp] | |
| ; NEON-NEXT: st4 { v3.2s, v4.2s, v5.2s, v6.2s }, [x0] | |
| ; NEON-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_general_mask_factor4_undefmid_intrinsic: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill | |
| ; NO_NEON-NEXT: .cfi_def_cfa_offset 16 | |
| ; NO_NEON-NEXT: .cfi_offset w29, -16 | |
| ; NO_NEON-NEXT: ldr w8, [sp, #32] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #224] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #96] | |
| ; NO_NEON-NEXT: str w6, [x0, #16] | |
| ; NO_NEON-NEXT: stp w9, w8, [x0, #24] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #24] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #216] | |
| ; NO_NEON-NEXT: str w10, [x0, #20] | |
| ; NO_NEON-NEXT: ldr w10, [sp, #88] | |
| ; NO_NEON-NEXT: stp w9, w8, [x0, #8] | |
| ; NO_NEON-NEXT: stp w5, w10, [x0] | |
| ; NO_NEON-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload | |
| ; NO_NEON-NEXT: ret | |
| %1 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> <i32 4, i32 5> | |
| %2 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> <i32 16, i32 17> | |
| %3 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> <i32 32, i32 33> | |
| %4 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> <i32 8, i32 9> | |
| %intrinsic.interleave.0 = call <8 x i32> @llvm.vector.interleave4.v8i32(<2 x i32> %1, <2 x i32> %2, <2 x i32> %3, <2 x i32> %4) | |
| store <8 x i32> %intrinsic.interleave.0, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_general_mask_factor4_undefmulti_intrinsic(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { | |
| ; NEON-LABEL: store_general_mask_factor4_undefmulti_intrinsic: | |
| ; NEON: // %bb.0: | |
| ; NEON-NEXT: mov v5.16b, v2.16b | |
| ; NEON-NEXT: mov v2.16b, v1.16b | |
| ; NEON-NEXT: mov v3.16b, v0.16b | |
| ; NEON-NEXT: fmov d4, d3 | |
| ; NEON-NEXT: st4 { v2.2s, v3.2s, v4.2s, v5.2s }, [x0] | |
| ; NEON-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_general_mask_factor4_undefmulti_intrinsic: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill | |
| ; NO_NEON-NEXT: .cfi_def_cfa_offset 16 | |
| ; NO_NEON-NEXT: .cfi_offset w29, -16 | |
| ; NO_NEON-NEXT: ldr w8, [sp, #32] | |
| ; NO_NEON-NEXT: stp w6, w2, [x0, #16] | |
| ; NO_NEON-NEXT: stp w5, w1, [x0] | |
| ; NO_NEON-NEXT: stp w2, w8, [x0, #24] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #24] | |
| ; NO_NEON-NEXT: stp w1, w8, [x0, #8] | |
| ; NO_NEON-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload | |
| ; NO_NEON-NEXT: ret | |
| %1 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> <i32 4, i32 5> | |
| %2 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> <i32 0, i32 1> | |
| %3 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> <i32 0, i32 1> | |
| %4 = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> <i32 8, i32 9> | |
| %intrinsic.interleave.0 = call <8 x i32> @llvm.vector.interleave4.v8i32(<2 x i32> %1, <2 x i32> %2, <2 x i32> %3, <2 x i32> %4) | |
| store <8 x i32> %intrinsic.interleave.0, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_ptrvec_factor2_intrinsic(ptr %ptr, <2 x ptr> %v0, <2 x ptr> %v1) { | |
| ; NEON-IAENABLED-LABEL: store_ptrvec_factor2_intrinsic: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1 | |
| ; NEON-IAENABLED-NEXT: // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1 | |
| ; NEON-IAENABLED-NEXT: st2 { v0.2d, v1.2d }, [x0] | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: store_ptrvec_factor2_intrinsic: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: zip2 v2.2d, v0.2d, v1.2d | |
| ; NEON-IADISABLED-NEXT: zip1 v0.2d, v0.2d, v1.2d | |
| ; NEON-IADISABLED-NEXT: stp q0, q2, [x0] | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_ptrvec_factor2_intrinsic: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: stp x3, x5, [x0, #16] | |
| ; NO_NEON-NEXT: stp x2, x4, [x0] | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.intrinsic = call <4 x ptr> @llvm.vector.interleave2.v4p0(<2 x ptr> %v0, <2 x ptr> %v1) | |
| store <4 x ptr> %interleaved.intrinsic, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_ptrvec_factor3_intrinsic(ptr %ptr, <2 x ptr> %v0, <2 x ptr> %v1, <2 x ptr> %v2) { | |
| ; NEON-LABEL: store_ptrvec_factor3_intrinsic: | |
| ; NEON: // %bb.0: | |
| ; NEON-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2 | |
| ; NEON-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2 | |
| ; NEON-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2 | |
| ; NEON-NEXT: st3 { v0.2d, v1.2d, v2.2d }, [x0] | |
| ; NEON-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_ptrvec_factor3_intrinsic: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: stp x5, x7, [x0, #32] | |
| ; NO_NEON-NEXT: stp x6, x3, [x0, #16] | |
| ; NO_NEON-NEXT: stp x2, x4, [x0] | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.intrinsic = call <6 x ptr> @llvm.vector.interleave3.v6p0(<2 x ptr> %v0, <2 x ptr> %v1, <2 x ptr> %v2) | |
| store <6 x ptr> %interleaved.intrinsic, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_ptrvec_factor4_intrinsic(ptr %ptr, <2 x ptr> %v0, <2 x ptr> %v1, <2 x ptr> %v2, <2 x ptr> %v3) { | |
| ; NEON-LABEL: store_ptrvec_factor4_intrinsic: | |
| ; NEON: // %bb.0: | |
| ; NEON-NEXT: // kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3 | |
| ; NEON-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3 | |
| ; NEON-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3 | |
| ; NEON-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3 | |
| ; NEON-NEXT: st4 { v0.2d, v1.2d, v2.2d, v3.2d }, [x0] | |
| ; NEON-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_ptrvec_factor4_intrinsic: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldr x8, [sp, #8] | |
| ; NO_NEON-NEXT: stp x3, x5, [x0, #32] | |
| ; NO_NEON-NEXT: stp x2, x4, [x0] | |
| ; NO_NEON-NEXT: stp x7, x8, [x0, #48] | |
| ; NO_NEON-NEXT: ldr x8, [sp] | |
| ; NO_NEON-NEXT: stp x6, x8, [x0, #16] | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.intrinsic = call <8 x ptr> @llvm.vector.interleave4.v8p0(<2 x ptr> %v0, <2 x ptr> %v1, <2 x ptr> %v2, <2 x ptr> %v3) | |
| store <8 x ptr> %interleaved.intrinsic, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_undef_mask_factor2_intrinsic(ptr %ptr, <4 x i32> %v0, <4 x i32> %v1) { | |
| ; NEON-IAENABLED-LABEL: store_undef_mask_factor2_intrinsic: | |
| ; NEON-IAENABLED: // %bb.0: | |
| ; NEON-IAENABLED-NEXT: // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1 | |
| ; NEON-IAENABLED-NEXT: // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1 | |
| ; NEON-IAENABLED-NEXT: st2 { v0.4s, v1.4s }, [x0] | |
| ; NEON-IAENABLED-NEXT: ret | |
| ; | |
| ; NEON-IADISABLED-LABEL: store_undef_mask_factor2_intrinsic: | |
| ; NEON-IADISABLED: // %bb.0: | |
| ; NEON-IADISABLED-NEXT: zip2 v2.4s, v0.4s, v1.4s | |
| ; NEON-IADISABLED-NEXT: zip1 v0.4s, v0.4s, v1.4s | |
| ; NEON-IADISABLED-NEXT: stp q0, q2, [x0] | |
| ; NEON-IADISABLED-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_undef_mask_factor2_intrinsic: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldr w8, [sp] | |
| ; NO_NEON-NEXT: stp w3, w7, [x0, #16] | |
| ; NO_NEON-NEXT: stp w2, w6, [x0, #8] | |
| ; NO_NEON-NEXT: stp w4, w8, [x0, #24] | |
| ; NO_NEON-NEXT: stp w1, w5, [x0] | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.intrinsic = call <8 x i32> @llvm.vector.interleave2.v8i32(<4 x i32> %v0, <4 x i32> %v1) | |
| store <8 x i32> %interleaved.intrinsic, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_undef_mask_factor3_intrinsic(ptr %ptr, <4 x i32> %v0, <4 x i32> %v1, <4 x i32> %v2) { | |
| ; NEON-LABEL: store_undef_mask_factor3_intrinsic: | |
| ; NEON: // %bb.0: | |
| ; NEON-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2 | |
| ; NEON-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2 | |
| ; NEON-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2 | |
| ; NEON-NEXT: st3 { v0.4s, v1.4s, v2.4s }, [x0] | |
| ; NEON-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_undef_mask_factor3_intrinsic: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldr w8, [sp] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #32] | |
| ; NO_NEON-NEXT: // kill: def $w4 killed $w4 def $x4 | |
| ; NO_NEON-NEXT: mov w12, w3 | |
| ; NO_NEON-NEXT: ldr w10, [sp, #24] | |
| ; NO_NEON-NEXT: ldr w11, [sp, #16] | |
| ; NO_NEON-NEXT: mov w13, w6 | |
| ; NO_NEON-NEXT: orr x8, x8, x9, lsl #32 | |
| ; NO_NEON-NEXT: ldr w9, [sp, #8] | |
| ; NO_NEON-NEXT: // kill: def $w7 killed $w7 def $x7 | |
| ; NO_NEON-NEXT: // kill: def $w5 killed $w5 def $x5 | |
| ; NO_NEON-NEXT: // kill: def $w2 killed $w2 def $x2 | |
| ; NO_NEON-NEXT: orr x12, x12, x7, lsl #32 | |
| ; NO_NEON-NEXT: orr x10, x10, x4, lsl #32 | |
| ; NO_NEON-NEXT: orr x9, x9, x2, lsl #32 | |
| ; NO_NEON-NEXT: stp x10, x8, [x0, #32] | |
| ; NO_NEON-NEXT: mov w10, w1 | |
| ; NO_NEON-NEXT: orr x8, x13, x11, lsl #32 | |
| ; NO_NEON-NEXT: orr x10, x10, x5, lsl #32 | |
| ; NO_NEON-NEXT: stp x8, x12, [x0, #16] | |
| ; NO_NEON-NEXT: stp x10, x9, [x0] | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.intrinsic = call <12 x i32> @llvm.vector.interleave3.v12i32(<4 x i32> %v0, <4 x i32> %v1, <4 x i32> %v2) | |
| store <12 x i32> %interleaved.intrinsic, ptr %ptr, align 4 | |
| ret void | |
| } | |
| define void @store_undef_mask_factor4_intrinsic(ptr %ptr, <4 x i32> %v0, <4 x i32> %v1, <4 x i32> %v2, <4 x i32> %v3) { | |
| ; NEON-LABEL: store_undef_mask_factor4_intrinsic: | |
| ; NEON: // %bb.0: | |
| ; NEON-NEXT: // kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3 | |
| ; NEON-NEXT: // kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3 | |
| ; NEON-NEXT: // kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3 | |
| ; NEON-NEXT: // kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3 | |
| ; NEON-NEXT: st4 { v0.4s, v1.4s, v2.4s, v3.4s }, [x0] | |
| ; NEON-NEXT: ret | |
| ; | |
| ; NO_NEON-LABEL: store_undef_mask_factor4_intrinsic: | |
| ; NO_NEON: // %bb.0: | |
| ; NO_NEON-NEXT: ldr w8, [sp, #64] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #32] | |
| ; NO_NEON-NEXT: ldr w10, [sp] | |
| ; NO_NEON-NEXT: str w7, [x0, #36] | |
| ; NO_NEON-NEXT: stp w9, w8, [x0, #56] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #56] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #24] | |
| ; NO_NEON-NEXT: str w10, [x0, #52] | |
| ; NO_NEON-NEXT: stp w8, w4, [x0, #44] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #48] | |
| ; NO_NEON-NEXT: str w9, [x0, #40] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #16] | |
| ; NO_NEON-NEXT: stp w8, w3, [x0, #28] | |
| ; NO_NEON-NEXT: ldr w8, [sp, #40] | |
| ; NO_NEON-NEXT: str w9, [x0, #24] | |
| ; NO_NEON-NEXT: ldr w9, [sp, #8] | |
| ; NO_NEON-NEXT: str w6, [x0, #20] | |
| ; NO_NEON-NEXT: stp w8, w2, [x0, #12] | |
| ; NO_NEON-NEXT: stp w5, w9, [x0, #4] | |
| ; NO_NEON-NEXT: str w1, [x0] | |
| ; NO_NEON-NEXT: ret | |
| %interleaved.intrinsic = call <16 x i32> @llvm.vector.interleave4.v16i32(<4 x i32> %v0, <4 x i32> %v1, <4 x i32> %v2, <4 x i32> %v3) | |
| store <16 x i32> %interleaved.intrinsic, ptr %ptr, align 4 | |
| ret void | |
| } | |
| ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: | |
| ; NO_NEON-IADISABLED: {{.*}} | |
| ; NO_NEON-IAENABLED: {{.*}} |