xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/store-narrow.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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