summaryrefslogtreecommitdiff
path: root/src/vm/arm64
diff options
context:
space:
mode:
authorAditya Mandaleeka <adityamandaleeka@users.noreply.github.com>2018-08-10 13:38:09 -0700
committerGitHub <noreply@github.com>2018-08-10 13:38:09 -0700
commit30f0be906507bef99d951efc5eb9a1664bde9ddd (patch)
treed813aac2527af98bf95afc34dfef3b7abbae8d42 /src/vm/arm64
parentb9028b31caba6e69d1fab99bd1219ae879782802 (diff)
parentc891df0a89a995c4e559ef9cefc0c07533ae88b4 (diff)
downloadcoreclr-30f0be906507bef99d951efc5eb9a1664bde9ddd.tar.gz
coreclr-30f0be906507bef99d951efc5eb9a1664bde9ddd.tar.bz2
coreclr-30f0be906507bef99d951efc5eb9a1664bde9ddd.zip
Merge pull request #19344 from adityamandaleeka/aa64_vm_callconv_changes
CallDescr/TransitionBlock changes for ARM64 calling convention
Diffstat (limited to 'src/vm/arm64')
-rw-r--r--src/vm/arm64/CallDescrWorkerARM64.asm9
-rw-r--r--src/vm/arm64/asmconstants.h18
-rw-r--r--src/vm/arm64/asmhelpers.S6
-rw-r--r--src/vm/arm64/asmhelpers.asm10
-rw-r--r--src/vm/arm64/asmmacros.h29
-rw-r--r--src/vm/arm64/calldescrworkerarm64.S5
-rw-r--r--src/vm/arm64/cgencpu.h9
7 files changed, 51 insertions, 35 deletions
diff --git a/src/vm/arm64/CallDescrWorkerARM64.asm b/src/vm/arm64/CallDescrWorkerARM64.asm
index b9f8a6090d..65c7db6f3f 100644
--- a/src/vm/arm64/CallDescrWorkerARM64.asm
+++ b/src/vm/arm64/CallDescrWorkerARM64.asm
@@ -62,15 +62,18 @@ Ldonestack
ldp d6, d7, [x9, #48]
LNoFloatingPoint
- ;; Copy [pArgumentRegisters, ..., pArgumentRegisters + 64]
- ;; into x0, ..., x7, x8
+ ;; Copy [pArgumentRegisters, ..., pArgumentRegisters + 56]
+ ;; into x0, ..., x7
ldr x9, [x19,#CallDescrData__pArgumentRegisters]
ldp x0, x1, [x9]
ldp x2, x3, [x9, #16]
ldp x4, x5, [x9, #32]
ldp x6, x7, [x9, #48]
- ldr x8, [x9, #64]
+
+ ;; Copy pRetBuffArg into x8
+ ldr x9, [x19,#CallDescrData__pRetBuffArg]
+ ldr x8, [x9]
;; call pTarget
ldr x9, [x19,#CallDescrData__pTarget]
diff --git a/src/vm/arm64/asmconstants.h b/src/vm/arm64/asmconstants.h
index dca845d000..262e481b53 100644
--- a/src/vm/arm64/asmconstants.h
+++ b/src/vm/arm64/asmconstants.h
@@ -55,19 +55,20 @@ ASMCONSTANTS_C_ASSERT(AppDomain__m_dwId == offsetof(AppDomain, m_dwId));
#define METHODDESC_REGISTER x12
-#define SIZEOF__ArgumentRegisters 0x48
+#define SIZEOF__ArgumentRegisters 0x40
ASMCONSTANTS_C_ASSERT(SIZEOF__ArgumentRegisters == sizeof(ArgumentRegisters))
#define SIZEOF__FloatArgumentRegisters 0x40
ASMCONSTANTS_C_ASSERT(SIZEOF__FloatArgumentRegisters == sizeof(FloatArgumentRegisters))
-#define CallDescrData__pSrc 0x00
-#define CallDescrData__numStackSlots 0x08
-#define CallDescrData__pArgumentRegisters 0x10
-#define CallDescrData__pFloatArgumentRegisters 0x18
-#define CallDescrData__fpReturnSize 0x20
-#define CallDescrData__pTarget 0x28
-#define CallDescrData__returnValue 0x30
+#define CallDescrData__pSrc 0x00
+#define CallDescrData__numStackSlots 0x08
+#define CallDescrData__pArgumentRegisters 0x10
+#define CallDescrData__pFloatArgumentRegisters 0x18
+#define CallDescrData__fpReturnSize 0x20
+#define CallDescrData__pTarget 0x28
+#define CallDescrData__pRetBuffArg 0x30
+#define CallDescrData__returnValue 0x38
ASMCONSTANTS_C_ASSERT(CallDescrData__pSrc == offsetof(CallDescrData, pSrc))
ASMCONSTANTS_C_ASSERT(CallDescrData__numStackSlots == offsetof(CallDescrData, numStackSlots))
@@ -75,6 +76,7 @@ ASMCONSTANTS_C_ASSERT(CallDescrData__pArgumentRegisters == offsetof(CallDescrD
ASMCONSTANTS_C_ASSERT(CallDescrData__pFloatArgumentRegisters == offsetof(CallDescrData, pFloatArgumentRegisters))
ASMCONSTANTS_C_ASSERT(CallDescrData__fpReturnSize == offsetof(CallDescrData, fpReturnSize))
ASMCONSTANTS_C_ASSERT(CallDescrData__pTarget == offsetof(CallDescrData, pTarget))
+ASMCONSTANTS_C_ASSERT(CallDescrData__pRetBuffArg == offsetof(CallDescrData, pRetBuffArg))
ASMCONSTANTS_C_ASSERT(CallDescrData__returnValue == offsetof(CallDescrData, returnValue))
#define CORINFO_NullReferenceException_ASM 0
diff --git a/src/vm/arm64/asmhelpers.S b/src/vm/arm64/asmhelpers.S
index 23f591fccc..e138feb402 100644
--- a/src/vm/arm64/asmhelpers.S
+++ b/src/vm/arm64/asmhelpers.S
@@ -562,7 +562,7 @@ LEAF_END SinglecastDelegateInvokeStub, _TEXT
#ifdef FEATURE_COMINTEROP
#define ComCallPreStub_FrameSize (SIZEOF__GSCookie + SIZEOF__ComMethodFrame)
-#define ComCallPreStub_FirstStackAdjust (SIZEOF__ArgumentRegisters + 2 * 8) // reg args , fp & lr already pushed
+#define ComCallPreStub_FirstStackAdjust (8 + SIZEOF__ArgumentRegisters + 2 * 8) // x8, reg args , fp & lr already pushed
#define ComCallPreStub_StackAlloc0 (ComCallPreStub_FrameSize - ComCallPreStub_FirstStackAdjust)
#define ComCallPreStub_StackAlloc1 (ComCallPreStub_StackAlloc0 + SIZEOF__FloatArgumentRegisters + 8)// 8 for ErrorReturn
#define ComCallPreStub_StackAlloc (ComCallPreStub_StackAlloc1 + (ComCallPreStub_StackAlloc1 & 8))
@@ -692,7 +692,7 @@ COMToCLRDispatchHelper_RegSetup
ldp x2, x3, [x1, #(SIZEOF__ComMethodFrame - SIZEOF__ArgumentRegisters + 16)]
ldp x4, x5, [x1, #(SIZEOF__ComMethodFrame - SIZEOF__ArgumentRegisters + 32)]
ldp x6, x7, [x1, #(SIZEOF__ComMethodFrame - SIZEOF__ArgumentRegisters + 48)]
- ldr x8, [x1, #(SIZEOF__ComMethodFrame - SIZEOF__ArgumentRegisters + 64)]
+ ldr x8, [x1, #(SIZEOF__ComMethodFrame - SIZEOF__ArgumentRegisters - 8)]
ldr x1, [x1, #(SIZEOF__ComMethodFrame - SIZEOF__ArgumentRegisters + 8)]
@@ -1253,7 +1253,7 @@ DelayLoad_Helper\suffix:
mov x4, \frameFlags
bl DynamicHelperWorker
cbnz x0, LOCAL_LABEL(FakeProlog\suffix\()_0)
- ldr x0, [sp, #__PWTB_ArgumentRegisters]
+ ldr x0, [sp, #__PWTB_ArgumentRegister_FirstArg]
EPILOG_WITH_TRANSITION_BLOCK_RETURN
LOCAL_LABEL(FakeProlog\suffix\()_0):
mov x12, x0
diff --git a/src/vm/arm64/asmhelpers.asm b/src/vm/arm64/asmhelpers.asm
index 376bbbcec7..7346c468a0 100644
--- a/src/vm/arm64/asmhelpers.asm
+++ b/src/vm/arm64/asmhelpers.asm
@@ -533,7 +533,7 @@ LNullThis
GBLA ComCallPreStub_FirstStackAdjust
ComCallPreStub_FrameSize SETA (SIZEOF__GSCookie + SIZEOF__ComMethodFrame)
-ComCallPreStub_FirstStackAdjust SETA (SIZEOF__ArgumentRegisters + 2 * 8) ; reg args , fp & lr already pushed
+ComCallPreStub_FirstStackAdjust SETA (8 + SIZEOF__ArgumentRegisters + 2 * 8) ; x8, reg args , fp & lr already pushed
ComCallPreStub_StackAlloc SETA ComCallPreStub_FrameSize - ComCallPreStub_FirstStackAdjust
ComCallPreStub_StackAlloc SETA ComCallPreStub_StackAlloc + SIZEOF__FloatArgumentRegisters + 8; 8 for ErrorReturn
IF ComCallPreStub_StackAlloc:MOD:16 != 0
@@ -603,7 +603,7 @@ ComCallPreStub_ErrorExit
GBLA GenericComCallStub_FirstStackAdjust
GenericComCallStub_FrameSize SETA (SIZEOF__GSCookie + SIZEOF__ComMethodFrame)
-GenericComCallStub_FirstStackAdjust SETA (SIZEOF__ArgumentRegisters + 2 * 8)
+GenericComCallStub_FirstStackAdjust SETA (8 + SIZEOF__ArgumentRegisters + 2 * 8)
GenericComCallStub_StackAlloc SETA GenericComCallStub_FrameSize - GenericComCallStub_FirstStackAdjust
GenericComCallStub_StackAlloc SETA GenericComCallStub_StackAlloc + SIZEOF__FloatArgumentRegisters
@@ -676,7 +676,7 @@ COMToCLRDispatchHelper_RegSetup
ldp x2, x3, [x1, #(SIZEOF__ComMethodFrame - SIZEOF__ArgumentRegisters + 16)]
ldp x4, x5, [x1, #(SIZEOF__ComMethodFrame - SIZEOF__ArgumentRegisters + 32)]
ldp x6, x7, [x1, #(SIZEOF__ComMethodFrame - SIZEOF__ArgumentRegisters + 48)]
- ldr x8, [x1, #(SIZEOF__ComMethodFrame - SIZEOF__ArgumentRegisters + 64)]
+ ldr x8, [x1, #(SIZEOF__ComMethodFrame - SIZEOF__ArgumentRegisters - 8)]
ldr x1, [x1, #(SIZEOF__ComMethodFrame - SIZEOF__ArgumentRegisters + 8)]
@@ -1262,9 +1262,9 @@ Fail
mov x4, $frameFlags
bl DynamicHelperWorker
cbnz x0, %FT0
- ldr x0, [sp, #__PWTB_ArgumentRegisters]
+ ldr x0, [sp, #__PWTB_ArgumentRegister_FirstArg]
EPILOG_WITH_TRANSITION_BLOCK_RETURN
-0
+0
mov x12, x0
EPILOG_WITH_TRANSITION_BLOCK_TAILCALL
EPILOG_BRANCH_REG x12
diff --git a/src/vm/arm64/asmmacros.h b/src/vm/arm64/asmmacros.h
index 74613daa8f..291fcf8e70 100644
--- a/src/vm/arm64/asmmacros.h
+++ b/src/vm/arm64/asmmacros.h
@@ -44,7 +44,9 @@ $name SETS "|$symbol|"
PROLOG_WITH_TRANSITION_BLOCK $extraLocals, $SaveFPArgs
GBLA __PWTB_FloatArgumentRegisters
- GBLA __PWTB_ArgumentRegisters
+ GBLA __PWTB_ArgumentRegisters
+ GBLA __PWTB_ArgumentRegister_FirstArg ; We save the x8 register ahead of the first argument, so this
+ ; is different from the start of the argument register save area.
GBLA __PWTB_StackAlloc
GBLA __PWTB_TransitionBlock
GBLL __PWTB_SaveFPArgs
@@ -72,7 +74,8 @@ __PWTB_TransitionBlock SETA __PWTB_FloatArgumentRegisters
ENDIF
__PWTB_StackAlloc SETA __PWTB_TransitionBlock
-__PWTB_ArgumentRegisters SETA __PWTB_StackAlloc + 96
+__PWTB_ArgumentRegisters SETA __PWTB_StackAlloc + 104
+__PWTB_ArgumentRegister_FirstArg SETA __PWTB_ArgumentRegisters + 8
PROLOG_SAVE_REG_PAIR fp, lr, #-176!
; Spill callee saved registers
@@ -172,11 +175,12 @@ __PWTB_SAVE_ARGUMENT_REGISTERS_OFFSET SETA $offset
__PWTB_SAVE_ARGUMENT_REGISTERS_OFFSET SETA 0
ENDIF
- stp x0, x1, [$reg, #(__PWTB_SAVE_ARGUMENT_REGISTERS_OFFSET)]
- stp x2, x3, [$reg, #(__PWTB_SAVE_ARGUMENT_REGISTERS_OFFSET + 16)]
- stp x4, x5, [$reg, #(__PWTB_SAVE_ARGUMENT_REGISTERS_OFFSET + 32)]
- stp x6, x7, [$reg, #(__PWTB_SAVE_ARGUMENT_REGISTERS_OFFSET + 48)]
- str x8, [$reg, #(__PWTB_SAVE_ARGUMENT_REGISTERS_OFFSET + 64)]
+ str x8, [$reg, #(__PWTB_SAVE_ARGUMENT_REGISTERS_OFFSET)]
+ stp x0, x1, [$reg, #(__PWTB_SAVE_ARGUMENT_REGISTERS_OFFSET + 8)]
+ stp x2, x3, [$reg, #(__PWTB_SAVE_ARGUMENT_REGISTERS_OFFSET + 24)]
+ stp x4, x5, [$reg, #(__PWTB_SAVE_ARGUMENT_REGISTERS_OFFSET + 40)]
+ stp x6, x7, [$reg, #(__PWTB_SAVE_ARGUMENT_REGISTERS_OFFSET + 56)]
+
MEND
; Reserve 64 bytes of memory before calling SAVE_FLOAT_ARGUMENT_REGISTERS
@@ -208,11 +212,12 @@ __PWTB_RESTORE_ARGUMENT_REGISTERS_OFFSET SETA $offset
__PWTB_RESTORE_ARGUMENT_REGISTERS_OFFSET SETA 0
ENDIF
- ldp x0, x1, [$reg, #(__PWTB_RESTORE_ARGUMENT_REGISTERS_OFFSET)]
- ldp x2, x3, [$reg, #(__PWTB_RESTORE_ARGUMENT_REGISTERS_OFFSET + 16)]
- ldp x4, x5, [$reg, #(__PWTB_RESTORE_ARGUMENT_REGISTERS_OFFSET + 32)]
- ldp x6, x7, [$reg, #(__PWTB_RESTORE_ARGUMENT_REGISTERS_OFFSET + 48)]
- ldr x8, [$reg, #(__PWTB_RESTORE_ARGUMENT_REGISTERS_OFFSET + 64)]
+ ldr x8, [$reg, #(__PWTB_RESTORE_ARGUMENT_REGISTERS_OFFSET)]
+ ldp x0, x1, [$reg, #(__PWTB_RESTORE_ARGUMENT_REGISTERS_OFFSET + 8)]
+ ldp x2, x3, [$reg, #(__PWTB_RESTORE_ARGUMENT_REGISTERS_OFFSET + 24)]
+ ldp x4, x5, [$reg, #(__PWTB_RESTORE_ARGUMENT_REGISTERS_OFFSET + 40)]
+ ldp x6, x7, [$reg, #(__PWTB_RESTORE_ARGUMENT_REGISTERS_OFFSET + 56)]
+
MEND
MACRO
diff --git a/src/vm/arm64/calldescrworkerarm64.S b/src/vm/arm64/calldescrworkerarm64.S
index 5bcad2f9c0..c3ce06aa72 100644
--- a/src/vm/arm64/calldescrworkerarm64.S
+++ b/src/vm/arm64/calldescrworkerarm64.S
@@ -62,7 +62,10 @@ LOCAL_LABEL(NoFloatingPoint):
ldp x2, x3, [x9, #16]
ldp x4, x5, [x9, #32]
ldp x6, x7, [x9, #48]
- ldr x8, [x9, #64]
+
+ // Copy pRetBuffArg into x8
+ ldr x9, [x19,#CallDescrData__pRetBuffArg]
+ ldr x8, [x9]
// call pTarget
ldr x9, [x19,#CallDescrData__pTarget]
diff --git a/src/vm/arm64/cgencpu.h b/src/vm/arm64/cgencpu.h
index 6edf704b8f..a297a84e17 100644
--- a/src/vm/arm64/cgencpu.h
+++ b/src/vm/arm64/cgencpu.h
@@ -57,6 +57,7 @@ extern PCODE GetPreStubEntryPoint();
#define CALLDESCR_ARGREGS 1 // CallDescrWorker has ArgumentRegister parameter
#define CALLDESCR_FPARGREGS 1 // CallDescrWorker has FloatArgumentRegisters parameter
+#define CALLDESCR_RETBUFFARGREG 1 // CallDescrWorker has RetBuffArg parameter that's separate from arg regs
// Given a return address retrieved during stackwalk,
// this is the offset by which it should be decremented to arrive at the callsite.
@@ -77,7 +78,9 @@ extern PCODE GetPreStubEntryPoint();
typedef INT64 StackElemType;
#define STACK_ELEM_SIZE sizeof(StackElemType)
-// !! This expression assumes STACK_ELEM_SIZE is a power of 2.
+// The expression below assumes STACK_ELEM_SIZE is a power of 2, so check that.
+static_assert(((STACK_ELEM_SIZE & (STACK_ELEM_SIZE-1)) == 0), "STACK_ELEM_SIZE must be a power of 2");
+
#define StackElemSize(parmSize) (((parmSize) + STACK_ELEM_SIZE - 1) & ~((ULONG)(STACK_ELEM_SIZE - 1)))
//
@@ -115,11 +118,11 @@ struct CalleeSavedRegisters {
// will probably have to communicate this back to the PromoteCallerStack
// routine to avoid a double promotion.
//--------------------------------------------------------------------
+#define NUM_ARGUMENT_REGISTERS 8
typedef DPTR(struct ArgumentRegisters) PTR_ArgumentRegisters;
struct ArgumentRegisters {
- INT64 x[9]; // x0 ....x7 & x8 can contain return buffer address
+ INT64 x[NUM_ARGUMENT_REGISTERS]; // x0 ....x7. Note that x8 (return buffer address) is not included.
};
-#define NUM_ARGUMENT_REGISTERS 9
#define ARGUMENTREGISTERS_SIZE sizeof(ArgumentRegisters)