@@ -137,6 +137,121 @@ entry:
137
137
ret void
138
138
}
139
139
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
+
140
255
attributes #0 = { nounwind "frame-pointer" ="all" }
141
256
!llvm.module.flags = !{!0 }
142
257
!0 = !{i32 2 , !"override-stack-alignment" , i32 32 }
0 commit comments