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