Skip to content

Commit 0d677dd

Browse files
committed
Handle FP regs
1 parent eb6c689 commit 0d677dd

15 files changed

Lines changed: 355 additions & 104 deletions

src/coreclr/pal/inc/unixasmmacrosamd64.inc

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,34 @@ C_FUNC(\Name\()_End):
428428
POP_CALLEE_SAVED_REGISTERS
429429
.endm
430430

431+
// Pushes a full TransitionBlock on the stack including argument registers and
432+
// floating point argument registers. Used for exception throw helpers where we
433+
// need to capture the complete register state.
434+
//
435+
// Stack layout (from high to low address after prologue):
436+
// Return address
437+
// CalleeSavedRegisters (rbp, rbx, r15, r14, r13, r12 - 48 bytes)
438+
// ArgumentRegisters (r9, r8, rcx, rdx, rsi, rdi - 48 bytes) <- TransitionBlock
439+
// Padding (8 bytes for 16-byte alignment)
440+
// FloatArgumentRegisters (xmm0-xmm7, 128 bytes)
441+
// sp points here
442+
//
443+
// On exit, \target contains the TransitionBlock pointer (after float args area).
444+
.macro PUSH_COOP_PINVOKE_FRAME_WITH_FLOATS target
445+
set_cfa_register rsp, 8
446+
447+
PUSH_CALLEE_SAVED_REGISTERS
448+
PUSH_ARGUMENT_REGISTERS
449+
450+
// Allocate space for float argument registers (128 bytes) + alignment (8 bytes)
451+
alloc_stack 136
452+
SAVE_FLOAT_ARGUMENT_REGISTERS 0
453+
454+
END_PROLOGUE
455+
456+
lea \target, [rsp + 136]
457+
.endm
458+
431459
.macro INLINE_GETTHREAD
432460
// Inlined version of call C_FUNC(RhpGetThread)
433461
INLINE_GET_TLS_VAR t_CurrentThreadInfo

src/coreclr/pal/inc/unixasmmacrosarm64.inc

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,43 @@ C_FUNC(\Name\()_End):
419419
EPILOG_RESTORE_REG_PAIR x25, x26, 64
420420
EPILOG_RESTORE_REG_PAIR x27, x28, 80
421421
EPILOG_RESTORE_REG_PAIR_INDEXED fp, lr, 176
422-
.endm
422+
.endm
423+
424+
// Pushes a full TransitionBlock on the stack including argument registers and
425+
// floating point argument registers. Used for exception throw helpers where we
426+
// need to capture the complete register state.
427+
//
428+
// Stack layout (from low to high address):
429+
// sp+0: FloatArgumentRegisters (q0-q7, 128 bytes)
430+
// sp+128: TransitionBlock start (176 bytes)
431+
// - CalleeSavedRegisters (fp, lr, x19-x28 - 96 bytes)
432+
// - padding (8 bytes)
433+
// - x8 (8 bytes)
434+
// - ArgumentRegisters (x0-x7, 64 bytes)
435+
//
436+
// On exit, \target contains the TransitionBlock pointer (sp+128).
437+
.macro PUSH_COOP_PINVOKE_FRAME_WITH_FLOATS target
438+
PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -176
439+
440+
// Spill callee saved registers
441+
PROLOG_SAVE_REG_PAIR x19, x20, 16
442+
PROLOG_SAVE_REG_PAIR x21, x22, 32
443+
PROLOG_SAVE_REG_PAIR x23, x24, 48
444+
PROLOG_SAVE_REG_PAIR x25, x26, 64
445+
PROLOG_SAVE_REG_PAIR x27, x28, 80
446+
447+
// Allocate space for FloatArgumentRegisters
448+
PROLOG_STACK_ALLOC 128
449+
450+
// Save argument registers (x8, x0-x7) at offset 232 from sp (128 + 104)
451+
SAVE_ARGUMENT_REGISTERS sp, 232
452+
453+
// Save floating point argument registers (q0-q7) at sp+0
454+
SAVE_FLOAT_ARGUMENT_REGISTERS sp, 0
455+
456+
// Set target to TransitionBlock pointer
457+
add \target, sp, #128
458+
.endm
423459

