1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86 -x86-asm-syntax=intel | \ 2*9880d681SAndroid Build Coastguard Worker; RUN: grep "ro[rl]" | count 12 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdefine i32 @rotl32(i32 %A, i8 %Amt) { 5*9880d681SAndroid Build Coastguard Worker %shift.upgrd.1 = zext i8 %Amt to i32 ; <i32> [#uses=1] 6*9880d681SAndroid Build Coastguard Worker %B = shl i32 %A, %shift.upgrd.1 ; <i32> [#uses=1] 7*9880d681SAndroid Build Coastguard Worker %Amt2 = sub i8 32, %Amt ; <i8> [#uses=1] 8*9880d681SAndroid Build Coastguard Worker %shift.upgrd.2 = zext i8 %Amt2 to i32 ; <i32> [#uses=1] 9*9880d681SAndroid Build Coastguard Worker %C = lshr i32 %A, %shift.upgrd.2 ; <i32> [#uses=1] 10*9880d681SAndroid Build Coastguard Worker %D = or i32 %B, %C ; <i32> [#uses=1] 11*9880d681SAndroid Build Coastguard Worker ret i32 %D 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdefine i32 @rotr32(i32 %A, i8 %Amt) { 15*9880d681SAndroid Build Coastguard Worker %shift.upgrd.3 = zext i8 %Amt to i32 ; <i32> [#uses=1] 16*9880d681SAndroid Build Coastguard Worker %B = lshr i32 %A, %shift.upgrd.3 ; <i32> [#uses=1] 17*9880d681SAndroid Build Coastguard Worker %Amt2 = sub i8 32, %Amt ; <i8> [#uses=1] 18*9880d681SAndroid Build Coastguard Worker %shift.upgrd.4 = zext i8 %Amt2 to i32 ; <i32> [#uses=1] 19*9880d681SAndroid Build Coastguard Worker %C = shl i32 %A, %shift.upgrd.4 ; <i32> [#uses=1] 20*9880d681SAndroid Build Coastguard Worker %D = or i32 %B, %C ; <i32> [#uses=1] 21*9880d681SAndroid Build Coastguard Worker ret i32 %D 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerdefine i32 @rotli32(i32 %A) { 25*9880d681SAndroid Build Coastguard Worker %B = shl i32 %A, 5 ; <i32> [#uses=1] 26*9880d681SAndroid Build Coastguard Worker %C = lshr i32 %A, 27 ; <i32> [#uses=1] 27*9880d681SAndroid Build Coastguard Worker %D = or i32 %B, %C ; <i32> [#uses=1] 28*9880d681SAndroid Build Coastguard Worker ret i32 %D 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerdefine i32 @rotri32(i32 %A) { 32*9880d681SAndroid Build Coastguard Worker %B = lshr i32 %A, 5 ; <i32> [#uses=1] 33*9880d681SAndroid Build Coastguard Worker %C = shl i32 %A, 27 ; <i32> [#uses=1] 34*9880d681SAndroid Build Coastguard Worker %D = or i32 %B, %C ; <i32> [#uses=1] 35*9880d681SAndroid Build Coastguard Worker ret i32 %D 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerdefine i16 @rotl16(i16 %A, i8 %Amt) { 39*9880d681SAndroid Build Coastguard Worker %shift.upgrd.5 = zext i8 %Amt to i16 ; <i16> [#uses=1] 40*9880d681SAndroid Build Coastguard Worker %B = shl i16 %A, %shift.upgrd.5 ; <i16> [#uses=1] 41*9880d681SAndroid Build Coastguard Worker %Amt2 = sub i8 16, %Amt ; <i8> [#uses=1] 42*9880d681SAndroid Build Coastguard Worker %shift.upgrd.6 = zext i8 %Amt2 to i16 ; <i16> [#uses=1] 43*9880d681SAndroid Build Coastguard Worker %C = lshr i16 %A, %shift.upgrd.6 ; <i16> [#uses=1] 44*9880d681SAndroid Build Coastguard Worker %D = or i16 %B, %C ; <i16> [#uses=1] 45*9880d681SAndroid Build Coastguard Worker ret i16 %D 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdefine i16 @rotr16(i16 %A, i8 %Amt) { 49*9880d681SAndroid Build Coastguard Worker %shift.upgrd.7 = zext i8 %Amt to i16 ; <i16> [#uses=1] 50*9880d681SAndroid Build Coastguard Worker %B = lshr i16 %A, %shift.upgrd.7 ; <i16> [#uses=1] 51*9880d681SAndroid Build Coastguard Worker %Amt2 = sub i8 16, %Amt ; <i8> [#uses=1] 52*9880d681SAndroid Build Coastguard Worker %shift.upgrd.8 = zext i8 %Amt2 to i16 ; <i16> [#uses=1] 53*9880d681SAndroid Build Coastguard Worker %C = shl i16 %A, %shift.upgrd.8 ; <i16> [#uses=1] 54*9880d681SAndroid Build Coastguard Worker %D = or i16 %B, %C ; <i16> [#uses=1] 55*9880d681SAndroid Build Coastguard Worker ret i16 %D 56*9880d681SAndroid Build Coastguard Worker} 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Workerdefine i16 @rotli16(i16 %A) { 59*9880d681SAndroid Build Coastguard Worker %B = shl i16 %A, 5 ; <i16> [#uses=1] 60*9880d681SAndroid Build Coastguard Worker %C = lshr i16 %A, 11 ; <i16> [#uses=1] 61*9880d681SAndroid Build Coastguard Worker %D = or i16 %B, %C ; <i16> [#uses=1] 62*9880d681SAndroid Build Coastguard Worker ret i16 %D 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerdefine i16 @rotri16(i16 %A) { 66*9880d681SAndroid Build Coastguard Worker %B = lshr i16 %A, 5 ; <i16> [#uses=1] 67*9880d681SAndroid Build Coastguard Worker %C = shl i16 %A, 11 ; <i16> [#uses=1] 68*9880d681SAndroid Build Coastguard Worker %D = or i16 %B, %C ; <i16> [#uses=1] 69*9880d681SAndroid Build Coastguard Worker ret i16 %D 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdefine i8 @rotl8(i8 %A, i8 %Amt) { 73*9880d681SAndroid Build Coastguard Worker %B = shl i8 %A, %Amt ; <i8> [#uses=1] 74*9880d681SAndroid Build Coastguard Worker %Amt2 = sub i8 8, %Amt ; <i8> [#uses=1] 75*9880d681SAndroid Build Coastguard Worker %C = lshr i8 %A, %Amt2 ; <i8> [#uses=1] 76*9880d681SAndroid Build Coastguard Worker %D = or i8 %B, %C ; <i8> [#uses=1] 77*9880d681SAndroid Build Coastguard Worker ret i8 %D 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerdefine i8 @rotr8(i8 %A, i8 %Amt) { 81*9880d681SAndroid Build Coastguard Worker %B = lshr i8 %A, %Amt ; <i8> [#uses=1] 82*9880d681SAndroid Build Coastguard Worker %Amt2 = sub i8 8, %Amt ; <i8> [#uses=1] 83*9880d681SAndroid Build Coastguard Worker %C = shl i8 %A, %Amt2 ; <i8> [#uses=1] 84*9880d681SAndroid Build Coastguard Worker %D = or i8 %B, %C ; <i8> [#uses=1] 85*9880d681SAndroid Build Coastguard Worker ret i8 %D 86*9880d681SAndroid Build Coastguard Worker} 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Workerdefine i8 @rotli8(i8 %A) { 89*9880d681SAndroid Build Coastguard Worker %B = shl i8 %A, 5 ; <i8> [#uses=1] 90*9880d681SAndroid Build Coastguard Worker %C = lshr i8 %A, 3 ; <i8> [#uses=1] 91*9880d681SAndroid Build Coastguard Worker %D = or i8 %B, %C ; <i8> [#uses=1] 92*9880d681SAndroid Build Coastguard Worker ret i8 %D 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerdefine i8 @rotri8(i8 %A) { 96*9880d681SAndroid Build Coastguard Worker %B = lshr i8 %A, 5 ; <i8> [#uses=1] 97*9880d681SAndroid Build Coastguard Worker %C = shl i8 %A, 3 ; <i8> [#uses=1] 98*9880d681SAndroid Build Coastguard Worker %D = or i8 %B, %C ; <i8> [#uses=1] 99*9880d681SAndroid Build Coastguard Worker ret i8 %D 100*9880d681SAndroid Build Coastguard Worker} 101