Skip to content

Commit b7021a3

Browse files
committed
[X86] Add regcall CC test case for base pointer register.
1 parent 015c431 commit b7021a3

File tree

2 files changed

+163
-0
lines changed

2 files changed

+163
-0
lines changed

llvm/test/CodeGen/X86/i386-baseptr.ll

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,54 @@ entry:
7272
ret void
7373
}
7474

75+
define x86_regcallcc void @clobber_baseptr_argptr(i32 %param1, i32 %param2, i32 %param3, i32 %param4, i32 %param5, i32 %param6) #0 {
76+
; CHECK-LABEL: clobber_baseptr_argptr:
77+
; CHECK: # %bb.0: # %entry
78+
; CHECK-NEXT: pushl %ebp
79+
; CHECK-NEXT: movl %esp, %ebp
80+
; CHECK-NEXT: pushl %ebx
81+
; CHECK-NEXT: andl $-128, %esp
82+
; CHECK-NEXT: subl $128, %esp
83+
; CHECK-NEXT: movl %esp, %esi
84+
; CHECK-NEXT: movl 8(%ebp), %edi
85+
; CHECK-NEXT: calll helper@PLT
86+
; CHECK-NEXT: movl %esp, %ecx
87+
; CHECK-NEXT: leal 31(,%eax,4), %eax
88+
; CHECK-NEXT: andl $-32, %eax
89+
; CHECK-NEXT: movl %ecx, %edx
90+
; CHECK-NEXT: subl %eax, %edx
91+
; CHECK-NEXT: movl %edx, %esp
92+
; CHECK-NEXT: negl %eax
93+
; CHECK-NEXT: movl $405, %esi # imm = 0x195
94+
; CHECK-NEXT: #APP
95+
; CHECK-NEXT: nop
96+
; CHECK-NEXT: #NO_APP
97+
; CHECK-NEXT: movl $405, %ebx # imm = 0x195
98+
; CHECK-NEXT: #APP
99+
; CHECK-NEXT: nop
100+
; CHECK-NEXT: #NO_APP
101+
; CHECK-NEXT: movl $8, %edx
102+
; CHECK-NEXT: #APP
103+
; CHECK-NEXT: movl %edx, (%esi)
104+
; CHECK-NEXT: #NO_APP
105+
; CHECK-NEXT: movl %edi, (%ecx,%eax)
106+
; CHECK-NEXT: leal -4(%ebp), %esp
107+
; CHECK-NEXT: popl %ebx
108+
; CHECK-NEXT: popl %ebp
109+
; CHECK-NEXT: retl
110+
entry:
111+
%k = call i32 @helper()
112+
%a = alloca i32, align 128
113+
%b = alloca i32, i32 %k, align 4
114+
; clobber base pointer register
115+
tail call void asm sideeffect "nop", "{si}"(i32 405)
116+
; clobber argument pointer register
117+
tail call void asm sideeffect "nop", "{bx}"(i32 405)
118+
call void asm sideeffect "movl $0, $1", "r,*m"(i32 8, ptr elementtype(i32) %a)
119+
store i32 %param6, ptr %b, align 4
120+
ret void
121+
}
122+
75123
attributes #0 = { nounwind "frame-pointer"="all"}
76124
!llvm.module.flags = !{!0}
77125
!0 = !{i32 2, !"override-stack-alignment", i32 32}

llvm/test/CodeGen/X86/x86-64-baseptr.ll

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,121 @@ entry:
137137
ret void
138138
}
139139

