1*9880d681SAndroid Build Coastguard Worker; rdar://7860110 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -asm-verbose=false < %s | FileCheck %s -check-prefix=X64 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=x86 -asm-verbose=false -fixup-byte-word-insts=1 < %s | FileCheck %s -check-prefix=X32 -check-prefix=X32-BWON 4*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=x86 -asm-verbose=false -fixup-byte-word-insts=0 < %s | FileCheck %s -check-prefix=X32 -check-prefix=X32-BWOFF 5*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" 6*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-apple-darwin10.2" 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine void @test1(i32* nocapture %a0, i8 zeroext %a1) nounwind ssp { 9*9880d681SAndroid Build Coastguard Workerentry: 10*9880d681SAndroid Build Coastguard Worker %A = load i32, i32* %a0, align 4 11*9880d681SAndroid Build Coastguard Worker %B = and i32 %A, -256 ; 0xFFFFFF00 12*9880d681SAndroid Build Coastguard Worker %C = zext i8 %a1 to i32 13*9880d681SAndroid Build Coastguard Worker %D = or i32 %C, %B 14*9880d681SAndroid Build Coastguard Worker store i32 %D, i32* %a0, align 4 15*9880d681SAndroid Build Coastguard Worker ret void 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test1: 18*9880d681SAndroid Build Coastguard Worker; X64: movb %sil, (%rdi) 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test1: 21*9880d681SAndroid Build Coastguard Worker; X32: movb 8(%esp), %al 22*9880d681SAndroid Build Coastguard Worker; X32: movb %al, (%{{.*}}) 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerdefine void @test2(i32* nocapture %a0, i8 zeroext %a1) nounwind ssp { 26*9880d681SAndroid Build Coastguard Workerentry: 27*9880d681SAndroid Build Coastguard Worker %A = load i32, i32* %a0, align 4 28*9880d681SAndroid Build Coastguard Worker %B = and i32 %A, -65281 ; 0xFFFF00FF 29*9880d681SAndroid Build Coastguard Worker %C = zext i8 %a1 to i32 30*9880d681SAndroid Build Coastguard Worker %CS = shl i32 %C, 8 31*9880d681SAndroid Build Coastguard Worker %D = or i32 %B, %CS 32*9880d681SAndroid Build Coastguard Worker store i32 %D, i32* %a0, align 4 33*9880d681SAndroid Build Coastguard Worker ret void 34*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test2: 35*9880d681SAndroid Build Coastguard Worker; X64: movb %sil, 1(%rdi) 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test2: 38*9880d681SAndroid Build Coastguard Worker; X32: movb 8(%esp), %[[REG:[abcd]]]l 39*9880d681SAndroid Build Coastguard Worker; X32: movb %[[REG]]l, 1(%{{.*}}) 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerdefine void @test3(i32* nocapture %a0, i16 zeroext %a1) nounwind ssp { 43*9880d681SAndroid Build Coastguard Workerentry: 44*9880d681SAndroid Build Coastguard Worker %A = load i32, i32* %a0, align 4 45*9880d681SAndroid Build Coastguard Worker %B = and i32 %A, -65536 ; 0xFFFF0000 46*9880d681SAndroid Build Coastguard Worker %C = zext i16 %a1 to i32 47*9880d681SAndroid Build Coastguard Worker %D = or i32 %B, %C 48*9880d681SAndroid Build Coastguard Worker store i32 %D, i32* %a0, align 4 49*9880d681SAndroid Build Coastguard Worker ret void 50*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test3: 51*9880d681SAndroid Build Coastguard Worker; X64: movw %si, (%rdi) 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test3: 54*9880d681SAndroid Build Coastguard Worker; X32-BWON: movzwl 8(%esp), %eax 55*9880d681SAndroid Build Coastguard Worker; X32-BWOFF: movw 8(%esp), %ax 56*9880d681SAndroid Build Coastguard Worker; X32: movw %ax, (%{{.*}}) 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerdefine void @test4(i32* nocapture %a0, i16 zeroext %a1) nounwind ssp { 60*9880d681SAndroid Build Coastguard Workerentry: 61*9880d681SAndroid Build Coastguard Worker %A = load i32, i32* %a0, align 4 62*9880d681SAndroid Build Coastguard Worker %B = and i32 %A, 65535 ; 0x0000FFFF 63*9880d681SAndroid Build Coastguard Worker %C = zext i16 %a1 to i32 64*9880d681SAndroid Build Coastguard Worker %CS = shl i32 %C, 16 65*9880d681SAndroid Build Coastguard Worker %D = or i32 %B, %CS 66*9880d681SAndroid Build Coastguard Worker store i32 %D, i32* %a0, align 4 67*9880d681SAndroid Build Coastguard Worker ret void 68*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test4: 69*9880d681SAndroid Build Coastguard Worker; X64: movw %si, 2(%rdi) 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test4: 72*9880d681SAndroid Build Coastguard Worker; X32-BWON: movzwl 8(%esp), %e[[REG:[abcd]]]x 73*9880d681SAndroid Build Coastguard Worker; X32-BWOFF: movw 8(%esp), %[[REG:[abcd]]]x 74*9880d681SAndroid Build Coastguard Worker; X32: movw %[[REG]]x, 2(%{{.*}}) 75*9880d681SAndroid Build Coastguard Worker} 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerdefine void @test5(i64* nocapture %a0, i16 zeroext %a1) nounwind ssp { 78*9880d681SAndroid Build Coastguard Workerentry: 79*9880d681SAndroid Build Coastguard Worker %A = load i64, i64* %a0, align 4 80*9880d681SAndroid Build Coastguard Worker %B = and i64 %A, -4294901761 ; 0xFFFFFFFF0000FFFF 81*9880d681SAndroid Build Coastguard Worker %C = zext i16 %a1 to i64 82*9880d681SAndroid Build Coastguard Worker %CS = shl i64 %C, 16 83*9880d681SAndroid Build Coastguard Worker %D = or i64 %B, %CS 84*9880d681SAndroid Build Coastguard Worker store i64 %D, i64* %a0, align 4 85*9880d681SAndroid Build Coastguard Worker ret void 86*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test5: 87*9880d681SAndroid Build Coastguard Worker; X64: movw %si, 2(%rdi) 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test5: 90*9880d681SAndroid Build Coastguard Worker; X32-BWON: movzwl 8(%esp), %e[[REG:[abcd]]]x 91*9880d681SAndroid Build Coastguard Worker; X32-BWOFF: movw 8(%esp), %[[REG:[abcd]]]x 92*9880d681SAndroid Build Coastguard Worker; X32: movw %[[REG]]x, 2(%{{.*}}) 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerdefine void @test6(i64* nocapture %a0, i8 zeroext %a1) nounwind ssp { 96*9880d681SAndroid Build Coastguard Workerentry: 97*9880d681SAndroid Build Coastguard Worker %A = load i64, i64* %a0, align 4 98*9880d681SAndroid Build Coastguard Worker %B = and i64 %A, -280375465082881 ; 0xFFFF00FFFFFFFFFF 99*9880d681SAndroid Build Coastguard Worker %C = zext i8 %a1 to i64 100*9880d681SAndroid Build Coastguard Worker %CS = shl i64 %C, 40 101*9880d681SAndroid Build Coastguard Worker %D = or i64 %B, %CS 102*9880d681SAndroid Build Coastguard Worker store i64 %D, i64* %a0, align 4 103*9880d681SAndroid Build Coastguard Worker ret void 104*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test6: 105*9880d681SAndroid Build Coastguard Worker; X64: movb %sil, 5(%rdi) 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test6: 109*9880d681SAndroid Build Coastguard Worker; X32: movb 8(%esp), %[[REG:[abcd]l]] 110*9880d681SAndroid Build Coastguard Worker; X32: movb %[[REG]], 5(%{{.*}}) 111*9880d681SAndroid Build Coastguard Worker} 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i64* nocapture %a0, i8 zeroext %a1, i32* %P2) nounwind { 114*9880d681SAndroid Build Coastguard Workerentry: 115*9880d681SAndroid Build Coastguard Worker %OtherLoad = load i32 , i32 *%P2 116*9880d681SAndroid Build Coastguard Worker %A = load i64, i64* %a0, align 4 117*9880d681SAndroid Build Coastguard Worker %B = and i64 %A, -280375465082881 ; 0xFFFF00FFFFFFFFFF 118*9880d681SAndroid Build Coastguard Worker %C = zext i8 %a1 to i64 119*9880d681SAndroid Build Coastguard Worker %CS = shl i64 %C, 40 120*9880d681SAndroid Build Coastguard Worker %D = or i64 %B, %CS 121*9880d681SAndroid Build Coastguard Worker store i64 %D, i64* %a0, align 4 122*9880d681SAndroid Build Coastguard Worker ret i32 %OtherLoad 123*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test7: 124*9880d681SAndroid Build Coastguard Worker; X64: movb %sil, 5(%rdi) 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test7: 128*9880d681SAndroid Build Coastguard Worker; X32: movb 8(%esp), %[[REG:[abcd]l]] 129*9880d681SAndroid Build Coastguard Worker; X32: movb %[[REG]], 5(%{{.*}}) 130*9880d681SAndroid Build Coastguard Worker} 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker; PR7833 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker@g_16 = internal global i32 -1 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test8: 137*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl _g_16(%rip), %eax 138*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl $0, _g_16(%rip) 139*9880d681SAndroid Build Coastguard Worker; X64-NEXT: orl $1, %eax 140*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movl %eax, _g_16(%rip) 141*9880d681SAndroid Build Coastguard Worker; X64-NEXT: ret 142*9880d681SAndroid Build Coastguard Workerdefine void @test8() nounwind { 143*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* @g_16 144*9880d681SAndroid Build Coastguard Worker store i32 0, i32* @g_16 145*9880d681SAndroid Build Coastguard Worker %or = or i32 %tmp, 1 146*9880d681SAndroid Build Coastguard Worker store i32 %or, i32* @g_16 147*9880d681SAndroid Build Coastguard Worker ret void 148*9880d681SAndroid Build Coastguard Worker} 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test9: 151*9880d681SAndroid Build Coastguard Worker; X64-NEXT: orb $1, _g_16(%rip) 152*9880d681SAndroid Build Coastguard Worker; X64-NEXT: ret 153*9880d681SAndroid Build Coastguard Workerdefine void @test9() nounwind { 154*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* @g_16 155*9880d681SAndroid Build Coastguard Worker %or = or i32 %tmp, 1 156*9880d681SAndroid Build Coastguard Worker store i32 %or, i32* @g_16 157*9880d681SAndroid Build Coastguard Worker ret void 158*9880d681SAndroid Build Coastguard Worker} 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Worker; rdar://8494845 + PR8244 161*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test10: 162*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movsbl (%rdi), %eax 163*9880d681SAndroid Build Coastguard Worker; X64-NEXT: shrl $8, %eax 164*9880d681SAndroid Build Coastguard Worker; X64-NEXT: ret 165*9880d681SAndroid Build Coastguard Workerdefine i8 @test10(i8* %P) nounwind ssp { 166*9880d681SAndroid Build Coastguard Workerentry: 167*9880d681SAndroid Build Coastguard Worker %tmp = load i8, i8* %P, align 1 168*9880d681SAndroid Build Coastguard Worker %conv = sext i8 %tmp to i32 169*9880d681SAndroid Build Coastguard Worker %shr3 = lshr i32 %conv, 8 170*9880d681SAndroid Build Coastguard Worker %conv2 = trunc i32 %shr3 to i8 171*9880d681SAndroid Build Coastguard Worker ret i8 %conv2 172*9880d681SAndroid Build Coastguard Worker} 173