1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86 -mcpu=corei7 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86 -mcpu=core-avx2 | FileCheck %s --check-prefix=BMI2 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdefine i32 @foo(i32 %x, i32 %y, i32 %z) nounwind readnone { 5*9880d681SAndroid Build Coastguard Workerentry: 6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo: 7*9880d681SAndroid Build Coastguard Worker; CHECK: roll %cl 8*9880d681SAndroid Build Coastguard Worker %0 = shl i32 %x, %z 9*9880d681SAndroid Build Coastguard Worker %1 = sub i32 32, %z 10*9880d681SAndroid Build Coastguard Worker %2 = lshr i32 %x, %1 11*9880d681SAndroid Build Coastguard Worker %3 = or i32 %2, %0 12*9880d681SAndroid Build Coastguard Worker ret i32 %3 13*9880d681SAndroid Build Coastguard Worker} 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerdefine i32 @bar(i32 %x, i32 %y, i32 %z) nounwind readnone { 16*9880d681SAndroid Build Coastguard Workerentry: 17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bar: 18*9880d681SAndroid Build Coastguard Worker; CHECK: shldl %cl 19*9880d681SAndroid Build Coastguard Worker %0 = shl i32 %y, %z 20*9880d681SAndroid Build Coastguard Worker %1 = sub i32 32, %z 21*9880d681SAndroid Build Coastguard Worker %2 = lshr i32 %x, %1 22*9880d681SAndroid Build Coastguard Worker %3 = or i32 %2, %0 23*9880d681SAndroid Build Coastguard Worker ret i32 %3 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Workerdefine i32 @un(i32 %x, i32 %y, i32 %z) nounwind readnone { 27*9880d681SAndroid Build Coastguard Workerentry: 28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: un: 29*9880d681SAndroid Build Coastguard Worker; CHECK: rorl %cl 30*9880d681SAndroid Build Coastguard Worker %0 = lshr i32 %x, %z 31*9880d681SAndroid Build Coastguard Worker %1 = sub i32 32, %z 32*9880d681SAndroid Build Coastguard Worker %2 = shl i32 %x, %1 33*9880d681SAndroid Build Coastguard Worker %3 = or i32 %2, %0 34*9880d681SAndroid Build Coastguard Worker ret i32 %3 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerdefine i32 @bu(i32 %x, i32 %y, i32 %z) nounwind readnone { 38*9880d681SAndroid Build Coastguard Workerentry: 39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bu: 40*9880d681SAndroid Build Coastguard Worker; CHECK: shrdl %cl 41*9880d681SAndroid Build Coastguard Worker %0 = lshr i32 %y, %z 42*9880d681SAndroid Build Coastguard Worker %1 = sub i32 32, %z 43*9880d681SAndroid Build Coastguard Worker %2 = shl i32 %x, %1 44*9880d681SAndroid Build Coastguard Worker %3 = or i32 %2, %0 45*9880d681SAndroid Build Coastguard Worker ret i32 %3 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdefine i32 @xfoo(i32 %x, i32 %y, i32 %z) nounwind readnone { 49*9880d681SAndroid Build Coastguard Workerentry: 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xfoo: 51*9880d681SAndroid Build Coastguard Worker; CHECK: roll $7 52*9880d681SAndroid Build Coastguard Worker; BMI2-LABEL: xfoo: 53*9880d681SAndroid Build Coastguard Worker; BMI2: rorxl $25 54*9880d681SAndroid Build Coastguard Worker %0 = lshr i32 %x, 25 55*9880d681SAndroid Build Coastguard Worker %1 = shl i32 %x, 7 56*9880d681SAndroid Build Coastguard Worker %2 = or i32 %0, %1 57*9880d681SAndroid Build Coastguard Worker ret i32 %2 58*9880d681SAndroid Build Coastguard Worker} 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Workerdefine i32 @xfoop(i32* %p) nounwind readnone { 61*9880d681SAndroid Build Coastguard Workerentry: 62*9880d681SAndroid Build Coastguard Worker; BMI2-LABEL: xfoop: 63*9880d681SAndroid Build Coastguard Worker; BMI2: rorxl $25, ({{.+}}), %{{.+}} 64*9880d681SAndroid Build Coastguard Worker %x = load i32, i32* %p 65*9880d681SAndroid Build Coastguard Worker %a = lshr i32 %x, 25 66*9880d681SAndroid Build Coastguard Worker %b = shl i32 %x, 7 67*9880d681SAndroid Build Coastguard Worker %c = or i32 %a, %b 68*9880d681SAndroid Build Coastguard Worker ret i32 %c 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerdefine i32 @xbar(i32 %x, i32 %y, i32 %z) nounwind readnone { 72*9880d681SAndroid Build Coastguard Workerentry: 73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xbar: 74*9880d681SAndroid Build Coastguard Worker; CHECK: shldl $7 75*9880d681SAndroid Build Coastguard Worker %0 = shl i32 %y, 7 76*9880d681SAndroid Build Coastguard Worker %1 = lshr i32 %x, 25 77*9880d681SAndroid Build Coastguard Worker %2 = or i32 %0, %1 78*9880d681SAndroid Build Coastguard Worker ret i32 %2 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workerdefine i32 @xun(i32 %x, i32 %y, i32 %z) nounwind readnone { 82*9880d681SAndroid Build Coastguard Workerentry: 83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xun: 84*9880d681SAndroid Build Coastguard Worker; CHECK: roll $25 85*9880d681SAndroid Build Coastguard Worker; BMI2-LABEL: xun: 86*9880d681SAndroid Build Coastguard Worker; BMI2: rorxl $7 87*9880d681SAndroid Build Coastguard Worker %0 = lshr i32 %x, 7 88*9880d681SAndroid Build Coastguard Worker %1 = shl i32 %x, 25 89*9880d681SAndroid Build Coastguard Worker %2 = or i32 %0, %1 90*9880d681SAndroid Build Coastguard Worker ret i32 %2 91*9880d681SAndroid Build Coastguard Worker} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdefine i32 @xunp(i32* %p) nounwind readnone { 94*9880d681SAndroid Build Coastguard Workerentry: 95*9880d681SAndroid Build Coastguard Worker; BMI2-LABEL: xunp: 96*9880d681SAndroid Build Coastguard Worker; BMI2: rorxl $7, ({{.+}}), %{{.+}} 97*9880d681SAndroid Build Coastguard Worker %x = load i32, i32* %p 98*9880d681SAndroid Build Coastguard Worker %a = lshr i32 %x, 7 99*9880d681SAndroid Build Coastguard Worker %b = shl i32 %x, 25 100*9880d681SAndroid Build Coastguard Worker %c = or i32 %a, %b 101*9880d681SAndroid Build Coastguard Worker ret i32 %c 102*9880d681SAndroid Build Coastguard Worker} 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Workerdefine i32 @xbu(i32 %x, i32 %y, i32 %z) nounwind readnone { 105*9880d681SAndroid Build Coastguard Workerentry: 106*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: xbu: 107*9880d681SAndroid Build Coastguard Worker; CHECK: shldl 108*9880d681SAndroid Build Coastguard Worker %0 = lshr i32 %y, 7 109*9880d681SAndroid Build Coastguard Worker %1 = shl i32 %x, 25 110*9880d681SAndroid Build Coastguard Worker %2 = or i32 %0, %1 111*9880d681SAndroid Build Coastguard Worker ret i32 %2 112*9880d681SAndroid Build Coastguard Worker} 113