1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mattr=-bmi -mtriple=x86_64-linux | FileCheck %s -check-prefix=X86-64 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mattr=-bmi -mtriple=x86_64-linux-gnux32 | FileCheck %s -check-prefix=X86-64 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mattr=-bmi -mtriple=x86_64-win32 | FileCheck %s -check-prefix=WIN64 4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mattr=-bmi -march=x86 | FileCheck %s -check-prefix=X86-32 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; Use h registers. On x86-64, codegen doesn't support general allocation 7*9880d681SAndroid Build Coastguard Worker; of h registers yet, due to x86 encoding complications. 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerdefine void @bar64(i64 inreg %x, i8* inreg %p) nounwind { 10*9880d681SAndroid Build Coastguard Worker; X86-64-LABEL: bar64: 11*9880d681SAndroid Build Coastguard Worker; X86-64: shrq $8, %rdi 12*9880d681SAndroid Build Coastguard Worker; X86-64: incb %dil 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker; See FIXME: on regclass GR8. 15*9880d681SAndroid Build Coastguard Worker; It could be optimally transformed like; incb %ch; movb %ch, (%rdx) 16*9880d681SAndroid Build Coastguard Worker; WIN64-LABEL: bar64: 17*9880d681SAndroid Build Coastguard Worker; WIN64: shrq $8, %rcx 18*9880d681SAndroid Build Coastguard Worker; WIN64: incb %cl 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker; X86-32-LABEL: bar64: 21*9880d681SAndroid Build Coastguard Worker; X86-32: incb %ah 22*9880d681SAndroid Build Coastguard Worker %t0 = lshr i64 %x, 8 23*9880d681SAndroid Build Coastguard Worker %t1 = trunc i64 %t0 to i8 24*9880d681SAndroid Build Coastguard Worker %t2 = add i8 %t1, 1 25*9880d681SAndroid Build Coastguard Worker store i8 %t2, i8* %p 26*9880d681SAndroid Build Coastguard Worker ret void 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine void @bar32(i32 inreg %x, i8* inreg %p) nounwind { 30*9880d681SAndroid Build Coastguard Worker; X86-64-LABEL: bar32: 31*9880d681SAndroid Build Coastguard Worker; X86-64: shrl $8, %edi 32*9880d681SAndroid Build Coastguard Worker; X86-64: incb %dil 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker; WIN64-LABEL: bar32: 35*9880d681SAndroid Build Coastguard Worker; WIN64: shrl $8, %ecx 36*9880d681SAndroid Build Coastguard Worker; WIN64: incb %cl 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker; X86-32-LABEL: bar32: 39*9880d681SAndroid Build Coastguard Worker; X86-32: incb %ah 40*9880d681SAndroid Build Coastguard Worker %t0 = lshr i32 %x, 8 41*9880d681SAndroid Build Coastguard Worker %t1 = trunc i32 %t0 to i8 42*9880d681SAndroid Build Coastguard Worker %t2 = add i8 %t1, 1 43*9880d681SAndroid Build Coastguard Worker store i8 %t2, i8* %p 44*9880d681SAndroid Build Coastguard Worker ret void 45*9880d681SAndroid Build Coastguard Worker} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerdefine void @bar16(i16 inreg %x, i8* inreg %p) nounwind { 48*9880d681SAndroid Build Coastguard Worker; X86-64-LABEL: bar16: 49*9880d681SAndroid Build Coastguard Worker; X86-64: shrl $8, %edi 50*9880d681SAndroid Build Coastguard Worker; X86-64: incb %dil 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; WIN64-LABEL: bar16: 53*9880d681SAndroid Build Coastguard Worker; WIN64: shrl $8, %ecx 54*9880d681SAndroid Build Coastguard Worker; WIN64: incb %cl 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker; X86-32-LABEL: bar16: 57*9880d681SAndroid Build Coastguard Worker; X86-32: incb %ah 58*9880d681SAndroid Build Coastguard Worker %t0 = lshr i16 %x, 8 59*9880d681SAndroid Build Coastguard Worker %t1 = trunc i16 %t0 to i8 60*9880d681SAndroid Build Coastguard Worker %t2 = add i8 %t1, 1 61*9880d681SAndroid Build Coastguard Worker store i8 %t2, i8* %p 62*9880d681SAndroid Build Coastguard Worker ret void 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerdefine i64 @qux64(i64 inreg %x) nounwind { 66*9880d681SAndroid Build Coastguard Worker; X86-64-LABEL: qux64: 67*9880d681SAndroid Build Coastguard Worker; X86-64: movq %rdi, %rax 68*9880d681SAndroid Build Coastguard Worker; X86-64: movzbl %ah, %eax 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker; WIN64-LABEL: qux64: 71*9880d681SAndroid Build Coastguard Worker; WIN64: movzbl %ch, %eax 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker; X86-32-LABEL: qux64: 74*9880d681SAndroid Build Coastguard Worker; X86-32: movzbl %ah, %eax 75*9880d681SAndroid Build Coastguard Worker %t0 = lshr i64 %x, 8 76*9880d681SAndroid Build Coastguard Worker %t1 = and i64 %t0, 255 77*9880d681SAndroid Build Coastguard Worker ret i64 %t1 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerdefine i32 @qux32(i32 inreg %x) nounwind { 81*9880d681SAndroid Build Coastguard Worker; X86-64-LABEL: qux32: 82*9880d681SAndroid Build Coastguard Worker; X86-64: movl %edi, %eax 83*9880d681SAndroid Build Coastguard Worker; X86-64: movzbl %ah, %eax 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker; WIN64-LABEL: qux32: 86*9880d681SAndroid Build Coastguard Worker; WIN64: movzbl %ch, %eax 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker; X86-32-LABEL: qux32: 89*9880d681SAndroid Build Coastguard Worker; X86-32: movzbl %ah, %eax 90*9880d681SAndroid Build Coastguard Worker %t0 = lshr i32 %x, 8 91*9880d681SAndroid Build Coastguard Worker %t1 = and i32 %t0, 255 92*9880d681SAndroid Build Coastguard Worker ret i32 %t1 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerdefine i16 @qux16(i16 inreg %x) nounwind { 96*9880d681SAndroid Build Coastguard Worker; X86-64-LABEL: qux16: 97*9880d681SAndroid Build Coastguard Worker; X86-64: movl %edi, %eax 98*9880d681SAndroid Build Coastguard Worker; X86-64: movzbl %ah, %eax 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker; WIN64-LABEL: qux16: 101*9880d681SAndroid Build Coastguard Worker; WIN64: movzbl %ch, %eax 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker; X86-32-LABEL: qux16: 104*9880d681SAndroid Build Coastguard Worker; X86-32: movzbl %ah, %eax 105*9880d681SAndroid Build Coastguard Worker %t0 = lshr i16 %x, 8 106*9880d681SAndroid Build Coastguard Worker ret i16 %t0 107*9880d681SAndroid Build Coastguard Worker} 108