424460
// ------------------------------------------------------------------
425461
// Macro to generate Redirection Stubs

src/coreclr/pal/inc/unixasmmacrosloongarch64.inc

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,35 @@ C_FUNC(\Name\()_End):
404404
EPILOG_STACK_FREE 160
405405
.endm
406406

407+
// Pushes a full TransitionBlock on the stack including argument registers and
408+
// floating point argument registers. Used for exception throw helpers where we
409+
// need to capture the complete register state.
410+
//
411+
// Stack layout (from low to high address):
412+
// sp+0: FloatArgumentRegisters (fa0-fa7, 64 bytes)
413+
// sp+64: TransitionBlock start
414+
// - CalleeSavedRegisters (fp, ra, s0-s8 - 96 bytes)
415+
// - ArgumentRegisters (a0-a7, 64 bytes)
416+
//
417+
// On exit, \target contains the TransitionBlock pointer (sp+64).
418+
.macro PUSH_COOP_PINVOKE_FRAME_WITH_FLOATS target
419+
// Stack: FloatArgs(64) + CalleeSaved(96) + Args(64) = 224 bytes
420+
PROLOG_STACK_ALLOC 224
421+
PROLOG_SAVE_REG_PAIR 22, 1, 64, 1
422+
423+
// Save callee-saved registers at offset 64 (after FloatArgumentRegisters)
424+
SAVE_CALLEESAVED_REGISTERS $sp, 64
425+
426+
// Save argument registers (a0-a7) at offset 160
427+
SAVE_ARGUMENT_REGISTERS $sp, 160
428+
429+
// Save floating-point argument registers (fa0-fa7) at offset 0
430+
SAVE_FLOAT_ARGUMENT_REGISTERS $sp, 0
431+
432+
// Set target to TransitionBlock pointer
433+
addi.d \target, $sp, 64
434+
.endm
435+
407436
// ------------------------------------------------------------------
408437
// Macro to generate Redirection Stubs
409438
//

src/coreclr/pal/inc/unixasmmacrosriscv64.inc

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,36 @@ C_FUNC(\Name):
349349
EPILOG_STACK_FREE 192
350350
.endm
351351

352+
// Pushes a full TransitionBlock on the stack including argument registers and
353+
// floating point argument registers. Used for exception throw helpers where we
354+
// need to capture the complete register state.
355+
//
356+
// Stack layout (from low to high address):
357+
// sp+0: FloatArgumentRegisters (fa0-fa7, 64 bytes)
358+
// sp+64: TransitionBlock start
359+
// - CalleeSavedRegisters (fp, ra, s1-s11, tp, gp - 120 bytes)
360+
// - padding (8 bytes)
361+
// - ArgumentRegisters (a0-a7, 64 bytes)
362+
//
363+
// On exit, \target contains the TransitionBlock pointer (sp+64).
364+
.macro PUSH_COOP_PINVOKE_FRAME_WITH_FLOATS target
365+
// Stack: FloatArgs(64) + CalleeSaved(120) + pad(8) + Args(64) = 256 bytes
366+
PROLOG_STACK_ALLOC 256
367+
PROLOG_SAVE_REG_PAIR fp, ra, 64, 1
368+
369+
// Save callee-saved registers at offset 64 (after FloatArgumentRegisters)
370+
SAVE_CALLEESAVED_REGISTERS sp, 64
371+
372+
// Save argument registers (a0-a7) at offset 192
373+
SAVE_ARGUMENT_REGISTERS sp, 192
374+
375+
// Save floating-point argument registers (fa0-fa7) at offset 0
376+
SAVE_FLOAT_ARGUMENT_REGISTERS sp, 0
377+
378+
// Set target to TransitionBlock pointer
379+
addi \target, sp, 64
380+
.endm
381+
352382
// ------------------------------------------------------------------
353383
// Macro to generate Redirection Stubs
354384
//

