1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=i386-unknown-unknown -mcpu=core-avx2 < %s | FileCheck --check-prefix=BMI2 %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=core-avx2 < %s | FileCheck --check-prefix=BMI264 %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdefine i32 @shl32(i32 %x, i32 %shamt) nounwind uwtable readnone { 5*9880d681SAndroid Build Coastguard Workerentry: 6*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %x, %shamt 7*9880d681SAndroid Build Coastguard Worker; BMI2: shl32 8*9880d681SAndroid Build Coastguard Worker; BMI2: shlxl 9*9880d681SAndroid Build Coastguard Worker; BMI2: ret 10*9880d681SAndroid Build Coastguard Worker; BMI264: shl32 11*9880d681SAndroid Build Coastguard Worker; BMI264: shlxl 12*9880d681SAndroid Build Coastguard Worker; BMI264: ret 13*9880d681SAndroid Build Coastguard Worker ret i32 %shl 14*9880d681SAndroid Build Coastguard Worker} 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerdefine i32 @shl32i(i32 %x) nounwind uwtable readnone { 17*9880d681SAndroid Build Coastguard Workerentry: 18*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %x, 5 19*9880d681SAndroid Build Coastguard Worker; BMI2: shl32i 20*9880d681SAndroid Build Coastguard Worker; BMI2-NOT: shlxl 21*9880d681SAndroid Build Coastguard Worker; BMI2: ret 22*9880d681SAndroid Build Coastguard Worker; BMI264: shl32i 23*9880d681SAndroid Build Coastguard Worker; BMI264-NOT: shlxl 24*9880d681SAndroid Build Coastguard Worker; BMI264: ret 25*9880d681SAndroid Build Coastguard Worker ret i32 %shl 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerdefine i32 @shl32p(i32* %p, i32 %shamt) nounwind uwtable readnone { 29*9880d681SAndroid Build Coastguard Workerentry: 30*9880d681SAndroid Build Coastguard Worker %x = load i32, i32* %p 31*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %x, %shamt 32*9880d681SAndroid Build Coastguard Worker; BMI2: shl32p 33*9880d681SAndroid Build Coastguard Worker; BMI2: shlxl %{{.+}}, ({{.+}}), %{{.+}} 34*9880d681SAndroid Build Coastguard Worker; BMI2: ret 35*9880d681SAndroid Build Coastguard Worker; BMI264: shl32p 36*9880d681SAndroid Build Coastguard Worker; BMI264: shlxl %{{.+}}, ({{.+}}), %{{.+}} 37*9880d681SAndroid Build Coastguard Worker; BMI264: ret 38*9880d681SAndroid Build Coastguard Worker ret i32 %shl 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerdefine i32 @shl32pi(i32* %p) nounwind uwtable readnone { 42*9880d681SAndroid Build Coastguard Workerentry: 43*9880d681SAndroid Build Coastguard Worker %x = load i32, i32* %p 44*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %x, 5 45*9880d681SAndroid Build Coastguard Worker; BMI2: shl32pi 46*9880d681SAndroid Build Coastguard Worker; BMI2-NOT: shlxl 47*9880d681SAndroid Build Coastguard Worker; BMI2: ret 48*9880d681SAndroid Build Coastguard Worker; BMI264: shl32pi 49*9880d681SAndroid Build Coastguard Worker; BMI264-NOT: shlxl 50*9880d681SAndroid Build Coastguard Worker; BMI264: ret 51*9880d681SAndroid Build Coastguard Worker ret i32 %shl 52*9880d681SAndroid Build Coastguard Worker} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerdefine i64 @shl64(i64 %x, i64 %shamt) nounwind uwtable readnone { 55*9880d681SAndroid Build Coastguard Workerentry: 56*9880d681SAndroid Build Coastguard Worker %shl = shl i64 %x, %shamt 57*9880d681SAndroid Build Coastguard Worker; BMI264: shl64 58*9880d681SAndroid Build Coastguard Worker; BMI264: shlxq 59*9880d681SAndroid Build Coastguard Worker; BMI264: ret 60*9880d681SAndroid Build Coastguard Worker ret i64 %shl 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerdefine i64 @shl64i(i64 %x) nounwind uwtable readnone { 64*9880d681SAndroid Build Coastguard Workerentry: 65*9880d681SAndroid Build Coastguard Worker %shl = shl i64 %x, 7 66*9880d681SAndroid Build Coastguard Worker; BMI264: shl64i 67*9880d681SAndroid Build Coastguard Worker; BMI264-NOT: shlxq 68*9880d681SAndroid Build Coastguard Worker; BMI264: ret 69*9880d681SAndroid Build Coastguard Worker ret i64 %shl 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdefine i64 @shl64p(i64* %p, i64 %shamt) nounwind uwtable readnone { 73*9880d681SAndroid Build Coastguard Workerentry: 74*9880d681SAndroid Build Coastguard Worker %x = load i64, i64* %p 75*9880d681SAndroid Build Coastguard Worker %shl = shl i64 %x, %shamt 76*9880d681SAndroid Build Coastguard Worker; BMI264: shl64p 77*9880d681SAndroid Build Coastguard Worker; BMI264: shlxq %{{.+}}, ({{.+}}), %{{.+}} 78*9880d681SAndroid Build Coastguard Worker; BMI264: ret 79*9880d681SAndroid Build Coastguard Worker ret i64 %shl 80*9880d681SAndroid Build Coastguard Worker} 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Workerdefine i64 @shl64pi(i64* %p) nounwind uwtable readnone { 83*9880d681SAndroid Build Coastguard Workerentry: 84*9880d681SAndroid Build Coastguard Worker %x = load i64, i64* %p 85*9880d681SAndroid Build Coastguard Worker %shl = shl i64 %x, 7 86*9880d681SAndroid Build Coastguard Worker; BMI264: shl64pi 87*9880d681SAndroid Build Coastguard Worker; BMI264-NOT: shlxq 88*9880d681SAndroid Build Coastguard Worker; BMI264: ret 89*9880d681SAndroid Build Coastguard Worker ret i64 %shl 90*9880d681SAndroid Build Coastguard Worker} 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workerdefine i32 @lshr32(i32 %x, i32 %shamt) nounwind uwtable readnone { 93*9880d681SAndroid Build Coastguard Workerentry: 94*9880d681SAndroid Build Coastguard Worker %shl = lshr i32 %x, %shamt 95*9880d681SAndroid Build Coastguard Worker; BMI2: lshr32 96*9880d681SAndroid Build Coastguard Worker; BMI2: shrxl 97*9880d681SAndroid Build Coastguard Worker; BMI2: ret 98*9880d681SAndroid Build Coastguard Worker; BMI264: lshr32 99*9880d681SAndroid Build Coastguard Worker; BMI264: shrxl 100*9880d681SAndroid Build Coastguard Worker; BMI264: ret 101*9880d681SAndroid Build Coastguard Worker ret i32 %shl 102*9880d681SAndroid Build Coastguard Worker} 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Workerdefine i32 @lshr32p(i32* %p, i32 %shamt) nounwind uwtable readnone { 105*9880d681SAndroid Build Coastguard Workerentry: 106*9880d681SAndroid Build Coastguard Worker %x = load i32, i32* %p 107*9880d681SAndroid Build Coastguard Worker %shl = lshr i32 %x, %shamt 108*9880d681SAndroid Build Coastguard Worker; BMI2: lshr32p 109*9880d681SAndroid Build Coastguard Worker; BMI2: shrxl %{{.+}}, ({{.+}}), %{{.+}} 110*9880d681SAndroid Build Coastguard Worker; BMI2: ret 111*9880d681SAndroid Build Coastguard Worker; BMI264: lshr32p 112*9880d681SAndroid Build Coastguard Worker; BMI264: shrxl %{{.+}}, ({{.+}}), %{{.+}} 113*9880d681SAndroid Build Coastguard Worker; BMI264: ret 114*9880d681SAndroid Build Coastguard Worker ret i32 %shl 115*9880d681SAndroid Build Coastguard Worker} 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerdefine i64 @lshr64(i64 %x, i64 %shamt) nounwind uwtable readnone { 118*9880d681SAndroid Build Coastguard Workerentry: 119*9880d681SAndroid Build Coastguard Worker %shl = lshr i64 %x, %shamt 120*9880d681SAndroid Build Coastguard Worker; BMI264: lshr64 121*9880d681SAndroid Build Coastguard Worker; BMI264: shrxq 122*9880d681SAndroid Build Coastguard Worker; BMI264: ret 123*9880d681SAndroid Build Coastguard Worker ret i64 %shl 124*9880d681SAndroid Build Coastguard Worker} 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Workerdefine i64 @lshr64p(i64* %p, i64 %shamt) nounwind uwtable readnone { 127*9880d681SAndroid Build Coastguard Workerentry: 128*9880d681SAndroid Build Coastguard Worker %x = load i64, i64* %p 129*9880d681SAndroid Build Coastguard Worker %shl = lshr i64 %x, %shamt 130*9880d681SAndroid Build Coastguard Worker; BMI264: lshr64p 131*9880d681SAndroid Build Coastguard Worker; BMI264: shrxq %{{.+}}, ({{.+}}), %{{.+}} 132*9880d681SAndroid Build Coastguard Worker; BMI264: ret 133*9880d681SAndroid Build Coastguard Worker ret i64 %shl 134*9880d681SAndroid Build Coastguard Worker} 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Workerdefine i32 @ashr32(i32 %x, i32 %shamt) nounwind uwtable readnone { 137*9880d681SAndroid Build Coastguard Workerentry: 138*9880d681SAndroid Build Coastguard Worker %shl = ashr i32 %x, %shamt 139*9880d681SAndroid Build Coastguard Worker; BMI2: ashr32 140*9880d681SAndroid Build Coastguard Worker; BMI2: sarxl 141*9880d681SAndroid Build Coastguard Worker; BMI2: ret 142*9880d681SAndroid Build Coastguard Worker; BMI264: ashr32 143*9880d681SAndroid Build Coastguard Worker; BMI264: sarxl 144*9880d681SAndroid Build Coastguard Worker; BMI264: ret 145*9880d681SAndroid Build Coastguard Worker ret i32 %shl 146*9880d681SAndroid Build Coastguard Worker} 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Workerdefine i32 @ashr32p(i32* %p, i32 %shamt) nounwind uwtable readnone { 149*9880d681SAndroid Build Coastguard Workerentry: 150*9880d681SAndroid Build Coastguard Worker %x = load i32, i32* %p 151*9880d681SAndroid Build Coastguard Worker %shl = ashr i32 %x, %shamt 152*9880d681SAndroid Build Coastguard Worker; BMI2: ashr32p 153*9880d681SAndroid Build Coastguard Worker; Source order scheduling prevents folding, rdar:14208996. 154*9880d681SAndroid Build Coastguard Worker; BMI2: sarxl %{{.+}}, ({{.+}}), %{{.+}} 155*9880d681SAndroid Build Coastguard Worker; BMI2: ret 156*9880d681SAndroid Build Coastguard Worker; BMI264: ashr32p 157*9880d681SAndroid Build Coastguard Worker; BMI264: sarxl %{{.+}}, ({{.+}}), %{{.+}} 158*9880d681SAndroid Build Coastguard Worker; BMI264: ret 159*9880d681SAndroid Build Coastguard Worker ret i32 %shl 160*9880d681SAndroid Build Coastguard Worker} 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Workerdefine i64 @ashr64(i64 %x, i64 %shamt) nounwind uwtable readnone { 163*9880d681SAndroid Build Coastguard Workerentry: 164*9880d681SAndroid Build Coastguard Worker %shl = ashr i64 %x, %shamt 165*9880d681SAndroid Build Coastguard Worker; BMI264: ashr64 166*9880d681SAndroid Build Coastguard Worker; BMI264: sarxq 167*9880d681SAndroid Build Coastguard Worker; BMI264: ret 168*9880d681SAndroid Build Coastguard Worker ret i64 %shl 169*9880d681SAndroid Build Coastguard Worker} 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Workerdefine i64 @ashr64p(i64* %p, i64 %shamt) nounwind uwtable readnone { 172*9880d681SAndroid Build Coastguard Workerentry: 173*9880d681SAndroid Build Coastguard Worker %x = load i64, i64* %p 174*9880d681SAndroid Build Coastguard Worker %shl = ashr i64 %x, %shamt 175*9880d681SAndroid Build Coastguard Worker; BMI264: ashr64p 176*9880d681SAndroid Build Coastguard Worker; BMI264: sarxq %{{.+}}, ({{.+}}), %{{.+}} 177*9880d681SAndroid Build Coastguard Worker; BMI264: ret 178*9880d681SAndroid Build Coastguard Worker ret i64 %shl 179*9880d681SAndroid Build Coastguard Worker} 180