diff --git a/src/coreclr/pal/inc/unixasmmacrosarm64.inc b/src/coreclr/pal/inc/unixasmmacrosarm64.inc index 2d27459372b561..35e1cc7a637ab7 100644 --- a/src/coreclr/pal/inc/unixasmmacrosarm64.inc +++ b/src/coreclr/pal/inc/unixasmmacrosarm64.inc @@ -309,6 +309,21 @@ C_FUNC(\Name\()_End): .endm +// Same as EPILOG_WITH_TRANSITION_BLOCK_RETURN but skips restoring x21 (SwiftError) +.macro EPILOG_WITH_TRANSITION_BLOCK_RETURN_SKIP_SWIFT_ERROR + + EPILOG_STACK_FREE __PWTB_StackAlloc + + EPILOG_RESTORE_REG_PAIR x19, x20, 16 + EPILOG_RESTORE_REG x22, 40 + EPILOG_RESTORE_REG_PAIR x23, x24, 48 + EPILOG_RESTORE_REG_PAIR x25, x26, 64 + EPILOG_RESTORE_REG_PAIR x27, x28, 80 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 176 + ret + +.endm + //----------------------------------------------------------------------------- // Provides a matching epilog to PROLOG_WITH_TRANSITION_BLOCK and ends by preparing for tail-calling. // Since this is a tail call argument registers are restored. @@ -410,7 +425,7 @@ C_FUNC(\Name\()_End): PROLOG_SAVE_REG_PAIR x27, x28, 80 mov \target, sp -.endm +.endm .macro POP_COOP_PINVOKE_FRAME EPILOG_RESTORE_REG_PAIR x19, x20, 16 diff --git a/src/coreclr/vm/arm/asmconstants.h b/src/coreclr/vm/arm/asmconstants.h index e07132357c5cdd..8a994cd700eab7 100644 --- a/src/coreclr/vm/arm/asmconstants.h +++ b/src/coreclr/vm/arm/asmconstants.h @@ -221,7 +221,7 @@ ASMCONSTANTS_C_ASSERT(OFFSETOF__Thread__m_pInterpThreadContext == offsetof(Threa #define OFFSETOF__InterpThreadContext__pStackPointer 0x8 ASMCONSTANTS_C_ASSERT(OFFSETOF__InterpThreadContext__pStackPointer == offsetof(InterpThreadContext, pStackPointer)) -#define OFFSETOF__CallStubHeader__Routines 0x10 +#define OFFSETOF__CallStubHeader__Routines 0x14 ASMCONSTANTS_C_ASSERT(OFFSETOF__CallStubHeader__Routines == offsetof(CallStubHeader, Routines)) #define SIZEOF__TransitionBlock 0x34 diff --git a/src/coreclr/vm/arm64/asmconstants.h b/src/coreclr/vm/arm64/asmconstants.h index 9f78786c3da059..98ecb5e4885309 100644 --- a/src/coreclr/vm/arm64/asmconstants.h +++ b/src/coreclr/vm/arm64/asmconstants.h @@ -318,6 +318,9 @@ ASMCONSTANTS_C_ASSERT(OFFSETOF__Thread__m_pInterpThreadContext == offsetof(Threa #define OFFSETOF__InterpThreadContext__pStackPointer 0x10 ASMCONSTANTS_C_ASSERT(OFFSETOF__InterpThreadContext__pStackPointer == offsetof(InterpThreadContext, pStackPointer)) +#define OFFSETOF__CallStubHeader__HasSwiftError 0x0D +ASMCONSTANTS_C_ASSERT(OFFSETOF__CallStubHeader__HasSwiftError == offsetof(CallStubHeader, HasSwiftError)) + #define OFFSETOF__CallStubHeader__Routines 0x18 ASMCONSTANTS_C_ASSERT(OFFSETOF__CallStubHeader__Routines == offsetof(CallStubHeader, Routines)) diff --git a/src/coreclr/vm/arm64/asmhelpers.S b/src/coreclr/vm/arm64/asmhelpers.S index 6e2c5bf3adbfe0..905614cbf60251 100644 --- a/src/coreclr/vm/arm64/asmhelpers.S +++ b/src/coreclr/vm/arm64/asmhelpers.S @@ -695,7 +695,7 @@ NESTED_ENTRY InterpreterStub, _TEXT, NoHandler mov x19, METHODDESC_REGISTER #ifdef TARGET_APPLE - mov x21, x0 + mov x22, x0 #endif INLINE_GETTHREAD x20 // thrashes x0 on Apple OSes (and possibly other arg registers on other Unixes) cbz x20, LOCAL_LABEL(NoManagedThreadOrCallStub) @@ -708,7 +708,7 @@ LOCAL_LABEL(NoManagedThreadOrCallStub): // GetInterpThreadContextWithPossiblyMissingThreadOrCallStub can destroy all argument registers, so we // need to save them. For non-Apple, they have been already saved in the PROLOG_WITH_TRANSITION_BLOCK // Restore x0 thrashed by the INLINE_GETTHREAD - mov x0, x21 + mov x0, x22 SAVE_ARGUMENT_REGISTERS sp, __PWTB_ArgumentRegisters SAVE_FLOAT_ARGUMENT_REGISTERS sp, __PWTB_FloatArgumentRegisters #endif @@ -729,12 +729,13 @@ LOCAL_LABEL(HaveInterpThreadContext): LOCAL_LABEL(HaveInterpThreadContext): // On Apple, the INLINE_GETTHREAD is guaranteed to not to thrash argument registers other than x0 // So we restore just the x0 - mov x0, x21 + mov x0, x22 #endif // TARGET_APPLE ldr x9, [x19] // InterpMethod* ldr x9, [x9, #OFFSETOF__InterpMethod__pCallStub] cbz x9, LOCAL_LABEL(NoManagedThreadOrCallStub) + mov x23, x9 // Save CallStubHeader* for later use add x10, x9, #OFFSETOF__CallStubHeader__Routines ldr x9, [x11, #OFFSETOF__InterpThreadContext__pStackPointer] // x19 contains IR bytecode address @@ -744,6 +745,11 @@ LOCAL_LABEL(HaveInterpThreadContext): // Fill in the ContinuationContext register ldr x2, [sp, #(__PWTB_ArgumentRegister_FirstArg + 16)] + // Check if this stub has Swift error handling + ldrb w11, [x23, #OFFSETOF__CallStubHeader__HasSwiftError] + cbz x11, LOCAL_LABEL(InterpreterStub_NoSwiftError) + EPILOG_WITH_TRANSITION_BLOCK_RETURN_SKIP_SWIFT_ERROR +LOCAL_LABEL(InterpreterStub_NoSwiftError): EPILOG_WITH_TRANSITION_BLOCK_RETURN NESTED_END InterpreterStub, _TEXT @@ -1165,6 +1171,183 @@ Store_Ref X5 Store_Ref X6 Store_Ref X7 +#ifdef TARGET_APPLE + +LEAF_ENTRY Load_SwiftSelf + ldr x20, [x9], #8 + ldr x11, [x10], #8 + EPILOG_BRANCH_REG x11 +LEAF_END Load_SwiftSelf + +LEAF_ENTRY Load_SwiftSelf_ByRef + mov x20, x9 + ldr x11, [x10], #8 + add x9, x9, x11 + ldr x11, [x10], #8 + EPILOG_BRANCH_REG x11 +LEAF_END Load_SwiftSelf_ByRef + +LEAF_ENTRY Load_SwiftError + ldr x11, [x9], #8 + str x11, [fp, #40] + mov x21, xzr + ldr x11, [x10], #8 + EPILOG_BRANCH_REG x11 +LEAF_END Load_SwiftError + +LEAF_ENTRY Load_SwiftIndirectResult + ldr x8, [x9], #8 + ldr x11, [x10], #8 + EPILOG_BRANCH_REG x11 +LEAF_END Load_SwiftIndirectResult + +.macro SwiftLoad_AtOffset reg + ldr x12, [x10], #8 // Load offset|struct_size + and w11, w12, #0xFFFF // Extract offset (lower 16 bits) + ldr \reg, [x9, x11] // Load from [x9 + offset] + lsr x12, x12, #16 // Shift to get struct_size + add x9, x9, x12 // Advance x9 by struct_size (no-op if zero) + ldr x11, [x10], #8 + EPILOG_BRANCH_REG x11 +.endm + +LEAF_ENTRY Load_X0_AtOffset + SwiftLoad_AtOffset x0 +LEAF_END Load_X0_AtOffset + +LEAF_ENTRY Load_X1_AtOffset + SwiftLoad_AtOffset x1 +LEAF_END Load_X1_AtOffset + +LEAF_ENTRY Load_X2_AtOffset + SwiftLoad_AtOffset x2 +LEAF_END Load_X2_AtOffset + +LEAF_ENTRY Load_X3_AtOffset + SwiftLoad_AtOffset x3 +LEAF_END Load_X3_AtOffset + +LEAF_ENTRY Load_X4_AtOffset + SwiftLoad_AtOffset x4 +LEAF_END Load_X4_AtOffset + +LEAF_ENTRY Load_X5_AtOffset + SwiftLoad_AtOffset x5 +LEAF_END Load_X5_AtOffset + +LEAF_ENTRY Load_X6_AtOffset + SwiftLoad_AtOffset x6 +LEAF_END Load_X6_AtOffset + +LEAF_ENTRY Load_X7_AtOffset + SwiftLoad_AtOffset x7 +LEAF_END Load_X7_AtOffset + +.macro SwiftLoadFloat_AtOffset reg + ldr x12, [x10], #8 // Load offset|struct_size + and w11, w12, #0xFFFF // Extract offset (lower 16 bits) + ldr \reg, [x9, x11] // Load float from [x9 + offset] + lsr x12, x12, #16 // Shift to get struct_size + add x9, x9, x12 // Advance x9 by struct_size (no-op if zero) + ldr x11, [x10], #8 + EPILOG_BRANCH_REG x11 +.endm + +LEAF_ENTRY Load_D0_AtOffset + SwiftLoadFloat_AtOffset d0 +LEAF_END Load_D0_AtOffset + +LEAF_ENTRY Load_D1_AtOffset + SwiftLoadFloat_AtOffset d1 +LEAF_END Load_D1_AtOffset + +LEAF_ENTRY Load_D2_AtOffset + SwiftLoadFloat_AtOffset d2 +LEAF_END Load_D2_AtOffset + +LEAF_ENTRY Load_D3_AtOffset + SwiftLoadFloat_AtOffset d3 +LEAF_END Load_D3_AtOffset + +LEAF_ENTRY Load_D4_AtOffset + SwiftLoadFloat_AtOffset d4 +LEAF_END Load_D4_AtOffset + +LEAF_ENTRY Load_D5_AtOffset + SwiftLoadFloat_AtOffset d5 +LEAF_END Load_D5_AtOffset + +LEAF_ENTRY Load_D6_AtOffset + SwiftLoadFloat_AtOffset d6 +LEAF_END Load_D6_AtOffset + +LEAF_ENTRY Load_D7_AtOffset + SwiftLoadFloat_AtOffset d7 +LEAF_END Load_D7_AtOffset + +LEAF_ENTRY Load_Stack_AtOffset + ldr x12, [x10], #8 // Load offset|structSize|stackOffset + and w11, w12, #0xFFFF // Extract offset (lower 16 bits) + ldr x13, [x9, x11] // Load 8 bytes from [x9 + offset] + lsr x14, x12, #32 // Extract stackOffset (upper 32 bits) + add x14, sp, x14 // Calculate stack destination + str x13, [x14] // Store to native stack + ubfx x12, x12, #16, #16 // Extract structSize (bits 16-31) + add x9, x9, x12 // Advance x9 by structSize (no-op if zero) + ldr x11, [x10], #8 + EPILOG_BRANCH_REG x11 +LEAF_END Load_Stack_AtOffset + +.macro SwiftStore_AtOffset reg + ldr x11, [x10], #8 + and w11, w11, #0xFFFF + str \reg, [x9, x11] + ldr x11, [x10], #8 + br x11 +.endm + +LEAF_ENTRY Store_X0_AtOffset + SwiftStore_AtOffset x0 +LEAF_END Store_X0_AtOffset + +LEAF_ENTRY Store_X1_AtOffset + SwiftStore_AtOffset x1 +LEAF_END Store_X1_AtOffset + +LEAF_ENTRY Store_X2_AtOffset + SwiftStore_AtOffset x2 +LEAF_END Store_X2_AtOffset + +LEAF_ENTRY Store_X3_AtOffset + SwiftStore_AtOffset x3 +LEAF_END Store_X3_AtOffset + +.macro SwiftStoreFloat_AtOffset reg + ldr x11, [x10], #8 + and w11, w11, #0xFFFF + str \reg, [x9, x11] + ldr x11, [x10], #8 + br x11 +.endm + +LEAF_ENTRY Store_D0_AtOffset + SwiftStoreFloat_AtOffset d0 +LEAF_END Store_D0_AtOffset + +LEAF_ENTRY Store_D1_AtOffset + SwiftStoreFloat_AtOffset d1 +LEAF_END Store_D1_AtOffset + +LEAF_ENTRY Store_D2_AtOffset + SwiftStoreFloat_AtOffset d2 +LEAF_END Store_D2_AtOffset + +LEAF_ENTRY Store_D3_AtOffset + SwiftStoreFloat_AtOffset d3 +LEAF_END Store_D3_AtOffset + +#endif // TARGET_APPLE + LEAF_ENTRY Store_X0 str x0, [x9], #8 ldr x11, [x10], #8 @@ -2303,17 +2486,26 @@ LEAF_END Load_Q1_Q2_Q3_Q4_Q5_Q6_Q7 // X3 - stack arguments size (properly aligned) // X4 - address of continuation return value NESTED_ENTRY CallJittedMethodRetVoid, _TEXT, NoHandler - PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32 + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -48 str x4, [fp, #16] +#ifdef TARGET_APPLE + str xzr, [fp, #40] +#endif sub sp, sp, x3 mov x10, x0 mov x9, x1 ldr x11, [x10], #8 blr x11 +#ifdef TARGET_APPLE + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRetVoid_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRetVoid_NoSwiftError): +#endif ldr x4, [fp, #16] str x2, [x4] EPILOG_STACK_RESTORE - EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 32 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 48 EPILOG_RETURN NESTED_END CallJittedMethodRetVoid, _TEXT @@ -2323,18 +2515,27 @@ NESTED_END CallJittedMethodRetVoid, _TEXT // X3 - stack arguments size (properly aligned) // X4 - address of continuation return value NESTED_ENTRY CallJittedMethodRetBuff, _TEXT, NoHandler - PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32 + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -48 str x4, [fp, #16] +#ifdef TARGET_APPLE + str xzr, [fp, #40] +#endif sub sp, sp, x3 mov x10, x0 mov x9, x1 mov x8, x2 ldr x11, [x10], #8 blr x11 +#ifdef TARGET_APPLE + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRetBuff_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRetBuff_NoSwiftError): +#endif ldr x4, [fp, #16] str x2, [x4] EPILOG_STACK_RESTORE - EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 32 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 48 EPILOG_RETURN NESTED_END CallJittedMethodRetBuff, _TEXT @@ -2344,20 +2545,29 @@ NESTED_END CallJittedMethodRetBuff, _TEXT // X3 - stack arguments size (properly aligned) // X4 - address of continuation return value NESTED_ENTRY CallJittedMethodRetI1, _TEXT, NoHandler - PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32 + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -48 stp x2, x4, [fp, #16] +#ifdef TARGET_APPLE + str xzr, [fp, #40] +#endif sub sp, sp, x3 mov x10, x0 mov x9, x1 ldr x11, [x10], #8 blr x11 +#ifdef TARGET_APPLE + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRetI1_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRetI1_NoSwiftError): +#endif sxtb x0, w0 ldr x9, [fp, #24] str x2, [x9] ldr x9, [fp, #16] str x0, [x9] EPILOG_STACK_RESTORE - EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 32 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 48 EPILOG_RETURN NESTED_END CallJittedMethodRetI1, _TEXT @@ -2367,20 +2577,29 @@ NESTED_END CallJittedMethodRetI1, _TEXT // X3 - stack arguments size (properly aligned) // X4 - address of continuation return value NESTED_ENTRY CallJittedMethodRetI2, _TEXT, NoHandler - PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32 + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -48 stp x2, x4, [fp, #16] +#ifdef TARGET_APPLE + str xzr, [fp, #40] +#endif sub sp, sp, x3 mov x10, x0 mov x9, x1 ldr x11, [x10], #8 blr x11 +#ifdef TARGET_APPLE + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRetI2_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRetI2_NoSwiftError): +#endif sxth x0, w0 ldr x9, [fp, #24] str x2, [x9] ldr x9, [fp, #16] str x0, [x9] EPILOG_STACK_RESTORE - EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 32 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 48 EPILOG_RETURN NESTED_END CallJittedMethodRetI2, _TEXT @@ -2390,19 +2609,28 @@ NESTED_END CallJittedMethodRetI2, _TEXT // X3 - stack arguments size (properly aligned) // X4 - address of continuation return value NESTED_ENTRY CallJittedMethodRetI8, _TEXT, NoHandler - PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32 + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -48 stp x2, x4, [fp, #16] +#ifdef TARGET_APPLE + str xzr, [fp, #40] +#endif sub sp, sp, x3 mov x10, x0 mov x9, x1 ldr x11, [x10], #8 blr x11 +#ifdef TARGET_APPLE + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRetI8_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRetI8_NoSwiftError): +#endif ldr x9, [fp, #24] str x2, [x9] ldr x9, [fp, #16] str x0, [x9] EPILOG_STACK_RESTORE - EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 32 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 48 EPILOG_RETURN NESTED_END CallJittedMethodRetI8, _TEXT @@ -2412,20 +2640,29 @@ NESTED_END CallJittedMethodRetI8, _TEXT // X3 - stack arguments size (properly aligned) // X4 - address of continuation return value NESTED_ENTRY CallJittedMethodRetU1, _TEXT, NoHandler - PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32 + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -48 stp x2, x4, [fp, #16] +#ifdef TARGET_APPLE + str xzr, [fp, #40] +#endif sub sp, sp, x3 mov x10, x0 mov x9, x1 ldr x11, [x10], #8 blr x11 +#ifdef TARGET_APPLE + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRetU1_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRetU1_NoSwiftError): +#endif uxtb x0, w0 ldr x9, [fp, #24] str x2, [x9] ldr x9, [fp, #16] str x0, [x9] EPILOG_STACK_RESTORE - EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 32 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 48 EPILOG_RETURN NESTED_END CallJittedMethodRetU1, _TEXT @@ -2435,20 +2672,29 @@ NESTED_END CallJittedMethodRetU1, _TEXT // X3 - stack arguments size (properly aligned) // X4 - address of continuation return value NESTED_ENTRY CallJittedMethodRetU2, _TEXT, NoHandler - PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32 + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -48 stp x2, x4, [fp, #16] +#ifdef TARGET_APPLE + str xzr, [fp, #40] +#endif sub sp, sp, x3 mov x10, x0 mov x9, x1 ldr x11, [x10], #8 blr x11 +#ifdef TARGET_APPLE + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRetU2_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRetU2_NoSwiftError): +#endif uxth x0, w0 ldr x9, [fp, #24] str x2, [x9] ldr x9, [fp, #16] str x0, [x9] EPILOG_STACK_RESTORE - EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 32 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 48 EPILOG_RETURN NESTED_END CallJittedMethodRetU2, _TEXT @@ -2458,19 +2704,28 @@ NESTED_END CallJittedMethodRetU2, _TEXT // X3 - stack arguments size (properly aligned) // X4 - address of continuation return value NESTED_ENTRY CallJittedMethodRet2I8, _TEXT, NoHandler - PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32 + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -48 stp x2, x4, [fp, #16] +#ifdef TARGET_APPLE + str xzr, [fp, #40] +#endif sub sp, sp, x3 mov x10, x0 mov x9, x1 ldr x11, [x10], #8 blr x11 +#ifdef TARGET_APPLE + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRet2I8_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRet2I8_NoSwiftError): +#endif ldr x9, [fp, #24] str x2, [x9] ldr x9, [fp, #16] stp x0, x1, [x9] EPILOG_STACK_RESTORE - EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 32 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 48 EPILOG_RETURN NESTED_END CallJittedMethodRet2I8, _TEXT @@ -2480,19 +2735,28 @@ NESTED_END CallJittedMethodRet2I8, _TEXT // X3 - stack arguments size (properly aligned) // X4 - address of continuation return value NESTED_ENTRY CallJittedMethodRetDouble, _TEXT, NoHandler - PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32 + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -48 stp x2, x4, [fp, #16] +#ifdef TARGET_APPLE + str xzr, [fp, #40] +#endif sub sp, sp, x3 mov x10, x0 mov x9, x1 ldr x11, [x10], #8 blr x11 +#ifdef TARGET_APPLE + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRetDouble_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRetDouble_NoSwiftError): +#endif ldr x9, [fp, #24] str x2, [x9] ldr x9, [fp, #16] str d0, [x9] EPILOG_STACK_RESTORE - EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 32 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 48 EPILOG_RETURN NESTED_END CallJittedMethodRetDouble, _TEXT @@ -2502,19 +2766,28 @@ NESTED_END CallJittedMethodRetDouble, _TEXT // X3 - stack arguments size (properly aligned) // X4 - address of continuation return value NESTED_ENTRY CallJittedMethodRet2Double, _TEXT, NoHandler - PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32 + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -48 stp x2, x4, [fp, #16] +#ifdef TARGET_APPLE + str xzr, [fp, #40] +#endif sub sp, sp, x3 mov x10, x0 mov x9, x1 ldr x11, [x10], #8 blr x11 +#ifdef TARGET_APPLE + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRet2Double_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRet2Double_NoSwiftError): +#endif ldr x9, [fp, #24] str x2, [x9] ldr x9, [fp, #16] stp d0, d1, [x9] EPILOG_STACK_RESTORE - EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 32 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 48 EPILOG_RETURN NESTED_END CallJittedMethodRet2Double, _TEXT @@ -2524,20 +2797,29 @@ NESTED_END CallJittedMethodRet2Double, _TEXT // X3 - stack arguments size (properly aligned) // X4 - address of continuation return value NESTED_ENTRY CallJittedMethodRet3Double, _TEXT, NoHandler - PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32 + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -48 stp x2, x4, [fp, #16] +#ifdef TARGET_APPLE + str xzr, [fp, #40] +#endif sub sp, sp, x3 mov x10, x0 mov x9, x1 ldr x11, [x10], #8 blr x11 +#ifdef TARGET_APPLE + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRet3Double_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRet3Double_NoSwiftError): +#endif ldr x9, [fp, #24] str x2, [x9] ldr x9, [fp, #16] stp d0, d1, [x9], #16 str d2, [x9] EPILOG_STACK_RESTORE - EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 32 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 48 EPILOG_RETURN NESTED_END CallJittedMethodRet3Double, _TEXT @@ -2547,20 +2829,29 @@ NESTED_END CallJittedMethodRet3Double, _TEXT // X3 - stack arguments size (properly aligned) // X4 - address of continuation return value NESTED_ENTRY CallJittedMethodRet4Double, _TEXT, NoHandler - PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32 + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -48 stp x2, x4, [fp, #16] +#ifdef TARGET_APPLE + str xzr, [fp, #40] +#endif sub sp, sp, x3 mov x10, x0 mov x9, x1 ldr x11, [x10], #8 blr x11 +#ifdef TARGET_APPLE + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRet4Double_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRet4Double_NoSwiftError): +#endif ldr x9, [fp, #24] str x2, [x9] ldr x9, [fp, #16] stp d0, d1, [x9], #16 stp d2, d3, [x9] EPILOG_STACK_RESTORE - EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 32 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 48 EPILOG_RETURN NESTED_END CallJittedMethodRet4Double, _TEXT @@ -2570,19 +2861,28 @@ NESTED_END CallJittedMethodRet4Double, _TEXT // X3 - stack arguments size (properly aligned) // X4 - address of continuation return value NESTED_ENTRY CallJittedMethodRetFloat, _TEXT, NoHandler - PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32 + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -48 stp x2, x4, [fp, #16] +#ifdef TARGET_APPLE + str xzr, [fp, #40] +#endif sub sp, sp, x3 mov x10, x0 mov x9, x1 ldr x11, [x10], #8 blr x11 +#ifdef TARGET_APPLE + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRetFloat_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRetFloat_NoSwiftError): +#endif ldr x9, [fp, #24] str x2, [x9] ldr x9, [fp, #16] str s0, [x9] EPILOG_STACK_RESTORE - EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 32 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 48 EPILOG_RETURN NESTED_END CallJittedMethodRetFloat, _TEXT @@ -2592,19 +2892,28 @@ NESTED_END CallJittedMethodRetFloat, _TEXT // X3 - stack arguments size (properly aligned) // X4 - address of continuation return value NESTED_ENTRY CallJittedMethodRet2Float, _TEXT, NoHandler - PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32 + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -48 stp x2, x4, [fp, #16] +#ifdef TARGET_APPLE + str xzr, [fp, #40] +#endif sub sp, sp, x3 mov x10, x0 mov x9, x1 ldr x11, [x10], #8 blr x11 +#ifdef TARGET_APPLE + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRet2Float_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRet2Float_NoSwiftError): +#endif ldr x9, [fp, #24] str x2, [x9] ldr x9, [fp, #16] stp s0, s1, [x9] EPILOG_STACK_RESTORE - EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 32 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 48 EPILOG_RETURN NESTED_END CallJittedMethodRet2Float, _TEXT @@ -2614,20 +2923,29 @@ NESTED_END CallJittedMethodRet2Float, _TEXT // X3 - stack arguments size (properly aligned) // X4 - address of continuation return value NESTED_ENTRY CallJittedMethodRet3Float, _TEXT, NoHandler - PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32 + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -48 stp x2, x4, [fp, #16] +#ifdef TARGET_APPLE + str xzr, [fp, #40] +#endif sub sp, sp, x3 mov x10, x0 mov x9, x1 ldr x11, [x10], #8 blr x11 +#ifdef TARGET_APPLE + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRet3Float_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRet3Float_NoSwiftError): +#endif ldr x9, [fp, #24] str x2, [x9] ldr x9, [fp, #16] stp s0, s1, [x9], #8 str s2, [x9] EPILOG_STACK_RESTORE - EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 32 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 48 EPILOG_RETURN NESTED_END CallJittedMethodRet3Float, _TEXT @@ -2637,20 +2955,29 @@ NESTED_END CallJittedMethodRet3Float, _TEXT // X3 - stack arguments size (properly aligned) // X4 - address of continuation return value NESTED_ENTRY CallJittedMethodRet4Float, _TEXT, NoHandler - PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32 + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -48 stp x2, x4, [fp, #16] +#ifdef TARGET_APPLE + str xzr, [fp, #40] +#endif sub sp, sp, x3 mov x10, x0 mov x9, x1 ldr x11, [x10], #8 blr x11 +#ifdef TARGET_APPLE + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRet4Float_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRet4Float_NoSwiftError): +#endif ldr x9, [fp, #24] str x2, [x9] ldr x9, [fp, #16] stp s0, s1, [x9], #8 stp s2, s3, [x9] EPILOG_STACK_RESTORE - EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 32 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 48 EPILOG_RETURN NESTED_END CallJittedMethodRet4Float, _TEXT @@ -2660,19 +2987,28 @@ NESTED_END CallJittedMethodRet4Float, _TEXT // X3 - stack arguments size (properly aligned) // X4 - address of continuation return value NESTED_ENTRY CallJittedMethodRetVector64, _TEXT, NoHandler - PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32 + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -48 stp x2, x4, [fp, #16] +#ifdef TARGET_APPLE + str xzr, [fp, #40] +#endif sub sp, sp, x3 mov x10, x0 mov x9, x1 ldr x11, [x10], #8 blr x11 +#ifdef TARGET_APPLE + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRetVector64_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRetVector64_NoSwiftError): +#endif ldr x9, [fp, #24] str x2, [x9] ldr x9, [fp, #16] str d0, [x9] EPILOG_STACK_RESTORE - EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 32 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 48 EPILOG_RETURN NESTED_END CallJittedMethodRetVector64, _TEXT @@ -2682,20 +3018,29 @@ NESTED_END CallJittedMethodRetVector64, _TEXT // X3 - stack arguments size (properly aligned) // X4 - address of continuation return value NESTED_ENTRY CallJittedMethodRet2Vector64, _TEXT, NoHandler - PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32 + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -48 stp x2, x4, [fp, #16] +#ifdef TARGET_APPLE + str xzr, [fp, #40] +#endif sub sp, sp, x3 mov x10, x0 mov x9, x1 ldr x11, [x10], #8 blr x11 +#ifdef TARGET_APPLE + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRet2Vector64_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRet2Vector64_NoSwiftError): +#endif ldr x9, [fp, #24] str x2, [x9] ldr x9, [fp, #16] str d0, [x9], #8 str d1, [x9] EPILOG_STACK_RESTORE - EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 32 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 48 EPILOG_RETURN NESTED_END CallJittedMethodRet2Vector64, _TEXT @@ -2705,13 +3050,22 @@ NESTED_END CallJittedMethodRet2Vector64, _TEXT // X3 - stack arguments size (properly aligned) // X4 - address of continuation return value NESTED_ENTRY CallJittedMethodRet3Vector64, _TEXT, NoHandler - PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32 + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -48 stp x2, x4, [fp, #16] +#ifdef TARGET_APPLE + str xzr, [fp, #40] +#endif sub sp, sp, x3 mov x10, x0 mov x9, x1 ldr x11, [x10], #8 blr x11 +#ifdef TARGET_APPLE + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRet3Vector64_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRet3Vector64_NoSwiftError): +#endif ldr x9, [fp, #24] str x2, [x9] ldr x9, [fp, #16] @@ -2719,7 +3073,7 @@ NESTED_ENTRY CallJittedMethodRet3Vector64, _TEXT, NoHandler str d1, [x9], #8 str d2, [x9] EPILOG_STACK_RESTORE - EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 32 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 48 EPILOG_RETURN NESTED_END CallJittedMethodRet3Vector64, _TEXT @@ -2729,13 +3083,22 @@ NESTED_END CallJittedMethodRet3Vector64, _TEXT // X3 - stack arguments size (properly aligned) // X4 - address of continuation return value NESTED_ENTRY CallJittedMethodRet4Vector64, _TEXT, NoHandler - PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32 + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -48 stp x2, x4, [fp, #16] +#ifdef TARGET_APPLE + str xzr, [fp, #40] +#endif sub sp, sp, x3 mov x10, x0 mov x9, x1 ldr x11, [x10], #8 blr x11 +#ifdef TARGET_APPLE + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRet4Vector64_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRet4Vector64_NoSwiftError): +#endif ldr x9, [fp, #24] str x2, [x9] ldr x9, [fp, #16] @@ -2744,7 +3107,7 @@ NESTED_ENTRY CallJittedMethodRet4Vector64, _TEXT, NoHandler str d2, [x9], #8 str d3, [x9] EPILOG_STACK_RESTORE - EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 32 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 48 EPILOG_RETURN NESTED_END CallJittedMethodRet4Vector64, _TEXT @@ -2754,19 +3117,28 @@ NESTED_END CallJittedMethodRet4Vector64, _TEXT // X3 - stack arguments size (properly aligned) // X4 - address of continuation return value NESTED_ENTRY CallJittedMethodRetVector128, _TEXT, NoHandler - PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32 + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -48 stp x2, x4, [fp, #16] +#ifdef TARGET_APPLE + str xzr, [fp, #40] +#endif sub sp, sp, x3 mov x10, x0 mov x9, x1 ldr x11, [x10], #8 blr x11 +#ifdef TARGET_APPLE + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRetVector128_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRetVector128_NoSwiftError): +#endif ldr x9, [fp, #24] str x2, [x9] ldr x9, [fp, #16] str q0, [x9] EPILOG_STACK_RESTORE - EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 32 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 48 EPILOG_RETURN NESTED_END CallJittedMethodRetVector128, _TEXT @@ -2776,20 +3148,29 @@ NESTED_END CallJittedMethodRetVector128, _TEXT // X3 - stack arguments size (properly aligned) // X4 - address of continuation return value NESTED_ENTRY CallJittedMethodRet2Vector128, _TEXT, NoHandler - PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32 + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -48 stp x2, x4, [fp, #16] +#ifdef TARGET_APPLE + str xzr, [fp, #40] +#endif sub sp, sp, x3 mov x10, x0 mov x9, x1 ldr x11, [x10], #8 blr x11 +#ifdef TARGET_APPLE + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRet2Vector128_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRet2Vector128_NoSwiftError): +#endif ldr x9, [fp, #24] str x2, [x9] ldr x9, [fp, #16] str q0, [x9], #16 str q1, [x9] EPILOG_STACK_RESTORE - EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 32 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 48 EPILOG_RETURN NESTED_END CallJittedMethodRet2Vector128, _TEXT @@ -2799,13 +3180,22 @@ NESTED_END CallJittedMethodRet2Vector128, _TEXT // X3 - stack arguments size (properly aligned) // X4 - address of continuation return value NESTED_ENTRY CallJittedMethodRet3Vector128, _TEXT, NoHandler - PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32 + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -48 stp x2, x4, [fp, #16] +#ifdef TARGET_APPLE + str xzr, [fp, #40] +#endif sub sp, sp, x3 mov x10, x0 mov x9, x1 ldr x11, [x10], #8 blr x11 +#ifdef TARGET_APPLE + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRet3Vector128_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRet3Vector128_NoSwiftError): +#endif ldr x9, [fp, #24] str x2, [x9] ldr x9, [fp, #16] @@ -2813,7 +3203,7 @@ NESTED_ENTRY CallJittedMethodRet3Vector128, _TEXT, NoHandler str q1, [x9], #16 str q2, [x9] EPILOG_STACK_RESTORE - EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 32 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 48 EPILOG_RETURN NESTED_END CallJittedMethodRet3Vector128, _TEXT @@ -2823,13 +3213,22 @@ NESTED_END CallJittedMethodRet3Vector128, _TEXT // X3 - stack arguments size (properly aligned) // X4 - address of continuation return value NESTED_ENTRY CallJittedMethodRet4Vector128, _TEXT, NoHandler - PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32 + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -48 stp x2, x4, [fp, #16] +#ifdef TARGET_APPLE + str xzr, [fp, #40] +#endif sub sp, sp, x3 mov x10, x0 mov x9, x1 ldr x11, [x10], #8 blr x11 +#ifdef TARGET_APPLE + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRet4Vector128_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRet4Vector128_NoSwiftError): +#endif ldr x9, [fp, #24] str x2, [x9] ldr x9, [fp, #16] @@ -2838,10 +3237,56 @@ NESTED_ENTRY CallJittedMethodRet4Vector128, _TEXT, NoHandler str q2, [x9], #16 str q3, [x9] EPILOG_STACK_RESTORE - EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 32 + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 48 EPILOG_RETURN NESTED_END CallJittedMethodRet4Vector128, _TEXT +#ifdef TARGET_APPLE + +// X0 - routines array +// X1 - interpreter stack args location +// X2 - interpreter stack return value location +// X3 - stack arguments size (properly aligned) +// X4 - address of continuation return value +NESTED_ENTRY CallJittedMethodRetSwiftLowered, _TEXT, NoHandler + PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -64 + stp x2, x4, [fp, #16] + str xzr, [fp, #40] + // Store the return address for the terminator to use + adr x11, LOCAL_LABEL(CallJittedMethodRetSwiftLowered_Epilog) + str x11, [fp, #32] + ldrsw x11, [x0, #-20] // Load TargetSlotIndex + add x11, x11, #1 // TargetSlotIndex + 1 + add x11, x0, x11, lsl #3 // x0 + (TargetSlotIndex + 1) * 8 + str x11, [fp, #56] // Save store routines start pointer + sub sp, sp, x3 + mov x10, x0 + mov x9, x1 + ldr x11, [x10], #8 + blr x11 + ldr x11, [fp, #40] + cbz x11, LOCAL_LABEL(CallJittedMethodRetSwiftLowered_NoSwiftError) + str x21, [x11] +LOCAL_LABEL(CallJittedMethodRetSwiftLowered_NoSwiftError): + ldr x12, [fp, #24] + str x2, [x12] // Store continuation return value + ldr x9, [fp, #16] // Load return buffer address into x9 + ldr x10, [fp, #56] // Load store routines start pointer + ldr x11, [x10], #8 // Load first store routine + br x11 +LOCAL_LABEL(CallJittedMethodRetSwiftLowered_Epilog): + EPILOG_STACK_RESTORE + EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 64 + EPILOG_RETURN +NESTED_END CallJittedMethodRetSwiftLowered, _TEXT + +// Terminator routine branches back to the epilog +LEAF_ENTRY SwiftLoweredReturnTerminator + ldr x11, [fp, #32] + br x11 +LEAF_END SwiftLoweredReturnTerminator + +#endif // TARGET_APPLE #endif // FEATURE_INTERPRETER diff --git a/src/coreclr/vm/callstubgenerator.cpp b/src/coreclr/vm/callstubgenerator.cpp index faea387d418ad9..9390fc04555f2d 100644 --- a/src/coreclr/vm/callstubgenerator.cpp +++ b/src/coreclr/vm/callstubgenerator.cpp @@ -3,6 +3,7 @@ #if defined(FEATURE_INTERPRETER) && !defined(TARGET_WASM) +#include "common.h" #include "callstubgenerator.h" #include "callconvbuilder.hpp" #include "ecall.h" @@ -80,102 +81,6 @@ extern "C" void Store_Ref_RDX(); extern "C" void Store_Ref_R8(); extern "C" void Store_Ref_R9(); -static const PCODE GPRegsRoutines[] = -{ - (PCODE)Load_RCX, // 00 - (PCODE)Load_RCX_RDX, // 01 - (PCODE)Load_RCX_RDX_R8, // 02 - (PCODE)Load_RCX_RDX_R8_R9, // 03 - (PCODE)0, // 10 - (PCODE)Load_RDX, // 11 - (PCODE)Load_RDX_R8, // 12 - (PCODE)Load_RDX_R8_R9, // 13 - (PCODE)0, // 20 - (PCODE)0, // 21 - (PCODE)Load_R8, // 22 - (PCODE)Load_R8_R9, // 23 - (PCODE)0, // 30 - (PCODE)0, // 31 - (PCODE)0, // 32 - (PCODE)Load_R9 // 33 -}; - -static const PCODE GPRegsStoreRoutines[] = -{ - (PCODE)Store_RCX, // 00 - (PCODE)Store_RCX_RDX, // 01 - (PCODE)Store_RCX_RDX_R8, // 02 - (PCODE)Store_RCX_RDX_R8_R9, // 03 - (PCODE)0, // 10 - (PCODE)Store_RDX, // 11 - (PCODE)Store_RDX_R8, // 12 - (PCODE)Store_RDX_R8_R9, // 13 - (PCODE)0, // 20 - (PCODE)0, // 21 - (PCODE)Store_R8, // 22 - (PCODE)Store_R8_R9, // 23 - (PCODE)0, // 30 - (PCODE)0, // 31 - (PCODE)0, // 32 - (PCODE)Store_R9 // 33 -}; - -static const PCODE GPRegsRefRoutines[] = -{ - (PCODE)Load_Ref_RCX, // 0 - (PCODE)Load_Ref_RDX, // 1 - (PCODE)Load_Ref_R8, // 2 - (PCODE)Load_Ref_R9, // 3 -}; - -static const PCODE GPRegsRefStoreRoutines[] = -{ - (PCODE)Store_Ref_RCX, // 0 - (PCODE)Store_Ref_RDX, // 1 - (PCODE)Store_Ref_R8, // 2 - (PCODE)Store_Ref_R9, // 3 -}; - -static const PCODE FPRegsRoutines[] = -{ - (PCODE)Load_XMM0, // 00 - (PCODE)Load_XMM0_XMM1, // 01 - (PCODE)Load_XMM0_XMM1_XMM2, // 02 - (PCODE)Load_XMM0_XMM1_XMM2_XMM3, // 03 - (PCODE)0, // 10 - (PCODE)Load_XMM1, // 11 - (PCODE)Load_XMM1_XMM2, // 12 - (PCODE)Load_XMM1_XMM2_XMM3, // 13 - (PCODE)0, // 20 - (PCODE)0, // 21 - (PCODE)Load_XMM2, // 22 - (PCODE)Load_XMM2_XMM3, // 23 - (PCODE)0, // 30 - (PCODE)0, // 31 - (PCODE)0, // 32 - (PCODE)Load_XMM3 // 33 -}; - -static const PCODE FPRegsStoreRoutines[] = -{ - (PCODE)Store_XMM0, // 00 - (PCODE)Store_XMM0_XMM1, // 01 - (PCODE)Store_XMM0_XMM1_XMM2, // 02 - (PCODE)Store_XMM0_XMM1_XMM2_XMM3, // 03 - (PCODE)0, // 10 - (PCODE)Store_XMM1, // 11 - (PCODE)Store_XMM1_XMM2, // 12 - (PCODE)Store_XMM1_XMM2_XMM3, // 13 - (PCODE)0, // 20 - (PCODE)0, // 21 - (PCODE)Store_XMM2, // 22 - (PCODE)Store_XMM2_XMM3, // 23 - (PCODE)0, // 30 - (PCODE)0, // 31 - (PCODE)0, // 32 - (PCODE)Store_XMM3 // 33 -}; - #else // TARGET_WINDOWS extern "C" void Load_RDI(); @@ -222,86 +127,6 @@ extern "C" void Store_R8(); extern "C" void Store_R8_R9(); extern "C" void Store_R9(); -static const PCODE GPRegsRoutines[] = -{ - (PCODE)Load_RDI, // 00 - (PCODE)Load_RDI_RSI, // 01 - (PCODE)Load_RDI_RSI_RDX, // 02 - (PCODE)Load_RDI_RSI_RDX_RCX, // 03 - (PCODE)Load_RDI_RSI_RDX_RCX_R8, // 04 - (PCODE)Load_RDI_RSI_RDX_RCX_R8_R9, // 05 - (PCODE)0, // 10 - (PCODE)Load_RSI, // 11 - (PCODE)Load_RSI_RDX, // 12 - (PCODE)Load_RSI_RDX_RCX, // 13 - (PCODE)Load_RSI_RDX_RCX_R8, // 14 - (PCODE)Load_RSI_RDX_RCX_R8_R9, // 15 - (PCODE)0, // 20 - (PCODE)0, // 21 - (PCODE)Load_RDX, // 22 - (PCODE)Load_RDX_RCX, // 23 - (PCODE)Load_RDX_RCX_R8, // 24 - (PCODE)Load_RDX_RCX_R8_R9, // 25 - (PCODE)0, // 30 - (PCODE)0, // 31 - (PCODE)0, // 32 - (PCODE)Load_RCX, // 33 - (PCODE)Load_RCX_R8, // 34 - (PCODE)Load_RCX_R8_R9, // 35 - (PCODE)0, // 40 - (PCODE)0, // 41 - (PCODE)0, // 42 - (PCODE)0, // 43 - (PCODE)Load_R8, // 44 - (PCODE)Load_R8_R9, // 45 - (PCODE)0, // 50 - (PCODE)0, // 51 - (PCODE)0, // 52 - (PCODE)0, // 53 - (PCODE)0, // 54 - (PCODE)Load_R9 // 55 -}; - -static const PCODE GPRegsStoreRoutines[] = -{ - (PCODE)Store_RDI, // 00 - (PCODE)Store_RDI_RSI, // 01 - (PCODE)Store_RDI_RSI_RDX, // 02 - (PCODE)Store_RDI_RSI_RDX_RCX, // 03 - (PCODE)Store_RDI_RSI_RDX_RCX_R8, // 04 - (PCODE)Store_RDI_RSI_RDX_RCX_R8_R9, // 05 - (PCODE)0, // 10 - (PCODE)Store_RSI, // 11 - (PCODE)Store_RSI_RDX, // 12 - (PCODE)Store_RSI_RDX_RCX, // 13 - (PCODE)Store_RSI_RDX_RCX_R8, // 14 - (PCODE)Store_RSI_RDX_RCX_R8_R9, // 15 - (PCODE)0, // 20 - (PCODE)0, // 21 - (PCODE)Store_RDX, // 22 - (PCODE)Store_RDX_RCX, // 23 - (PCODE)Store_RDX_RCX_R8, // 24 - (PCODE)Store_RDX_RCX_R8_R9, // 25 - (PCODE)0, // 30 - (PCODE)0, // 31 - (PCODE)0, // 32 - (PCODE)Store_RCX, // 33 - (PCODE)Store_RCX_R8, // 34 - (PCODE)Store_RCX_R8_R9, // 35 - (PCODE)0, // 40 - (PCODE)0, // 41 - (PCODE)0, // 42 - (PCODE)0, // 43 - (PCODE)Store_R8, // 44 - (PCODE)Store_R8_R9, // 45 - (PCODE)0, // 50 - (PCODE)0, // 51 - (PCODE)0, // 52 - (PCODE)0, // 53 - (PCODE)0, // 54 - (PCODE)Store_R9 // 55 -}; - extern "C" void Load_XMM0(); extern "C" void Load_XMM0_XMM1(); extern "C" void Load_XMM0_XMM1_XMM2(); @@ -376,142 +201,6 @@ extern "C" void Store_XMM6(); extern "C" void Store_XMM6_XMM7(); extern "C" void Store_XMM7(); -static const PCODE FPRegsRoutines[] = -{ - (PCODE)Load_XMM0, // 00 - (PCODE)Load_XMM0_XMM1, // 01 - (PCODE)Load_XMM0_XMM1_XMM2, // 02 - (PCODE)Load_XMM0_XMM1_XMM2_XMM3, // 03 - (PCODE)Load_XMM0_XMM1_XMM2_XMM3_XMM4, // 04 - (PCODE)Load_XMM0_XMM1_XMM2_XMM3_XMM4_XMM5, // 05 - (PCODE)Load_XMM0_XMM1_XMM2_XMM3_XMM4_XMM5_XMM6, // 06 - (PCODE)Load_XMM0_XMM1_XMM2_XMM3_XMM4_XMM5_XMM6_XMM7,// 07 - (PCODE)0, // 10 - (PCODE)Load_XMM1, // 11 - (PCODE)Load_XMM1_XMM2, // 12 - (PCODE)Load_XMM1_XMM2_XMM3, // 13 - (PCODE)Load_XMM1_XMM2_XMM3_XMM4, // 14 - (PCODE)Load_XMM1_XMM2_XMM3_XMM4_XMM5, // 15 - (PCODE)Load_XMM1_XMM2_XMM3_XMM4_XMM5_XMM6, // 16 - (PCODE)Load_XMM1_XMM2_XMM3_XMM4_XMM5_XMM6_XMM7, // 17 - (PCODE)0, // 20 - (PCODE)0, // 21 - (PCODE)Load_XMM2, // 22 - (PCODE)Load_XMM2_XMM3, // 23 - (PCODE)Load_XMM2_XMM3_XMM4, // 24 - (PCODE)Load_XMM2_XMM3_XMM4_XMM5, // 25 - (PCODE)Load_XMM2_XMM3_XMM4_XMM5_XMM6, // 26 - (PCODE)Load_XMM2_XMM3_XMM4_XMM5_XMM6_XMM7, // 27 - (PCODE)0, // 30 - (PCODE)0, // 31 - (PCODE)0, // 32 - (PCODE)Load_XMM3, // 33 - (PCODE)Load_XMM3_XMM4, // 34 - (PCODE)Load_XMM3_XMM4_XMM5, // 35 - (PCODE)Load_XMM3_XMM4_XMM5_XMM6, // 36 - (PCODE)Load_XMM3_XMM4_XMM5_XMM6_XMM7, // 37 - (PCODE)0, // 40 - (PCODE)0, // 41 - (PCODE)0, // 42 - (PCODE)0, // 43 - (PCODE)Load_XMM4, // 44 - (PCODE)Load_XMM4_XMM5, // 45 - (PCODE)Load_XMM4_XMM5_XMM6, // 46 - (PCODE)Load_XMM4_XMM5_XMM6_XMM7, // 47 - (PCODE)0, // 50 - (PCODE)0, // 51 - (PCODE)0, // 52 - (PCODE)0, // 53 - (PCODE)0, // 54 - (PCODE)Load_XMM5, // 55 - (PCODE)Load_XMM5_XMM6, // 56 - (PCODE)Load_XMM5_XMM6_XMM7, // 57 - (PCODE)0, // 60 - (PCODE)0, // 61 - (PCODE)0, // 62 - (PCODE)0, // 63 - (PCODE)0, // 64 - (PCODE)0, // 65 - (PCODE)Load_XMM6, // 66 - (PCODE)Load_XMM6_XMM7, // 67 - (PCODE)0, // 70 - (PCODE)0, // 71 - (PCODE)0, // 72 - (PCODE)0, // 73 - (PCODE)0, // 74 - (PCODE)0, // 75 - (PCODE)0, // 76 - (PCODE)Load_XMM7 // 77 -}; - -static const PCODE FPRegsStoreRoutines[] = -{ - (PCODE)Store_XMM0, // 00 - (PCODE)Store_XMM0_XMM1, // 01 - (PCODE)Store_XMM0_XMM1_XMM2, // 02 - (PCODE)Store_XMM0_XMM1_XMM2_XMM3, // 03 - (PCODE)Store_XMM0_XMM1_XMM2_XMM3_XMM4, // 04 - (PCODE)Store_XMM0_XMM1_XMM2_XMM3_XMM4_XMM5, // 05 - (PCODE)Store_XMM0_XMM1_XMM2_XMM3_XMM4_XMM5_XMM6, // 06 - (PCODE)Store_XMM0_XMM1_XMM2_XMM3_XMM4_XMM5_XMM6_XMM7,// 07 - (PCODE)0, // 10 - (PCODE)Store_XMM1, // 11 - (PCODE)Store_XMM1_XMM2, // 12 - (PCODE)Store_XMM1_XMM2_XMM3, // 13 - (PCODE)Store_XMM1_XMM2_XMM3_XMM4, // 14 - (PCODE)Store_XMM1_XMM2_XMM3_XMM4_XMM5, // 15 - (PCODE)Store_XMM1_XMM2_XMM3_XMM4_XMM5_XMM6, // 16 - (PCODE)Store_XMM1_XMM2_XMM3_XMM4_XMM5_XMM6_XMM7, // 17 - (PCODE)0, // 20 - (PCODE)0, // 21 - (PCODE)Store_XMM2, // 22 - (PCODE)Store_XMM2_XMM3, // 23 - (PCODE)Store_XMM2_XMM3_XMM4, // 24 - (PCODE)Store_XMM2_XMM3_XMM4_XMM5, // 25 - (PCODE)Store_XMM2_XMM3_XMM4_XMM5_XMM6, // 26 - (PCODE)Store_XMM2_XMM3_XMM4_XMM5_XMM6_XMM7, // 27 - (PCODE)0, // 30 - (PCODE)0, // 31 - (PCODE)0, // 32 - (PCODE)Store_XMM3, // 33 - (PCODE)Store_XMM3_XMM4, // 34 - (PCODE)Store_XMM3_XMM4_XMM5, // 35 - (PCODE)Store_XMM3_XMM4_XMM5_XMM6, // 36 - (PCODE)Store_XMM3_XMM4_XMM5_XMM6_XMM7, // 37 - (PCODE)0, // 40 - (PCODE)0, // 41 - (PCODE)0, // 42 - (PCODE)0, // 43 - (PCODE)Store_XMM4, // 44 - (PCODE)Store_XMM4_XMM5, // 45 - (PCODE)Store_XMM4_XMM5_XMM6, // 46 - (PCODE)Store_XMM4_XMM5_XMM6_XMM7, // 47 - (PCODE)0, // 50 - (PCODE)0, // 51 - (PCODE)0, // 52 - (PCODE)0, // 53 - (PCODE)0, // 54 - (PCODE)Store_XMM5, // 55 - (PCODE)Store_XMM5_XMM6, // 56 - (PCODE)Store_XMM5_XMM6_XMM7, // 57 - (PCODE)0, // 60 - (PCODE)0, // 61 - (PCODE)0, // 62 - (PCODE)0, // 63 - (PCODE)0, // 64 - (PCODE)0, // 65 - (PCODE)Store_XMM6, // 66 - (PCODE)Store_XMM6_XMM7, // 67 - (PCODE)0, // 70 - (PCODE)0, // 71 - (PCODE)0, // 72 - (PCODE)0, // 73 - (PCODE)0, // 74 - (PCODE)0, // 75 - (PCODE)0, // 76 - (PCODE)Store_XMM7 // 77 -}; - #endif // TARGET_WINDOWS #endif // TARGET_AMD64 @@ -592,6 +281,41 @@ extern "C" void Store_X6(); extern "C" void Store_X6_X7(); extern "C" void Store_X7(); +#if defined(TARGET_APPLE) +extern "C" void Load_SwiftSelf(); +extern "C" void Load_SwiftSelf_ByRef(); +extern "C" void Load_SwiftError(); +extern "C" void Load_SwiftIndirectResult(); + +extern "C" void Load_X0_AtOffset(); +extern "C" void Load_X1_AtOffset(); +extern "C" void Load_X2_AtOffset(); +extern "C" void Load_X3_AtOffset(); +extern "C" void Load_X4_AtOffset(); +extern "C" void Load_X5_AtOffset(); +extern "C" void Load_X6_AtOffset(); +extern "C" void Load_X7_AtOffset(); +extern "C" void Load_D0_AtOffset(); +extern "C" void Load_D1_AtOffset(); +extern "C" void Load_D2_AtOffset(); +extern "C" void Load_D3_AtOffset(); +extern "C" void Load_D4_AtOffset(); +extern "C" void Load_D5_AtOffset(); +extern "C" void Load_D6_AtOffset(); +extern "C" void Load_D7_AtOffset(); +extern "C" void Load_Stack_AtOffset(); + +extern "C" void Store_X0_AtOffset(); +extern "C" void Store_X1_AtOffset(); +extern "C" void Store_X2_AtOffset(); +extern "C" void Store_X3_AtOffset(); +extern "C" void Store_D0_AtOffset(); +extern "C" void Store_D1_AtOffset(); +extern "C" void Store_D2_AtOffset(); +extern "C" void Store_D3_AtOffset(); +extern "C" void SwiftLoweredReturnTerminator(); +#endif // TARGET_APPLE + extern "C" void Load_Ref_X0(); extern "C" void Load_Ref_X1(); extern "C" void Load_Ref_X2(); @@ -610,166 +334,6 @@ extern "C" void Store_Ref_X5(); extern "C" void Store_Ref_X6(); extern "C" void Store_Ref_X7(); -static const PCODE GPRegsRoutines[] = -{ - (PCODE)Load_X0, // 00 - (PCODE)Load_X0_X1, // 01 - (PCODE)Load_X0_X1_X2, // 02 - (PCODE)Load_X0_X1_X2_X3, // 03 - (PCODE)Load_X0_X1_X2_X3_X4, // 04 - (PCODE)Load_X0_X1_X2_X3_X4_X5, // 05 - (PCODE)Load_X0_X1_X2_X3_X4_X5_X6, // 06 - (PCODE)Load_X0_X1_X2_X3_X4_X5_X6_X7, // 07 - (PCODE)0, // 10 - (PCODE)Load_X1, // 11 - (PCODE)Load_X1_X2, // 12 - (PCODE)Load_X1_X2_X3, // 13 - (PCODE)Load_X1_X2_X3_X4, // 14 - (PCODE)Load_X1_X2_X3_X4_X5, // 15 - (PCODE)Load_X1_X2_X3_X4_X5_X6, // 16 - (PCODE)Load_X1_X2_X3_X4_X5_X6_X7, // 17 - (PCODE)0, // 20 - (PCODE)0, // 21 - (PCODE)Load_X2, // 22 - (PCODE)Load_X2_X3, // 23 - (PCODE)Load_X2_X3_X4, // 24 - (PCODE)Load_X2_X3_X4_X5, // 25 - (PCODE)Load_X2_X3_X4_X5_X6, // 26 - (PCODE)Load_X2_X3_X4_X5_X6_X7, // 27 - (PCODE)0, // 30 - (PCODE)0, // 31 - (PCODE)0, // 32 - (PCODE)Load_X3, // 33 - (PCODE)Load_X3_X4, // 34 - (PCODE)Load_X3_X4_X5, // 35 - (PCODE)Load_X3_X4_X5_X6, // 36 - (PCODE)Load_X3_X4_X5_X6_X7, // 37 - (PCODE)0, // 40 - (PCODE)0, // 41 - (PCODE)0, // 42 - (PCODE)0, // 43 - (PCODE)Load_X4, // 44 - (PCODE)Load_X4_X5, // 45 - (PCODE)Load_X4_X5_X6, // 46 - (PCODE)Load_X4_X5_X6_X7, // 47 - (PCODE)0, // 50 - (PCODE)0, // 51 - (PCODE)0, // 52 - (PCODE)0, // 53 - (PCODE)0, // 54 - (PCODE)Load_X5, // 55 - (PCODE)Load_X5_X6, // 56 - (PCODE)Load_X5_X6_X7, // 57 - (PCODE)0, // 60 - (PCODE)0, // 61 - (PCODE)0, // 62 - (PCODE)0, // 63 - (PCODE)0, // 64 - (PCODE)0, // 65 - (PCODE)Load_X6, // 66 - (PCODE)Load_X6_X7, // 67 - (PCODE)0, // 70 - (PCODE)0, // 71 - (PCODE)0, // 72 - (PCODE)0, // 73 - (PCODE)0, // 74 - (PCODE)0, // 75 - (PCODE)0, // 76 - (PCODE)Load_X7 // 77 -}; - -static const PCODE GPRegsStoreRoutines[] = -{ - (PCODE)Store_X0, // 00 - (PCODE)Store_X0_X1, // 01 - (PCODE)Store_X0_X1_X2, // 02 - (PCODE)Store_X0_X1_X2_X3, // 03 - (PCODE)Store_X0_X1_X2_X3_X4, // 04 - (PCODE)Store_X0_X1_X2_X3_X4_X5, // 05 - (PCODE)Store_X0_X1_X2_X3_X4_X5_X6, // 06 - (PCODE)Store_X0_X1_X2_X3_X4_X5_X6_X7, // 07 - (PCODE)0, // 10 - (PCODE)Store_X1, // 11 - (PCODE)Store_X1_X2, // 12 - (PCODE)Store_X1_X2_X3, // 13 - (PCODE)Store_X1_X2_X3_X4, // 14 - (PCODE)Store_X1_X2_X3_X4_X5, // 15 - (PCODE)Store_X1_X2_X3_X4_X5_X6, // 16 - (PCODE)Store_X1_X2_X3_X4_X5_X6_X7, // 17 - (PCODE)0, // 20 - (PCODE)0, // 21 - (PCODE)Store_X2, // 22 - (PCODE)Store_X2_X3, // 23 - (PCODE)Store_X2_X3_X4, // 24 - (PCODE)Store_X2_X3_X4_X5, // 25 - (PCODE)Store_X2_X3_X4_X5_X6, // 26 - (PCODE)Store_X2_X3_X4_X5_X6_X7, // 27 - (PCODE)0, // 30 - (PCODE)0, // 31 - (PCODE)0, // 32 - (PCODE)Store_X3, // 33 - (PCODE)Store_X3_X4, // 34 - (PCODE)Store_X3_X4_X5, // 35 - (PCODE)Store_X3_X4_X5_X6, // 36 - (PCODE)Store_X3_X4_X5_X6_X7, // 37 - (PCODE)0, // 40 - (PCODE)0, // 41 - (PCODE)0, // 42 - (PCODE)0, // 43 - (PCODE)Store_X4, // 44 - (PCODE)Store_X4_X5, // 45 - (PCODE)Store_X4_X5_X6, // 46 - (PCODE)Store_X4_X5_X6_X7, // 47 - (PCODE)0, // 50 - (PCODE)0, // 51 - (PCODE)0, // 52 - (PCODE)0, // 53 - (PCODE)0, // 54 - (PCODE)Store_X5, // 55 - (PCODE)Store_X5_X6, // 56 - (PCODE)Store_X5_X6_X7, // 57 - (PCODE)0, // 60 - (PCODE)0, // 61 - (PCODE)0, // 62 - (PCODE)0, // 63 - (PCODE)0, // 64 - (PCODE)0, // 65 - (PCODE)Store_X6, // 66 - (PCODE)Store_X6_X7, // 67 - (PCODE)0, // 70 - (PCODE)0, // 71 - (PCODE)0, // 72 - (PCODE)0, // 73 - (PCODE)0, // 74 - (PCODE)0, // 75 - (PCODE)0, // 76 - (PCODE)Store_X7 // 77 -}; - -static const PCODE GPRegsRefRoutines[] = -{ - (PCODE)Load_Ref_X0, // 0 - (PCODE)Load_Ref_X1, // 1 - (PCODE)Load_Ref_X2, // 2 - (PCODE)Load_Ref_X3, // 3 - (PCODE)Load_Ref_X4, // 4 - (PCODE)Load_Ref_X5, // 5 - (PCODE)Load_Ref_X6, // 6 - (PCODE)Load_Ref_X7 // 7 -}; - -static const PCODE GPRegsRefStoreRoutines[] = -{ - (PCODE)Store_Ref_X0, // 0 - (PCODE)Store_Ref_X1, // 1 - (PCODE)Store_Ref_X2, // 2 - (PCODE)Store_Ref_X3, // 3 - (PCODE)Store_Ref_X4, // 4 - (PCODE)Store_Ref_X5, // 5 - (PCODE)Store_Ref_X6, // 6 - (PCODE)Store_Ref_X7 // 7 -}; - extern "C" void Load_D0(); extern "C" void Load_D0_D1(); extern "C" void Load_D0_D1_D2(); @@ -994,414 +558,6 @@ extern "C" void Store_S6(); extern "C" void Store_S6_S7(); extern "C" void Store_S7(); -static const PCODE FPRegsStoreRoutines[] = -{ - (PCODE)Store_D0, // 00 - (PCODE)Store_D0_D1, // 01 - (PCODE)Store_D0_D1_D2, // 02 - (PCODE)Store_D0_D1_D2_D3, // 03 - (PCODE)Store_D0_D1_D2_D3_D4, // 04 - (PCODE)Store_D0_D1_D2_D3_D4_D5, // 05 - (PCODE)Store_D0_D1_D2_D3_D4_D5_D6, // 06 - (PCODE)Store_D0_D1_D2_D3_D4_D5_D6_D7, // 07 - (PCODE)0, // 10 - (PCODE)Store_D1, // 11 - (PCODE)Store_D1_D2, // 12 - (PCODE)Store_D1_D2_D3, // 13 - (PCODE)Store_D1_D2_D3_D4, // 14 - (PCODE)Store_D1_D2_D3_D4_D5, // 15 - (PCODE)Store_D1_D2_D3_D4_D5_D6, // 16 - (PCODE)Store_D1_D2_D3_D4_D5_D6_D7, // 17 - (PCODE)0, // 20 - (PCODE)0, // 21 - (PCODE)Store_D2, // 22 - (PCODE)Store_D2_D3, // 23 - (PCODE)Store_D2_D3_D4, // 24 - (PCODE)Store_D2_D3_D4_D5, // 25 - (PCODE)Store_D2_D3_D4_D5_D6, // 26 - (PCODE)Store_D2_D3_D4_D5_D6_D7, // 27 - (PCODE)0, // 30 - (PCODE)0, // 31 - (PCODE)0, // 32 - (PCODE)Store_D3, // 33 - (PCODE)Store_D3_D4, // 34 - (PCODE)Store_D3_D4_D5, // 35 - (PCODE)Store_D3_D4_D5_D6, // 36 - (PCODE)Store_D3_D4_D5_D6_D7, // 37 - (PCODE)0, // 40 - (PCODE)0, // 41 - (PCODE)0, // 42 - (PCODE)0, // 43 - (PCODE)Store_D4, // 44 - (PCODE)Store_D4_D5, // 45 - (PCODE)Store_D4_D5_D6, // 46 - (PCODE)Store_D4_D5_D6_D7, // 47 - (PCODE)0, // 50 - (PCODE)0, // 51 - (PCODE)0, // 52 - (PCODE)0, // 53 - (PCODE)0, // 54 - (PCODE)Store_D5, // 55 - (PCODE)Store_D5_D6, // 56 - (PCODE)Store_D5_D6_D7, // 57 - (PCODE)0, // 60 - (PCODE)0, // 61 - (PCODE)0, // 62 - (PCODE)0, // 63 - (PCODE)0, // 64 - (PCODE)0, // 65 - (PCODE)Store_D6, // 66 - (PCODE)Store_D6_D7, // 67 - (PCODE)0, // 70 - (PCODE)0, // 71 - (PCODE)0, // 72 - (PCODE)0, // 73 - (PCODE)0, // 74 - (PCODE)0, // 75 - (PCODE)0, // 76 - (PCODE)Store_D7 // 77 -}; - -static const PCODE FPRegsRoutines[] = -{ - (PCODE)Load_D0, // 00 - (PCODE)Load_D0_D1, // 01 - (PCODE)Load_D0_D1_D2, // 02 - (PCODE)Load_D0_D1_D2_D3, // 03 - (PCODE)Load_D0_D1_D2_D3_D4, // 04 - (PCODE)Load_D0_D1_D2_D3_D4_D5, // 05 - (PCODE)Load_D0_D1_D2_D3_D4_D5_D6, // 06 - (PCODE)Load_D0_D1_D2_D3_D4_D5_D6_D7, // 07 - (PCODE)0, // 10 - (PCODE)Load_D1, // 11 - (PCODE)Load_D1_D2, // 12 - (PCODE)Load_D1_D2_D3, // 13 - (PCODE)Load_D1_D2_D3_D4, // 14 - (PCODE)Load_D1_D2_D3_D4_D5, // 15 - (PCODE)Load_D1_D2_D3_D4_D5_D6, // 16 - (PCODE)Load_D1_D2_D3_D4_D5_D6_D7, // 17 - (PCODE)0, // 20 - (PCODE)0, // 21 - (PCODE)Load_D2, // 22 - (PCODE)Load_D2_D3, // 23 - (PCODE)Load_D2_D3_D4, // 24 - (PCODE)Load_D2_D3_D4_D5, // 25 - (PCODE)Load_D2_D3_D4_D5_D6, // 26 - (PCODE)Load_D2_D3_D4_D5_D6_D7, // 27 - (PCODE)0, // 30 - (PCODE)0, // 31 - (PCODE)0, // 32 - (PCODE)Load_D3, // 33 - (PCODE)Load_D3_D4, // 34 - (PCODE)Load_D3_D4_D5, // 35 - (PCODE)Load_D3_D4_D5_D6, // 36 - (PCODE)Load_D3_D4_D5_D6_D7, // 37 - (PCODE)0, // 40 - (PCODE)0, // 41 - (PCODE)0, // 42 - (PCODE)0, // 43 - (PCODE)Load_D4, // 44 - (PCODE)Load_D4_D5, // 45 - (PCODE)Load_D4_D5_D6, // 46 - (PCODE)Load_D4_D5_D6_D7, // 47 - (PCODE)0, // 50 - (PCODE)0, // 51 - (PCODE)0, // 52 - (PCODE)0, // 53 - (PCODE)0, // 54 - (PCODE)Load_D5, // 55 - (PCODE)Load_D5_D6, // 56 - (PCODE)Load_D5_D6_D7, // 57 - (PCODE)0, // 60 - (PCODE)0, // 61 - (PCODE)0, // 62 - (PCODE)0, // 63 - (PCODE)0, // 64 - (PCODE)0, // 65 - (PCODE)Load_D6, // 66 - (PCODE)Load_D6_D7, // 67 - (PCODE)0, // 70 - (PCODE)0, // 71 - (PCODE)0, // 72 - (PCODE)0, // 73 - (PCODE)0, // 74 - (PCODE)0, // 75 - (PCODE)0, // 76 - (PCODE)Load_D7 // 77 -}; - -PCODE FPRegs128StoreRoutines[] = -{ - (PCODE)Store_Q0, // 00 - (PCODE)Store_Q0_Q1, // 01 - (PCODE)Store_Q0_Q1_Q2, // 02 - (PCODE)Store_Q0_Q1_Q2_Q3, // 03 - (PCODE)Store_Q0_Q1_Q2_Q3_Q4, // 04 - (PCODE)Store_Q0_Q1_Q2_Q3_Q4_Q5, // 05 - (PCODE)Store_Q0_Q1_Q2_Q3_Q4_Q5_Q6, // 06 - (PCODE)Store_Q0_Q1_Q2_Q3_Q4_Q5_Q6_Q7, // 07 - (PCODE)0, // 10 - (PCODE)Store_Q1, // 11 - (PCODE)Store_Q1_Q2, // 12 - (PCODE)Store_Q1_Q2_Q3, // 13 - (PCODE)Store_Q1_Q2_Q3_Q4, // 14 - (PCODE)Store_Q1_Q2_Q3_Q4_Q5, // 15 - (PCODE)Store_Q1_Q2_Q3_Q4_Q5_Q6, // 16 - (PCODE)Store_Q1_Q2_Q3_Q4_Q5_Q6_Q7, // 17 - (PCODE)0, // 20 - (PCODE)0, // 21 - (PCODE)Store_Q2, // 22 - (PCODE)Store_Q2_Q3, // 23 - (PCODE)Store_Q2_Q3_Q4, // 24 - (PCODE)Store_Q2_Q3_Q4_Q5, // 25 - (PCODE)Store_Q2_Q3_Q4_Q5_Q6, // 26 - (PCODE)Store_Q2_Q3_Q4_Q5_Q6_Q7, // 27 - (PCODE)0, // 30 - (PCODE)0, // 31 - (PCODE)0, // 32 - (PCODE)Store_Q3, // 33 - (PCODE)Store_Q3_Q4, // 34 - (PCODE)Store_Q3_Q4_Q5, // 35 - (PCODE)Store_Q3_Q4_Q5_Q6, // 36 - (PCODE)Store_Q3_Q4_Q5_Q6_Q7, // 37 - (PCODE)0, // 40 - (PCODE)0, // 41 - (PCODE)0, // 42 - (PCODE)0, // 43 - (PCODE)Store_Q4, // 44 - (PCODE)Store_Q4_Q5, // 45 - (PCODE)Store_Q4_Q5_Q6, // 46 - (PCODE)Store_Q4_Q5_Q6_Q7, // 47 - (PCODE)0, // 50 - (PCODE)0, // 51 - (PCODE)0, // 52 - (PCODE)0, // 53 - (PCODE)0, // 54 - (PCODE)Store_Q5, // 55 - (PCODE)Store_Q5_Q6, // 56 - (PCODE)Store_Q5_Q6_Q7, // 57 - (PCODE)0, // 60 - (PCODE)0, // 61 - (PCODE)0, // 62 - (PCODE)0, // 63 - (PCODE)0, // 64 - (PCODE)0, // 65 - (PCODE)Store_Q6, // 66 - (PCODE)Store_Q6_Q7, // 67 - (PCODE)0, // 70 - (PCODE)0, // 71 - (PCODE)0, // 72 - (PCODE)0, // 73 - (PCODE)0, // 74 - (PCODE)0, // 75 - (PCODE)0, // 76 - (PCODE)Store_Q7 // 77 -}; - -static const PCODE FPRegs128LoadRoutines[] = -{ - (PCODE)Load_Q0, // 00 - (PCODE)Load_Q0_Q1, // 01 - (PCODE)Load_Q0_Q1_Q2, // 02 - (PCODE)Load_Q0_Q1_Q2_Q3, // 03 - (PCODE)Load_Q0_Q1_Q2_Q3_Q4, // 04 - (PCODE)Load_Q0_Q1_Q2_Q3_Q4_Q5, // 05 - (PCODE)Load_Q0_Q1_Q2_Q3_Q4_Q5_Q6, // 06 - (PCODE)Load_Q0_Q1_Q2_Q3_Q4_Q5_Q6_Q7, // 07 - (PCODE)0, // 10 - (PCODE)Load_Q1, // 11 - (PCODE)Load_Q1_Q2, // 12 - (PCODE)Load_Q1_Q2_Q3, // 13 - (PCODE)Load_Q1_Q2_Q3_Q4, // 14 - (PCODE)Load_Q1_Q2_Q3_Q4_Q5, // 15 - (PCODE)Load_Q1_Q2_Q3_Q4_Q5_Q6, // 16 - (PCODE)Load_Q1_Q2_Q3_Q4_Q5_Q6_Q7, // 17 - (PCODE)0, // 20 - (PCODE)0, // 21 - (PCODE)Load_Q2, // 22 - (PCODE)Load_Q2_Q3, // 23 - (PCODE)Load_Q2_Q3_Q4, // 24 - (PCODE)Load_Q2_Q3_Q4_Q5, // 25 - (PCODE)Load_Q2_Q3_Q4_Q5_Q6, // 26 - (PCODE)Load_Q2_Q3_Q4_Q5_Q6_Q7, // 27 - (PCODE)0, // 30 - (PCODE)0, // 31 - (PCODE)0, // 32 - (PCODE)Load_Q3, // 33 - (PCODE)Load_Q3_Q4, // 34 - (PCODE)Load_Q3_Q4_Q5, // 35 - (PCODE)Load_Q3_Q4_Q5_Q6, // 36 - (PCODE)Load_Q3_Q4_Q5_Q6_Q7, // 37 - (PCODE)0, // 40 - (PCODE)0, // 41 - (PCODE)0, // 42 - (PCODE)0, // 43 - (PCODE)Load_Q4, // 44 - (PCODE)Load_Q4_Q5, // 45 - (PCODE)Load_Q4_Q5_Q6, // 46 - (PCODE)Load_Q4_Q5_Q6_Q7, // 47 - (PCODE)0, // 50 - (PCODE)0, // 51 - (PCODE)0, // 52 - (PCODE)0, // 53 - (PCODE)0, // 54 - (PCODE)Load_Q5, // 55 - (PCODE)Load_Q5_Q6, // 56 - (PCODE)Load_Q5_Q6_Q7, // 57 - (PCODE)0, // 60 - (PCODE)0, // 61 - (PCODE)0, // 62 - (PCODE)0, // 63 - (PCODE)0, // 64 - (PCODE)0, // 65 - (PCODE)Load_Q6, // 66 - (PCODE)Load_Q6_Q7, // 67 - (PCODE)0, // 70 - (PCODE)0, // 71 - (PCODE)0, // 72 - (PCODE)0, // 73 - (PCODE)0, // 74 - (PCODE)0, // 75 - (PCODE)0, // 76 - (PCODE)Load_Q7 // 77 -}; - -static const PCODE FPRegs32StoreRoutines[] = -{ - (PCODE)Store_S0, // 00 - (PCODE)Store_S0_S1, // 01 - (PCODE)Store_S0_S1_S2, // 02 - (PCODE)Store_S0_S1_S2_S3, // 03 - (PCODE)Store_S0_S1_S2_S3_S4, // 04 - (PCODE)Store_S0_S1_S2_S3_S4_S5, // 05 - (PCODE)Store_S0_S1_S2_S3_S4_S5_S6, // 06 - (PCODE)Store_S0_S1_S2_S3_S4_S5_S6_S7, // 07 - (PCODE)0, // 10 - (PCODE)Store_S1, // 11 - (PCODE)Store_S1_S2, // 12 - (PCODE)Store_S1_S2_S3, // 13 - (PCODE)Store_S1_S2_S3_S4, // 14 - (PCODE)Store_S1_S2_S3_S4_S5, // 15 - (PCODE)Store_S1_S2_S3_S4_S5_S6, // 16 - (PCODE)Store_S1_S2_S3_S4_S5_S6_S7, // 17 - (PCODE)0, // 20 - (PCODE)0, // 21 - (PCODE)Store_S2, // 22 - (PCODE)Store_S2_S3, // 23 - (PCODE)Store_S2_S3_S4, // 24 - (PCODE)Store_S2_S3_S4_S5, // 25 - (PCODE)Store_S2_S3_S4_S5_S6, // 26 - (PCODE)Store_S2_S3_S4_S5_S6_S7, // 27 - (PCODE)0, // 30 - (PCODE)0, // 31 - (PCODE)0, // 32 - (PCODE)Store_S3, // 33 - (PCODE)Store_S3_S4, // 34 - (PCODE)Store_S3_S4_S5, // 35 - (PCODE)Store_S3_S4_S5_S6, // 36 - (PCODE)Store_S3_S4_S5_S6_S7, // 37 - (PCODE)0, // 40 - (PCODE)0, // 41 - (PCODE)0, // 42 - (PCODE)0, // 43 - (PCODE)Store_S4, // 44 - (PCODE)Store_S4_S5, // 45 - (PCODE)Store_S4_S5_S6, // 46 - (PCODE)Store_S4_S5_S6_S7, // 47 - (PCODE)0, // 50 - (PCODE)0, // 51 - (PCODE)0, // 52 - (PCODE)0, // 53 - (PCODE)0, // 54 - (PCODE)Store_S5, // 55 - (PCODE)Store_S5_S6, // 56 - (PCODE)Store_S5_S6_S7, // 57 - (PCODE)0, // 60 - (PCODE)0, // 61 - (PCODE)0, // 62 - (PCODE)0, // 63 - (PCODE)0, // 64 - (PCODE)0, // 65 - (PCODE)Store_S6, // 66 - (PCODE)Store_S6_S7, // 67 - (PCODE)0, // 70 - (PCODE)0, // 71 - (PCODE)0, // 72 - (PCODE)0, // 73 - (PCODE)0, // 74 - (PCODE)0, // 75 - (PCODE)0, // 76 - (PCODE)Store_S7 // 77 -}; - -static const PCODE FPRegs32LoadRoutines[] = -{ - (PCODE)Load_S0, // 00 - (PCODE)Load_S0_S1, // 01 - (PCODE)Load_S0_S1_S2, // 02 - (PCODE)Load_S0_S1_S2_S3, // 03 - (PCODE)Load_S0_S1_S2_S3_S4, // 04 - (PCODE)Load_S0_S1_S2_S3_S4_S5, // 05 - (PCODE)Load_S0_S1_S2_S3_S4_S5_S6, // 06 - (PCODE)Load_S0_S1_S2_S3_S4_S5_S6_S7, // 07 - (PCODE)0, // 10 - (PCODE)Load_S1, // 11 - (PCODE)Load_S1_S2, // 12 - (PCODE)Load_S1_S2_S3, // 13 - (PCODE)Load_S1_S2_S3_S4, // 14 - (PCODE)Load_S1_S2_S3_S4_S5, // 15 - (PCODE)Load_S1_S2_S3_S4_S5_S6, // 16 - (PCODE)Load_S1_S2_S3_S4_S5_S6_S7, // 17 - (PCODE)0, // 20 - (PCODE)0, // 21 - (PCODE)Load_S2, // 22 - (PCODE)Load_S2_S3, // 23 - (PCODE)Load_S2_S3_S4, // 24 - (PCODE)Load_S2_S3_S4_S5, // 25 - (PCODE)Load_S2_S3_S4_S5_S6, // 26 - (PCODE)Load_S2_S3_S4_S5_S6_S7, // 27 - (PCODE)0, // 30 - (PCODE)0, // 31 - (PCODE)0, // 32 - (PCODE)Load_S3, // 33 - (PCODE)Load_S3_S4, // 34 - (PCODE)Load_S3_S4_S5, // 35 - (PCODE)Load_S3_S4_S5_S6, // 36 - (PCODE)Load_S3_S4_S5_S6_S7, // 37 - (PCODE)0, // 40 - (PCODE)0, // 41 - (PCODE)0, // 42 - (PCODE)0, // 43 - (PCODE)Load_S4, // 44 - (PCODE)Load_S4_S5, // 45 - (PCODE)Load_S4_S5_S6, // 46 - (PCODE)Load_S4_S5_S6_S7, // 47 - (PCODE)0, // 50 - (PCODE)0, // 51 - (PCODE)0, // 52 - (PCODE)0, // 53 - (PCODE)0, // 54 - (PCODE)Load_S5, // 55 - (PCODE)Load_S5_S6, // 56 - (PCODE)Load_S5_S6_S7, // 57 - (PCODE)0, // 60 - (PCODE)0, // 61 - (PCODE)0, // 62 - (PCODE)0, // 63 - (PCODE)0, // 64 - (PCODE)0, // 65 - (PCODE)Load_S6, // 66 - (PCODE)Load_S6_S7, // 67 - (PCODE)0, // 70 - (PCODE)0, // 71 - (PCODE)0, // 72 - (PCODE)0, // 73 - (PCODE)0, // 74 - (PCODE)0, // 75 - (PCODE)0, // 76 - (PCODE)Load_S7 // 77 -}; - #endif // TARGET_ARM64 #ifdef TARGET_ARM @@ -1437,86 +593,6 @@ extern "C" void Store_R0_R1_R2_R3_4B(); extern "C" void Store_R2_R3_4B(); extern "C" void Store_Stack_4B(); -PCODE GPRegsRoutines[] = -{ - (PCODE)Load_R0, // 00 - (PCODE)Load_R0_R1, // 01 - (PCODE)Load_R0_R1_R2, // 02 - (PCODE)Load_R0_R1_R2_R3, // 03 - (PCODE)0, // 04 - (PCODE)Load_R1, // 05 - (PCODE)Load_R1_R2, // 06 - (PCODE)Load_R1_R2_R3, // 07 - (PCODE)0, // 08 - (PCODE)0, // 09 - (PCODE)Load_R2, // 10 - (PCODE)Load_R2_R3, // 11 - (PCODE)0, // 12 - (PCODE)0, // 13 - (PCODE)0, // 14 - (PCODE)Load_R3, // 15 -}; - -PCODE GPRegsStoreRoutines[] = -{ - (PCODE)Store_R0, // 00 - (PCODE)Store_R0_R1, // 01 - (PCODE)Store_R0_R1_R2, // 02 - (PCODE)Store_R0_R1_R2_R3, // 03 - (PCODE)0, // 04 - (PCODE)Store_R1, // 05 - (PCODE)Store_R1_R2, // 06 - (PCODE)Store_R1_R2_R3, // 07 - (PCODE)0, // 08 - (PCODE)0, // 09 - (PCODE)Store_R2, // 10 - (PCODE)Store_R2_R3, // 11 - (PCODE)0, // 12 - (PCODE)0, // 13 - (PCODE)0, // 14 - (PCODE)Store_R3, // 15 -}; - -PCODE GPRegLoadRoutines_4B[] = -{ - (PCODE)0, // 00 - (PCODE)Load_R0_R1_4B, // 01 - (PCODE)0, // 02 - (PCODE)Load_R0_R1_R2_R3_4B, // 03 - (PCODE)0, // 04 - (PCODE)0, // 05 - (PCODE)0, // 06 - (PCODE)0, // 07 - (PCODE)0, // 08 - (PCODE)0, // 09 - (PCODE)0, // 10 - (PCODE)Load_R2_R3_4B, // 11 - (PCODE)0, // 12 - (PCODE)0, // 13 - (PCODE)0, // 14 - (PCODE)0, // 15 -}; - -PCODE GPRegStoreRoutines_4B[] = -{ - (PCODE)0, // 00 - (PCODE)Store_R0_R1_4B, // 01 - (PCODE)0, // 02 - (PCODE)Store_R0_R1_R2_R3_4B, // 03 - (PCODE)0, // 04 - (PCODE)0, // 05 - (PCODE)0, // 06 - (PCODE)0, // 07 - (PCODE)0, // 08 - (PCODE)0, // 09 - (PCODE)0, // 10 - (PCODE)Store_R2_R3_4B, // 11 - (PCODE)0, // 12 - (PCODE)0, // 13 - (PCODE)0, // 14 - (PCODE)0, // 15 -}; - #endif // TARGET_ARM #ifdef TARGET_RISCV64 @@ -1613,142 +689,6 @@ extern "C" void Store_Ref_A5(); extern "C" void Store_Ref_A6(); extern "C" void Store_Ref_A7(); -PCODE GPRegsRoutines[] = -{ - (PCODE)Load_A0, // 00 - (PCODE)Load_A0_A1, // 01 - (PCODE)Load_A0_A1_A2, // 02 - (PCODE)Load_A0_A1_A2_A3, // 03 - (PCODE)Load_A0_A1_A2_A3_A4, // 04 - (PCODE)Load_A0_A1_A2_A3_A4_A5, // 05 - (PCODE)Load_A0_A1_A2_A3_A4_A5_A6, // 06 - (PCODE)Load_A0_A1_A2_A3_A4_A5_A6_A7, // 07 - (PCODE)0, // 10 - (PCODE)Load_A1, // 11 - (PCODE)Load_A1_A2, // 12 - (PCODE)Load_A1_A2_A3, // 13 - (PCODE)Load_A1_A2_A3_A4, // 14 - (PCODE)Load_A1_A2_A3_A4_A5, // 15 - (PCODE)Load_A1_A2_A3_A4_A5_A6, // 16 - (PCODE)Load_A1_A2_A3_A4_A5_A6_A7, // 17 - (PCODE)0, // 20 - (PCODE)0, // 21 - (PCODE)Load_A2, // 22 - (PCODE)Load_A2_A3, // 23 - (PCODE)Load_A2_A3_A4, // 24 - (PCODE)Load_A2_A3_A4_A5, // 25 - (PCODE)Load_A2_A3_A4_A5_A6, // 26 - (PCODE)Load_A2_A3_A4_A5_A6_A7, // 27 - (PCODE)0, // 30 - (PCODE)0, // 31 - (PCODE)0, // 32 - (PCODE)Load_A3, // 33 - (PCODE)Load_A3_A4, // 34 - (PCODE)Load_A3_A4_A5, // 35 - (PCODE)Load_A3_A4_A5_A6, // 36 - (PCODE)Load_A3_A4_A5_A6_A7, // 37 - (PCODE)0, // 40 - (PCODE)0, // 41 - (PCODE)0, // 42 - (PCODE)0, // 43 - (PCODE)Load_A4, // 44 - (PCODE)Load_A4_A5, // 45 - (PCODE)Load_A4_A5_A6, // 46 - (PCODE)Load_A4_A5_A6_A7, // 47 - (PCODE)0, // 50 - (PCODE)0, // 51 - (PCODE)0, // 52 - (PCODE)0, // 53 - (PCODE)0, // 54 - (PCODE)Load_A5, // 55 - (PCODE)Load_A5_A6, // 56 - (PCODE)Load_A5_A6_A7, // 57 - (PCODE)0, // 60 - (PCODE)0, // 61 - (PCODE)0, // 62 - (PCODE)0, // 63 - (PCODE)0, // 64 - (PCODE)0, // 65 - (PCODE)Load_A6, // 66 - (PCODE)Load_A6_A7, // 67 - (PCODE)0, // 70 - (PCODE)0, // 71 - (PCODE)0, // 72 - (PCODE)0, // 73 - (PCODE)0, // 74 - (PCODE)0, // 75 - (PCODE)0, // 76 - (PCODE)Load_A7 // 77 -}; - -PCODE GPRegsStoreRoutines[] = -{ - (PCODE)Store_A0, // 00 - (PCODE)Store_A0_A1, // 01 - (PCODE)Store_A0_A1_A2, // 02 - (PCODE)Store_A0_A1_A2_A3, // 03 - (PCODE)Store_A0_A1_A2_A3_A4, // 04 - (PCODE)Store_A0_A1_A2_A3_A4_A5, // 05 - (PCODE)Store_A0_A1_A2_A3_A4_A5_A6, // 06 - (PCODE)Store_A0_A1_A2_A3_A4_A5_A6_A7, // 07 - (PCODE)0, // 10 - (PCODE)Store_A1, // 11 - (PCODE)Store_A1_A2, // 12 - (PCODE)Store_A1_A2_A3, // 13 - (PCODE)Store_A1_A2_A3_A4, // 14 - (PCODE)Store_A1_A2_A3_A4_A5, // 15 - (PCODE)Store_A1_A2_A3_A4_A5_A6, // 16 - (PCODE)Store_A1_A2_A3_A4_A5_A6_A7, // 17 - (PCODE)0, // 20 - (PCODE)0, // 21 - (PCODE)Store_A2, // 22 - (PCODE)Store_A2_A3, // 23 - (PCODE)Store_A2_A3_A4, // 24 - (PCODE)Store_A2_A3_A4_A5, // 25 - (PCODE)Store_A2_A3_A4_A5_A6, // 26 - (PCODE)Store_A2_A3_A4_A5_A6_A7, // 27 - (PCODE)0, // 30 - (PCODE)0, // 31 - (PCODE)0, // 32 - (PCODE)Store_A3, // 33 - (PCODE)Store_A3_A4, // 34 - (PCODE)Store_A3_A4_A5, // 35 - (PCODE)Store_A3_A4_A5_A6, // 36 - (PCODE)Store_A3_A4_A5_A6_A7, // 37 - (PCODE)0, // 40 - (PCODE)0, // 41 - (PCODE)0, // 42 - (PCODE)0, // 43 - (PCODE)Store_A4, // 44 - (PCODE)Store_A4_A5, // 45 - (PCODE)Store_A4_A5_A6, // 46 - (PCODE)Store_A4_A5_A6_A7, // 47 - (PCODE)0, // 50 - (PCODE)0, // 51 - (PCODE)0, // 52 - (PCODE)0, // 53 - (PCODE)0, // 54 - (PCODE)Store_A5, // 55 - (PCODE)Store_A5_A6, // 56 - (PCODE)Store_A5_A6_A7, // 57 - (PCODE)0, // 60 - (PCODE)0, // 61 - (PCODE)0, // 62 - (PCODE)0, // 63 - (PCODE)0, // 64 - (PCODE)0, // 65 - (PCODE)Store_A6, // 66 - (PCODE)Store_A6_A7, // 67 - (PCODE)0, // 70 - (PCODE)0, // 71 - (PCODE)0, // 72 - (PCODE)0, // 73 - (PCODE)0, // 74 - (PCODE)0, // 75 - (PCODE)0, // 76 - (PCODE)Store_A7 // 77 -}; - extern "C" void Load_FA0(); extern "C" void Load_FA0_FA1(); extern "C" void Load_FA0_FA1_FA2(); @@ -1823,166 +763,6 @@ extern "C" void Store_FA6(); extern "C" void Store_FA6_FA7(); extern "C" void Store_FA7(); -PCODE FPRegsRoutines[] = -{ - (PCODE)Load_FA0, // 00 - (PCODE)Load_FA0_FA1, // 01 - (PCODE)Load_FA0_FA1_FA2, // 02 - (PCODE)Load_FA0_FA1_FA2_FA3, // 03 - (PCODE)Load_FA0_FA1_FA2_FA3_FA4, // 04 - (PCODE)Load_FA0_FA1_FA2_FA3_FA4_FA5, // 05 - (PCODE)Load_FA0_FA1_FA2_FA3_FA4_FA5_FA6, // 06 - (PCODE)Load_FA0_FA1_FA2_FA3_FA4_FA5_FA6_FA7, // 07 - (PCODE)0, // 10 - (PCODE)Load_FA1, // 11 - (PCODE)Load_FA1_FA2, // 12 - (PCODE)Load_FA1_FA2_FA3, // 13 - (PCODE)Load_FA1_FA2_FA3_FA4, // 14 - (PCODE)Load_FA1_FA2_FA3_FA4_FA5, // 15 - (PCODE)Load_FA1_FA2_FA3_FA4_FA5_FA6, // 16 - (PCODE)Load_FA1_FA2_FA3_FA4_FA5_FA6_FA7, // 17 - (PCODE)0, // 20 - (PCODE)0, // 21 - (PCODE)Load_FA2, // 22 - (PCODE)Load_FA2_FA3, // 23 - (PCODE)Load_FA2_FA3_FA4, // 24 - (PCODE)Load_FA2_FA3_FA4_FA5, // 25 - (PCODE)Load_FA2_FA3_FA4_FA5_FA6, // 26 - (PCODE)Load_FA2_FA3_FA4_FA5_FA6_FA7, // 27 - (PCODE)0, // 30 - (PCODE)0, // 31 - (PCODE)0, // 32 - (PCODE)Load_FA3, // 33 - (PCODE)Load_FA3_FA4, // 34 - (PCODE)Load_FA3_FA4_FA5, // 35 - (PCODE)Load_FA3_FA4_FA5_FA6, // 36 - (PCODE)Load_FA3_FA4_FA5_FA6_FA7, // 37 - (PCODE)0, // 40 - (PCODE)0, // 41 - (PCODE)0, // 42 - (PCODE)0, // 43 - (PCODE)Load_FA4, // 44 - (PCODE)Load_FA4_FA5, // 45 - (PCODE)Load_FA4_FA5_FA6, // 46 - (PCODE)Load_FA4_FA5_FA6_FA7, // 47 - (PCODE)0, // 50 - (PCODE)0, // 51 - (PCODE)0, // 52 - (PCODE)0, // 53 - (PCODE)0, // 54 - (PCODE)Load_FA5, // 55 - (PCODE)Load_FA5_FA6, // 56 - (PCODE)Load_FA5_FA6_FA7, // 57 - (PCODE)0, // 60 - (PCODE)0, // 61 - (PCODE)0, // 62 - (PCODE)0, // 63 - (PCODE)0, // 64 - (PCODE)0, // 65 - (PCODE)Load_FA6, // 66 - (PCODE)Load_FA6_FA7, // 67 - (PCODE)0, // 70 - (PCODE)0, // 71 - (PCODE)0, // 72 - (PCODE)0, // 73 - (PCODE)0, // 74 - (PCODE)0, // 75 - (PCODE)0, // 76 - (PCODE)Load_FA7 // 77 -}; - -PCODE FPRegsStoreRoutines[] = -{ - (PCODE)Store_FA0, // 00 - (PCODE)Store_FA0_FA1, // 01 - (PCODE)Store_FA0_FA1_FA2, // 02 - (PCODE)Store_FA0_FA1_FA2_FA3, // 03 - (PCODE)Store_FA0_FA1_FA2_FA3_FA4, // 04 - (PCODE)Store_FA0_FA1_FA2_FA3_FA4_FA5, // 05 - (PCODE)Store_FA0_FA1_FA2_FA3_FA4_FA5_FA6, // 06 - (PCODE)Store_FA0_FA1_FA2_FA3_FA4_FA5_FA6_FA7, // 07 - (PCODE)0, // 10 - (PCODE)Store_FA1, // 11 - (PCODE)Store_FA1_FA2, // 12 - (PCODE)Store_FA1_FA2_FA3, // 13 - (PCODE)Store_FA1_FA2_FA3_FA4, // 14 - (PCODE)Store_FA1_FA2_FA3_FA4_FA5, // 15 - (PCODE)Store_FA1_FA2_FA3_FA4_FA5_FA6, // 16 - (PCODE)Store_FA1_FA2_FA3_FA4_FA5_FA6_FA7, // 17 - (PCODE)0, // 20 - (PCODE)0, // 21 - (PCODE)Store_FA2, // 22 - (PCODE)Store_FA2_FA3, // 23 - (PCODE)Store_FA2_FA3_FA4, // 24 - (PCODE)Store_FA2_FA3_FA4_FA5, // 25 - (PCODE)Store_FA2_FA3_FA4_FA5_FA6, // 26 - (PCODE)Store_FA2_FA3_FA4_FA5_FA6_FA7, // 27 - (PCODE)0, // 30 - (PCODE)0, // 31 - (PCODE)0, // 32 - (PCODE)Store_FA3, // 33 - (PCODE)Store_FA3_FA4, // 34 - (PCODE)Store_FA3_FA4_FA5, // 35 - (PCODE)Store_FA3_FA4_FA5_FA6, // 36 - (PCODE)Store_FA3_FA4_FA5_FA6_FA7, // 37 - (PCODE)0, // 40 - (PCODE)0, // 41 - (PCODE)0, // 42 - (PCODE)0, // 43 - (PCODE)Store_FA4, // 44 - (PCODE)Store_FA4_FA5, // 45 - (PCODE)Store_FA4_FA5_FA6, // 46 - (PCODE)Store_FA4_FA5_FA6_FA7, // 47 - (PCODE)0, // 50 - (PCODE)0, // 51 - (PCODE)0, // 52 - (PCODE)0, // 53 - (PCODE)0, // 54 - (PCODE)Store_FA5, // 55 - (PCODE)Store_FA5_FA6, // 56 - (PCODE)Store_FA5_FA6_FA7, // 57 - (PCODE)0, // 60 - (PCODE)0, // 61 - (PCODE)0, // 62 - (PCODE)0, // 63 - (PCODE)0, // 64 - (PCODE)0, // 65 - (PCODE)Store_FA6, // 66 - (PCODE)Store_FA6_FA7, // 67 - (PCODE)0, // 70 - (PCODE)0, // 71 - (PCODE)0, // 72 - (PCODE)0, // 73 - (PCODE)0, // 74 - (PCODE)0, // 75 - (PCODE)0, // 76 - (PCODE)Store_FA7 // 77 -}; - -PCODE GPRegsRefRoutines[] = -{ - (PCODE)Load_Ref_A0, // 0 - a0 - (PCODE)Load_Ref_A1, // 1 - a1 - (PCODE)Load_Ref_A2, // 2 - a2 - (PCODE)Load_Ref_A3, // 3 - a3 - (PCODE)Load_Ref_A4, // 4 - a4 - (PCODE)Load_Ref_A5, // 5 - a5 - (PCODE)Load_Ref_A6, // 6 - a6 - (PCODE)Load_Ref_A7 // 7 - a7 -}; - -PCODE GPRegsRefStoreRoutines[] = -{ - (PCODE)Store_Ref_A0, // 0 - a0 - (PCODE)Store_Ref_A1, // 1 - a1 - (PCODE)Store_Ref_A2, // 2 - a2 - (PCODE)Store_Ref_A3, // 3 - a3 - (PCODE)Store_Ref_A4, // 4 - a4 - (PCODE)Store_Ref_A5, // 5 - a5 - (PCODE)Store_Ref_A6, // 6 - a6 - (PCODE)Store_Ref_A7 // 7 - a7 -}; - #endif // TARGET_RISCV64 PCODE CallStubGenerator::GetStackRoutine() @@ -2015,8 +795,95 @@ PCODE CallStubGenerator::GetGPRegRangeRoutine(int r1, int r2) { LOG2((LF2_INTERPRETER, LL_INFO10000, "GetGPRegRangeRoutine %d %d\n", r1, r2)); +#if defined(TARGET_AMD64) && defined(TARGET_WINDOWS) + static const PCODE GPRegsLoadRoutines[] = { + (PCODE)Load_RCX, (PCODE)Load_RCX_RDX, (PCODE)Load_RCX_RDX_R8, (PCODE)Load_RCX_RDX_R8_R9, + (PCODE)0, (PCODE)Load_RDX, (PCODE)Load_RDX_R8, (PCODE)Load_RDX_R8_R9, + (PCODE)0, (PCODE)0, (PCODE)Load_R8, (PCODE)Load_R8_R9, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_R9 + }; + static const PCODE GPRegsStoreRoutines[] = { + (PCODE)Store_RCX, (PCODE)Store_RCX_RDX, (PCODE)Store_RCX_RDX_R8, (PCODE)Store_RCX_RDX_R8_R9, + (PCODE)0, (PCODE)Store_RDX, (PCODE)Store_RDX_R8, (PCODE)Store_RDX_R8_R9, + (PCODE)0, (PCODE)0, (PCODE)Store_R8, (PCODE)Store_R8_R9, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_R9 + }; +#elif defined(TARGET_AMD64) // Unix AMD64 + static const PCODE GPRegsLoadRoutines[] = { + (PCODE)Load_RDI, (PCODE)Load_RDI_RSI, (PCODE)Load_RDI_RSI_RDX, (PCODE)Load_RDI_RSI_RDX_RCX, (PCODE)Load_RDI_RSI_RDX_RCX_R8, (PCODE)Load_RDI_RSI_RDX_RCX_R8_R9, + (PCODE)0, (PCODE)Load_RSI, (PCODE)Load_RSI_RDX, (PCODE)Load_RSI_RDX_RCX, (PCODE)Load_RSI_RDX_RCX_R8, (PCODE)Load_RSI_RDX_RCX_R8_R9, + (PCODE)0, (PCODE)0, (PCODE)Load_RDX, (PCODE)Load_RDX_RCX, (PCODE)Load_RDX_RCX_R8, (PCODE)Load_RDX_RCX_R8_R9, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_RCX, (PCODE)Load_RCX_R8, (PCODE)Load_RCX_R8_R9, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_R8, (PCODE)Load_R8_R9, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_R9 + }; + static const PCODE GPRegsStoreRoutines[] = { + (PCODE)Store_RDI, (PCODE)Store_RDI_RSI, (PCODE)Store_RDI_RSI_RDX, (PCODE)Store_RDI_RSI_RDX_RCX, (PCODE)Store_RDI_RSI_RDX_RCX_R8, (PCODE)Store_RDI_RSI_RDX_RCX_R8_R9, + (PCODE)0, (PCODE)Store_RSI, (PCODE)Store_RSI_RDX, (PCODE)Store_RSI_RDX_RCX, (PCODE)Store_RSI_RDX_RCX_R8, (PCODE)Store_RSI_RDX_RCX_R8_R9, + (PCODE)0, (PCODE)0, (PCODE)Store_RDX, (PCODE)Store_RDX_RCX, (PCODE)Store_RDX_RCX_R8, (PCODE)Store_RDX_RCX_R8_R9, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_RCX, (PCODE)Store_RCX_R8, (PCODE)Store_RCX_R8_R9, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_R8, (PCODE)Store_R8_R9, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_R9 + }; +#elif defined(TARGET_ARM64) + static const PCODE GPRegsLoadRoutines[] = { + (PCODE)Load_X0, (PCODE)Load_X0_X1, (PCODE)Load_X0_X1_X2, (PCODE)Load_X0_X1_X2_X3, (PCODE)Load_X0_X1_X2_X3_X4, (PCODE)Load_X0_X1_X2_X3_X4_X5, (PCODE)Load_X0_X1_X2_X3_X4_X5_X6, (PCODE)Load_X0_X1_X2_X3_X4_X5_X6_X7, + (PCODE)0, (PCODE)Load_X1, (PCODE)Load_X1_X2, (PCODE)Load_X1_X2_X3, (PCODE)Load_X1_X2_X3_X4, (PCODE)Load_X1_X2_X3_X4_X5, (PCODE)Load_X1_X2_X3_X4_X5_X6, (PCODE)Load_X1_X2_X3_X4_X5_X6_X7, + (PCODE)0, (PCODE)0, (PCODE)Load_X2, (PCODE)Load_X2_X3, (PCODE)Load_X2_X3_X4, (PCODE)Load_X2_X3_X4_X5, (PCODE)Load_X2_X3_X4_X5_X6, (PCODE)Load_X2_X3_X4_X5_X6_X7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_X3, (PCODE)Load_X3_X4, (PCODE)Load_X3_X4_X5, (PCODE)Load_X3_X4_X5_X6, (PCODE)Load_X3_X4_X5_X6_X7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_X4, (PCODE)Load_X4_X5, (PCODE)Load_X4_X5_X6, (PCODE)Load_X4_X5_X6_X7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_X5, (PCODE)Load_X5_X6, (PCODE)Load_X5_X6_X7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_X6, (PCODE)Load_X6_X7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_X7 + }; + static const PCODE GPRegsStoreRoutines[] = { + (PCODE)Store_X0, (PCODE)Store_X0_X1, (PCODE)Store_X0_X1_X2, (PCODE)Store_X0_X1_X2_X3, (PCODE)Store_X0_X1_X2_X3_X4, (PCODE)Store_X0_X1_X2_X3_X4_X5, (PCODE)Store_X0_X1_X2_X3_X4_X5_X6, (PCODE)Store_X0_X1_X2_X3_X4_X5_X6_X7, + (PCODE)0, (PCODE)Store_X1, (PCODE)Store_X1_X2, (PCODE)Store_X1_X2_X3, (PCODE)Store_X1_X2_X3_X4, (PCODE)Store_X1_X2_X3_X4_X5, (PCODE)Store_X1_X2_X3_X4_X5_X6, (PCODE)Store_X1_X2_X3_X4_X5_X6_X7, + (PCODE)0, (PCODE)0, (PCODE)Store_X2, (PCODE)Store_X2_X3, (PCODE)Store_X2_X3_X4, (PCODE)Store_X2_X3_X4_X5, (PCODE)Store_X2_X3_X4_X5_X6, (PCODE)Store_X2_X3_X4_X5_X6_X7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_X3, (PCODE)Store_X3_X4, (PCODE)Store_X3_X4_X5, (PCODE)Store_X3_X4_X5_X6, (PCODE)Store_X3_X4_X5_X6_X7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_X4, (PCODE)Store_X4_X5, (PCODE)Store_X4_X5_X6, (PCODE)Store_X4_X5_X6_X7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_X5, (PCODE)Store_X5_X6, (PCODE)Store_X5_X6_X7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_X6, (PCODE)Store_X6_X7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_X7 + }; +#elif defined(TARGET_ARM) + static const PCODE GPRegsLoadRoutines[] = { + (PCODE)Load_R0, (PCODE)Load_R0_R1, (PCODE)Load_R0_R1_R2, (PCODE)Load_R0_R1_R2_R3, + (PCODE)0, (PCODE)Load_R1, (PCODE)Load_R1_R2, (PCODE)Load_R1_R2_R3, + (PCODE)0, (PCODE)0, (PCODE)Load_R2, (PCODE)Load_R2_R3, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_R3 + }; + static const PCODE GPRegsStoreRoutines[] = { + (PCODE)Store_R0, (PCODE)Store_R0_R1, (PCODE)Store_R0_R1_R2, (PCODE)Store_R0_R1_R2_R3, + (PCODE)0, (PCODE)Store_R1, (PCODE)Store_R1_R2, (PCODE)Store_R1_R2_R3, + (PCODE)0, (PCODE)0, (PCODE)Store_R2, (PCODE)Store_R2_R3, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_R3 + }; +#elif defined(TARGET_RISCV64) + static const PCODE GPRegsLoadRoutines[] = { + (PCODE)Load_A0, (PCODE)Load_A0_A1, (PCODE)Load_A0_A1_A2, (PCODE)Load_A0_A1_A2_A3, (PCODE)Load_A0_A1_A2_A3_A4, (PCODE)Load_A0_A1_A2_A3_A4_A5, (PCODE)Load_A0_A1_A2_A3_A4_A5_A6, (PCODE)Load_A0_A1_A2_A3_A4_A5_A6_A7, + (PCODE)0, (PCODE)Load_A1, (PCODE)Load_A1_A2, (PCODE)Load_A1_A2_A3, (PCODE)Load_A1_A2_A3_A4, (PCODE)Load_A1_A2_A3_A4_A5, (PCODE)Load_A1_A2_A3_A4_A5_A6, (PCODE)Load_A1_A2_A3_A4_A5_A6_A7, + (PCODE)0, (PCODE)0, (PCODE)Load_A2, (PCODE)Load_A2_A3, (PCODE)Load_A2_A3_A4, (PCODE)Load_A2_A3_A4_A5, (PCODE)Load_A2_A3_A4_A5_A6, (PCODE)Load_A2_A3_A4_A5_A6_A7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_A3, (PCODE)Load_A3_A4, (PCODE)Load_A3_A4_A5, (PCODE)Load_A3_A4_A5_A6, (PCODE)Load_A3_A4_A5_A6_A7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_A4, (PCODE)Load_A4_A5, (PCODE)Load_A4_A5_A6, (PCODE)Load_A4_A5_A6_A7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_A5, (PCODE)Load_A5_A6, (PCODE)Load_A5_A6_A7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_A6, (PCODE)Load_A6_A7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_A7 + }; + static const PCODE GPRegsStoreRoutines[] = { + (PCODE)Store_A0, (PCODE)Store_A0_A1, (PCODE)Store_A0_A1_A2, (PCODE)Store_A0_A1_A2_A3, (PCODE)Store_A0_A1_A2_A3_A4, (PCODE)Store_A0_A1_A2_A3_A4_A5, (PCODE)Store_A0_A1_A2_A3_A4_A5_A6, (PCODE)Store_A0_A1_A2_A3_A4_A5_A6_A7, + (PCODE)0, (PCODE)Store_A1, (PCODE)Store_A1_A2, (PCODE)Store_A1_A2_A3, (PCODE)Store_A1_A2_A3_A4, (PCODE)Store_A1_A2_A3_A4_A5, (PCODE)Store_A1_A2_A3_A4_A5_A6, (PCODE)Store_A1_A2_A3_A4_A5_A6_A7, + (PCODE)0, (PCODE)0, (PCODE)Store_A2, (PCODE)Store_A2_A3, (PCODE)Store_A2_A3_A4, (PCODE)Store_A2_A3_A4_A5, (PCODE)Store_A2_A3_A4_A5_A6, (PCODE)Store_A2_A3_A4_A5_A6_A7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_A3, (PCODE)Store_A3_A4, (PCODE)Store_A3_A4_A5, (PCODE)Store_A3_A4_A5_A6, (PCODE)Store_A3_A4_A5_A6_A7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_A4, (PCODE)Store_A4_A5, (PCODE)Store_A4_A5_A6, (PCODE)Store_A4_A5_A6_A7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_A5, (PCODE)Store_A5_A6, (PCODE)Store_A5_A6_A7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_A6, (PCODE)Store_A6_A7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_A7 + }; +#endif + int index = r1 * NUM_ARGUMENT_REGISTERS + r2; - PCODE routine = m_interpreterToNative ? GPRegsRoutines[index] : GPRegsStoreRoutines[index]; + PCODE routine = m_interpreterToNative ? GPRegsLoadRoutines[index] : GPRegsStoreRoutines[index]; _ASSERTE(routine != 0); return routine; } @@ -2024,8 +891,38 @@ PCODE CallStubGenerator::GetGPRegRangeRoutine(int r1, int r2) #if !defined(UNIX_AMD64_ABI) && defined(ENREGISTERED_PARAMTYPE_MAXSIZE) PCODE CallStubGenerator::GetGPRegRefRoutine(int r) { +#if LOG_COMPUTE_CALL_STUB LOG2((LF2_INTERPRETER, LL_INFO10000, "GetGPRegRefRoutine %d\n", r)); - return m_interpreterToNative ? GPRegsRefRoutines[r] : GPRegsRefStoreRoutines[r]; +#endif + +#if defined(TARGET_AMD64) && defined(TARGET_WINDOWS) + static const PCODE GPRegsRefLoadRoutines[] = { + (PCODE)Load_Ref_RCX, (PCODE)Load_Ref_RDX, (PCODE)Load_Ref_R8, (PCODE)Load_Ref_R9 + }; + static const PCODE GPRegsRefStoreRoutines[] = { + (PCODE)Store_Ref_RCX, (PCODE)Store_Ref_RDX, (PCODE)Store_Ref_R8, (PCODE)Store_Ref_R9 + }; +#elif defined(TARGET_ARM64) + static const PCODE GPRegsRefLoadRoutines[] = { + (PCODE)Load_Ref_X0, (PCODE)Load_Ref_X1, (PCODE)Load_Ref_X2, (PCODE)Load_Ref_X3, + (PCODE)Load_Ref_X4, (PCODE)Load_Ref_X5, (PCODE)Load_Ref_X6, (PCODE)Load_Ref_X7 + }; + static const PCODE GPRegsRefStoreRoutines[] = { + (PCODE)Store_Ref_X0, (PCODE)Store_Ref_X1, (PCODE)Store_Ref_X2, (PCODE)Store_Ref_X3, + (PCODE)Store_Ref_X4, (PCODE)Store_Ref_X5, (PCODE)Store_Ref_X6, (PCODE)Store_Ref_X7 + }; +#elif defined(TARGET_RISCV64) + static const PCODE GPRegsRefLoadRoutines[] = { + (PCODE)Load_Ref_A0, (PCODE)Load_Ref_A1, (PCODE)Load_Ref_A2, (PCODE)Load_Ref_A3, + (PCODE)Load_Ref_A4, (PCODE)Load_Ref_A5, (PCODE)Load_Ref_A6, (PCODE)Load_Ref_A7 + }; + static const PCODE GPRegsRefStoreRoutines[] = { + (PCODE)Store_Ref_A0, (PCODE)Store_Ref_A1, (PCODE)Store_Ref_A2, (PCODE)Store_Ref_A3, + (PCODE)Store_Ref_A4, (PCODE)Store_Ref_A5, (PCODE)Store_Ref_A6, (PCODE)Store_Ref_A7 + }; +#endif + + return m_interpreterToNative ? GPRegsRefLoadRoutines[r] : GPRegsRefStoreRoutines[r]; } PCODE CallStubGenerator::GetStackRefRoutine() @@ -2044,8 +941,87 @@ PCODE CallStubGenerator::GetFPRegRangeRoutine(int x1, int x2) _ASSERTE(!"Not support FP reg yet"); return 0; #else + +#if defined(TARGET_AMD64) && defined(TARGET_WINDOWS) + static const PCODE FPRegsLoadRoutines[] = { + (PCODE)Load_XMM0, (PCODE)Load_XMM0_XMM1, (PCODE)Load_XMM0_XMM1_XMM2, (PCODE)Load_XMM0_XMM1_XMM2_XMM3, + (PCODE)0, (PCODE)Load_XMM1, (PCODE)Load_XMM1_XMM2, (PCODE)Load_XMM1_XMM2_XMM3, + (PCODE)0, (PCODE)0, (PCODE)Load_XMM2, (PCODE)Load_XMM2_XMM3, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_XMM3 + }; + static const PCODE FPRegsStoreRoutines[] = { + (PCODE)Store_XMM0, (PCODE)Store_XMM0_XMM1, (PCODE)Store_XMM0_XMM1_XMM2, (PCODE)Store_XMM0_XMM1_XMM2_XMM3, + (PCODE)0, (PCODE)Store_XMM1, (PCODE)Store_XMM1_XMM2, (PCODE)Store_XMM1_XMM2_XMM3, + (PCODE)0, (PCODE)0, (PCODE)Store_XMM2, (PCODE)Store_XMM2_XMM3, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_XMM3 + }; +#elif defined(TARGET_AMD64) // Unix AMD64 + static const PCODE FPRegsLoadRoutines[] = { + (PCODE)Load_XMM0, (PCODE)Load_XMM0_XMM1, (PCODE)Load_XMM0_XMM1_XMM2, (PCODE)Load_XMM0_XMM1_XMM2_XMM3, (PCODE)Load_XMM0_XMM1_XMM2_XMM3_XMM4, (PCODE)Load_XMM0_XMM1_XMM2_XMM3_XMM4_XMM5, (PCODE)Load_XMM0_XMM1_XMM2_XMM3_XMM4_XMM5_XMM6, (PCODE)Load_XMM0_XMM1_XMM2_XMM3_XMM4_XMM5_XMM6_XMM7, + (PCODE)0, (PCODE)Load_XMM1, (PCODE)Load_XMM1_XMM2, (PCODE)Load_XMM1_XMM2_XMM3, (PCODE)Load_XMM1_XMM2_XMM3_XMM4, (PCODE)Load_XMM1_XMM2_XMM3_XMM4_XMM5, (PCODE)Load_XMM1_XMM2_XMM3_XMM4_XMM5_XMM6, (PCODE)Load_XMM1_XMM2_XMM3_XMM4_XMM5_XMM6_XMM7, + (PCODE)0, (PCODE)0, (PCODE)Load_XMM2, (PCODE)Load_XMM2_XMM3, (PCODE)Load_XMM2_XMM3_XMM4, (PCODE)Load_XMM2_XMM3_XMM4_XMM5, (PCODE)Load_XMM2_XMM3_XMM4_XMM5_XMM6, (PCODE)Load_XMM2_XMM3_XMM4_XMM5_XMM6_XMM7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_XMM3, (PCODE)Load_XMM3_XMM4, (PCODE)Load_XMM3_XMM4_XMM5, (PCODE)Load_XMM3_XMM4_XMM5_XMM6, (PCODE)Load_XMM3_XMM4_XMM5_XMM6_XMM7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_XMM4, (PCODE)Load_XMM4_XMM5, (PCODE)Load_XMM4_XMM5_XMM6, (PCODE)Load_XMM4_XMM5_XMM6_XMM7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_XMM5, (PCODE)Load_XMM5_XMM6, (PCODE)Load_XMM5_XMM6_XMM7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_XMM6, (PCODE)Load_XMM6_XMM7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_XMM7 + }; + static const PCODE FPRegsStoreRoutines[] = { + (PCODE)Store_XMM0, (PCODE)Store_XMM0_XMM1, (PCODE)Store_XMM0_XMM1_XMM2, (PCODE)Store_XMM0_XMM1_XMM2_XMM3, (PCODE)Store_XMM0_XMM1_XMM2_XMM3_XMM4, (PCODE)Store_XMM0_XMM1_XMM2_XMM3_XMM4_XMM5, (PCODE)Store_XMM0_XMM1_XMM2_XMM3_XMM4_XMM5_XMM6, (PCODE)Store_XMM0_XMM1_XMM2_XMM3_XMM4_XMM5_XMM6_XMM7, + (PCODE)0, (PCODE)Store_XMM1, (PCODE)Store_XMM1_XMM2, (PCODE)Store_XMM1_XMM2_XMM3, (PCODE)Store_XMM1_XMM2_XMM3_XMM4, (PCODE)Store_XMM1_XMM2_XMM3_XMM4_XMM5, (PCODE)Store_XMM1_XMM2_XMM3_XMM4_XMM5_XMM6, (PCODE)Store_XMM1_XMM2_XMM3_XMM4_XMM5_XMM6_XMM7, + (PCODE)0, (PCODE)0, (PCODE)Store_XMM2, (PCODE)Store_XMM2_XMM3, (PCODE)Store_XMM2_XMM3_XMM4, (PCODE)Store_XMM2_XMM3_XMM4_XMM5, (PCODE)Store_XMM2_XMM3_XMM4_XMM5_XMM6, (PCODE)Store_XMM2_XMM3_XMM4_XMM5_XMM6_XMM7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_XMM3, (PCODE)Store_XMM3_XMM4, (PCODE)Store_XMM3_XMM4_XMM5, (PCODE)Store_XMM3_XMM4_XMM5_XMM6, (PCODE)Store_XMM3_XMM4_XMM5_XMM6_XMM7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_XMM4, (PCODE)Store_XMM4_XMM5, (PCODE)Store_XMM4_XMM5_XMM6, (PCODE)Store_XMM4_XMM5_XMM6_XMM7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_XMM5, (PCODE)Store_XMM5_XMM6, (PCODE)Store_XMM5_XMM6_XMM7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_XMM6, (PCODE)Store_XMM6_XMM7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_XMM7 + }; +#elif defined(TARGET_ARM64) + static const PCODE FPRegsLoadRoutines[] = { + (PCODE)Load_D0, (PCODE)Load_D0_D1, (PCODE)Load_D0_D1_D2, (PCODE)Load_D0_D1_D2_D3, (PCODE)Load_D0_D1_D2_D3_D4, (PCODE)Load_D0_D1_D2_D3_D4_D5, (PCODE)Load_D0_D1_D2_D3_D4_D5_D6, (PCODE)Load_D0_D1_D2_D3_D4_D5_D6_D7, + (PCODE)0, (PCODE)Load_D1, (PCODE)Load_D1_D2, (PCODE)Load_D1_D2_D3, (PCODE)Load_D1_D2_D3_D4, (PCODE)Load_D1_D2_D3_D4_D5, (PCODE)Load_D1_D2_D3_D4_D5_D6, (PCODE)Load_D1_D2_D3_D4_D5_D6_D7, + (PCODE)0, (PCODE)0, (PCODE)Load_D2, (PCODE)Load_D2_D3, (PCODE)Load_D2_D3_D4, (PCODE)Load_D2_D3_D4_D5, (PCODE)Load_D2_D3_D4_D5_D6, (PCODE)Load_D2_D3_D4_D5_D6_D7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_D3, (PCODE)Load_D3_D4, (PCODE)Load_D3_D4_D5, (PCODE)Load_D3_D4_D5_D6, (PCODE)Load_D3_D4_D5_D6_D7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_D4, (PCODE)Load_D4_D5, (PCODE)Load_D4_D5_D6, (PCODE)Load_D4_D5_D6_D7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_D5, (PCODE)Load_D5_D6, (PCODE)Load_D5_D6_D7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_D6, (PCODE)Load_D6_D7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_D7 + }; + static const PCODE FPRegsStoreRoutines[] = { + (PCODE)Store_D0, (PCODE)Store_D0_D1, (PCODE)Store_D0_D1_D2, (PCODE)Store_D0_D1_D2_D3, (PCODE)Store_D0_D1_D2_D3_D4, (PCODE)Store_D0_D1_D2_D3_D4_D5, (PCODE)Store_D0_D1_D2_D3_D4_D5_D6, (PCODE)Store_D0_D1_D2_D3_D4_D5_D6_D7, + (PCODE)0, (PCODE)Store_D1, (PCODE)Store_D1_D2, (PCODE)Store_D1_D2_D3, (PCODE)Store_D1_D2_D3_D4, (PCODE)Store_D1_D2_D3_D4_D5, (PCODE)Store_D1_D2_D3_D4_D5_D6, (PCODE)Store_D1_D2_D3_D4_D5_D6_D7, + (PCODE)0, (PCODE)0, (PCODE)Store_D2, (PCODE)Store_D2_D3, (PCODE)Store_D2_D3_D4, (PCODE)Store_D2_D3_D4_D5, (PCODE)Store_D2_D3_D4_D5_D6, (PCODE)Store_D2_D3_D4_D5_D6_D7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_D3, (PCODE)Store_D3_D4, (PCODE)Store_D3_D4_D5, (PCODE)Store_D3_D4_D5_D6, (PCODE)Store_D3_D4_D5_D6_D7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_D4, (PCODE)Store_D4_D5, (PCODE)Store_D4_D5_D6, (PCODE)Store_D4_D5_D6_D7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_D5, (PCODE)Store_D5_D6, (PCODE)Store_D5_D6_D7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_D6, (PCODE)Store_D6_D7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_D7 + }; +#elif defined(TARGET_RISCV64) + static const PCODE FPRegsLoadRoutines[] = { + (PCODE)Load_FA0, (PCODE)Load_FA0_FA1, (PCODE)Load_FA0_FA1_FA2, (PCODE)Load_FA0_FA1_FA2_FA3, (PCODE)Load_FA0_FA1_FA2_FA3_FA4, (PCODE)Load_FA0_FA1_FA2_FA3_FA4_FA5, (PCODE)Load_FA0_FA1_FA2_FA3_FA4_FA5_FA6, (PCODE)Load_FA0_FA1_FA2_FA3_FA4_FA5_FA6_FA7, + (PCODE)0, (PCODE)Load_FA1, (PCODE)Load_FA1_FA2, (PCODE)Load_FA1_FA2_FA3, (PCODE)Load_FA1_FA2_FA3_FA4, (PCODE)Load_FA1_FA2_FA3_FA4_FA5, (PCODE)Load_FA1_FA2_FA3_FA4_FA5_FA6, (PCODE)Load_FA1_FA2_FA3_FA4_FA5_FA6_FA7, + (PCODE)0, (PCODE)0, (PCODE)Load_FA2, (PCODE)Load_FA2_FA3, (PCODE)Load_FA2_FA3_FA4, (PCODE)Load_FA2_FA3_FA4_FA5, (PCODE)Load_FA2_FA3_FA4_FA5_FA6, (PCODE)Load_FA2_FA3_FA4_FA5_FA6_FA7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_FA3, (PCODE)Load_FA3_FA4, (PCODE)Load_FA3_FA4_FA5, (PCODE)Load_FA3_FA4_FA5_FA6, (PCODE)Load_FA3_FA4_FA5_FA6_FA7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_FA4, (PCODE)Load_FA4_FA5, (PCODE)Load_FA4_FA5_FA6, (PCODE)Load_FA4_FA5_FA6_FA7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_FA5, (PCODE)Load_FA5_FA6, (PCODE)Load_FA5_FA6_FA7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_FA6, (PCODE)Load_FA6_FA7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_FA7 + }; + static const PCODE FPRegsStoreRoutines[] = { + (PCODE)Store_FA0, (PCODE)Store_FA0_FA1, (PCODE)Store_FA0_FA1_FA2, (PCODE)Store_FA0_FA1_FA2_FA3, (PCODE)Store_FA0_FA1_FA2_FA3_FA4, (PCODE)Store_FA0_FA1_FA2_FA3_FA4_FA5, (PCODE)Store_FA0_FA1_FA2_FA3_FA4_FA5_FA6, (PCODE)Store_FA0_FA1_FA2_FA3_FA4_FA5_FA6_FA7, + (PCODE)0, (PCODE)Store_FA1, (PCODE)Store_FA1_FA2, (PCODE)Store_FA1_FA2_FA3, (PCODE)Store_FA1_FA2_FA3_FA4, (PCODE)Store_FA1_FA2_FA3_FA4_FA5, (PCODE)Store_FA1_FA2_FA3_FA4_FA5_FA6, (PCODE)Store_FA1_FA2_FA3_FA4_FA5_FA6_FA7, + (PCODE)0, (PCODE)0, (PCODE)Store_FA2, (PCODE)Store_FA2_FA3, (PCODE)Store_FA2_FA3_FA4, (PCODE)Store_FA2_FA3_FA4_FA5, (PCODE)Store_FA2_FA3_FA4_FA5_FA6, (PCODE)Store_FA2_FA3_FA4_FA5_FA6_FA7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_FA3, (PCODE)Store_FA3_FA4, (PCODE)Store_FA3_FA4_FA5, (PCODE)Store_FA3_FA4_FA5_FA6, (PCODE)Store_FA3_FA4_FA5_FA6_FA7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_FA4, (PCODE)Store_FA4_FA5, (PCODE)Store_FA4_FA5_FA6, (PCODE)Store_FA4_FA5_FA6_FA7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_FA5, (PCODE)Store_FA5_FA6, (PCODE)Store_FA5_FA6_FA7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_FA6, (PCODE)Store_FA6_FA7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_FA7 + }; +#endif + int index = x1 * NUM_FLOAT_ARGUMENT_REGISTERS + x2; - PCODE routine = m_interpreterToNative ? FPRegsRoutines[index] : FPRegsStoreRoutines[index]; + PCODE routine = m_interpreterToNative ? FPRegsLoadRoutines[index] : FPRegsStoreRoutines[index]; _ASSERTE(routine != 0); return routine; #endif @@ -2054,7 +1030,30 @@ PCODE CallStubGenerator::GetFPRegRangeRoutine(int x1, int x2) #ifdef TARGET_ARM64 PCODE CallStubGenerator::GetFPReg128RangeRoutine(int x1, int x2) { +#if LOG_COMPUTE_CALL_STUB LOG2((LF2_INTERPRETER, LL_INFO10000, "GetFPReg128RangeRoutine %d %d\n", x1, x2)); +#endif + static const PCODE FPRegs128LoadRoutines[] = { + (PCODE)Load_Q0, (PCODE)Load_Q0_Q1, (PCODE)Load_Q0_Q1_Q2, (PCODE)Load_Q0_Q1_Q2_Q3, (PCODE)Load_Q0_Q1_Q2_Q3_Q4, (PCODE)Load_Q0_Q1_Q2_Q3_Q4_Q5, (PCODE)Load_Q0_Q1_Q2_Q3_Q4_Q5_Q6, (PCODE)Load_Q0_Q1_Q2_Q3_Q4_Q5_Q6_Q7, + (PCODE)0, (PCODE)Load_Q1, (PCODE)Load_Q1_Q2, (PCODE)Load_Q1_Q2_Q3, (PCODE)Load_Q1_Q2_Q3_Q4, (PCODE)Load_Q1_Q2_Q3_Q4_Q5, (PCODE)Load_Q1_Q2_Q3_Q4_Q5_Q6, (PCODE)Load_Q1_Q2_Q3_Q4_Q5_Q6_Q7, + (PCODE)0, (PCODE)0, (PCODE)Load_Q2, (PCODE)Load_Q2_Q3, (PCODE)Load_Q2_Q3_Q4, (PCODE)Load_Q2_Q3_Q4_Q5, (PCODE)Load_Q2_Q3_Q4_Q5_Q6, (PCODE)Load_Q2_Q3_Q4_Q5_Q6_Q7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_Q3, (PCODE)Load_Q3_Q4, (PCODE)Load_Q3_Q4_Q5, (PCODE)Load_Q3_Q4_Q5_Q6, (PCODE)Load_Q3_Q4_Q5_Q6_Q7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_Q4, (PCODE)Load_Q4_Q5, (PCODE)Load_Q4_Q5_Q6, (PCODE)Load_Q4_Q5_Q6_Q7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_Q5, (PCODE)Load_Q5_Q6, (PCODE)Load_Q5_Q6_Q7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_Q6, (PCODE)Load_Q6_Q7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_Q7 + }; + static const PCODE FPRegs128StoreRoutines[] = { + (PCODE)Store_Q0, (PCODE)Store_Q0_Q1, (PCODE)Store_Q0_Q1_Q2, (PCODE)Store_Q0_Q1_Q2_Q3, (PCODE)Store_Q0_Q1_Q2_Q3_Q4, (PCODE)Store_Q0_Q1_Q2_Q3_Q4_Q5, (PCODE)Store_Q0_Q1_Q2_Q3_Q4_Q5_Q6, (PCODE)Store_Q0_Q1_Q2_Q3_Q4_Q5_Q6_Q7, + (PCODE)0, (PCODE)Store_Q1, (PCODE)Store_Q1_Q2, (PCODE)Store_Q1_Q2_Q3, (PCODE)Store_Q1_Q2_Q3_Q4, (PCODE)Store_Q1_Q2_Q3_Q4_Q5, (PCODE)Store_Q1_Q2_Q3_Q4_Q5_Q6, (PCODE)Store_Q1_Q2_Q3_Q4_Q5_Q6_Q7, + (PCODE)0, (PCODE)0, (PCODE)Store_Q2, (PCODE)Store_Q2_Q3, (PCODE)Store_Q2_Q3_Q4, (PCODE)Store_Q2_Q3_Q4_Q5, (PCODE)Store_Q2_Q3_Q4_Q5_Q6, (PCODE)Store_Q2_Q3_Q4_Q5_Q6_Q7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_Q3, (PCODE)Store_Q3_Q4, (PCODE)Store_Q3_Q4_Q5, (PCODE)Store_Q3_Q4_Q5_Q6, (PCODE)Store_Q3_Q4_Q5_Q6_Q7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_Q4, (PCODE)Store_Q4_Q5, (PCODE)Store_Q4_Q5_Q6, (PCODE)Store_Q4_Q5_Q6_Q7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_Q5, (PCODE)Store_Q5_Q6, (PCODE)Store_Q5_Q6_Q7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_Q6, (PCODE)Store_Q6_Q7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_Q7 + }; + int index = x1 * NUM_FLOAT_ARGUMENT_REGISTERS + x2; PCODE routine = m_interpreterToNative ? FPRegs128LoadRoutines[index] : FPRegs128StoreRoutines[index]; _ASSERTE(routine != 0); @@ -2063,7 +1062,31 @@ PCODE CallStubGenerator::GetFPReg128RangeRoutine(int x1, int x2) PCODE CallStubGenerator::GetFPReg32RangeRoutine(int x1, int x2) { +#if LOG_COMPUTE_CALL_STUB LOG2((LF2_INTERPRETER, LL_INFO10000, "GetFPReg32RangeRoutine %d %d\n", x1, x2)); + +#endif + static const PCODE FPRegs32LoadRoutines[] = { + (PCODE)Load_S0, (PCODE)Load_S0_S1, (PCODE)Load_S0_S1_S2, (PCODE)Load_S0_S1_S2_S3, (PCODE)Load_S0_S1_S2_S3_S4, (PCODE)Load_S0_S1_S2_S3_S4_S5, (PCODE)Load_S0_S1_S2_S3_S4_S5_S6, (PCODE)Load_S0_S1_S2_S3_S4_S5_S6_S7, + (PCODE)0, (PCODE)Load_S1, (PCODE)Load_S1_S2, (PCODE)Load_S1_S2_S3, (PCODE)Load_S1_S2_S3_S4, (PCODE)Load_S1_S2_S3_S4_S5, (PCODE)Load_S1_S2_S3_S4_S5_S6, (PCODE)Load_S1_S2_S3_S4_S5_S6_S7, + (PCODE)0, (PCODE)0, (PCODE)Load_S2, (PCODE)Load_S2_S3, (PCODE)Load_S2_S3_S4, (PCODE)Load_S2_S3_S4_S5, (PCODE)Load_S2_S3_S4_S5_S6, (PCODE)Load_S2_S3_S4_S5_S6_S7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_S3, (PCODE)Load_S3_S4, (PCODE)Load_S3_S4_S5, (PCODE)Load_S3_S4_S5_S6, (PCODE)Load_S3_S4_S5_S6_S7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_S4, (PCODE)Load_S4_S5, (PCODE)Load_S4_S5_S6, (PCODE)Load_S4_S5_S6_S7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_S5, (PCODE)Load_S5_S6, (PCODE)Load_S5_S6_S7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_S6, (PCODE)Load_S6_S7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_S7 + }; + static const PCODE FPRegs32StoreRoutines[] = { + (PCODE)Store_S0, (PCODE)Store_S0_S1, (PCODE)Store_S0_S1_S2, (PCODE)Store_S0_S1_S2_S3, (PCODE)Store_S0_S1_S2_S3_S4, (PCODE)Store_S0_S1_S2_S3_S4_S5, (PCODE)Store_S0_S1_S2_S3_S4_S5_S6, (PCODE)Store_S0_S1_S2_S3_S4_S5_S6_S7, + (PCODE)0, (PCODE)Store_S1, (PCODE)Store_S1_S2, (PCODE)Store_S1_S2_S3, (PCODE)Store_S1_S2_S3_S4, (PCODE)Store_S1_S2_S3_S4_S5, (PCODE)Store_S1_S2_S3_S4_S5_S6, (PCODE)Store_S1_S2_S3_S4_S5_S6_S7, + (PCODE)0, (PCODE)0, (PCODE)Store_S2, (PCODE)Store_S2_S3, (PCODE)Store_S2_S3_S4, (PCODE)Store_S2_S3_S4_S5, (PCODE)Store_S2_S3_S4_S5_S6, (PCODE)Store_S2_S3_S4_S5_S6_S7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_S3, (PCODE)Store_S3_S4, (PCODE)Store_S3_S4_S5, (PCODE)Store_S3_S4_S5_S6, (PCODE)Store_S3_S4_S5_S6_S7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_S4, (PCODE)Store_S4_S5, (PCODE)Store_S4_S5_S6, (PCODE)Store_S4_S5_S6_S7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_S5, (PCODE)Store_S5_S6, (PCODE)Store_S5_S6_S7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_S6, (PCODE)Store_S6_S7, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_S7 + }; + int index = x1 * NUM_FLOAT_ARGUMENT_REGISTERS + x2; return m_interpreterToNative ? FPRegs32LoadRoutines[index] : FPRegs32StoreRoutines[index]; } @@ -2073,8 +1096,21 @@ PCODE CallStubGenerator::GetFPReg32RangeRoutine(int x1, int x2) PCODE CallStubGenerator::GetRegRoutine_4B(int r1, int r2) { #if LOG_COMPUTE_CALL_STUB - printf("GetRegRoutine_4B\n"); + LOG2((LF2_INTERPRETER, LL_INFO10000, "GetRegRoutine_4B\n")); #endif + static const PCODE GPRegLoadRoutines_4B[] = { + (PCODE)0, (PCODE)Load_R0_R1_4B, (PCODE)0, (PCODE)Load_R0_R1_R2_R3_4B, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Load_R2_R3_4B, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0 + }; + static const PCODE GPRegStoreRoutines_4B[] = { + (PCODE)0, (PCODE)Store_R0_R1_4B, (PCODE)0, (PCODE)Store_R0_R1_R2_R3_4B, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)Store_R2_R3_4B, + (PCODE)0, (PCODE)0, (PCODE)0, (PCODE)0 + }; + int index = r1 * NUM_ARGUMENT_REGISTERS + r2; return m_interpreterToNative ? GPRegLoadRoutines_4B[index] : GPRegStoreRoutines_4B[index]; } @@ -2082,11 +1118,82 @@ PCODE CallStubGenerator::GetRegRoutine_4B(int r1, int r2) PCODE CallStubGenerator::GetStackRoutine_4B() { #if LOG_COMPUTE_CALL_STUB - printf("GetStackRoutine_4B\n"); + LOG2((LF2_INTERPRETER, LL_INFO10000, "GetStackRoutine_4B\n")); #endif return m_interpreterToNative ? (PCODE)Load_Stack_4B : (PCODE)Store_Stack_4B; } #endif // TARGET_ARM +#if defined(TARGET_APPLE) && defined(TARGET_ARM64) +PCODE CallStubGenerator::GetSwiftSelfRoutine() +{ +#if LOG_COMPUTE_CALL_STUB + LOG2((LF2_INTERPRETER, LL_INFO10000, "GetSwiftSelfRoutine\n")); +#endif + return (PCODE)Load_SwiftSelf; +} + +PCODE CallStubGenerator::GetSwiftSelfByRefRoutine() +{ +#if LOG_COMPUTE_CALL_STUB + LOG2((LF2_INTERPRETER, LL_INFO10000, "GetSwiftSelfByRefRoutine\n")); +#endif + return (PCODE)Load_SwiftSelf_ByRef; +} + +PCODE CallStubGenerator::GetSwiftErrorRoutine() +{ +#if LOG_COMPUTE_CALL_STUB + LOG2((LF2_INTERPRETER, LL_INFO10000, "GetSwiftErrorRoutine\n")); +#endif + return (PCODE)Load_SwiftError; +} + +PCODE CallStubGenerator::GetSwiftIndirectResultRoutine() +{ +#if LOG_COMPUTE_CALL_STUB + LOG2((LF2_INTERPRETER, LL_INFO10000, "GetSwiftIndirectResultRoutine\n")); +#endif + return (PCODE)Load_SwiftIndirectResult; +} + +PCODE CallStubGenerator::GetSwiftLoadGPAtOffsetRoutine(int regIndex) +{ + static PCODE routines[] = { + (PCODE)Load_X0_AtOffset, (PCODE)Load_X1_AtOffset, (PCODE)Load_X2_AtOffset, (PCODE)Load_X3_AtOffset, + (PCODE)Load_X4_AtOffset, (PCODE)Load_X5_AtOffset, (PCODE)Load_X6_AtOffset, (PCODE)Load_X7_AtOffset + }; + _ASSERTE(regIndex >= 0 && regIndex < ARRAY_SIZE(routines)); + return routines[regIndex]; +} + +PCODE CallStubGenerator::GetSwiftLoadFPAtOffsetRoutine(int regIndex) +{ + static PCODE routines[] = { + (PCODE)Load_D0_AtOffset, (PCODE)Load_D1_AtOffset, (PCODE)Load_D2_AtOffset, (PCODE)Load_D3_AtOffset, + (PCODE)Load_D4_AtOffset, (PCODE)Load_D5_AtOffset, (PCODE)Load_D6_AtOffset, (PCODE)Load_D7_AtOffset + }; + _ASSERTE(regIndex >= 0 && regIndex < ARRAY_SIZE(routines)); + return routines[regIndex]; +} + +PCODE CallStubGenerator::GetSwiftStoreGPAtOffsetRoutine(int regIndex) +{ + static PCODE routines[] = { + (PCODE)Store_X0_AtOffset, (PCODE)Store_X1_AtOffset, (PCODE)Store_X2_AtOffset, (PCODE)Store_X3_AtOffset + }; + _ASSERTE(regIndex >= 0 && regIndex < ARRAY_SIZE(routines)); + return routines[regIndex]; +} + +PCODE CallStubGenerator::GetSwiftStoreFPAtOffsetRoutine(int regIndex) +{ + static PCODE routines[] = { + (PCODE)Store_D0_AtOffset, (PCODE)Store_D1_AtOffset, (PCODE)Store_D2_AtOffset, (PCODE)Store_D3_AtOffset + }; + _ASSERTE(regIndex >= 0 && regIndex < ARRAY_SIZE(routines)); + return routines[regIndex]; +} +#endif // TARGET_APPLE && TARGET_ARM64 extern "C" void CallJittedMethodRetVoid(PCODE *routines, int8_t*pArgs, int8_t*pRet, int totalStackSize, PTR_PTR_Object pContinuation); extern "C" void CallJittedMethodRetDouble(PCODE *routines, int8_t*pArgs, int8_t*pRet, int totalStackSize, PTR_PTR_Object pContinuation); @@ -2161,6 +1268,9 @@ extern "C" void CallJittedMethodRetVector128(PCODE *routines, int8_t *pArgs, int extern "C" void CallJittedMethodRet2Vector128(PCODE *routines, int8_t *pArgs, int8_t *pRet, int totalStackSize, PTR_PTR_Object pContinuation); extern "C" void CallJittedMethodRet3Vector128(PCODE *routines, int8_t *pArgs, int8_t *pRet, int totalStackSize, PTR_PTR_Object pContinuation); extern "C" void CallJittedMethodRet4Vector128(PCODE *routines, int8_t *pArgs, int8_t *pRet, int totalStackSize, PTR_PTR_Object pContinuation); +#if defined(TARGET_APPLE) +extern "C" void CallJittedMethodRetSwiftLowered(PCODE *routines, int8_t*pArgs, int8_t*pRet, int totalStackSize, PTR_PTR_Object pContinuation); +#endif // TARGET_APPLE extern "C" void InterpreterStubRet2I8(); extern "C" void InterpreterStubRet2Double(); extern "C" void InterpreterStubRet3Double(); @@ -2291,6 +1401,10 @@ CallStubHeader::InvokeFunctionPtr CallStubGenerator::GetInvokeFunctionPtr(CallSt INVOKE_FUNCTION_PTR(CallJittedMethodRet3Vector128); case ReturnType4Vector128: INVOKE_FUNCTION_PTR(CallJittedMethodRet4Vector128); +#if defined(TARGET_APPLE) + case ReturnTypeSwiftLowered: + INVOKE_FUNCTION_PTR(CallJittedMethodRetSwiftLowered); +#endif // TARGET_APPLE #endif // TARGET_ARM64 #if defined(TARGET_RISCV64) case ReturnType2I8: @@ -2455,16 +1569,18 @@ CallStubHeader *CallStubGenerator::GenerateCallStub(MethodDesc *pMD, AllocMemTra LoaderAllocator *pLoaderAllocator = pMD->GetLoaderAllocator(); S_SIZE_T finalStubSize(sizeof(CallStubHeader) + m_routineIndex * sizeof(PCODE)); void *pHeaderStorage = pamTracker->Track(pLoaderAllocator->GetHighFrequencyHeap()->AllocMem(finalStubSize)); + bool hasSwiftError = m_isSwiftCallConv && m_hasSwiftError && pMD->IsILStub(); - CallStubHeader *pHeader = new (pHeaderStorage) CallStubHeader(m_routineIndex, pRoutines, ALIGN_UP(m_totalStackSize, STACK_ALIGN_SIZE), sig.IsAsyncCall(), m_pInvokeFunction); + int targetSlotIndex = m_interpreterToNative ? m_targetSlotIndex : (m_routineIndex - 1); + CallStubHeader *pHeader = new (pHeaderStorage) CallStubHeader(m_routineIndex, targetSlotIndex, pRoutines, ALIGN_UP(m_totalStackSize, STACK_ALIGN_SIZE), sig.IsAsyncCall(), hasSwiftError, m_pInvokeFunction); return pHeader; } struct CachedCallStubKey { - CachedCallStubKey(int32_t hashCode, int numRoutines, PCODE *pRoutines, int totalStackSize, bool hasContinuationRet, CallStubHeader::InvokeFunctionPtr pInvokeFunction) - : HashCode(hashCode), NumRoutines(numRoutines), TotalStackSize(totalStackSize), HasContinuationRet(hasContinuationRet), Invoke(pInvokeFunction), Routines(pRoutines) + CachedCallStubKey(int32_t hashCode, int numRoutines, int targetSlotIndex, PCODE *pRoutines, int totalStackSize, bool hasContinuationRet, bool hasSwiftError, CallStubHeader::InvokeFunctionPtr pInvokeFunction) + : HashCode(hashCode), NumRoutines(numRoutines), TargetSlotIndex(targetSlotIndex), TotalStackSize(totalStackSize), HasContinuationRet(hasContinuationRet), HasSwiftError(hasSwiftError), Invoke(pInvokeFunction), Routines(pRoutines) { } @@ -2472,7 +1588,7 @@ struct CachedCallStubKey { LIMITED_METHOD_CONTRACT; - if (HashCode != other.HashCode || NumRoutines != other.NumRoutines || TotalStackSize != other.TotalStackSize || Invoke != other.Invoke || HasContinuationRet != other.HasContinuationRet) + if (HashCode != other.HashCode || NumRoutines != other.NumRoutines || TargetSlotIndex != other.TargetSlotIndex || TotalStackSize != other.TotalStackSize || Invoke != other.Invoke || HasContinuationRet != other.HasContinuationRet || HasSwiftError != other.HasSwiftError) return false; for (int i = 0; i < NumRoutines; i++) @@ -2485,17 +1601,19 @@ struct CachedCallStubKey const int32_t HashCode = 0; const int NumRoutines = 0; + const int TargetSlotIndex = 0; const int TotalStackSize = 0; const bool HasContinuationRet = false; + const bool HasSwiftError = false; const CallStubHeader::InvokeFunctionPtr Invoke = NULL; // Pointer to the invoke function const PCODE *Routines; }; struct CachedCallStub { - CachedCallStub(int32_t hashCode, int numRoutines, PCODE *pRoutines, int totalStackSize, bool hasContinuationRet, CallStubHeader::InvokeFunctionPtr pInvokeFunction) : + CachedCallStub(int32_t hashCode, int numRoutines, int targetSlotIndex, PCODE *pRoutines, int totalStackSize, bool hasContinuationRet, bool hasSwiftError, CallStubHeader::InvokeFunctionPtr pInvokeFunction) : HashCode(hashCode), - Header(numRoutines, pRoutines, totalStackSize, hasContinuationRet, pInvokeFunction) + Header(numRoutines, targetSlotIndex, pRoutines, totalStackSize, hasContinuationRet, hasSwiftError, pInvokeFunction) { } @@ -2507,9 +1625,11 @@ struct CachedCallStub return CachedCallStubKey( HashCode, Header.NumRoutines, + Header.TargetSlotIndex, &Header.Routines[0], Header.TotalStackSize, Header.HasContinuationRet, + Header.HasSwiftError, Header.Invoke); } @@ -2557,13 +1677,17 @@ CallStubHeader *CallStubGenerator::GenerateCallStubForSig(MetaSig &sig) hashState.Add(m_totalStackSize); hashState.AddPointer((void*)m_pInvokeFunction); hashState.Add(sig.IsAsyncCall() ? 1 : 0); + hashState.Add(m_targetSlotIndex); + hashState.Add(m_hasSwiftError ? 1 : 0); CachedCallStubKey cachedHeaderKey( hashState.ToHashCode(), m_routineIndex, + m_targetSlotIndex, pRoutines, ALIGN_UP(m_totalStackSize, STACK_ALIGN_SIZE), sig.IsAsyncCall(), + m_hasSwiftError, m_pInvokeFunction); CrstHolder lockHolder(&s_callStubCrst); @@ -2581,7 +1705,7 @@ CallStubHeader *CallStubGenerator::GenerateCallStubForSig(MetaSig &sig) // We only need to allocate the actual pRoutines array, and then we can just use the cachedHeader we already constructed size_t finalCachedCallStubSize = sizeof(CachedCallStub) + m_routineIndex * sizeof(PCODE); void* pHeaderStorage = amTracker.Track(SystemDomain::GetGlobalLoaderAllocator()->GetHighFrequencyHeap()->AllocMem(S_SIZE_T(finalCachedCallStubSize))); - CachedCallStub *pHeader = new (pHeaderStorage) CachedCallStub(cachedHeaderKey.HashCode, m_routineIndex, pRoutines, ALIGN_UP(m_totalStackSize, STACK_ALIGN_SIZE), sig.IsAsyncCall(), m_pInvokeFunction); + CachedCallStub *pHeader = new (pHeaderStorage) CachedCallStub(cachedHeaderKey.HashCode, m_routineIndex, m_targetSlotIndex, pRoutines, ALIGN_UP(m_totalStackSize, STACK_ALIGN_SIZE), sig.IsAsyncCall(), m_hasSwiftError, m_pInvokeFunction); s_callStubCache->Add(pHeader); amTracker.SuppressRelease(); @@ -2618,6 +1742,30 @@ void CallStubGenerator::TerminateCurrentRoutineIfNotOfNewType(RoutineType type, m_x1 = NoRange; m_currentRoutineType = RoutineType::None; } +#if defined(TARGET_APPLE) + else if ((m_currentRoutineType == RoutineType::SwiftSelf) && (type != RoutineType::SwiftSelf)) + { + pRoutines[m_routineIndex++] = GetSwiftSelfRoutine(); + m_currentRoutineType = RoutineType::None; + } + else if ((m_currentRoutineType == RoutineType::SwiftSelfByRef) && (type != RoutineType::SwiftSelfByRef)) + { + pRoutines[m_routineIndex++] = GetSwiftSelfByRefRoutine(); + pRoutines[m_routineIndex++] = (PCODE)m_swiftSelfByRefSize; + m_swiftSelfByRefSize = 0; + m_currentRoutineType = RoutineType::None; + } + else if ((m_currentRoutineType == RoutineType::SwiftError) && (type != RoutineType::SwiftError)) + { + pRoutines[m_routineIndex++] = GetSwiftErrorRoutine(); + m_currentRoutineType = RoutineType::None; + } + else if ((m_currentRoutineType == RoutineType::SwiftIndirectResult) && (type != RoutineType::SwiftIndirectResult)) + { + pRoutines[m_routineIndex++] = GetSwiftIndirectResultRoutine(); + m_currentRoutineType = RoutineType::None; + } +#endif // TARGET_APPLE #endif // TARGET_ARM64 else if ((m_currentRoutineType == RoutineType::Stack) && (type != RoutineType::Stack)) { @@ -2679,9 +1827,16 @@ void CallStubGenerator::ComputeCallStub(MetaSig &sig, PCODE *pRoutines, MethodDe PInvoke::GetCallingConvention_IgnoreErrors(pMD, &unmanagedCallConv, NULL); hasUnmanagedCallConv = true; } - // NOTE: IL stubs don't actually have an UnmanagedCallersOnly attribute, - // even though the HasUnmanagedCallersOnlyAttribute method may return true for them. - else if (pMD != NULL && pMD->HasUnmanagedCallersOnlyAttribute() && !pMD->IsILStub()) + else if (pMD != NULL && pMD->IsILStub()) + { + MethodDesc* pTargetMD = pMD->AsDynamicMethodDesc()->GetILStubResolver()->GetStubTargetMethodDesc(); + if (pTargetMD != NULL && pTargetMD->IsPInvoke()) + { + PInvoke::GetCallingConvention_IgnoreErrors(pTargetMD, &unmanagedCallConv, NULL); + hasUnmanagedCallConv = true; + } + } + else if (pMD != NULL && pMD->HasUnmanagedCallersOnlyAttribute()) { if (CallConv::TryGetCallingConventionFromUnmanagedCallersOnly(pMD, &unmanagedCallConv)) { @@ -2747,10 +1902,20 @@ void CallStubGenerator::ComputeCallStubWorker(bool hasUnmanagedCallConv, CorInfo { bool unmanagedThisCallConv = false; bool rewriteMetaSigFromExplicitThisToHasThis = false; +#if defined(TARGET_APPLE) && defined(TARGET_ARM64) + bool isSwiftCallConv = false; +#endif if (hasUnmanagedCallConv) { - unmanagedThisCallConv = callConvIsInstanceMethodCallConv(unmanagedCallConv); +#if defined(TARGET_APPLE) && defined(TARGET_ARM64) + isSwiftCallConv = (unmanagedCallConv == CorInfoCallConvExtension::Swift); + m_isSwiftCallConv = isSwiftCallConv; + if (!isSwiftCallConv) +#endif + { + unmanagedThisCallConv = callConvIsInstanceMethodCallConv(unmanagedCallConv); + } } #if defined(TARGET_WINDOWS) @@ -2830,6 +1995,22 @@ void CallStubGenerator::ComputeCallStubWorker(bool hasUnmanagedCallConv, CorInfo sig = newSig; } +#if defined(TARGET_APPLE) && defined(TARGET_ARM64) + CQuickArray swiftLoweringInfo; + SigBuilder swiftSigBuilder; + int swiftIndirectResultCount = 0; + int swiftArgIndex = 0; + + m_hasSwiftReturnLowering = false; + m_swiftReturnLowering = {}; + m_swiftSelfByRefSize = 0; + + if (isSwiftCallConv) + { + RewriteSignatureForSwiftLowering(sig, swiftSigBuilder, swiftLoweringInfo, swiftIndirectResultCount); + } +#endif // TARGET_APPLE && TARGET_ARM64 + ArgIteratorType argIt(&sig); int32_t interpreterStackOffset = 0; @@ -2876,6 +2057,19 @@ void CallStubGenerator::ComputeCallStubWorker(bool hasUnmanagedCallConv, CorInfo interpreterStackOffset += INTERP_STACK_SLOT_SIZE; } +#if defined(TARGET_APPLE) && defined(TARGET_ARM64) + if (swiftIndirectResultCount > 0) + { +#if LOG_COMPUTE_CALL_STUB + LOG2((LF2_INTERPRETER, LL_INFO10000, "Emitting Load_SwiftIndirectResult routine\n")); +#endif + TerminateCurrentRoutineIfNotOfNewType(RoutineType::SwiftIndirectResult, pRoutines); + pRoutines[m_routineIndex++] = GetSwiftIndirectResultRoutine(); + m_currentRoutineType = RoutineType::None; + interpreterStackOffset += INTERP_STACK_SLOT_SIZE; + } +#endif + int ofs; while ((ofs = argIt.GetNextOffset()) != TransitionBlock::InvalidOffset) { @@ -2889,6 +2083,33 @@ void CallStubGenerator::ComputeCallStubWorker(bool hasUnmanagedCallConv, CorInfo // Each entry on the interpreter stack is always aligned to at least 8 bytes, but some arguments are 16 byte aligned TypeHandle thArgTypeHandle; CorElementType corType = argIt.GetArgType(&thArgTypeHandle); +#if defined(TARGET_APPLE) && defined(TARGET_ARM64) + if (isSwiftCallConv && m_interpreterToNative) + { + MethodTable* pArgMT = nullptr; + + if (corType == ELEMENT_TYPE_BYREF) + { + sig.GetByRefType(&thArgTypeHandle); + } + + if (thArgTypeHandle.IsTypeDesc() && !thArgTypeHandle.AsTypeDesc()->GetTypeParam().IsNull()) + { + pArgMT = thArgTypeHandle.AsTypeDesc()->GetTypeParam().AsMethodTable(); + } + else if (!thArgTypeHandle.IsTypeDesc() && !thArgTypeHandle.IsNull()) + { + pArgMT = thArgTypeHandle.AsMethodTable(); + } + + if (ProcessSwiftSpecialArgument(pArgMT, interpStackSlotSize, interpreterStackOffset, pRoutines)) + { + swiftArgIndex++; + continue; + } + } +#endif // TARGET_APPLE && TARGET_ARM64 + if ((corType == ELEMENT_TYPE_VALUETYPE) && thArgTypeHandle.GetSize() > INTERP_STACK_SLOT_SIZE) { unsigned align = CEEInfo::getClassAlignmentRequirementStatic(thArgTypeHandle); @@ -2914,6 +2135,25 @@ void CallStubGenerator::ComputeCallStubWorker(bool hasUnmanagedCallConv, CorInfo interpStackSlotSize = ALIGN_UP(thArgTypeHandle.GetSize(), align); } + +#if defined(TARGET_APPLE) && defined(TARGET_ARM64) + if (isSwiftCallConv && m_interpreterToNative && swiftArgIndex < (int)swiftLoweringInfo.Size()) + { + SwiftLoweringElement& elem = swiftLoweringInfo[swiftArgIndex]; + swiftArgIndex++; + + if (elem.isLowered) + { + if (elem.structSize != 0) + { + interpreterStackOffset += elem.structSize; + } + EmitSwiftLoweredElementRoutine(elem, argLocDesc, pRoutines); + continue; + } + } +#endif // TARGET_APPLE && TARGET_ARM64 + interpreterStackOffset += interpStackSlotSize; #ifdef UNIX_AMD64_ABI @@ -2996,7 +2236,15 @@ void CallStubGenerator::ComputeCallStubWorker(bool hasUnmanagedCallConv, CorInfo if (m_interpreterToNative) { m_pInvokeFunction = GetInvokeFunctionPtr(returnType); + m_targetSlotIndex = m_routineIndex; m_routineIndex++; // Reserve one extra slot for the target method pointer + +#if defined(TARGET_APPLE) && defined(TARGET_ARM64) + if (m_hasSwiftReturnLowering) + { + EmitSwiftReturnLoweringRoutines(pRoutines); + } +#endif // TARGET_APPLE && TARGET_ARM64 } else { @@ -3245,6 +2493,13 @@ void CallStubGenerator::ProcessArgument(ArgIteratorType *pArgIt, ArgLocDesc& arg template CallStubGenerator::ReturnType CallStubGenerator::GetReturnType(ArgIteratorType *pArgIt) { +#if defined(TARGET_APPLE) && defined(TARGET_ARM64) + if (m_hasSwiftReturnLowering) + { + return ReturnTypeSwiftLowered; + } +#endif // TARGET_APPLE && TARGET_ARM64 + if (pArgIt->HasRetBuffArg()) { #if defined(TARGET_AMD64) || defined(TARGET_ARM) @@ -3519,4 +2774,397 @@ CallStubGenerator::ReturnType CallStubGenerator::GetReturnType(ArgIteratorType * return ReturnTypeVoid; } +#if defined(TARGET_APPLE) && defined(TARGET_ARM64) +void CallStubGenerator::RewriteSignatureForSwiftLowering(MetaSig &sig, SigBuilder &swiftSigBuilder, CQuickArray &swiftLoweringInfo, int &swiftIndirectResultCount) +{ + sig.Reset(); + TypeHandle thReturnType; + CorElementType retCorType = sig.GetReturnTypeNormalized(&thReturnType); + if (retCorType == ELEMENT_TYPE_VALUETYPE && !thReturnType.IsNull() && !thReturnType.IsTypeDesc()) + { + MethodTable* pRetMT = thReturnType.AsMethodTable(); + if (pRetMT->IsValueType() && !pRetMT->IsHFA() && + !pRetMT->HasSameTypeDefAs(CoreLibBinder::GetClass(CLASS__VECTOR64T)) && + !pRetMT->HasSameTypeDefAs(CoreLibBinder::GetClass(CLASS__VECTOR128T)) && + !pRetMT->HasSameTypeDefAs(CoreLibBinder::GetClass(CLASS__VECTOR256T)) && + !pRetMT->HasSameTypeDefAs(CoreLibBinder::GetClass(CLASS__VECTOR512T)) && + !pRetMT->HasSameTypeDefAs(CoreLibBinder::GetClass(CLASS__VECTORT))) + { + CORINFO_SWIFT_LOWERING lowering = {}; + pRetMT->GetNativeSwiftPhysicalLowering(&lowering, false); + if (!lowering.byReference && lowering.numLoweredElements > 0) + { + m_hasSwiftReturnLowering = true; + m_swiftReturnLowering = lowering; +#if LOG_COMPUTE_CALL_STUB + LOG2((LF2_INTERPRETER, LL_INFO10000, "Swift return lowering detected: %d elements\n", lowering.numLoweredElements)); +#endif + } + } + } + + // Count how many extra arguments we need due to Swift lowering + sig.Reset(); + int newArgCount = 0; + int swiftSelfCount = 0; + int swiftErrorCount = 0; + swiftIndirectResultCount = 0; + CorElementType argType; + while ((argType = sig.NextArg()) != ELEMENT_TYPE_END) + { + TypeHandle thArgType = sig.GetLastTypeHandleThrowing(); + MethodTable* pArgMT = nullptr; + + if (argType == ELEMENT_TYPE_BYREF) + { + sig.GetByRefType(&thArgType); + } + + // Extract the underlying MT for pointer types or unwrapped byrefs + if (thArgType.IsTypeDesc() && !thArgType.AsTypeDesc()->GetTypeParam().IsNull()) + { + pArgMT = thArgType.AsTypeDesc()->GetTypeParam().AsMethodTable(); + } + else if (!thArgType.IsTypeDesc() && !thArgType.IsNull()) + { + pArgMT = thArgType.AsMethodTable(); + } + + if (pArgMT != nullptr) + { + if (!pArgMT->IsValueType()) + { + COMPlusThrow(kInvalidProgramException); + } + + if (pArgMT->HasSameTypeDefAs(CoreLibBinder::GetClass(CLASS__VECTOR64T)) || + pArgMT->HasSameTypeDefAs(CoreLibBinder::GetClass(CLASS__VECTOR128T)) || + pArgMT->HasSameTypeDefAs(CoreLibBinder::GetClass(CLASS__VECTOR256T)) || + pArgMT->HasSameTypeDefAs(CoreLibBinder::GetClass(CLASS__VECTOR512T)) || + pArgMT->HasSameTypeDefAs(CoreLibBinder::GetClass(CLASS__VECTORT))) + { + COMPlusThrow(kInvalidProgramException); + } + + if (pArgMT == CoreLibBinder::GetClass(CLASS__SWIFT_SELF)) + { + swiftSelfCount++; + if (swiftSelfCount > 1) + { + COMPlusThrow(kInvalidProgramException); + } + newArgCount++; + continue; + } + + if (pArgMT->HasSameTypeDefAs(CoreLibBinder::GetClass(CLASS__SWIFT_SELF_T))) + { + swiftSelfCount++; + if (swiftSelfCount > 1) + { + COMPlusThrow(kInvalidProgramException); + } + + // Fall through for struct lowering + } + + if (pArgMT == CoreLibBinder::GetClass(CLASS__SWIFT_ERROR)) + { + swiftErrorCount++; + m_hasSwiftError = true; + if (swiftErrorCount > 1) + { + COMPlusThrow(kInvalidProgramException); + } + newArgCount++; + continue; + } + + if (pArgMT == CoreLibBinder::GetClass(CLASS__SWIFT_INDIRECT_RESULT)) + { + swiftIndirectResultCount++; + if (swiftIndirectResultCount > 1) + { + COMPlusThrow(kInvalidProgramException); + } + // SwiftIndirectResult goes in x8, not in argument registers + continue; + } + + if (argType == ELEMENT_TYPE_VALUETYPE) + { + CORINFO_SWIFT_LOWERING lowering = {}; + pArgMT->GetNativeSwiftPhysicalLowering(&lowering, false); + + if (!lowering.byReference && lowering.numLoweredElements > 0) + { + newArgCount += (int)lowering.numLoweredElements; + continue; + } + } + } + + newArgCount++; + } + + if (!m_interpreterToNative) + { + sig.Reset(); + return; + } + + swiftLoweringInfo.ReSizeThrows(newArgCount); + int loweringIndex = 0; + + // Build new signature with lowered structs and store lowering info + swiftSigBuilder.AppendByte((BYTE)sig.GetCallingConventionInfo()); + swiftSigBuilder.AppendData(newArgCount); + + // Copy return type + SigPointer pReturn = sig.GetReturnProps(); + pReturn.ConvertToInternalExactlyOne(sig.GetModule(), sig.GetSigTypeContext(), &swiftSigBuilder); + + // Process arguments + sig.Reset(); + while ((argType = sig.NextArg()) != ELEMENT_TYPE_END) + { + if (argType == ELEMENT_TYPE_VALUETYPE) + { + TypeHandle thArgType = sig.GetLastTypeHandleThrowing(); + MethodTable* pArgMT = thArgType.IsTypeDesc() ? nullptr : thArgType.AsMethodTable(); + if (pArgMT != nullptr) + { + if (pArgMT == CoreLibBinder::GetClass(CLASS__SWIFT_INDIRECT_RESULT)) + { + // SwiftIndirectResult goes in x8, not in argument registers + continue; + } + // Don't lower Swift* types except SwiftSelf + if (pArgMT == CoreLibBinder::GetClass(CLASS__SWIFT_SELF)) + { + SigPointer pArg = sig.GetArgProps(); + pArg.ConvertToInternalExactlyOne(sig.GetModule(), sig.GetSigTypeContext(), &swiftSigBuilder); + swiftLoweringInfo[loweringIndex++] = { 0, 0, false, false }; + continue; + } + + CORINFO_SWIFT_LOWERING lowering = {}; + pArgMT->GetNativeSwiftPhysicalLowering(&lowering, false); + + if (!lowering.byReference && lowering.numLoweredElements > 0) + { + // Emit primitive types instead of struct + int structSize = ALIGN_UP(pArgMT->GetNumInstanceFieldBytes(), INTERP_STACK_SLOT_SIZE); + for (size_t i = 0; i < lowering.numLoweredElements; i++) + { + bool isFloat = false; + switch (lowering.loweredElements[i]) + { + case CORINFO_TYPE_BYTE: + swiftSigBuilder.AppendElementType(ELEMENT_TYPE_I1); + break; + case CORINFO_TYPE_UBYTE: + swiftSigBuilder.AppendElementType(ELEMENT_TYPE_U1); + break; + case CORINFO_TYPE_SHORT: + swiftSigBuilder.AppendElementType(ELEMENT_TYPE_I2); + break; + case CORINFO_TYPE_USHORT: + swiftSigBuilder.AppendElementType(ELEMENT_TYPE_U2); + break; + case CORINFO_TYPE_INT: + swiftSigBuilder.AppendElementType(ELEMENT_TYPE_I4); + break; + case CORINFO_TYPE_UINT: + swiftSigBuilder.AppendElementType(ELEMENT_TYPE_U4); + break; + case CORINFO_TYPE_LONG: + swiftSigBuilder.AppendElementType(ELEMENT_TYPE_I8); + break; + case CORINFO_TYPE_ULONG: + swiftSigBuilder.AppendElementType(ELEMENT_TYPE_U8); + break; + case CORINFO_TYPE_NATIVEINT: + swiftSigBuilder.AppendElementType(ELEMENT_TYPE_I); + break; + case CORINFO_TYPE_NATIVEUINT: + swiftSigBuilder.AppendElementType(ELEMENT_TYPE_U); + break; + case CORINFO_TYPE_FLOAT: + swiftSigBuilder.AppendElementType(ELEMENT_TYPE_R4); + isFloat = true; + break; + case CORINFO_TYPE_DOUBLE: + swiftSigBuilder.AppendElementType(ELEMENT_TYPE_R8); + isFloat = true; + break; + default: + swiftSigBuilder.AppendElementType(ELEMENT_TYPE_I); + break; + } + bool isLast = (i == lowering.numLoweredElements - 1); + swiftLoweringInfo[loweringIndex++] = { + (uint16_t)lowering.offsets[i], + isLast ? (uint16_t)structSize : (uint16_t)0, + isFloat, + true + }; + } + continue; + } + } + } + + SigPointer pArg = sig.GetArgProps(); + pArg.ConvertToInternalExactlyOne(sig.GetModule(), sig.GetSigTypeContext(), &swiftSigBuilder); + swiftLoweringInfo[loweringIndex++] = { 0, 0, false, false }; + } + + DWORD cSwiftSig; + PCCOR_SIGNATURE pSwiftSig = (PCCOR_SIGNATURE)swiftSigBuilder.GetSignature(&cSwiftSig); + MetaSig swiftSig(pSwiftSig, cSwiftSig, sig.GetModule(), NULL, MetaSig::sigMember); + sig = swiftSig; +} + +bool CallStubGenerator::ProcessSwiftSpecialArgument(MethodTable* pArgMT, int interpStackSlotSize, int32_t &interpreterStackOffset, PCODE *pRoutines) +{ + if (pArgMT == nullptr) + { + return false; + } + + if (pArgMT->HasSameTypeDefAs(CoreLibBinder::GetClass(CLASS__SWIFT_SELF_T))) + { + Instantiation inst = pArgMT->GetInstantiation(); + _ASSERTE(inst.GetNumArgs() != 0); + TypeHandle innerType = inst[0]; + _ASSERTE(!innerType.IsNull() && !innerType.IsTypeDesc()); + MethodTable* pInnerMT = innerType.AsMethodTable(); +#if DEBUG + CORINFO_SWIFT_LOWERING lowering = {}; + pInnerMT->GetNativeSwiftPhysicalLowering(&lowering, false); + _ASSERTE(lowering.byReference); +#endif // DEBUG + +#if LOG_COMPUTE_CALL_STUB + LOG2((LF2_INTERPRETER, LL_INFO10000, "SwiftSelf argument detected\n")); +#endif + TerminateCurrentRoutineIfNotOfNewType(RoutineType::SwiftSelfByRef, pRoutines); + m_currentRoutineType = RoutineType::SwiftSelfByRef; + + int structSize = ALIGN_UP(pInnerMT->GetNumInstanceFieldBytes(), INTERP_STACK_SLOT_SIZE); + m_swiftSelfByRefSize = structSize; + interpreterStackOffset += structSize; + return true; + } + + if (pArgMT == CoreLibBinder::GetClass(CLASS__SWIFT_SELF)) + { +#if LOG_COMPUTE_CALL_STUB + LOG2((LF2_INTERPRETER, LL_INFO10000, "Swift Self argument detected\n")); +#endif + + TerminateCurrentRoutineIfNotOfNewType(RoutineType::SwiftSelf, pRoutines); + m_currentRoutineType = RoutineType::SwiftSelf; + interpreterStackOffset += interpStackSlotSize; + return true; + } + + if (pArgMT == CoreLibBinder::GetClass(CLASS__SWIFT_ERROR)) + { +#if LOG_COMPUTE_CALL_STUB + LOG2((LF2_INTERPRETER, LL_INFO10000, "Swift Error argument detected\n")); +#endif + + TerminateCurrentRoutineIfNotOfNewType(RoutineType::SwiftError, pRoutines); + m_currentRoutineType = RoutineType::SwiftError; + interpreterStackOffset += interpStackSlotSize; + return true; + } + + return false; +} + +void CallStubGenerator::EmitSwiftLoweredElementRoutine(SwiftLoweringElement &elem, ArgLocDesc &argLocDesc, PCODE *pRoutines) +{ + TerminateCurrentRoutineIfNotOfNewType(RoutineType::None, pRoutines); + + if (elem.isFloat && argLocDesc.m_cFloatReg > 0) + { + int regIndex = argLocDesc.m_idxFloatReg; + pRoutines[m_routineIndex++] = GetSwiftLoadFPAtOffsetRoutine(regIndex); + // Pack offset (lower 16 bits) and structSize (bits 16-31) + PCODE packedData = (PCODE)elem.offset | ((PCODE)elem.structSize << 16); + pRoutines[m_routineIndex++] = packedData; +#if LOG_COMPUTE_CALL_STUB + LOG2((LF2_INTERPRETER, LL_INFO10000, "Swift lowered element to FP reg: offset=%d, structSize=%d, reg=d%d\n", + elem.offset, elem.structSize, regIndex)); +#endif + } + else if (!elem.isFloat && argLocDesc.m_cGenReg > 0) + { + int regIndex = argLocDesc.m_idxGenReg; + pRoutines[m_routineIndex++] = GetSwiftLoadGPAtOffsetRoutine(regIndex); + // Pack offset (lower 16 bits) and structSize (bits 16-31) + PCODE packedData = (PCODE)elem.offset | ((PCODE)elem.structSize << 16); + pRoutines[m_routineIndex++] = packedData; +#if LOG_COMPUTE_CALL_STUB + LOG2((LF2_INTERPRETER, LL_INFO10000, "Swift lowered element to GP reg: offset=%d, structSize=%d, reg=x%d\n", + elem.offset, elem.structSize, regIndex)); +#endif + } + else + { + // Spilled to stack + pRoutines[m_routineIndex++] = (PCODE)Load_Stack_AtOffset; + // Pack offset (lower 16 bits), structSize (bits 16-31), and stackOffset (bits 32-63) + PCODE packedData = (PCODE)elem.offset | + ((PCODE)elem.structSize << 16) | + ((PCODE)argLocDesc.m_byteStackIndex << 32); + pRoutines[m_routineIndex++] = packedData; +#if LOG_COMPUTE_CALL_STUB + LOG2((LF2_INTERPRETER, LL_INFO10000, "Swift lowered element to stack: offset=%d, structSize=%d, stackOffset=%d\n", + elem.offset, elem.structSize, argLocDesc.m_byteStackIndex)); +#endif + } +} + +void CallStubGenerator::EmitSwiftReturnLoweringRoutines(PCODE *pRoutines) +{ + int gpRegIndex = 0; + int fpRegIndex = 0; + + for (size_t i = 0; i < m_swiftReturnLowering.numLoweredElements; i++) + { + CorInfoType elemType = m_swiftReturnLowering.loweredElements[i]; + uint32_t offset = m_swiftReturnLowering.offsets[i]; + + bool isFloat = (elemType == CORINFO_TYPE_FLOAT || elemType == CORINFO_TYPE_DOUBLE); + + if (isFloat) + { + _ASSERTE(fpRegIndex < 4); + pRoutines[m_routineIndex++] = GetSwiftStoreFPAtOffsetRoutine(fpRegIndex); + pRoutines[m_routineIndex++] = (PCODE)offset; + fpRegIndex++; +#if LOG_COMPUTE_CALL_STUB + LOG2((LF2_INTERPRETER, LL_INFO10000, "Swift return store FP d%d at offset %d\n", fpRegIndex - 1, offset)); +#endif + } + else + { + _ASSERTE(gpRegIndex < 4); + pRoutines[m_routineIndex++] = GetSwiftStoreGPAtOffsetRoutine(gpRegIndex); + pRoutines[m_routineIndex++] = (PCODE)offset; + gpRegIndex++; +#if LOG_COMPUTE_CALL_STUB + LOG2((LF2_INTERPRETER, LL_INFO10000, "Swift return store GP x%d at offset %d\n", gpRegIndex - 1, offset)); +#endif + } + } + + pRoutines[m_routineIndex++] = (PCODE)SwiftLoweredReturnTerminator; +} +#endif + #endif // FEATURE_INTERPRETER && !TARGET_WASM diff --git a/src/coreclr/vm/callstubgenerator.h b/src/coreclr/vm/callstubgenerator.h index 818645a8b6123a..9621b634a8f13b 100644 --- a/src/coreclr/vm/callstubgenerator.h +++ b/src/coreclr/vm/callstubgenerator.h @@ -15,25 +15,32 @@ struct CallStubHeader { typedef void (*InvokeFunctionPtr)(PCODE *routines, int8_t*pArgs, int8_t*pRet, int totalStackSize, PTR_PTR_Object pContinuationRet); - // Number of routines in the Routines array. The last one is the target method to call. + // Number of routines in the Routines array. int NumRoutines; + // Index of the target method slot within the Routines array. + // For normal calls, this is NumRoutines - 1. + // For Swift lowered returns, store routines follow the target slot. + int TargetSlotIndex; // Total stack size used for the arguments. int TotalStackSize; bool HasContinuationRet; // Indicates whether the stub supports returning a continuation + bool HasSwiftError; // Indicates whether the stub has a Swift error parameter // This is a pointer to a helper function that invokes the target method. There are several // versions of this function, depending on the return type of the target method. InvokeFunctionPtr Invoke; // This is an array of routines that translate the arguments from the interpreter stack to the CPU registers and native stack. PCODE Routines[0]; - CallStubHeader(int numRoutines, PCODE *pRoutines, int totalStackSize, bool hasContinuationRet, InvokeFunctionPtr pInvokeFunction) + CallStubHeader(int numRoutines, int targetSlotIndex, PCODE *pRoutines, int totalStackSize, bool hasContinuationRet, bool hasSwiftError, InvokeFunctionPtr pInvokeFunction) { LIMITED_METHOD_CONTRACT; NumRoutines = numRoutines; + TargetSlotIndex = targetSlotIndex; TotalStackSize = totalStackSize; Invoke = pInvokeFunction; HasContinuationRet = hasContinuationRet; + HasSwiftError = hasSwiftError; memcpy(Routines, pRoutines, NumRoutines * sizeof(PCODE)); } @@ -43,14 +50,14 @@ struct CallStubHeader { LIMITED_METHOD_CONTRACT; - VolatileStore(&Routines[NumRoutines - 1], target); + VolatileStore(&Routines[TargetSlotIndex], target); } PCODE GetTarget() { LIMITED_METHOD_CONTRACT; - return VolatileLoadWithoutBarrier(&Routines[NumRoutines - 1]); + return VolatileLoadWithoutBarrier(&Routines[TargetSlotIndex]); } size_t GetSize() @@ -111,6 +118,9 @@ class CallStubGenerator ReturnType2Vector128, ReturnType3Vector128, ReturnType4Vector128, +#if defined(TARGET_APPLE) + ReturnTypeSwiftLowered, +#endif // TARGET_APPLE #endif // TARGET_ARM64 #if defined(TARGET_RISCV64) ReturnType2I8, @@ -128,7 +138,13 @@ class CallStubGenerator #ifdef TARGET_ARM64 FPReg32, FPReg128, -#endif +#if defined(TARGET_APPLE) + SwiftSelf, + SwiftSelfByRef, + SwiftError, + SwiftIndirectResult, +#endif // TARGET_APPLE +#endif // TARGET_ARM64 Stack }; @@ -148,11 +164,15 @@ class CallStubGenerator int m_s2 = NoRange; // The index of the next routine to store in the Routines array. int m_routineIndex = 0; + // The index of the target method slot in the Routines array. + int m_targetSlotIndex = -1; // The total stack size used for the arguments. int m_totalStackSize = 0; CallStubHeader::InvokeFunctionPtr m_pInvokeFunction = NULL; bool m_interpreterToNative = false; + bool m_hasSwiftError = false; + bool m_isSwiftCallConv = false; #if !defined(UNIX_AMD64_ABI) && defined(ENREGISTERED_PARAMTYPE_MAXSIZE) PCODE GetGPRegRefRoutine(int r); @@ -169,6 +189,35 @@ class CallStubGenerator PCODE GetFPReg128RangeRoutine(int x1, int x2); PCODE GetFPReg32RangeRoutine(int x1, int x2); #endif // TARGET_ARM64 +#if defined(TARGET_APPLE) && defined(TARGET_ARM64) + // Swift calling convention state + int m_swiftSelfByRefSize = 0; + CORINFO_SWIFT_LOWERING m_swiftReturnLowering = {}; + bool m_hasSwiftReturnLowering = false; + + // Swift routine helpers + PCODE GetSwiftSelfRoutine(); + PCODE GetSwiftSelfByRefRoutine(); + PCODE GetSwiftErrorRoutine(); + PCODE GetSwiftIndirectResultRoutine(); + PCODE GetSwiftLoadGPAtOffsetRoutine(int regIndex); + PCODE GetSwiftLoadFPAtOffsetRoutine(int regIndex); + PCODE GetSwiftStoreGPAtOffsetRoutine(int regIndex); + PCODE GetSwiftStoreFPAtOffsetRoutine(int regIndex); + + // Swift lowering info for expanded struct elements + struct SwiftLoweringElement { + uint16_t offset; // Offset within struct + uint16_t structSize; // If non-zero, this is the last element, advance x9 by this amount + bool isFloat; // True if this element goes in FP register + bool isLowered; // True if this is part of a lowered struct + }; + + void RewriteSignatureForSwiftLowering(MetaSig &sig, SigBuilder &swiftSigBuilder, CQuickArray &swiftLoweringInfo, int &swiftIndirectResultCount); + bool ProcessSwiftSpecialArgument(MethodTable* pArgMT, int interpStackSlotSize, int32_t &interpreterStackOffset, PCODE *pRoutines); + void EmitSwiftLoweredElementRoutine(SwiftLoweringElement &elem, ArgLocDesc &argLocDesc, PCODE *pRoutines); + void EmitSwiftReturnLoweringRoutines(PCODE *pRoutines); +#endif // TARGET_APPLE && TARGET_ARM64 PCODE GetGPRegRangeRoutine(int r1, int r2); template ReturnType GetReturnType(ArgIteratorType *pArgIt); @@ -194,7 +243,12 @@ class CallStubGenerator // The size of the temporary storage is the size of the CallStubHeader plus the size of the routines array. // The size of the routines array is three times the number of arguments plus one slot for the target method pointer. - return sizeof(CallStubHeader) + ((numArgs + 1) * 3 + 1) * sizeof(PCODE); + size_t baseSize = sizeof(CallStubHeader) + ((numArgs + 1) * 3 + 1) * sizeof(PCODE); +#if defined(TARGET_APPLE) && defined(TARGET_ARM64) + // Add extra space for Swift return lowering (up to 4 elements * 2 slots + terminator = 9 slots). + baseSize += 9 * sizeof(PCODE); +#endif + return baseSize; } void ComputeCallStub(MetaSig &sig, PCODE *pRoutines, MethodDesc *pMD); template diff --git a/src/coreclr/vm/corelib.h b/src/coreclr/vm/corelib.h index 04ca088663c09a..94507c3f53e38e 100644 --- a/src/coreclr/vm/corelib.h +++ b/src/coreclr/vm/corelib.h @@ -870,6 +870,11 @@ DEFINE_CLASS(CALLCONV_SUPPRESSGCTRANSITION, CompilerServices, CallConvSup DEFINE_CLASS(CALLCONV_MEMBERFUNCTION, CompilerServices, CallConvMemberFunction) DEFINE_CLASS(CALLCONV_SWIFT, CompilerServices, CallConvSwift) +DEFINE_CLASS(SWIFT_SELF, Swift, SwiftSelf) +DEFINE_CLASS(SWIFT_SELF_T, Swift, SwiftSelf`1) +DEFINE_CLASS(SWIFT_ERROR, Swift, SwiftError) +DEFINE_CLASS(SWIFT_INDIRECT_RESULT, Swift, SwiftIndirectResult) + DEFINE_CLASS(SAFE_HANDLE, Interop, SafeHandle) DEFINE_FIELD(SAFE_HANDLE, HANDLE, handle) diff --git a/src/coreclr/vm/namespace.h b/src/coreclr/vm/namespace.h index f3ba695d07dc2d..acc36a9ba11fe4 100644 --- a/src/coreclr/vm/namespace.h +++ b/src/coreclr/vm/namespace.h @@ -36,6 +36,7 @@ #define g_CustomMarshalersNS g_InteropNS ".CustomMarshalers" #define g_ObjectiveCNS g_InteropNS ".ObjectiveC" #define g_MarshallingNS g_InteropNS ".Marshalling" +#define g_SwiftNS g_InteropNS ".Swift" #define g_IntrinsicsNS g_RuntimeNS ".Intrinsics" #define g_NumericsNS g_SystemNS ".Numerics" diff --git a/src/tests/Interop/Swift/SwiftCallbackAbiStress/SwiftCallbackAbiStress.cs b/src/tests/Interop/Swift/SwiftCallbackAbiStress/SwiftCallbackAbiStress.cs index 9867814d8336e1..c35eddbe8d956e 100644 --- a/src/tests/Interop/Swift/SwiftCallbackAbiStress/SwiftCallbackAbiStress.cs +++ b/src/tests/Interop/Swift/SwiftCallbackAbiStress/SwiftCallbackAbiStress.cs @@ -64,6 +64,7 @@ private static int SwiftCallbackFunc0Callback(short a0, int a1, ulong a2, ushort } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc0() { Console.Write("Running SwiftCallbackFunc0: "); @@ -175,6 +176,7 @@ private static byte SwiftCallbackFunc1Callback(long a0, double a1, sbyte a2, F1_ } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc1() { Console.Write("Running SwiftCallbackFunc1: "); @@ -266,6 +268,7 @@ private static sbyte SwiftCallbackFunc2Callback(F2_S0 a0, F2_S1 a1, F2_S2 a2, fl } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc2() { Console.Write("Running SwiftCallbackFunc2: "); @@ -376,6 +379,7 @@ private static F3_Ret SwiftCallbackFunc3Callback(F3_S0 a0, float a1, ushort a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc3() { Console.Write("Running SwiftCallbackFunc3: "); @@ -461,6 +465,7 @@ private static F4_Ret SwiftCallbackFunc4Callback(double a0, F4_S0 a1, byte a2, i } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc4() { Console.Write("Running SwiftCallbackFunc4: "); @@ -589,6 +594,7 @@ private static F5_Ret SwiftCallbackFunc5Callback(byte a0, short a1, ulong a2, nu } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc5() { Console.Write("Running SwiftCallbackFunc5: "); @@ -713,6 +719,7 @@ private static F6_Ret SwiftCallbackFunc6Callback(float a0, F6_S0 a1, long a2, sb } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc6() { Console.Write("Running SwiftCallbackFunc6: "); @@ -786,6 +793,7 @@ private static ushort SwiftCallbackFunc7Callback(long a0, byte a1, double a2, us } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc7() { Console.Write("Running SwiftCallbackFunc7: "); @@ -867,6 +875,7 @@ private static F8_Ret SwiftCallbackFunc8Callback(F8_S0 a0, F8_S1 a1, SwiftSelf s } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc8() { Console.Write("Running SwiftCallbackFunc8: "); @@ -1013,6 +1022,7 @@ private static ushort SwiftCallbackFunc9Callback(sbyte a0, byte a1, long a2, F9_ } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc9() { Console.Write("Running SwiftCallbackFunc9: "); @@ -1062,6 +1072,7 @@ private static F10_Ret SwiftCallbackFunc10Callback(short a0, SwiftSelf self) } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc10() { Console.Write("Running SwiftCallbackFunc10: "); @@ -1170,6 +1181,7 @@ private static F11_Ret SwiftCallbackFunc11Callback(uint a0, nuint a1, ulong a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc11() { Console.Write("Running SwiftCallbackFunc11: "); @@ -1252,6 +1264,7 @@ private static F12_Ret SwiftCallbackFunc12Callback(F12_S0 a0, short a1, ulong a2 } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc12() { Console.Write("Running SwiftCallbackFunc12: "); @@ -1353,6 +1366,7 @@ private static double SwiftCallbackFunc13Callback(F13_S0 a0, int a1, nint a2, us } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc13() { Console.Write("Running SwiftCallbackFunc13: "); @@ -1408,6 +1422,7 @@ private static long SwiftCallbackFunc14Callback(long a0, F14_S0 a1, sbyte a2, ul } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc14() { Console.Write("Running SwiftCallbackFunc14: "); @@ -1490,6 +1505,7 @@ private static nint SwiftCallbackFunc15Callback(byte a0, ushort a1, ulong a2, ul } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc15() { Console.Write("Running SwiftCallbackFunc15: "); @@ -1589,6 +1605,7 @@ private static sbyte SwiftCallbackFunc16Callback(F16_S0 a0, short a1, float a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc16() { Console.Write("Running SwiftCallbackFunc16: "); @@ -1658,6 +1675,7 @@ private static double SwiftCallbackFunc17Callback(uint a0, F17_S0 a1, F17_S1 a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc17() { Console.Write("Running SwiftCallbackFunc17: "); @@ -1743,6 +1761,7 @@ private static F18_Ret SwiftCallbackFunc18Callback(F18_S0 a0, F18_S1 a1, F18_S2 } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc18() { Console.Write("Running SwiftCallbackFunc18: "); @@ -1856,6 +1875,7 @@ private static F19_Ret SwiftCallbackFunc19Callback(long a0, byte a1, F19_S0 a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc19() { Console.Write("Running SwiftCallbackFunc19: "); @@ -1961,6 +1981,7 @@ private static F20_Ret SwiftCallbackFunc20Callback(F20_S0 a0, F20_S1 a1, float a } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc20() { Console.Write("Running SwiftCallbackFunc20: "); @@ -2035,6 +2056,7 @@ private static F21_Ret SwiftCallbackFunc21Callback(int a0, short a1, F21_S0 a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc21() { Console.Write("Running SwiftCallbackFunc21: "); @@ -2158,6 +2180,7 @@ private static F22_Ret SwiftCallbackFunc22Callback(int a0, F22_S0 a1, F22_S1 a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc22() { Console.Write("Running SwiftCallbackFunc22: "); @@ -2212,6 +2235,7 @@ private static double SwiftCallbackFunc23Callback(nuint a0, byte a1, sbyte a2, b } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc23() { Console.Write("Running SwiftCallbackFunc23: "); @@ -2315,6 +2339,7 @@ private static float SwiftCallbackFunc24Callback(int a0, nuint a1, F24_S0 a2, us } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc24() { Console.Write("Running SwiftCallbackFunc24: "); @@ -2416,6 +2441,7 @@ private static F25_Ret SwiftCallbackFunc25Callback(F25_S0 a0, ushort a1, nuint a } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc25() { Console.Write("Running SwiftCallbackFunc25: "); @@ -2512,6 +2538,7 @@ private static F26_Ret SwiftCallbackFunc26Callback(sbyte a0, byte a1, uint a2, F } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc26() { Console.Write("Running SwiftCallbackFunc26: "); @@ -2603,6 +2630,7 @@ private static float SwiftCallbackFunc27Callback(ulong a0, byte a1, F27_S0 a2, b } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc27() { Console.Write("Running SwiftCallbackFunc27: "); @@ -2702,6 +2730,7 @@ private static F28_Ret SwiftCallbackFunc28Callback(uint a0, ushort a1, sbyte a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc28() { Console.Write("Running SwiftCallbackFunc28: "); @@ -2829,6 +2858,7 @@ private static F29_Ret SwiftCallbackFunc29Callback(F29_S0 a0, nint a1, ulong a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc29() { Console.Write("Running SwiftCallbackFunc29: "); @@ -2907,6 +2937,7 @@ private static float SwiftCallbackFunc30Callback(F30_S0 a0, F30_S1 a1, F30_S2 a2 } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc30() { Console.Write("Running SwiftCallbackFunc30: "); @@ -2982,6 +3013,7 @@ private static F31_Ret SwiftCallbackFunc31Callback(F31_S0 a0, double a1, SwiftSe } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc31() { Console.Write("Running SwiftCallbackFunc31: "); @@ -3035,6 +3067,7 @@ private static F32_Ret SwiftCallbackFunc32Callback(ushort a0, short a1, SwiftSel } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc32() { Console.Write("Running SwiftCallbackFunc32: "); @@ -3140,6 +3173,7 @@ private static nuint SwiftCallbackFunc33Callback(F33_S0 a0, float a1, F33_S1 a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc33() { Console.Write("Running SwiftCallbackFunc33: "); @@ -3189,6 +3223,7 @@ private static ushort SwiftCallbackFunc34Callback(uint a0, F34_S0 a1, nuint a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc34() { Console.Write("Running SwiftCallbackFunc34: "); @@ -3278,6 +3313,7 @@ private static ulong SwiftCallbackFunc35Callback(byte a0, sbyte a1, float a2, lo } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc35() { Console.Write("Running SwiftCallbackFunc35: "); @@ -3328,6 +3364,7 @@ private static nint SwiftCallbackFunc36Callback(nuint a0, double a1, nuint a2, b } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc36() { Console.Write("Running SwiftCallbackFunc36: "); @@ -3414,6 +3451,7 @@ private static F37_Ret SwiftCallbackFunc37Callback(ulong a0, F37_S0 a1, double a } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc37() { Console.Write("Running SwiftCallbackFunc37: "); @@ -3492,6 +3530,7 @@ private static double SwiftCallbackFunc38Callback(F38_S0 a0, F38_S1 a1, double a } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc38() { Console.Write("Running SwiftCallbackFunc38: "); @@ -3588,6 +3627,7 @@ private static nint SwiftCallbackFunc39Callback(F39_S0 a0, nuint a1, uint a2, do } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc39() { Console.Write("Running SwiftCallbackFunc39: "); @@ -3676,6 +3716,7 @@ private static nuint SwiftCallbackFunc40Callback(F40_S0 a0, uint a1, byte a2, F4 } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc40() { Console.Write("Running SwiftCallbackFunc40: "); @@ -3731,6 +3772,7 @@ private static F41_Ret SwiftCallbackFunc41Callback(F41_S0 a0, SwiftSelf self) } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc41() { Console.Write("Running SwiftCallbackFunc41: "); @@ -3789,6 +3831,7 @@ private static nint SwiftCallbackFunc42Callback(int a0, uint a1, F42_S0 a2, floa } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc42() { Console.Write("Running SwiftCallbackFunc42: "); @@ -3849,6 +3892,7 @@ private static F43_Ret SwiftCallbackFunc43Callback(F43_S0 a0, F43_S1 a1, SwiftSe } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc43() { Console.Write("Running SwiftCallbackFunc43: "); @@ -3953,6 +3997,7 @@ private static F44_Ret SwiftCallbackFunc44Callback(double a0, F44_S0 a1, F44_S1 } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc44() { Console.Write("Running SwiftCallbackFunc44: "); @@ -4037,6 +4082,7 @@ private static F45_Ret SwiftCallbackFunc45Callback(F45_S0 a0, F45_S1 a1, byte a2 } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc45() { Console.Write("Running SwiftCallbackFunc45: "); @@ -4096,6 +4142,7 @@ private static F46_Ret SwiftCallbackFunc46Callback(nint a0, nuint a1, ushort a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc46() { Console.Write("Running SwiftCallbackFunc46: "); @@ -4212,6 +4259,7 @@ private static F47_Ret SwiftCallbackFunc47Callback(nint a0, float a1, uint a2, F } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc47() { Console.Write("Running SwiftCallbackFunc47: "); @@ -4287,6 +4335,7 @@ private static long SwiftCallbackFunc48Callback(sbyte a0, short a1, short a2, ui } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc48() { Console.Write("Running SwiftCallbackFunc48: "); @@ -4355,6 +4404,7 @@ private static F49_Ret SwiftCallbackFunc49Callback(F49_S0 a0, long a1, SwiftSelf } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc49() { Console.Write("Running SwiftCallbackFunc49: "); @@ -4472,6 +4522,7 @@ private static byte SwiftCallbackFunc50Callback(F50_S0 a0, F50_S1 a1, byte a2, F } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc50() { Console.Write("Running SwiftCallbackFunc50: "); @@ -4532,6 +4583,7 @@ private static F51_Ret SwiftCallbackFunc51Callback(short a0, nuint a1, F51_S0 a2 } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc51() { Console.Write("Running SwiftCallbackFunc51: "); @@ -4605,6 +4657,7 @@ private static F52_Ret SwiftCallbackFunc52Callback(nint a0, F52_S0 a1, short a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc52() { Console.Write("Running SwiftCallbackFunc52: "); @@ -4764,6 +4817,7 @@ private static F53_Ret SwiftCallbackFunc53Callback(F53_S0 a0, byte a1, long a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc53() { Console.Write("Running SwiftCallbackFunc53: "); @@ -4883,6 +4937,7 @@ private static F54_Ret SwiftCallbackFunc54Callback(ushort a0, F54_S0 a1, float a } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc54() { Console.Write("Running SwiftCallbackFunc54: "); @@ -4981,6 +5036,7 @@ private static F55_Ret SwiftCallbackFunc55Callback(F55_S0 a0, long a1, F55_S1 a2 } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc55() { Console.Write("Running SwiftCallbackFunc55: "); @@ -5024,6 +5080,7 @@ private static uint SwiftCallbackFunc56Callback(F56_S0 a0, SwiftSelf self) } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc56() { Console.Write("Running SwiftCallbackFunc56: "); @@ -5115,6 +5172,7 @@ private static F57_Ret SwiftCallbackFunc57Callback(sbyte a0, nuint a1, uint a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc57() { Console.Write("Running SwiftCallbackFunc57: "); @@ -5189,6 +5247,7 @@ private static nint SwiftCallbackFunc58Callback(ulong a0, sbyte a1, nint a2, F58 } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc58() { Console.Write("Running SwiftCallbackFunc58: "); @@ -5223,6 +5282,7 @@ private static ulong SwiftCallbackFunc59Callback(ushort a0, long a1, nint a2, Sw } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc59() { Console.Write("Running SwiftCallbackFunc59: "); @@ -5279,6 +5339,7 @@ private static ulong SwiftCallbackFunc60Callback(float a0, double a1, long a2, u } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc60() { Console.Write("Running SwiftCallbackFunc60: "); @@ -5380,6 +5441,7 @@ private static uint SwiftCallbackFunc61Callback(uint a0, uint a1, F61_S0 a2, F61 } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc61() { Console.Write("Running SwiftCallbackFunc61: "); @@ -5435,6 +5497,7 @@ private static F62_Ret SwiftCallbackFunc62Callback(F62_S0 a0, SwiftSelf self) } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc62() { Console.Write("Running SwiftCallbackFunc62: "); @@ -5477,6 +5540,7 @@ private static float SwiftCallbackFunc63Callback(F63_S0 a0, short a1, SwiftSelf } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc63() { Console.Write("Running SwiftCallbackFunc63: "); @@ -5561,6 +5625,7 @@ private static F64_Ret SwiftCallbackFunc64Callback(sbyte a0, F64_S0 a1, F64_S1 a } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc64() { Console.Write("Running SwiftCallbackFunc64: "); @@ -5660,6 +5725,7 @@ private static F65_Ret SwiftCallbackFunc65Callback(F65_S0 a0, short a1, double a } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc65() { Console.Write("Running SwiftCallbackFunc65: "); @@ -5727,6 +5793,7 @@ private static F66_Ret SwiftCallbackFunc66Callback(long a0, SwiftSelf self) } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc66() { Console.Write("Running SwiftCallbackFunc66: "); @@ -5825,6 +5892,7 @@ private static int SwiftCallbackFunc67Callback(double a0, F67_S0 a1, float a2, F } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc67() { Console.Write("Running SwiftCallbackFunc67: "); @@ -5934,6 +6002,7 @@ private static F68_Ret SwiftCallbackFunc68Callback(byte a0, float a1, int a2, ni } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc68() { Console.Write("Running SwiftCallbackFunc68: "); @@ -6033,6 +6102,7 @@ private static F69_Ret SwiftCallbackFunc69Callback(F69_S0 a0, nint a1, int a2, F } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc69() { Console.Write("Running SwiftCallbackFunc69: "); @@ -6149,6 +6219,7 @@ private static F70_Ret SwiftCallbackFunc70Callback(short a0, byte a1, nint a2, u } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc70() { Console.Write("Running SwiftCallbackFunc70: "); @@ -6204,6 +6275,7 @@ private static ulong SwiftCallbackFunc71Callback(F71_S0 a0, F71_S1 a1, SwiftSelf } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc71() { Console.Write("Running SwiftCallbackFunc71: "); @@ -6261,6 +6333,7 @@ private static F72_Ret SwiftCallbackFunc72Callback(F72_S0 a0, long a1, sbyte a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc72() { Console.Write("Running SwiftCallbackFunc72: "); @@ -6361,6 +6434,7 @@ private static sbyte SwiftCallbackFunc73Callback(double a0, float a1, F73_S0 a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc73() { Console.Write("Running SwiftCallbackFunc73: "); @@ -6419,6 +6493,7 @@ private static long SwiftCallbackFunc74Callback(F74_S0 a0, F74_S1 a1, short a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc74() { Console.Write("Running SwiftCallbackFunc74: "); @@ -6512,6 +6587,7 @@ private static F75_Ret SwiftCallbackFunc75Callback(sbyte a0, sbyte a1, sbyte a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc75() { Console.Write("Running SwiftCallbackFunc75: "); @@ -6619,6 +6695,7 @@ private static ulong SwiftCallbackFunc76Callback(byte a0, F76_S0 a1, sbyte a2, F } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc76() { Console.Write("Running SwiftCallbackFunc76: "); @@ -6710,6 +6787,7 @@ private static F77_Ret SwiftCallbackFunc77Callback(double a0, F77_S0 a1, F77_S1 } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc77() { Console.Write("Running SwiftCallbackFunc77: "); @@ -6806,6 +6884,7 @@ private static double SwiftCallbackFunc78Callback(ulong a0, F78_S0 a1, ulong a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc78() { Console.Write("Running SwiftCallbackFunc78: "); @@ -6868,6 +6947,7 @@ private static F79_Ret SwiftCallbackFunc79Callback(F79_S0 a0, float a1, SwiftSel } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc79() { Console.Write("Running SwiftCallbackFunc79: "); @@ -6947,6 +7027,7 @@ private static float SwiftCallbackFunc80Callback(ulong a0, nint a1, int a2, shor } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc80() { Console.Write("Running SwiftCallbackFunc80: "); @@ -7008,6 +7089,7 @@ private static F81_Ret SwiftCallbackFunc81Callback(byte a0, uint a1, byte a2, F8 } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc81() { Console.Write("Running SwiftCallbackFunc81: "); @@ -7106,6 +7188,7 @@ private static float SwiftCallbackFunc82Callback(long a0, F82_S0 a1, short a2, s } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc82() { Console.Write("Running SwiftCallbackFunc82: "); @@ -7157,6 +7240,7 @@ private static F83_Ret SwiftCallbackFunc83Callback(sbyte a0, F83_S0 a1, short a2 } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc83() { Console.Write("Running SwiftCallbackFunc83: "); @@ -7261,6 +7345,7 @@ private static nint SwiftCallbackFunc84Callback(int a0, F84_S0 a1, F84_S1 a2, do } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc84() { Console.Write("Running SwiftCallbackFunc84: "); @@ -7383,6 +7468,7 @@ private static F85_Ret SwiftCallbackFunc85Callback(F85_S0 a0, F85_S1 a1, uint a2 } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc85() { Console.Write("Running SwiftCallbackFunc85: "); @@ -7487,6 +7573,7 @@ private static F86_Ret SwiftCallbackFunc86Callback(float a0, short a1, nint a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc86() { Console.Write("Running SwiftCallbackFunc86: "); @@ -7541,6 +7628,7 @@ private static ulong SwiftCallbackFunc87Callback(float a0, nint a1, F87_S0 a2, F } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc87() { Console.Write("Running SwiftCallbackFunc87: "); @@ -7635,6 +7723,7 @@ private static F88_Ret SwiftCallbackFunc88Callback(F88_S0 a0, F88_S1 a1, float a } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc88() { Console.Write("Running SwiftCallbackFunc88: "); @@ -7704,6 +7793,7 @@ private static F89_Ret SwiftCallbackFunc89Callback(F89_S0 a0, SwiftSelf self) } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc89() { Console.Write("Running SwiftCallbackFunc89: "); @@ -7812,6 +7902,7 @@ private static F90_Ret SwiftCallbackFunc90Callback(long a0, float a1, F90_S0 a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc90() { Console.Write("Running SwiftCallbackFunc90: "); @@ -7932,6 +8023,7 @@ private static F91_Ret SwiftCallbackFunc91Callback(F91_S0 a0, short a1, uint a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc91() { Console.Write("Running SwiftCallbackFunc91: "); @@ -8025,6 +8117,7 @@ private static F92_Ret SwiftCallbackFunc92Callback(uint a0, long a1, F92_S0 a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc92() { Console.Write("Running SwiftCallbackFunc92: "); @@ -8088,6 +8181,7 @@ private static F93_Ret SwiftCallbackFunc93Callback(nuint a0, ushort a1, double a } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc93() { Console.Write("Running SwiftCallbackFunc93: "); @@ -8197,6 +8291,7 @@ private static F94_Ret SwiftCallbackFunc94Callback(F94_S0 a0, short a1, F94_S1 a } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc94() { Console.Write("Running SwiftCallbackFunc94: "); @@ -8286,6 +8381,7 @@ private static F95_Ret SwiftCallbackFunc95Callback(F95_S0 a0, nuint a1, F95_S1 a } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc95() { Console.Write("Running SwiftCallbackFunc95: "); @@ -8356,6 +8452,7 @@ private static ulong SwiftCallbackFunc96Callback(uint a0, F96_S0 a1, float a2, u } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc96() { Console.Write("Running SwiftCallbackFunc96: "); @@ -8449,6 +8546,7 @@ private static F97_Ret SwiftCallbackFunc97Callback(F97_S0 a0, F97_S1 a1, F97_S2 } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc97() { Console.Write("Running SwiftCallbackFunc97: "); @@ -8494,6 +8592,7 @@ private static nint SwiftCallbackFunc98Callback(float a0, ushort a1, F98_S0 a2, } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc98() { Console.Write("Running SwiftCallbackFunc98: "); @@ -8560,6 +8659,7 @@ private static ulong SwiftCallbackFunc99Callback(long a0, nuint a1, float a2, us } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSwiftCallbackFunc99() { Console.Write("Running SwiftCallbackFunc99: "); diff --git a/src/tests/Interop/Swift/SwiftErrorHandling/SwiftErrorHandling.cs b/src/tests/Interop/Swift/SwiftErrorHandling/SwiftErrorHandling.cs index 48d7187b129204..bf84f846b3fa1c 100644 --- a/src/tests/Interop/Swift/SwiftErrorHandling/SwiftErrorHandling.cs +++ b/src/tests/Interop/Swift/SwiftErrorHandling/SwiftErrorHandling.cs @@ -130,6 +130,7 @@ public unsafe static void TestSwiftErrorOnStackNotThrown() } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static unsafe void TestUnmanagedCallersOnly() { SwiftError error; @@ -145,6 +146,7 @@ public static unsafe void TestUnmanagedCallersOnly() } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static unsafe void TestUnmanagedCallersOnlyWithReturn() { SwiftError error; diff --git a/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs b/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs index 9660dfef909beb..92fe30484f9bec 100644 --- a/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs +++ b/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs @@ -47,6 +47,7 @@ private static void ReversePInvokeReturnNonFrozenStruct(SwiftIndirectResult resu } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/120049", typeof(TestLibrary.Utilities), nameof(TestLibrary.Utilities.IsCoreClrInterpreter))] public static void TestSumReturnedNonFrozenStruct() { int result = SumReturnedNonFrozenStruct(&ReversePInvokeReturnNonFrozenStruct, null);