| OLD | NEW |
| 1 ; This file checks that Subzero generates code in accordance with the | 1 ; This file checks that Subzero generates code in accordance with the |
| 2 ; calling convention for integers. | 2 ; calling convention for integers. |
| 3 | 3 |
| 4 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ | 4 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ |
| 5 ; RUN: --target x8632 -i %s --args -O2 \ | 5 ; RUN: --target x8632 -i %s --args -O2 \ |
| 6 ; RUN: | %if --need=target_X8632 --command FileCheck %s | 6 ; RUN: | %if --need=target_X8632 --command FileCheck %s |
| 7 | 7 |
| 8 ; TODO(jvoung): Stop skipping unimplemented parts (via --skip-unimplemented) | 8 ; TODO(jvoung): Stop skipping unimplemented parts (via --skip-unimplemented) |
| 9 ; once enough infrastructure is in. Also, switch to --filetype=obj | 9 ; once enough infrastructure is in. Also, switch to --filetype=obj |
| 10 ; when possible. | 10 ; when possible. |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 228 } | 228 } |
| 229 ; CHECK-LABEL: test_returning32_even_arg4 | 229 ; CHECK-LABEL: test_returning32_even_arg4 |
| 230 ; CHECK-NEXT: mov {{.*}} [esp+0x18] | 230 ; CHECK-NEXT: mov {{.*}} [esp+0x18] |
| 231 ; CHECK-NEXT: ret | 231 ; CHECK-NEXT: ret |
| 232 ; ARM32-LABEL: test_returning32_even_arg4 | 232 ; ARM32-LABEL: test_returning32_even_arg4 |
| 233 ; ARM32-NEXT: ldr r0, [sp, #8] | 233 ; ARM32-NEXT: ldr r0, [sp, #8] |
| 234 ; ARM32-NEXT: bx lr | 234 ; ARM32-NEXT: bx lr |
| 235 | 235 |
| 236 ; Test interleaving float/double and integer (different register streams on ARM)
. | 236 ; Test interleaving float/double and integer (different register streams on ARM)
. |
| 237 ; TODO(jvoung): Test once the S/D/Q regs are modeled. | 237 ; TODO(jvoung): Test once the S/D/Q regs are modeled. |
| 238 |
| 239 ; Test that integers are passed correctly as arguments to a function. |
| 240 |
| 241 declare void @IntArgs(i32, i32, i32, i32, i32, i32) |
| 242 |
| 243 declare void @killRegisters() |
| 244 |
| 245 define void @test_passing_integers(i32 %arg0, i32 %arg1, i32 %arg2, i32 %arg3, i
32 %arg4, i32 %arg5, i32 %arg6) { |
| 246 call void @killRegisters() |
| 247 call void @IntArgs(i32 %arg6, i32 %arg5, i32 %arg4, i32 %arg3, i32 %arg2, i32
%arg1) |
| 248 ret void |
| 249 } |
| 250 |
| 251 ; CHECK-LABEL: test_passing_integers |
| 252 ; CHECK-DAG: mov [[REG1:e.*]],DWORD PTR [esp+0x24] |
| 253 ; CHECK-DAG: mov [[REG2:e.*]],DWORD PTR [esp+0x28] |
| 254 ; CHECK-DAG: mov [[REG3:e.*]],DWORD PTR [esp+0x2c] |
| 255 ; CHECK-DAG: mov [[REG4:e.*]],DWORD PTR [esp+0x30] |
| 256 ; CHECK: mov DWORD PTR [esp] |
| 257 ; CHECK: mov DWORD PTR [esp+0x4] |
| 258 ; CHECK-DAG: mov DWORD PTR [esp+0x8],[[REG4]] |
| 259 ; CHECK-DAG: mov DWORD PTR [esp+0xc],[[REG3]] |
| 260 ; CHECK-DAG: mov DWORD PTR [esp+0x10],[[REG2]] |
| 261 ; CHECK-DAG: mov DWORD PTR [esp+0x14],[[REG1]] |
| 262 ; CHECK: call |
| 263 |
| 264 ; ARM32-LABEL: test_passing_integers |
| 265 ; ARM32-DAG: mov [[REG1:.*]], r1 |
| 266 ; ARM32-DAG: mov [[REG2:.*]], r2 |
| 267 ; ARM32-DAG: mov [[REG3:.*]], r3 |
| 268 ; ARM32: str [[REG2]], [sp] |
| 269 ; ARM32: str [[REG1]], [sp, #4] |
| 270 ; ARM32-DAG: mov r0 |
| 271 ; ARM32-DAG: mov r1 |
| 272 ; ARM32-DAG: mov r2 |
| 273 ; ARM32-DAG: mov r3, [[REG3]] |
| 274 ; ARM32: bl |
| OLD | NEW |