1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=hexagon < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=hexagon -verify-machineinstrs=true < %s | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker; Testing bitreverse load intrinsics: 4*9880d681SAndroid Build Coastguard Worker; Q6_bitrev_load_update_D(inputLR, pDelay, nConvLength); 5*9880d681SAndroid Build Coastguard Worker; Q6_bitrev_load_update_W(inputLR, pDelay, nConvLength); 6*9880d681SAndroid Build Coastguard Worker; Q6_bitrev_load_update_H(inputLR, pDelay, nConvLength); 7*9880d681SAndroid Build Coastguard Worker; Q6_bitrev_load_update_UH(inputLR, pDelay, nConvLength); 8*9880d681SAndroid Build Coastguard Worker; Q6_bitrev_load_update_UB(inputLR, pDelay, nConvLength); 9*9880d681SAndroid Build Coastguard Worker; Q6_bitrev_load_update_B(inputLR, pDelay, nConvLength); 10*9880d681SAndroid Build Coastguard Worker; producing these instructions: 11*9880d681SAndroid Build Coastguard Worker; r3:2 = memd(r0++m0:brev) 12*9880d681SAndroid Build Coastguard Worker; r1 = memw(r0++m0:brev) 13*9880d681SAndroid Build Coastguard Worker; r1 = memh(r0++m0:brev) 14*9880d681SAndroid Build Coastguard Worker; r1 = memuh(r0++m0:brev) 15*9880d681SAndroid Build Coastguard Worker; r1 = memub(r0++m0:brev) 16*9880d681SAndroid Build Coastguard Worker; r1 = memb(r0++m0:brev) 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:32:32:32-i64:64:64-i32:32:32-i16:16:16-i1:32:32-f64:64:64-f32:32:32-v64:64:64-v32:32:32-a0:0-n16:32" 19*9880d681SAndroid Build Coastguard Workertarget triple = "hexagon" 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerdefine i64 @foo(i16 zeroext %filtMemLen, i16* %filtMemLR, i16 signext %filtMemIndex) nounwind { 22*9880d681SAndroid Build Coastguard Workerentry: 23*9880d681SAndroid Build Coastguard Worker %inputLR = alloca i64, align 8 24*9880d681SAndroid Build Coastguard Worker %conv = zext i16 %filtMemLen to i32 25*9880d681SAndroid Build Coastguard Worker %shr1 = lshr i32 %conv, 1 26*9880d681SAndroid Build Coastguard Worker %idxprom = sext i16 %filtMemIndex to i32 27*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i16, i16* %filtMemLR, i32 %idxprom 28*9880d681SAndroid Build Coastguard Worker %0 = bitcast i16* %arrayidx to i8* 29*9880d681SAndroid Build Coastguard Worker %1 = bitcast i64* %inputLR to i8* 30*9880d681SAndroid Build Coastguard Worker %sub = sub i32 13, %shr1 31*9880d681SAndroid Build Coastguard Worker %shl = shl i32 1, %sub 32*9880d681SAndroid Build Coastguard Worker; CHECK: = memd(r{{[0-9]*}} ++ m{{[0-1]}}:brev) 33*9880d681SAndroid Build Coastguard Worker %2 = call i8* @llvm.hexagon.brev.ldd(i8* %0, i8* %1, i32 %shl) 34*9880d681SAndroid Build Coastguard Worker %3 = bitcast i8* %1 to i64* 35*9880d681SAndroid Build Coastguard Worker %4 = load i64, i64* %3, align 8, !tbaa !0 36*9880d681SAndroid Build Coastguard Worker ret i64 %4 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdeclare i8* @llvm.hexagon.brev.ldd(i8*, i8*, i32) nounwind 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerdefine i32 @foo1(i16 zeroext %filtMemLen, i16* %filtMemLR, i16 signext %filtMemIndex) nounwind { 42*9880d681SAndroid Build Coastguard Workerentry: 43*9880d681SAndroid Build Coastguard Worker %inputLR = alloca i32, align 4 44*9880d681SAndroid Build Coastguard Worker %conv = zext i16 %filtMemLen to i32 45*9880d681SAndroid Build Coastguard Worker %shr1 = lshr i32 %conv, 1 46*9880d681SAndroid Build Coastguard Worker %idxprom = sext i16 %filtMemIndex to i32 47*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i16, i16* %filtMemLR, i32 %idxprom 48*9880d681SAndroid Build Coastguard Worker %0 = bitcast i16* %arrayidx to i8* 49*9880d681SAndroid Build Coastguard Worker %1 = bitcast i32* %inputLR to i8* 50*9880d681SAndroid Build Coastguard Worker %sub = sub i32 14, %shr1 51*9880d681SAndroid Build Coastguard Worker %shl = shl i32 1, %sub 52*9880d681SAndroid Build Coastguard Worker; CHECK: = memw(r{{[0-9]*}} ++ m{{[0-1]}}:brev) 53*9880d681SAndroid Build Coastguard Worker %2 = call i8* @llvm.hexagon.brev.ldw(i8* %0, i8* %1, i32 %shl) 54*9880d681SAndroid Build Coastguard Worker %3 = bitcast i8* %1 to i32* 55*9880d681SAndroid Build Coastguard Worker %4 = load i32, i32* %3, align 4, !tbaa !2 56*9880d681SAndroid Build Coastguard Worker ret i32 %4 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerdeclare i8* @llvm.hexagon.brev.ldw(i8*, i8*, i32) nounwind 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Workerdefine signext i16 @foo2(i16 zeroext %filtMemLen, i16* %filtMemLR, i16 signext %filtMemIndex) nounwind { 62*9880d681SAndroid Build Coastguard Workerentry: 63*9880d681SAndroid Build Coastguard Worker %inputLR = alloca i16, align 2 64*9880d681SAndroid Build Coastguard Worker %conv = zext i16 %filtMemLen to i32 65*9880d681SAndroid Build Coastguard Worker %shr1 = lshr i32 %conv, 1 66*9880d681SAndroid Build Coastguard Worker %idxprom = sext i16 %filtMemIndex to i32 67*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i16, i16* %filtMemLR, i32 %idxprom 68*9880d681SAndroid Build Coastguard Worker %0 = bitcast i16* %arrayidx to i8* 69*9880d681SAndroid Build Coastguard Worker %1 = bitcast i16* %inputLR to i8* 70*9880d681SAndroid Build Coastguard Worker %sub = sub i32 15, %shr1 71*9880d681SAndroid Build Coastguard Worker %shl = shl i32 1, %sub 72*9880d681SAndroid Build Coastguard Worker; CHECK: = memh(r{{[0-9]*}} ++ m0:brev) 73*9880d681SAndroid Build Coastguard Worker %2 = call i8* @llvm.hexagon.brev.ldh(i8* %0, i8* %1, i32 %shl) 74*9880d681SAndroid Build Coastguard Worker %3 = bitcast i8* %1 to i16* 75*9880d681SAndroid Build Coastguard Worker %4 = load i16, i16* %3, align 2, !tbaa !3 76*9880d681SAndroid Build Coastguard Worker ret i16 %4 77*9880d681SAndroid Build Coastguard Worker} 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workerdeclare i8* @llvm.hexagon.brev.ldh(i8*, i8*, i32) nounwind 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @foo3(i16 zeroext %filtMemLen, i16* %filtMemLR, i16 signext %filtMemIndex) nounwind { 82*9880d681SAndroid Build Coastguard Workerentry: 83*9880d681SAndroid Build Coastguard Worker %inputLR = alloca i16, align 2 84*9880d681SAndroid Build Coastguard Worker %conv = zext i16 %filtMemLen to i32 85*9880d681SAndroid Build Coastguard Worker %shr1 = lshr i32 %conv, 1 86*9880d681SAndroid Build Coastguard Worker %idxprom = sext i16 %filtMemIndex to i32 87*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i16, i16* %filtMemLR, i32 %idxprom 88*9880d681SAndroid Build Coastguard Worker %0 = bitcast i16* %arrayidx to i8* 89*9880d681SAndroid Build Coastguard Worker %1 = bitcast i16* %inputLR to i8* 90*9880d681SAndroid Build Coastguard Worker %sub = sub i32 15, %shr1 91*9880d681SAndroid Build Coastguard Worker %shl = shl i32 1, %sub 92*9880d681SAndroid Build Coastguard Worker; CHECK: = memuh(r{{[0-9]*}} ++ m0:brev) 93*9880d681SAndroid Build Coastguard Worker %2 = call i8* @llvm.hexagon.brev.lduh(i8* %0, i8* %1, i32 %shl) 94*9880d681SAndroid Build Coastguard Worker %3 = bitcast i8* %1 to i16* 95*9880d681SAndroid Build Coastguard Worker %4 = load i16, i16* %3, align 2, !tbaa !3 96*9880d681SAndroid Build Coastguard Worker ret i16 %4 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerdeclare i8* @llvm.hexagon.brev.lduh(i8*, i8*, i32) nounwind 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @foo4(i16 zeroext %filtMemLen, i16* %filtMemLR, i16 signext %filtMemIndex) nounwind { 102*9880d681SAndroid Build Coastguard Workerentry: 103*9880d681SAndroid Build Coastguard Worker %inputLR = alloca i8, align 1 104*9880d681SAndroid Build Coastguard Worker %conv = zext i16 %filtMemLen to i32 105*9880d681SAndroid Build Coastguard Worker %shr1 = lshr i32 %conv, 1 106*9880d681SAndroid Build Coastguard Worker %idxprom = sext i16 %filtMemIndex to i32 107*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i16, i16* %filtMemLR, i32 %idxprom 108*9880d681SAndroid Build Coastguard Worker %0 = bitcast i16* %arrayidx to i8* 109*9880d681SAndroid Build Coastguard Worker %sub = sub nsw i32 16, %shr1 110*9880d681SAndroid Build Coastguard Worker %shl = shl i32 1, %sub 111*9880d681SAndroid Build Coastguard Worker; CHECK: = memub(r{{[0-9]*}} ++ m{{[0-1]}}:brev) 112*9880d681SAndroid Build Coastguard Worker %1 = call i8* @llvm.hexagon.brev.ldub(i8* %0, i8* %inputLR, i32 %shl) 113*9880d681SAndroid Build Coastguard Worker %2 = load i8, i8* %inputLR, align 1, !tbaa !0 114*9880d681SAndroid Build Coastguard Worker ret i8 %2 115*9880d681SAndroid Build Coastguard Worker} 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerdeclare i8* @llvm.hexagon.brev.ldub(i8*, i8*, i32) nounwind 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerdefine signext i8 @foo5(i16 zeroext %filtMemLen, i16* %filtMemLR, i16 signext %filtMemIndex) nounwind { 120*9880d681SAndroid Build Coastguard Workerentry: 121*9880d681SAndroid Build Coastguard Worker %inputLR = alloca i8, align 1 122*9880d681SAndroid Build Coastguard Worker %conv = zext i16 %filtMemLen to i32 123*9880d681SAndroid Build Coastguard Worker %shr1 = lshr i32 %conv, 1 124*9880d681SAndroid Build Coastguard Worker %idxprom = sext i16 %filtMemIndex to i32 125*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i16, i16* %filtMemLR, i32 %idxprom 126*9880d681SAndroid Build Coastguard Worker %0 = bitcast i16* %arrayidx to i8* 127*9880d681SAndroid Build Coastguard Worker %sub = sub nsw i32 16, %shr1 128*9880d681SAndroid Build Coastguard Worker %shl = shl i32 1, %sub 129*9880d681SAndroid Build Coastguard Worker; CHECK: = memb(r{{[0-9]*}} ++ m{{[0-1]}}:brev) 130*9880d681SAndroid Build Coastguard Worker %1 = call i8* @llvm.hexagon.brev.ldb(i8* %0, i8* %inputLR, i32 %shl) 131*9880d681SAndroid Build Coastguard Worker %2 = load i8, i8* %inputLR, align 1, !tbaa !0 132*9880d681SAndroid Build Coastguard Worker ret i8 %2 133*9880d681SAndroid Build Coastguard Worker} 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Workerdeclare i8* @llvm.hexagon.brev.ldb(i8*, i8*, i32) nounwind 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker!0 = !{!"omnipotent char", !1} 138*9880d681SAndroid Build Coastguard Worker!1 = !{!"Simple C/C++ TBAA"} 139*9880d681SAndroid Build Coastguard Worker!2 = !{!"int", !0} 140*9880d681SAndroid Build Coastguard Worker!3 = !{!"short", !0} 141