140+
define x86_regcallcc void @clobber_baseptr_argptr(i32 %param1, i32 %param2, i32 %param3, i32 %param4, i32 %param5, i32 %param6, i32 %param7, i32 %param8, i32 %param9, i32 %param10, i32 %param11, i32 %param12) #0 {
141+
; CHECK-LABEL: clobber_baseptr_argptr:
142+
; CHECK: # %bb.0: # %entry
143+
; CHECK-NEXT: pushq %rbp
144+
; CHECK-NEXT: movq %rsp, %rbp
145+
; CHECK-NEXT: pushq %rbx
146+
; CHECK-NEXT: andq $-128, %rsp
147+
; CHECK-NEXT: subq $256, %rsp # imm = 0x100
148+
; CHECK-NEXT: movaps %xmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
149+
; CHECK-NEXT: movaps %xmm14, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
150+
; CHECK-NEXT: movaps %xmm13, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
151+
; CHECK-NEXT: movaps %xmm12, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
152+
; CHECK-NEXT: movaps %xmm11, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
153+
; CHECK-NEXT: movaps %xmm10, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
154+
; CHECK-NEXT: movaps %xmm9, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
155+
; CHECK-NEXT: movaps %xmm8, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
156+
; CHECK-NEXT: movq %rsp, %rbx
157+
; CHECK-NEXT: movl 16(%rbp), %r14d
158+
; CHECK-NEXT: callq helper@PLT
159+
; CHECK-NEXT: movq %rsp, %rcx
160+
; CHECK-NEXT: movl %eax, %eax
161+
; CHECK-NEXT: leaq 31(,%rax,4), %rax
162+
; CHECK-NEXT: andq $-32, %rax
163+
; CHECK-NEXT: movq %rcx, %rdx
164+
; CHECK-NEXT: subq %rax, %rdx
165+
; CHECK-NEXT: movq %rdx, %rsp
166+
; CHECK-NEXT: negq %rax
167+
; CHECK-NEXT: movl $405, %ebx # imm = 0x195
168+
; CHECK-NEXT: #APP
169+
; CHECK-NEXT: nop
170+
; CHECK-NEXT: #NO_APP
171+
; CHECK-NEXT: #APP
172+
; CHECK-NEXT: nop
173+
; CHECK-NEXT: #NO_APP
174+
; CHECK-NEXT: movl $8, %edx
175+
; CHECK-NEXT: #APP
176+
; CHECK-NEXT: movl %edx, (%rbx)
177+
; CHECK-NEXT: #NO_APP
178+
; CHECK-NEXT: movl %r14d, (%rcx,%rax)
179+
; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm8 # 16-byte Reload
180+
; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm9 # 16-byte Reload
181+
; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm10 # 16-byte Reload
182+
; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm11 # 16-byte Reload
183+
; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm12 # 16-byte Reload
184+
; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm13 # 16-byte Reload
185+
; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm14 # 16-byte Reload
186+
; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
187+
; CHECK-NEXT: leaq -8(%rbp), %rsp
188+
; CHECK-NEXT: popq %rbx
189+
; CHECK-NEXT: popq %rbp
190+
; CHECK-NEXT: retq
191+
;
192+
; X32ABI-LABEL: clobber_baseptr_argptr:
193+
; X32ABI: # %bb.0: # %entry
194+
; X32ABI-NEXT: pushq %rbp
195+
; X32ABI-NEXT: movl %esp, %ebp
196+
; X32ABI-NEXT: pushq %rbx
197+
; X32ABI-NEXT: andl $-128, %esp
198+
; X32ABI-NEXT: subl $256, %esp # imm = 0x100
199+
; X32ABI-NEXT: movaps %xmm15, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
200+
; X32ABI-NEXT: movaps %xmm14, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
201+
; X32ABI-NEXT: movaps %xmm13, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
202+
; X32ABI-NEXT: movaps %xmm12, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
203+
; X32ABI-NEXT: movaps %xmm11, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
204+
; X32ABI-NEXT: movaps %xmm10, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
205+
; X32ABI-NEXT: movaps %xmm9, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
206+
; X32ABI-NEXT: movaps %xmm8, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
207+
; X32ABI-NEXT: movl %esp, %ebx
208+
; X32ABI-NEXT: movl 16(%ebp), %r14d
209+
; X32ABI-NEXT: callq helper@PLT
210+
; X32ABI-NEXT: # kill: def $eax killed $eax def $rax
211+
; X32ABI-NEXT: leal 31(,%rax,4), %eax
212+
; X32ABI-NEXT: andl $-32, %eax
213+
; X32ABI-NEXT: movl %esp, %ecx
214+
; X32ABI-NEXT: movl %ecx, %edx
215+
; X32ABI-NEXT: subl %eax, %edx
216+
; X32ABI-NEXT: negl %eax
217+
; X32ABI-NEXT: movl %edx, %esp
218+
; X32ABI-NEXT: movl $405, %ebx # imm = 0x195
219+
; X32ABI-NEXT: #APP
220+
; X32ABI-NEXT: nop
221+
; X32ABI-NEXT: #NO_APP
222+
; X32ABI-NEXT: #APP
223+
; X32ABI-NEXT: nop
224+
; X32ABI-NEXT: #NO_APP
225+
; X32ABI-NEXT: movl $8, %edx
226+
; X32ABI-NEXT: #APP
227+
; X32ABI-NEXT: movl %edx, (%ebx)
228+
; X32ABI-NEXT: #NO_APP
229+
; X32ABI-NEXT: movl %r14d, (%ecx,%eax)
230+
; X32ABI-NEXT: movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm8 # 16-byte Reload
231+
; X32ABI-NEXT: movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm9 # 16-byte Reload
232+
; X32ABI-NEXT: movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm10 # 16-byte Reload
233+
; X32ABI-NEXT: movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm11 # 16-byte Reload
234+
; X32ABI-NEXT: movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm12 # 16-byte Reload
235+
; X32ABI-NEXT: movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm13 # 16-byte Reload
236+
; X32ABI-NEXT: movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm14 # 16-byte Reload
237+
; X32ABI-NEXT: movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm15 # 16-byte Reload
238+
; X32ABI-NEXT: leal -8(%ebp), %esp
239+
; X32ABI-NEXT: popq %rbx
240+
; X32ABI-NEXT: popq %rbp
241+
; X32ABI-NEXT: retq
242+
entry:
243+
%k = call i32 @helper()
244+
%a = alloca i32, align 128
245+
%b = alloca i32, i32 %k, align 4
246+
; clobber base pointer register
247+
tail call void asm sideeffect "nop", "{bx}"(i32 405)
248+
; clobber argument pointer register
249+
tail call void asm sideeffect "nop", "~{bx},~{r10},~{r11}"()
250+
call void asm sideeffect "movl $0, $1", "r,*m"(i32 8, ptr elementtype(i32) %a)
251+
store i32 %param12, ptr %b, align 4
252+
ret void
253+
}
254+
140255
attributes #0 = { nounwind "frame-pointer"="all"}
141256
!llvm.module.flags = !{!0}
142257
!0 = !{i32 2, !"override-stack-alignment", i32 32}

0 commit comments

Comments
 (0)