mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 04:33:05 +00:00
77c1b73211
This handles the simplest case for mov -> push conversion: 1. x86-32 calling convention, everything is passed through the stack. 2. There is no reserved call frame. 3. Only registers or immediates are pushed, no attempt to combine a mem-reg-mem sequence into a single PUSHmm. Differential Revision: http://reviews.llvm.org/D6503 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223757 91177308-0d34-0410-b5e6-96231b3b80d8
98 lines
2.6 KiB
LLVM
98 lines
2.6 KiB
LLVM
; RUN: llc < %s -mtriple=i686-windows | FileCheck %s -check-prefix=NORMAL
|
|
; RUN: llc < %s -mtriple=i686-windows -force-align-stack -stack-alignment=32 | FileCheck %s -check-prefix=ALIGNED
|
|
declare void @good(i32 %a, i32 %b, i32 %c, i32 %d)
|
|
declare void @inreg(i32 %a, i32 inreg %b, i32 %c, i32 %d)
|
|
|
|
; Here, we should have a reserved frame, so we don't expect pushes
|
|
; NORMAL-LABEL: test1
|
|
; NORMAL: subl $16, %esp
|
|
; NORMAL-NEXT: movl $4, 12(%esp)
|
|
; NORMAL-NEXT: movl $3, 8(%esp)
|
|
; NORMAL-NEXT: movl $2, 4(%esp)
|
|
; NORMAL-NEXT: movl $1, (%esp)
|
|
; NORMAL-NEXT: call
|
|
define void @test1() {
|
|
entry:
|
|
call void @good(i32 1, i32 2, i32 3, i32 4)
|
|
ret void
|
|
}
|
|
|
|
; Here, we expect a sequence of 4 immediate pushes
|
|
; NORMAL-LABEL: test2
|
|
; NORMAL-NOT: subl {{.*}} %esp
|
|
; NORMAL: pushl $4
|
|
; NORMAL-NEXT: pushl $3
|
|
; NORMAL-NEXT: pushl $2
|
|
; NORMAL-NEXT: pushl $1
|
|
; NORMAL-NEXT: call
|
|
define void @test2(i32 %k) {
|
|
entry:
|
|
%a = alloca i32, i32 %k
|
|
call void @good(i32 1, i32 2, i32 3, i32 4)
|
|
ret void
|
|
}
|
|
|
|
; Again, we expect a sequence of 4 immediate pushes
|
|
; Checks that we generate the right pushes for >8bit immediates
|
|
; NORMAL-LABEL: test2b
|
|
; NORMAL-NOT: subl {{.*}} %esp
|
|
; NORMAL: pushl $4096
|
|
; NORMAL-NEXT: pushl $3072
|
|
; NORMAL-NEXT: pushl $2048
|
|
; NORMAL-NEXT: pushl $1024
|
|
; NORMAL-NEXT: call
|
|
define void @test2b(i32 %k) {
|
|
entry:
|
|
%a = alloca i32, i32 %k
|
|
call void @good(i32 1024, i32 2048, i32 3072, i32 4096)
|
|
ret void
|
|
}
|
|
|
|
; The first push should push a register
|
|
; NORMAL-LABEL: test3
|
|
; NORMAL-NOT: subl {{.*}} %esp
|
|
; NORMAL: pushl $4
|
|
; NORMAL-NEXT: pushl $3
|
|
; NORMAL-NEXT: pushl $2
|
|
; NORMAL-NEXT: pushl %e{{..}}
|
|
; NORMAL-NEXT: call
|
|
define void @test3(i32 %k) {
|
|
entry:
|
|
%a = alloca i32, i32 %k
|
|
call void @good(i32 %k, i32 2, i32 3, i32 4)
|
|
ret void
|
|
}
|
|
|
|
; We don't support weird calling conventions
|
|
; NORMAL-LABEL: test4
|
|
; NORMAL: subl $12, %esp
|
|
; NORMAL-NEXT: movl $4, 8(%esp)
|
|
; NORMAL-NEXT: movl $3, 4(%esp)
|
|
; NORMAL-NEXT: movl $1, (%esp)
|
|
; NORMAL-NEXT: movl $2, %eax
|
|
; NORMAL-NEXT: call
|
|
define void @test4(i32 %k) {
|
|
entry:
|
|
%a = alloca i32, i32 %k
|
|
call void @inreg(i32 1, i32 2, i32 3, i32 4)
|
|
ret void
|
|
}
|
|
|
|
; Check that additional alignment is added when the pushes
|
|
; don't add up to the required alignment.
|
|
; ALIGNED-LABEL: test5
|
|
; ALIGNED: subl $16, %esp
|
|
; ALIGNED-NEXT: pushl $4
|
|
; ALIGNED-NEXT: pushl $3
|
|
; ALIGNED-NEXT: pushl $2
|
|
; ALIGNED-NEXT: pushl $1
|
|
; ALIGNED-NEXT: call
|
|
define void @test5(i32 %k) {
|
|
entry:
|
|
%a = alloca i32, i32 %k
|
|
call void @good(i32 1, i32 2, i32 3, i32 4)
|
|
ret void
|
|
}
|
|
|
|
|