Skip to content

Commit 50909e3

Browse files
cdjenkcdjenk
cdjenk
authored and
cdjenk
committed
add initial code to context switch NEON regs
1 parent 19747e1 commit 50909e3

File tree

2 files changed

+56
-14
lines changed

2 files changed

+56
-14
lines changed

include/fastcontext/armv8-a64-ucontext.h

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ typedef struct uctxt uctxt_t;
1515
struct mctxt {
1616
/* Saved main processor registers. */
1717
uint64_t regs[32]; /* callee saves x0-x30, SP */
18+
uint128_t regs[32]; /* SIMD Neon Registers*/
1819
char first;
1920
};
2021

src/fastcontext/asm.S

+55-14
Original file line numberDiff line numberDiff line change
@@ -797,6 +797,7 @@ SET:
797797
.global GET
798798
.type GET, %function
799799
GET:
800+
/* Store GP registers */
800801
stp X1, X2, [X0,#8]
801802
stp X3, X4, [X0,#24]
802803
stp X5, X6, [X0,#40]
@@ -811,12 +812,34 @@ GET:
811812
stp X23, X24, [X0,#184]
812813
stp X25, X26, [X0,#200]
813814
stp X27, X28, [X0,#216]
814-
stp X29, X30, [X0,#232] (/* X30 is LR) */)
815-
str SP, [X0,#248] _(/* sp */)
816-
_(/*) store 1 as X0-to-restore */)
815+
stp X29, X30, [X0,#232] /* X30 is LR */
816+
str SP, [X0,#248] /* sp */
817+
818+
/* Store vector registers */
819+
add X0, X0, #256 /* Update pointer to avoid immediate growing to large for STP/LDP instruction */
820+
stp Q0, Q1, [X0]
821+
stp Q2, Q3, [X0,#32]
822+
stp Q4, Q5, [X0,#64]
823+
stp Q6, Q7, [X0,#96]
824+
stp Q8, Q9, [X0,#128]
825+
stp Q10, Q11, [X0,#160]
826+
stp Q12, Q13, [X0,#192]
827+
stp Q14, Q15, [X0,#224]
828+
stp Q16, Q17, [X0,#256]
829+
stp Q18, Q19, [X0,#288]
830+
stp Q20, Q21, [X0,#320]
831+
stp Q22, Q23, [X0,#352]
832+
stp Q24, Q25, [X0,#384]
833+
stp Q26, Q27, [X0,#416]
834+
stp Q28, Q29, [X0,#448]
835+
stp Q30, Q31, [X0,#480]
836+
sub X0, X0, #256
837+
838+
/* Store 1 as X0-to-restore */
817839
mov X1, #1
818-
str X1, [X0] _(/* arg 1 / RET 1 */)
819-
_(/*) return 0 */)
840+
str X1, [X0]
841+
842+
/* return 0 */
820843
mov X0, #0
821844
ret
822845
/*
@@ -828,6 +851,7 @@ GET:
828851
.global SET
829852
.type SET, %function
830853
SET:
854+
/* Load GP registers */
831855
ldp X1, X2, [X0,#8]
832856
ldp X3, X4, [X0,#24]
833857
ldp X5, X6, [X0,#40]
@@ -842,17 +866,34 @@ SET:
842866
ldp X23, X24, [X0,#184]
843867
ldp X25, X26, [X0,#200]
844868
ldp X27, X28, [X0,#216]
845-
ldp X29, X30, [X0,#232] (/* X30 is LR) */)
846-
ldr SP, [X0,#248] _(/* sp */)
869+
ldp X29, X30, [X0,#232]
870+
ldr SP, [X0,#248]
871+
872+
873+
/* Load vector registers */
874+
add X0, X0, #256
875+
ldp Q0, Q1, [X0]
876+
ldp Q2, Q3, [X0,#32]
877+
ldp Q4, Q5, [X0,#64]
878+
ldp Q6, Q7, [X0,#96]
879+
ldp Q8, Q9, [X0,#128]
880+
ldp Q10, Q11, [X0,#160]
881+
ldp Q12, Q13, [X0,#192]
882+
ldp Q14, Q15, [X0,#224]
883+
ldp Q16, Q17, [X0,#256]
884+
ldp Q18, Q19, [X0,#288]
885+
ldp Q20, Q21, [X0,#320]
886+
ldp Q22, Q23, [X0,#352]
887+
ldp Q24, Q25, [X0,#384]
888+
ldp Q26, Q27, [X0,#416]
889+
ldp Q28, Q29, [X0,#448]
890+
ldp Q30, Q31, [X0,#480]
891+
sub X0, X0, #256
892+
847893
ldr X0, [X0]
848894
ret
849895
#endif
850896

851-
#if defined(__ELF__) && !defined(__SUNPRO_C)
852-
.section .note.GNU-stack,"",%progbits
853-
#endif
854-
855-
856897
#ifdef NEEDARMCONTEXT
857898
#warning NEEDARMCONTEXT
858899
#warning GET SET
@@ -898,7 +939,7 @@ GET:
898939
str r1, [r0] _(/* arg 1 / RET 1 */)
899940
_(/*) return 0 */)
900941
mov r0, #0
901-
bx lr
942+
bx lr
902943

903944
.globl SET
904945
.global SET
@@ -919,7 +960,7 @@ SET:
919960
ldr r13, [r0,#52]
920961
ldr r14, [r0,#56]
921962
ldr r0, [r0]
922-
bx lr
963+
bx lr
923964
#endif
924965

925966
#if defined(__ELF__) && !defined(__SUNPRO_C)

0 commit comments

Comments
 (0)