1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -aarch64-neon-syntax=apple | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine i32 @test_rev_w(i32 %a) nounwind { 4*9880d681SAndroid Build Coastguard Workerentry: 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_rev_w: 6*9880d681SAndroid Build Coastguard Worker; CHECK: rev w0, w0 7*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.bswap.i32(i32 %a) 8*9880d681SAndroid Build Coastguard Worker ret i32 %0 9*9880d681SAndroid Build Coastguard Worker} 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workerdefine i64 @test_rev_x(i64 %a) nounwind { 12*9880d681SAndroid Build Coastguard Workerentry: 13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_rev_x: 14*9880d681SAndroid Build Coastguard Worker; CHECK: rev x0, x0 15*9880d681SAndroid Build Coastguard Worker %0 = tail call i64 @llvm.bswap.i64(i64 %a) 16*9880d681SAndroid Build Coastguard Worker ret i64 %0 17*9880d681SAndroid Build Coastguard Worker} 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker; Canonicalize (srl (bswap x), 16) to (rotr (bswap x), 16) if the high 16-bits 20*9880d681SAndroid Build Coastguard Worker; of %a are zero. This optimizes rev + lsr 16 to rev16. 21*9880d681SAndroid Build Coastguard Workerdefine i32 @test_rev_w_srl16(i16 %a) { 22*9880d681SAndroid Build Coastguard Workerentry: 23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_rev_w_srl16: 24*9880d681SAndroid Build Coastguard Worker; CHECK: and [[REG:w[0-9]+]], w0, #0xffff 25*9880d681SAndroid Build Coastguard Worker; CHECK: rev16 w0, [[REG]] 26*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: lsr 27*9880d681SAndroid Build Coastguard Worker %0 = zext i16 %a to i32 28*9880d681SAndroid Build Coastguard Worker %1 = tail call i32 @llvm.bswap.i32(i32 %0) 29*9880d681SAndroid Build Coastguard Worker %2 = lshr i32 %1, 16 30*9880d681SAndroid Build Coastguard Worker ret i32 %2 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker; Canonicalize (srl (bswap x), 32) to (rotr (bswap x), 32) if the high 32-bits 34*9880d681SAndroid Build Coastguard Worker; of %a are zero. This optimizes rev + lsr 32 to rev32. 35*9880d681SAndroid Build Coastguard Workerdefine i64 @test_rev_x_srl32(i32 %a) { 36*9880d681SAndroid Build Coastguard Workerentry: 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_rev_x_srl32: 38*9880d681SAndroid Build Coastguard Worker; CHECK: rev32 x0, {{x[0-9]+}} 39*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: lsr 40*9880d681SAndroid Build Coastguard Worker %0 = zext i32 %a to i64 41*9880d681SAndroid Build Coastguard Worker %1 = tail call i64 @llvm.bswap.i64(i64 %0) 42*9880d681SAndroid Build Coastguard Worker %2 = lshr i64 %1, 32 43*9880d681SAndroid Build Coastguard Worker ret i64 %2 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.bswap.i32(i32) nounwind readnone 47*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.bswap.i64(i64) nounwind readnone 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Workerdefine i32 @test_rev16_w(i32 %X) nounwind { 50*9880d681SAndroid Build Coastguard Workerentry: 51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_rev16_w: 52*9880d681SAndroid Build Coastguard Worker; CHECK: rev16 w0, w0 53*9880d681SAndroid Build Coastguard Worker %tmp1 = lshr i32 %X, 8 54*9880d681SAndroid Build Coastguard Worker %X15 = bitcast i32 %X to i32 55*9880d681SAndroid Build Coastguard Worker %tmp4 = shl i32 %X15, 8 56*9880d681SAndroid Build Coastguard Worker %tmp2 = and i32 %tmp1, 16711680 57*9880d681SAndroid Build Coastguard Worker %tmp5 = and i32 %tmp4, -16777216 58*9880d681SAndroid Build Coastguard Worker %tmp9 = and i32 %tmp1, 255 59*9880d681SAndroid Build Coastguard Worker %tmp13 = and i32 %tmp4, 65280 60*9880d681SAndroid Build Coastguard Worker %tmp6 = or i32 %tmp5, %tmp2 61*9880d681SAndroid Build Coastguard Worker %tmp10 = or i32 %tmp6, %tmp13 62*9880d681SAndroid Build Coastguard Worker %tmp14 = or i32 %tmp10, %tmp9 63*9880d681SAndroid Build Coastguard Worker ret i32 %tmp14 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker; 64-bit REV16 is *not* a swap then a 16-bit rotation: 67*9880d681SAndroid Build Coastguard Worker; 01234567 ->(bswap) 76543210 ->(rotr) 10765432 68*9880d681SAndroid Build Coastguard Worker; 01234567 ->(rev16) 10325476 69*9880d681SAndroid Build Coastguard Workerdefine i64 @test_rev16_x(i64 %a) nounwind { 70*9880d681SAndroid Build Coastguard Workerentry: 71*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_rev16_x: 72*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: rev16 x0, x0 73*9880d681SAndroid Build Coastguard Worker %0 = tail call i64 @llvm.bswap.i64(i64 %a) 74*9880d681SAndroid Build Coastguard Worker %1 = lshr i64 %0, 16 75*9880d681SAndroid Build Coastguard Worker %2 = shl i64 %0, 48 76*9880d681SAndroid Build Coastguard Worker %3 = or i64 %1, %2 77*9880d681SAndroid Build Coastguard Worker ret i64 %3 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerdefine i64 @test_rev32_x(i64 %a) nounwind { 81*9880d681SAndroid Build Coastguard Workerentry: 82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_rev32_x: 83*9880d681SAndroid Build Coastguard Worker; CHECK: rev32 x0, x0 84*9880d681SAndroid Build Coastguard Worker %0 = tail call i64 @llvm.bswap.i64(i64 %a) 85*9880d681SAndroid Build Coastguard Worker %1 = lshr i64 %0, 32 86*9880d681SAndroid Build Coastguard Worker %2 = shl i64 %0, 32 87*9880d681SAndroid Build Coastguard Worker %3 = or i64 %1, %2 88*9880d681SAndroid Build Coastguard Worker ret i64 %3 89*9880d681SAndroid Build Coastguard Worker} 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vrev64D8(<8 x i8>* %A) nounwind { 92*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev64D8: 93*9880d681SAndroid Build Coastguard Worker;CHECK: rev64.8b 94*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i8>, <8 x i8>* %A 95*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <8 x i8> %tmp1, <8 x i8> undef, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0> 96*9880d681SAndroid Build Coastguard Worker ret <8 x i8> %tmp2 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vrev64D16(<4 x i16>* %A) nounwind { 100*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev64D16: 101*9880d681SAndroid Build Coastguard Worker;CHECK: rev64.4h 102*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i16>, <4 x i16>* %A 103*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <4 x i16> %tmp1, <4 x i16> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0> 104*9880d681SAndroid Build Coastguard Worker ret <4 x i16> %tmp2 105*9880d681SAndroid Build Coastguard Worker} 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vrev64D32(<2 x i32>* %A) nounwind { 108*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev64D32: 109*9880d681SAndroid Build Coastguard Worker;CHECK: rev64.2s 110*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x i32>, <2 x i32>* %A 111*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <2 x i32> %tmp1, <2 x i32> undef, <2 x i32> <i32 1, i32 0> 112*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %tmp2 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test_vrev64Df(<2 x float>* %A) nounwind { 116*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev64Df: 117*9880d681SAndroid Build Coastguard Worker;CHECK: rev64.2s 118*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x float>, <2 x float>* %A 119*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <2 x float> %tmp1, <2 x float> undef, <2 x i32> <i32 1, i32 0> 120*9880d681SAndroid Build Coastguard Worker ret <2 x float> %tmp2 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vrev64Q8(<16 x i8>* %A) nounwind { 124*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev64Q8: 125*9880d681SAndroid Build Coastguard Worker;CHECK: rev64.16b 126*9880d681SAndroid Build Coastguard Worker %tmp1 = load <16 x i8>, <16 x i8>* %A 127*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <16 x i8> %tmp1, <16 x i8> undef, <16 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8> 128*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %tmp2 129*9880d681SAndroid Build Coastguard Worker} 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vrev64Q16(<8 x i16>* %A) nounwind { 132*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev64Q16: 133*9880d681SAndroid Build Coastguard Worker;CHECK: rev64.8h 134*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i16>, <8 x i16>* %A 135*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <8 x i16> %tmp1, <8 x i16> undef, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4> 136*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %tmp2 137*9880d681SAndroid Build Coastguard Worker} 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vrev64Q32(<4 x i32>* %A) nounwind { 140*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev64Q32: 141*9880d681SAndroid Build Coastguard Worker;CHECK: rev64.4s 142*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i32>, <4 x i32>* %A 143*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <4 x i32> %tmp1, <4 x i32> undef, <4 x i32> <i32 1, i32 0, i32 3, i32 2> 144*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %tmp2 145*9880d681SAndroid Build Coastguard Worker} 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_vrev64Qf(<4 x float>* %A) nounwind { 148*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev64Qf: 149*9880d681SAndroid Build Coastguard Worker;CHECK: rev64.4s 150*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x float>, <4 x float>* %A 151*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <4 x float> %tmp1, <4 x float> undef, <4 x i32> <i32 1, i32 0, i32 3, i32 2> 152*9880d681SAndroid Build Coastguard Worker ret <4 x float> %tmp2 153*9880d681SAndroid Build Coastguard Worker} 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vrev32D8(<8 x i8>* %A) nounwind { 156*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev32D8: 157*9880d681SAndroid Build Coastguard Worker;CHECK: rev32.8b 158*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i8>, <8 x i8>* %A 159*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <8 x i8> %tmp1, <8 x i8> undef, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4> 160*9880d681SAndroid Build Coastguard Worker ret <8 x i8> %tmp2 161*9880d681SAndroid Build Coastguard Worker} 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vrev32D16(<4 x i16>* %A) nounwind { 164*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev32D16: 165*9880d681SAndroid Build Coastguard Worker;CHECK: rev32.4h 166*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i16>, <4 x i16>* %A 167*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <4 x i16> %tmp1, <4 x i16> undef, <4 x i32> <i32 1, i32 0, i32 3, i32 2> 168*9880d681SAndroid Build Coastguard Worker ret <4 x i16> %tmp2 169*9880d681SAndroid Build Coastguard Worker} 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vrev32Q8(<16 x i8>* %A) nounwind { 172*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev32Q8: 173*9880d681SAndroid Build Coastguard Worker;CHECK: rev32.16b 174*9880d681SAndroid Build Coastguard Worker %tmp1 = load <16 x i8>, <16 x i8>* %A 175*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <16 x i8> %tmp1, <16 x i8> undef, <16 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 11, i32 10, i32 9, i32 8, i32 15, i32 14, i32 13, i32 12> 176*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %tmp2 177*9880d681SAndroid Build Coastguard Worker} 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vrev32Q16(<8 x i16>* %A) nounwind { 180*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev32Q16: 181*9880d681SAndroid Build Coastguard Worker;CHECK: rev32.8h 182*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i16>, <8 x i16>* %A 183*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <8 x i16> %tmp1, <8 x i16> undef, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6> 184*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %tmp2 185*9880d681SAndroid Build Coastguard Worker} 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vrev16D8(<8 x i8>* %A) nounwind { 188*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev16D8: 189*9880d681SAndroid Build Coastguard Worker;CHECK: rev16.8b 190*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i8>, <8 x i8>* %A 191*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <8 x i8> %tmp1, <8 x i8> undef, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6> 192*9880d681SAndroid Build Coastguard Worker ret <8 x i8> %tmp2 193*9880d681SAndroid Build Coastguard Worker} 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vrev16Q8(<16 x i8>* %A) nounwind { 196*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev16Q8: 197*9880d681SAndroid Build Coastguard Worker;CHECK: rev16.16b 198*9880d681SAndroid Build Coastguard Worker %tmp1 = load <16 x i8>, <16 x i8>* %A 199*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <16 x i8> %tmp1, <16 x i8> undef, <16 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6, i32 9, i32 8, i32 11, i32 10, i32 13, i32 12, i32 15, i32 14> 200*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %tmp2 201*9880d681SAndroid Build Coastguard Worker} 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Worker; Undef shuffle indices should not prevent matching to VREV: 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vrev64D8_undef(<8 x i8>* %A) nounwind { 206*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev64D8_undef: 207*9880d681SAndroid Build Coastguard Worker;CHECK: rev64.8b 208*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i8>, <8 x i8>* %A 209*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <8 x i8> %tmp1, <8 x i8> undef, <8 x i32> <i32 7, i32 undef, i32 undef, i32 4, i32 3, i32 2, i32 1, i32 0> 210*9880d681SAndroid Build Coastguard Worker ret <8 x i8> %tmp2 211*9880d681SAndroid Build Coastguard Worker} 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vrev32Q16_undef(<8 x i16>* %A) nounwind { 214*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev32Q16_undef: 215*9880d681SAndroid Build Coastguard Worker;CHECK: rev32.8h 216*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i16>, <8 x i16>* %A 217*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <8 x i16> %tmp1, <8 x i16> undef, <8 x i32> <i32 undef, i32 0, i32 undef, i32 2, i32 5, i32 4, i32 7, i32 undef> 218*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %tmp2 219*9880d681SAndroid Build Coastguard Worker} 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard Worker; vrev <4 x i16> should use REV32 and not REV64 222*9880d681SAndroid Build Coastguard Workerdefine void @test_vrev64(<4 x i16>* nocapture %source, <2 x i16>* nocapture %dst) nounwind ssp { 223*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vrev64: 224*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[DEST:q[0-9]+]], 225*9880d681SAndroid Build Coastguard Worker; CHECK: st1.h 226*9880d681SAndroid Build Coastguard Worker; CHECK: st1.h 227*9880d681SAndroid Build Coastguard Workerentry: 228*9880d681SAndroid Build Coastguard Worker %0 = bitcast <4 x i16>* %source to <8 x i16>* 229*9880d681SAndroid Build Coastguard Worker %tmp2 = load <8 x i16>, <8 x i16>* %0, align 4 230*9880d681SAndroid Build Coastguard Worker %tmp3 = extractelement <8 x i16> %tmp2, i32 6 231*9880d681SAndroid Build Coastguard Worker %tmp5 = insertelement <2 x i16> undef, i16 %tmp3, i32 0 232*9880d681SAndroid Build Coastguard Worker %tmp9 = extractelement <8 x i16> %tmp2, i32 5 233*9880d681SAndroid Build Coastguard Worker %tmp11 = insertelement <2 x i16> %tmp5, i16 %tmp9, i32 1 234*9880d681SAndroid Build Coastguard Worker store <2 x i16> %tmp11, <2 x i16>* %dst, align 4 235*9880d681SAndroid Build Coastguard Worker ret void 236*9880d681SAndroid Build Coastguard Worker} 237*9880d681SAndroid Build Coastguard Worker 238*9880d681SAndroid Build Coastguard Worker; Test vrev of float4 239*9880d681SAndroid Build Coastguard Workerdefine void @float_vrev64(float* nocapture %source, <4 x float>* nocapture %dest) nounwind noinline ssp { 240*9880d681SAndroid Build Coastguard Worker; CHECK: float_vrev64 241*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[DEST:q[0-9]+]], 242*9880d681SAndroid Build Coastguard Worker; CHECK: rev64.4s 243*9880d681SAndroid Build Coastguard Workerentry: 244*9880d681SAndroid Build Coastguard Worker %0 = bitcast float* %source to <4 x float>* 245*9880d681SAndroid Build Coastguard Worker %tmp2 = load <4 x float>, <4 x float>* %0, align 4 246*9880d681SAndroid Build Coastguard Worker %tmp5 = shufflevector <4 x float> <float 0.000000e+00, float undef, float undef, float undef>, <4 x float> %tmp2, <4 x i32> <i32 0, i32 7, i32 0, i32 0> 247*9880d681SAndroid Build Coastguard Worker %arrayidx8 = getelementptr inbounds <4 x float>, <4 x float>* %dest, i32 11 248*9880d681SAndroid Build Coastguard Worker store <4 x float> %tmp5, <4 x float>* %arrayidx8, align 4 249*9880d681SAndroid Build Coastguard Worker ret void 250*9880d681SAndroid Build Coastguard Worker} 251*9880d681SAndroid Build Coastguard Worker 252*9880d681SAndroid Build Coastguard Worker 253*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vrev32_bswap(<4 x i32> %source) nounwind { 254*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vrev32_bswap: 255*9880d681SAndroid Build Coastguard Worker; CHECK: rev32.16b 256*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: rev 257*9880d681SAndroid Build Coastguard Worker; CHECK: ret 258*9880d681SAndroid Build Coastguard Worker %bswap = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> %source) 259*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %bswap 260*9880d681SAndroid Build Coastguard Worker} 261*9880d681SAndroid Build Coastguard Worker 262*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.bswap.v4i32(<4 x i32>) nounwind readnone 263