src/coreclr/vm/amd64/AsmHelpers.asm

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1208,7 +1208,8 @@ endif ; FEATURE_INTERPRETER
12081208
; RCX = Pointer to exception object
12091209
;==========================================================================
12101210
NESTED_ENTRY IL_Throw, _TEXT
1211-
PUSH_COOP_PINVOKE_FRAME rdx
1211+
1212+
PUSH_COOP_PINVOKE_FRAME_WITH_FLOATS rdx
12121213
; RCX already contains exception object
12131214
; RDX contains pointer to TransitionBlock
12141215
call IL_Throw_Impl
@@ -1224,7 +1225,8 @@ NESTED_END IL_Throw, _TEXT
12241225
; RCX = Pointer to exception object
12251226
;==========================================================================
12261227
NESTED_ENTRY IL_ThrowExact, _TEXT
1227-
PUSH_COOP_PINVOKE_FRAME rdx
1228+
1229+
PUSH_COOP_PINVOKE_FRAME_WITH_FLOATS rdx
12281230
; RCX already contains exception object
12291231
; RDX contains pointer to TransitionBlock
12301232
call IL_ThrowExact_Impl
@@ -1237,7 +1239,8 @@ NESTED_END IL_ThrowExact, _TEXT
12371239
; implementation written in C.
12381240
;==========================================================================
12391241
NESTED_ENTRY IL_Rethrow, _TEXT
1240-
PUSH_COOP_PINVOKE_FRAME rcx
1242+
1243+
PUSH_COOP_PINVOKE_FRAME_WITH_FLOATS rcx
12411244
; RCX contains pointer to TransitionBlock
12421245
call IL_Rethrow_Impl
12431246
; Should never return

src/coreclr/vm/amd64/AsmMacros.inc

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,5 +485,37 @@ POP_COOP_PINVOKE_FRAME macro
485485

486486
endm
487487

488+
; Pushes a full TransitionBlock on the stack including argument registers and
489+
; floating point argument registers. Used for exception throw helpers where we
490+
; need to capture the complete register state.
491+
;
492+
; Stack layout (from high to low address after prologue):
493+
; Return address
494+
; CalleeSavedRegisters (r15, r14, r13, r12, rbp, rbx, rsi, rdi - 64 bytes)
495+
; Outgoing argument homes (32 bytes) + alignment (8 bytes) <- TransitionBlock
496+
; FloatArgumentRegisters (xmm0-xmm3, 64 bytes)
497+
; sp points here
498+
;
499+
; On exit, target contains the TransitionBlock pointer (after float args area).
500+
PUSH_COOP_PINVOKE_FRAME_WITH_FLOATS macro target
501+
502+
PUSH_CALLEE_SAVED_REGISTERS
503+
504+
; Allocate space for: outgoing args (32) + align (8) + float args (64) = 104 bytes
505+
alloc_stack 104
506+
507+
; Save argument registers to shadow space area
508+
; Shadow space is at offset 64 (after float args) from sp
509+
SAVE_ARGUMENT_REGISTERS 64
510+
511+
; Save float argument registers at offset 0
512+
SAVE_FLOAT_ARGUMENT_REGISTERS 0
513+
514+
END_PROLOGUE
515+
516+
lea target, [rsp + 64]
517+
518+
endm
519+
488520
;; GC type flags
489521
GC_ALLOC_FINALIZE equ 1

src/coreclr/vm/amd64/asmhelpers.S

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1922,7 +1922,7 @@ NESTED_END CallJittedMethodRetDoubleDouble, _TEXT
19221922
// rdi = Pointer to exception object
19231923
// ------------------------------------------------------------------
19241924
NESTED_ENTRY IL_Throw, _TEXT, NoHandler
1925-
PUSH_COOP_PINVOKE_FRAME rsi
1925+
PUSH_COOP_PINVOKE_FRAME_WITH_FLOATS rsi
19261926
// rdi already contains exception object
19271927
// rsi contains pointer to TransitionBlock
19281928
call C_FUNC(IL_Throw_Impl)
@@ -1938,7 +1938,7 @@ NESTED_END IL_Throw, _TEXT
19381938
// rdi = Pointer to exception object
19391939
// ------------------------------------------------------------------
19401940
NESTED_ENTRY IL_ThrowExact, _TEXT, NoHandler
1941-
PUSH_COOP_PINVOKE_FRAME rsi
1941+
PUSH_COOP_PINVOKE_FRAME_WITH_FLOATS rsi
19421942
// rdi already contains exception object
19431943
// rsi contains pointer to TransitionBlock
19441944
call C_FUNC(IL_ThrowExact_Impl)
@@ -1951,7 +1951,7 @@ NESTED_END IL_ThrowExact, _TEXT
19511951
// implementation written in C.
19521952
// ------------------------------------------------------------------
19531953
NESTED_ENTRY IL_Rethrow, _TEXT, NoHandler
1954-
PUSH_COOP_PINVOKE_FRAME rdi
1954+
PUSH_COOP_PINVOKE_FRAME_WITH_FLOATS rdi
19551955
// rdi contains pointer to TransitionBlock
19561956
call C_FUNC(IL_Rethrow_Impl)
19571957
// Should never return

