xref: /llvm-project/llvm/test/CodeGen/X86/3addr-16bit.ll (revision 7030c01c925dbd725cb4441d0a9a138a5dc65ed3)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-apple-darwin | FileCheck %s -check-prefix=X64
3; RUN: llc < %s -mtriple=i686-apple-darwin   | FileCheck %s -check-prefix=X86
4
5; rdar://7329206
6
7; In 32-bit the partial register stall would degrade performance.
8
9define zeroext i16 @test1(i16 zeroext %c, i16 zeroext %k) nounwind ssp {
10; X64-LABEL: test1:
11; X64:       ## %bb.0: ## %entry
12; X64-NEXT:    movl %esi, %eax
13; X64-NEXT:    incl %eax
14; X64-NEXT:    cmpw %di, %si
15; X64-NEXT:    jne LBB0_2
16; X64-NEXT:  ## %bb.1: ## %bb
17; X64-NEXT:    pushq %rbx
18; X64-NEXT:    movzwl %ax, %ebx
19; X64-NEXT:    movl %ebx, %edi
20; X64-NEXT:    callq _foo
21; X64-NEXT:    movl %ebx, %eax
22; X64-NEXT:    popq %rbx
23; X64-NEXT:    retq
24; X64-NEXT:  LBB0_2: ## %bb1
25; X64-NEXT:    movzwl %ax, %eax
26; X64-NEXT:    retq
27;
28; X86-LABEL: test1:
29; X86:       ## %bb.0: ## %entry
30; X86-NEXT:    pushl %esi
31; X86-NEXT:    subl $8, %esp
32; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
33; X86-NEXT:    movl %ecx, %eax
34; X86-NEXT:    incl %eax
35; X86-NEXT:    cmpw {{[0-9]+}}(%esp), %cx
36; X86-NEXT:    jne LBB0_2
37; X86-NEXT:  ## %bb.1: ## %bb
38; X86-NEXT:    movzwl %ax, %esi
39; X86-NEXT:    movl %esi, (%esp)
40; X86-NEXT:    calll _foo
41; X86-NEXT:    movl %esi, %eax
42; X86-NEXT:    jmp LBB0_3
43; X86-NEXT:  LBB0_2: ## %bb1
44; X86-NEXT:    movzwl %ax, %eax
45; X86-NEXT:  LBB0_3: ## %bb1
46; X86-NEXT:    addl $8, %esp
47; X86-NEXT:    popl %esi
48; X86-NEXT:    retl
49entry:
50  %0 = icmp eq i16 %k, %c
51  %1 = add i16 %k, 1
52  br i1 %0, label %bb, label %bb1
53
54bb:
55  tail call void @foo(i16 zeroext %1) nounwind
56  ret i16 %1
57
58bb1:
59  ret i16 %1
60}
61
62define zeroext i16 @test2(i16 zeroext %c, i16 zeroext %k) nounwind ssp {
63; X64-LABEL: test2:
64; X64:       ## %bb.0: ## %entry
65; X64-NEXT:    movl %esi, %eax
66; X64-NEXT:    decl %eax
67; X64-NEXT:    cmpw %di, %si
68; X64-NEXT:    jne LBB1_2
69; X64-NEXT:  ## %bb.1: ## %bb
70; X64-NEXT:    pushq %rbx
71; X64-NEXT:    movzwl %ax, %ebx
72; X64-NEXT:    movl %ebx, %edi
73; X64-NEXT:    callq _foo
74; X64-NEXT:    movl %ebx, %eax
75; X64-NEXT:    popq %rbx
76; X64-NEXT:    retq
77; X64-NEXT:  LBB1_2: ## %bb1
78; X64-NEXT:    movzwl %ax, %eax
79; X64-NEXT:    retq
80;
81; X86-LABEL: test2:
82; X86:       ## %bb.0: ## %entry
83; X86-NEXT:    pushl %esi
84; X86-NEXT:    subl $8, %esp
85; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
86; X86-NEXT:    movl %ecx, %eax
87; X86-NEXT:    decl %eax
88; X86-NEXT:    cmpw {{[0-9]+}}(%esp), %cx
89; X86-NEXT:    jne LBB1_2
90; X86-NEXT:  ## %bb.1: ## %bb
91; X86-NEXT:    movzwl %ax, %esi
92; X86-NEXT:    movl %esi, (%esp)
93; X86-NEXT:    calll _foo
94; X86-NEXT:    movl %esi, %eax
95; X86-NEXT:    jmp LBB1_3
96; X86-NEXT:  LBB1_2: ## %bb1
97; X86-NEXT:    movzwl %ax, %eax
98; X86-NEXT:  LBB1_3: ## %bb1
99; X86-NEXT:    addl $8, %esp
100; X86-NEXT:    popl %esi
101; X86-NEXT:    retl
102entry:
103  %0 = icmp eq i16 %k, %c
104  %1 = add i16 %k, -1
105  br i1 %0, label %bb, label %bb1
106
107bb:
108  tail call void @foo(i16 zeroext %1) nounwind
109  ret i16 %1
110
111bb1:
112  ret i16 %1
113}
114
115declare void @foo(i16 zeroext)
116
117define zeroext i16 @test3(i16 zeroext %c, i16 zeroext %k) nounwind ssp {
118; X64-LABEL: test3:
119; X64:       ## %bb.0: ## %entry
120; X64-NEXT:    movl %esi, %eax
121; X64-NEXT:    addl $2, %eax
122; X64-NEXT:    cmpw %di, %si
123; X64-NEXT:    jne LBB2_2
124; X64-NEXT:  ## %bb.1: ## %bb
125; X64-NEXT:    pushq %rbx
126; X64-NEXT:    movzwl %ax, %ebx
127; X64-NEXT:    movl %ebx, %edi
128; X64-NEXT:    callq _foo
129; X64-NEXT:    movl %ebx, %eax
130; X64-NEXT:    popq %rbx
131; X64-NEXT:    retq
132; X64-NEXT:  LBB2_2: ## %bb1
133; X64-NEXT:    movzwl %ax, %eax
134; X64-NEXT:    retq
135;
136; X86-LABEL: test3:
137; X86:       ## %bb.0: ## %entry
138; X86-NEXT:    pushl %esi
139; X86-NEXT:    subl $8, %esp
140; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
141; X86-NEXT:    movl %ecx, %eax
142; X86-NEXT:    addl $2, %eax
143; X86-NEXT:    cmpw {{[0-9]+}}(%esp), %cx
144; X86-NEXT:    jne LBB2_2
145; X86-NEXT:  ## %bb.1: ## %bb
146; X86-NEXT:    movzwl %ax, %esi
147; X86-NEXT:    movl %esi, (%esp)
148; X86-NEXT:    calll _foo
149; X86-NEXT:    movl %esi, %eax
150; X86-NEXT:    jmp LBB2_3
151; X86-NEXT:  LBB2_2: ## %bb1
152; X86-NEXT:    movzwl %ax, %eax
153; X86-NEXT:  LBB2_3: ## %bb1
154; X86-NEXT:    addl $8, %esp
155; X86-NEXT:    popl %esi
156; X86-NEXT:    retl
157entry:
158  %0 = add i16 %k, 2
159  %1 = icmp eq i16 %k, %c
160  br i1 %1, label %bb, label %bb1
161
162bb:
163  tail call void @foo(i16 zeroext %0) nounwind
164  ret i16 %0
165
166bb1:
167  ret i16 %0
168}
169
170define zeroext i16 @test4(i16 zeroext %c, i16 zeroext %k) nounwind ssp {
171; X64-LABEL: test4:
172; X64:       ## %bb.0: ## %entry
173; X64-NEXT:    movl %esi, %eax
174; X64-NEXT:    addl %edi, %eax
175; X64-NEXT:    cmpw %di, %si
176; X64-NEXT:    jne LBB3_2
177; X64-NEXT:  ## %bb.1: ## %bb
178; X64-NEXT:    pushq %rbx
179; X64-NEXT:    movzwl %ax, %ebx
180; X64-NEXT:    movl %ebx, %edi
181; X64-NEXT:    callq _foo
182; X64-NEXT:    movl %ebx, %eax
183; X64-NEXT:    popq %rbx
184; X64-NEXT:    retq
185; X64-NEXT:  LBB3_2: ## %bb1
186; X64-NEXT:    movzwl %ax, %eax
187; X64-NEXT:    retq
188;
189; X86-LABEL: test4:
190; X86:       ## %bb.0: ## %entry
191; X86-NEXT:    pushl %esi
192; X86-NEXT:    subl $8, %esp
193; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
194; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
195; X86-NEXT:    movl %edx, %eax
196; X86-NEXT:    addl %ecx, %eax
197; X86-NEXT:    cmpw %cx, %dx
198; X86-NEXT:    jne LBB3_2
199; X86-NEXT:  ## %bb.1: ## %bb
200; X86-NEXT:    movzwl %ax, %esi
201; X86-NEXT:    movl %esi, (%esp)
202; X86-NEXT:    calll _foo
203; X86-NEXT:    movl %esi, %eax
204; X86-NEXT:    jmp LBB3_3
205; X86-NEXT:  LBB3_2: ## %bb1
206; X86-NEXT:    movzwl %ax, %eax
207; X86-NEXT:  LBB3_3: ## %bb1
208; X86-NEXT:    addl $8, %esp
209; X86-NEXT:    popl %esi
210; X86-NEXT:    retl
211entry:
212  %0 = add i16 %k, %c
213  %1 = icmp eq i16 %k, %c
214  br i1 %1, label %bb, label %bb1
215
216bb:
217  tail call void @foo(i16 zeroext %0) nounwind
218  ret i16 %0
219
220bb1:
221  ret i16 %0
222}
223
224