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