src/coreclr/vm/arm64/asmhelpers.S

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2757,11 +2757,19 @@ NESTED_END CallJittedMethodRet4Vector128, _TEXT
27572757
// Capture a transition block with register values and call the IL_Throw_Impl
27582758
// implementation written in C.
27592759
//
2760+
// Stack layout (from low to high address):
2761+
// sp+0: FloatArgumentRegisters (q0-q7, 128 bytes)
2762+
// sp+128: TransitionBlock start (176 bytes)
2763+
// - CalleeSavedRegisters (fp, lr, x19-x28 - 96 bytes)
2764+
// - padding (8 bytes)
2765+
// - x8 (8 bytes)
2766+
// - ArgumentRegisters (x0-x7, 64 bytes)
2767+
//
27602768
// Input state:
27612769
// x0 = Pointer to exception object
27622770
// ------------------------------------------------------------------
27632771
NESTED_ENTRY IL_Throw, _TEXT, NoHandler
2764-
PUSH_COOP_PINVOKE_FRAME x1
2772+
PUSH_COOP_PINVOKE_FRAME_WITH_FLOATS x1
27652773
// x0 already contains exception object
27662774
// x1 contains pointer to TransitionBlock
27672775
bl C_FUNC(IL_Throw_Impl)
@@ -2777,7 +2785,7 @@ NESTED_END IL_Throw, _TEXT
27772785
// x0 = Pointer to exception object
27782786
// ------------------------------------------------------------------
27792787
NESTED_ENTRY IL_ThrowExact, _TEXT, NoHandler
2780-
PUSH_COOP_PINVOKE_FRAME x1
2788+
PUSH_COOP_PINVOKE_FRAME_WITH_FLOATS x1
27812789
// x0 already contains exception object
27822790
// x1 contains pointer to TransitionBlock
27832791
bl C_FUNC(IL_ThrowExact_Impl)
@@ -2790,7 +2798,7 @@ NESTED_END IL_ThrowExact, _TEXT
27902798
// implementation written in C.
27912799
// ------------------------------------------------------------------
27922800
NESTED_ENTRY IL_Rethrow, _TEXT, NoHandler
2793-
PUSH_COOP_PINVOKE_FRAME x0
2801+
PUSH_COOP_PINVOKE_FRAME_WITH_FLOATS x0
27942802
// x0 contains pointer to TransitionBlock
27952803
bl C_FUNC(IL_Rethrow_Impl)
27962804
// Should never return

src/coreclr/vm/arm64/asmhelpers.asm

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2988,14 +2988,14 @@ CopyLoop
29882988
; Input state:
29892989
; x0 = Pointer to exception object
29902990
; ------------------------------------------------------------------
2991-
NESTED_ENTRY IL_Throw, _TEXT, NoHandler
2992-
PUSH_COOP_PINVOKE_FRAME x1
2991+
NESTED_ENTRY IL_Throw
2992+
PUSH_COOP_PINVOKE_FRAME_WITH_FLOATS x1
29932993
; x0 already contains exception object
29942994
; x1 contains pointer to TransitionBlock
29952995
bl IL_Throw_Impl
29962996
; Should never return
29972997
brk #0
2998-
NESTED_END IL_Throw, _TEXT
2998+
NESTED_END IL_Throw
29992999

