1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-eabi %s -o - | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; These tests just check that the plumbing is in place for @llvm.bitreverse. The 4*9880d681SAndroid Build Coastguard Worker; actual output is massive at the moment as llvm.bitreverse is not yet legal. 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdeclare <2 x i16> @llvm.bitreverse.v2i16(<2 x i16>) readnone 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine <2 x i16> @f(<2 x i16> %a) { 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f: 10*9880d681SAndroid Build Coastguard Worker; CHECK: rev32 11*9880d681SAndroid Build Coastguard Worker; CHECK: ushr 12*9880d681SAndroid Build Coastguard Worker %b = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> %a) 13*9880d681SAndroid Build Coastguard Worker ret <2 x i16> %b 14*9880d681SAndroid Build Coastguard Worker} 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerdeclare i8 @llvm.bitreverse.i8(i8) readnone 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; Unfortunately some of the shift-and-inserts become BFIs, and some do not :( 19*9880d681SAndroid Build Coastguard Workerdefine i8 @g(i8 %a) { 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: g: 21*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lsr [[S5:w.*]], w0, #5 22*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lsr [[S4:w.*]], w0, #4 23*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lsr [[S3:w.*]], w0, #3 24*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lsr [[S2:w.*]], w0, #2 25*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lsl [[L1:w.*]], w0, #29 26*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lsl [[L2:w.*]], w0, #19 27*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lsl [[L3:w.*]], w0, #17 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and [[T1:w.*]], [[L1]], #0x40000000 30*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: bfi [[T1]], w0, #31, #1 31*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: bfi [[T1]], [[S2]], #29, #1 32*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: bfi [[T1]], [[S3]], #28, #1 33*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: bfi [[T1]], [[S4]], #27, #1 34*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: bfi [[T1]], [[S5]], #26, #1 35*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and [[T2:w.*]], [[L2]], #0x2000000 36*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and [[T3:w.*]], [[L3]], #0x1000000 37*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: orr [[T4:w.*]], [[T1]], [[T2]] 38*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: orr [[T5:w.*]], [[T4]], [[T3]] 39*9880d681SAndroid Build Coastguard Worker; CHECK: lsr w0, [[T5]], #24 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker %b = call i8 @llvm.bitreverse.i8(i8 %a) 42*9880d681SAndroid Build Coastguard Worker ret i8 %b 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerdeclare <8 x i8> @llvm.bitreverse.v8i8(<8 x i8>) readnone 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @g_vec(<8 x i8> %a) { 48*9880d681SAndroid Build Coastguard Worker; Try and match as much of the sequence as precisely as possible. 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: g_vec: 51*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi [[M1:v.*]], #128 52*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi [[M2:v.*]], #64 53*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi [[M3:v.*]], #32 54*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi [[M4:v.*]], #16 55*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi [[M5:v.*]], #8{{$}} 56*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi [[M6:v.*]], #4{{$}} 57*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi [[M7:v.*]], #2{{$}} 58*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi [[M8:v.*]], #1{{$}} 59*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: shl [[S1:v.*]], v0.8b, #7 60*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: shl [[S2:v.*]], v0.8b, #5 61*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: shl [[S3:v.*]], v0.8b, #3 62*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: shl [[S4:v.*]], v0.8b, #1 63*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: ushr [[S5:v.*]], v0.8b, #1 64*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: ushr [[S6:v.*]], v0.8b, #3 65*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: ushr [[S7:v.*]], v0.8b, #5 66*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: ushr [[S8:v.*]], v0.8b, #7 67*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and [[A1:v.*]], [[S1]], [[M1]] 68*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and [[A2:v.*]], [[S2]], [[M2]] 69*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and [[A3:v.*]], [[S3]], [[M3]] 70*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and [[A4:v.*]], [[S4]], [[M4]] 71*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and [[A5:v.*]], [[S5]], [[M5]] 72*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and [[A6:v.*]], [[S6]], [[M6]] 73*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and [[A7:v.*]], [[S7]], [[M7]] 74*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: and [[A8:v.*]], [[S8]], [[M8]] 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker; The rest can be ORRed together in any order; it's not worth the test 77*9880d681SAndroid Build Coastguard Worker; maintenance to match them precisely. 78*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: orr 79*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: orr 80*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: orr 81*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: orr 82*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: orr 83*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: orr 84*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: orr 85*9880d681SAndroid Build Coastguard Worker; CHECK: ret 86*9880d681SAndroid Build Coastguard Worker %b = call <8 x i8> @llvm.bitreverse.v8i8(<8 x i8> %a) 87*9880d681SAndroid Build Coastguard Worker ret <8 x i8> %b 88*9880d681SAndroid Build Coastguard Worker} 89