mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
[Stackmap] Allow WebKit_JS calling convention to store 4 byte sized and aligned arguments.
This allows the WebKit_JS calling convention to perform partial writes on a 4 byte granularity to stack slots. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@197431 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
62fd16a297
commit
e77491226a
@ -358,12 +358,15 @@ def CC_X86_64_WebKit_JS : CallingConv<[
|
||||
CCIfType<[i8, i16], CCPromoteToType<i32>>,
|
||||
|
||||
// Only the first integer argument is passed in register.
|
||||
CCIfType<[i32], CCAssignToReg<[EDI]>>,
|
||||
CCIfType<[i64], CCAssignToReg<[RDI]>>,
|
||||
CCIfType<[i32], CCAssignToReg<[EAX]>>,
|
||||
CCIfType<[i64], CCAssignToReg<[RAX]>>,
|
||||
|
||||
// Integer/FP values are always stored in stack slots that are 8 bytes in size
|
||||
// and 8-byte aligned.
|
||||
CCIfType<[i32, i64, f32, f64], CCAssignToStack<8, 8>>
|
||||
// The remaining integer arguments are passed on the stack. 32bit integer and
|
||||
// floating-point arguments are aligned to 4 byte and stored in 4 byte slots.
|
||||
// 64bit integer and floating-point arguments are aligned to 8 byte and stored
|
||||
// in 8 byte stack slots.
|
||||
CCIfType<[i32, f32], CCAssignToStack<4, 4>>,
|
||||
CCIfType<[i64, f64], CCAssignToStack<8, 8>>
|
||||
]>;
|
||||
|
||||
// No explicit register is specified for the AnyReg calling convention. The
|
||||
|
@ -46,7 +46,7 @@ entry:
|
||||
; CHECK-LABEL: jscall_patchpoint_codegen:
|
||||
; CHECK: Ltmp
|
||||
; CHECK: movq %r{{.+}}, (%rsp)
|
||||
; CHECK: movq %r{{.+}}, %rdi
|
||||
; CHECK: movq %r{{.+}}, %rax
|
||||
; CHECK: Ltmp
|
||||
; CHECK-NEXT: movabsq $-559038736, %r11
|
||||
; CHECK-NEXT: callq *%r11
|
||||
@ -59,6 +59,40 @@ entry:
|
||||
ret void
|
||||
}
|
||||
|
||||
; Test if the arguments are properly aligned and that we don't store undef arguments.
|
||||
define i64 @jscall_patchpoint_codegen2(i64 %callee) {
|
||||
entry:
|
||||
; CHECK-LABEL: jscall_patchpoint_codegen2:
|
||||
; CHECK: Ltmp
|
||||
; CHECK: movq $6, 24(%rsp)
|
||||
; CHECK-NEXT: movl $4, 16(%rsp)
|
||||
; CHECK-NEXT: movq $2, (%rsp)
|
||||
; CHECK: Ltmp
|
||||
; CHECK-NEXT: movabsq $-559038736, %r11
|
||||
; CHECK-NEXT: callq *%r11
|
||||
%call = inttoptr i64 -559038736 to i8*
|
||||
%result = call webkit_jscc i64 (i64, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64(i64 7, i32 15, i8* %call, i32 6, i64 %callee, i64 2, i64 undef, i32 4, i32 undef, i64 6)
|
||||
ret i64 %result
|
||||
}
|
||||
|
||||
; Test if the arguments are properly aligned and that we don't store undef arguments.
|
||||
define i64 @jscall_patchpoint_codegen3(i64 %callee) {
|
||||
entry:
|
||||
; CHECK-LABEL: jscall_patchpoint_codegen3:
|
||||
; CHECK: Ltmp
|
||||
; CHECK: movq $10, 48(%rsp)
|
||||
; CHECK-NEXT: movl $8, 36(%rsp)
|
||||
; CHECK-NEXT: movq $6, 24(%rsp)
|
||||
; CHECK-NEXT: movl $4, 16(%rsp)
|
||||
; CHECK-NEXT: movq $2, (%rsp)
|
||||
; CHECK: Ltmp
|
||||
; CHECK-NEXT: movabsq $-559038736, %r11
|
||||
; CHECK-NEXT: callq *%r11
|
||||
%call = inttoptr i64 -559038736 to i8*
|
||||
%result = call webkit_jscc i64 (i64, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64(i64 7, i32 15, i8* %call, i32 10, i64 %callee, i64 2, i64 undef, i32 4, i32 undef, i64 6, i32 undef, i32 8, i32 undef, i64 10)
|
||||
ret i64 %result
|
||||
}
|
||||
|
||||
; Test patchpoints reusing the same TargetConstant.
|
||||
; <rdar:15390785> Assertion failed: (CI.getNumArgOperands() >= NumArgs + 4)
|
||||
; There is no way to verify this, since it depends on memory allocation.
|
||||
|
Loading…
Reference in New Issue
Block a user