30003000
; ------------------------------------------------------------------
30013001
; Capture a transition block with register values and call the IL_ThrowExact_Impl
@@ -3004,26 +3004,26 @@ CopyLoop
30043004
; Input state:
30053005
; x0 = Pointer to exception object
30063006
; ------------------------------------------------------------------
3007-
NESTED_ENTRY IL_ThrowExact, _TEXT, NoHandler
3008-
PUSH_COOP_PINVOKE_FRAME x1
3007+
NESTED_ENTRY IL_ThrowExact
3008+
PUSH_COOP_PINVOKE_FRAME_WITH_FLOATS x1
30093009
; x0 already contains exception object
30103010
; x1 contains pointer to TransitionBlock
30113011
bl IL_ThrowExact_Impl
30123012
; Should never return
30133013
brk #0
3014-
NESTED_END IL_ThrowExact, _TEXT
3014+
NESTED_END IL_ThrowExact
30153015

30163016
; ------------------------------------------------------------------
30173017
; Capture a transition block with register values and call the IL_Rethrow_Impl
30183018
; implementation written in C.
30193019
; ------------------------------------------------------------------
3020-
NESTED_ENTRY IL_Rethrow, _TEXT, NoHandler
3021-
PUSH_COOP_PINVOKE_FRAME x0
3020+
NESTED_ENTRY IL_Rethrow
3021+
PUSH_COOP_PINVOKE_FRAME_WITH_FLOATS x0
30223022
; x0 contains pointer to TransitionBlock
30233023
bl IL_Rethrow_Impl
30243024
; Should never return
30253025
brk #0
3026-
NESTED_END IL_Rethrow, _TEXT
3026+
NESTED_END IL_Rethrow
30273027

30283028
; Must be at very end of file
30293029
END

src/coreclr/vm/arm64/asmmacros.h

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,44 @@ OFFSETOF__ee_alloc_context EQU OFFSETOF__RuntimeThreadLocals__ee_alloc_context
204204
EPILOG_RESTORE_REG_PAIR fp, lr, #176!
205205
MEND
206206

207+
; Pushes a full TransitionBlock on the stack including argument registers and
208+
; floating point argument registers. Used for exception throw helpers where we
209+
; need to capture the complete register state.
210+
;
211+
; Stack layout (from low to high address):
212+
; sp+0: FloatArgumentRegisters (q0-q7, 128 bytes)
213+
; sp+128: TransitionBlock start (176 bytes)
214+
; - CalleeSavedRegisters (fp, lr, x19-x28 - 96 bytes)
215+
; - padding (8 bytes)
216+
; - x8 (8 bytes)
217+
; - ArgumentRegisters (x0-x7, 64 bytes)
218+
;
219+
; On exit, $Target contains the TransitionBlock pointer (sp+128).
220+
MACRO
221+
PUSH_COOP_PINVOKE_FRAME_WITH_FLOATS $Target
222+
223+
PROLOG_SAVE_REG_PAIR fp, lr, #-176!
224+
225+
; Spill callee saved registers
226+
PROLOG_SAVE_REG_PAIR x19, x20, #16
227+
PROLOG_SAVE_REG_PAIR x21, x22, #32
228+
PROLOG_SAVE_REG_PAIR x23, x24, #48
229+
PROLOG_SAVE_REG_PAIR x25, x26, #64
230+
PROLOG_SAVE_REG_PAIR x27, x28, #80
231+
232+
; Allocate space for FloatArgumentRegisters
233+
PROLOG_STACK_ALLOC 128
234+
235+
; Save argument registers (x8, x0-x7) at offset 232 from sp (128 + 104)
236+
SAVE_ARGUMENT_REGISTERS sp, 232
237+
238+
; Save floating point argument registers (q0-q7) at sp+0
239+
SAVE_FLOAT_ARGUMENT_REGISTERS sp, 0
240+
241+
; Set target to TransitionBlock pointer
242+
add $Target, sp, #128
243+
MEND
244+
207245
#define GC_ALLOC_FINALIZE 1
208246

209247
;-----------------------------------------------------------------------------

0 commit comments

Comments
 (0)