1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 -mattr=-bmi | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Use h-register extract and zero-extend. 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine double @foo8(double* nocapture inreg %p, i64 inreg %x) nounwind readonly { 6*9880d681SAndroid Build Coastguard Worker %t0 = lshr i64 %x, 8 7*9880d681SAndroid Build Coastguard Worker %t1 = and i64 %t0, 255 8*9880d681SAndroid Build Coastguard Worker %t2 = getelementptr double, double* %p, i64 %t1 9*9880d681SAndroid Build Coastguard Worker %t3 = load double, double* %t2, align 8 10*9880d681SAndroid Build Coastguard Worker ret double %t3 11*9880d681SAndroid Build Coastguard Worker} 12*9880d681SAndroid Build Coastguard Worker; CHECK: foo8: 13*9880d681SAndroid Build Coastguard Worker; CHECK: movzbl %{{[abcd]}}h, %e 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerdefine float @foo4(float* nocapture inreg %p, i64 inreg %x) nounwind readonly { 16*9880d681SAndroid Build Coastguard Worker %t0 = lshr i64 %x, 8 17*9880d681SAndroid Build Coastguard Worker %t1 = and i64 %t0, 255 18*9880d681SAndroid Build Coastguard Worker %t2 = getelementptr float, float* %p, i64 %t1 19*9880d681SAndroid Build Coastguard Worker %t3 = load float, float* %t2, align 8 20*9880d681SAndroid Build Coastguard Worker ret float %t3 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker; CHECK: foo4: 23*9880d681SAndroid Build Coastguard Worker; CHECK: movzbl %{{[abcd]}}h, %e 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerdefine i16 @foo2(i16* nocapture inreg %p, i64 inreg %x) nounwind readonly { 26*9880d681SAndroid Build Coastguard Worker %t0 = lshr i64 %x, 8 27*9880d681SAndroid Build Coastguard Worker %t1 = and i64 %t0, 255 28*9880d681SAndroid Build Coastguard Worker %t2 = getelementptr i16, i16* %p, i64 %t1 29*9880d681SAndroid Build Coastguard Worker %t3 = load i16, i16* %t2, align 8 30*9880d681SAndroid Build Coastguard Worker ret i16 %t3 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker; CHECK: foo2: 33*9880d681SAndroid Build Coastguard Worker; CHECK: movzbl %{{[abcd]}}h, %e 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerdefine i8 @foo1(i8* nocapture inreg %p, i64 inreg %x) nounwind readonly { 36*9880d681SAndroid Build Coastguard Worker %t0 = lshr i64 %x, 8 37*9880d681SAndroid Build Coastguard Worker %t1 = and i64 %t0, 255 38*9880d681SAndroid Build Coastguard Worker %t2 = getelementptr i8, i8* %p, i64 %t1 39*9880d681SAndroid Build Coastguard Worker %t3 = load i8, i8* %t2, align 8 40*9880d681SAndroid Build Coastguard Worker ret i8 %t3 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker; CHECK: foo1: 43*9880d681SAndroid Build Coastguard Worker; CHECK: movzbl %{{[abcd]}}h, %e 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerdefine i8 @bar8(i8* nocapture inreg %p, i64 inreg %x) nounwind readonly { 46*9880d681SAndroid Build Coastguard Worker %t0 = lshr i64 %x, 5 47*9880d681SAndroid Build Coastguard Worker %t1 = and i64 %t0, 2040 48*9880d681SAndroid Build Coastguard Worker %t2 = getelementptr i8, i8* %p, i64 %t1 49*9880d681SAndroid Build Coastguard Worker %t3 = load i8, i8* %t2, align 8 50*9880d681SAndroid Build Coastguard Worker ret i8 %t3 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker; CHECK: bar8: 53*9880d681SAndroid Build Coastguard Worker; CHECK: movzbl %{{[abcd]}}h, %e 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Workerdefine i8 @bar4(i8* nocapture inreg %p, i64 inreg %x) nounwind readonly { 56*9880d681SAndroid Build Coastguard Worker %t0 = lshr i64 %x, 6 57*9880d681SAndroid Build Coastguard Worker %t1 = and i64 %t0, 1020 58*9880d681SAndroid Build Coastguard Worker %t2 = getelementptr i8, i8* %p, i64 %t1 59*9880d681SAndroid Build Coastguard Worker %t3 = load i8, i8* %t2, align 8 60*9880d681SAndroid Build Coastguard Worker ret i8 %t3 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker; CHECK: bar4: 63*9880d681SAndroid Build Coastguard Worker; CHECK: movzbl %{{[abcd]}}h, %e 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerdefine i8 @bar2(i8* nocapture inreg %p, i64 inreg %x) nounwind readonly { 66*9880d681SAndroid Build Coastguard Worker %t0 = lshr i64 %x, 7 67*9880d681SAndroid Build Coastguard Worker %t1 = and i64 %t0, 510 68*9880d681SAndroid Build Coastguard Worker %t2 = getelementptr i8, i8* %p, i64 %t1 69*9880d681SAndroid Build Coastguard Worker %t3 = load i8, i8* %t2, align 8 70*9880d681SAndroid Build Coastguard Worker ret i8 %t3 71*9880d681SAndroid Build Coastguard Worker} 72*9880d681SAndroid Build Coastguard Worker; CHECK: bar2: 73*9880d681SAndroid Build Coastguard Worker; CHECK: movzbl %{{[abcd]}}h, %e 74*9880d681SAndroid Build Coastguard Worker; CHECK: ret 75