diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2023-05-13 11:33:34 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2023-05-13 11:33:34 +0000 |
commit | 84c995e12e87e8d0ffe2855fee147d86c05e8023 (patch) | |
tree | aa57350f56f5b9aa24aaeaf6e5073b29350e79da /sys/src/9 | |
parent | 88e8cb58529889ac04caff7c3e3c8393b58dc874 (diff) |
bcm64: move fpon()/fpoff() into l.s
avoid dynamic code generating syswr() in the hot path...
Diffstat (limited to 'sys/src/9')
-rw-r--r-- | sys/src/9/bcm64/fns.h | 2 | ||||
-rw-r--r-- | sys/src/9/bcm64/fpu.c | 12 | ||||
-rw-r--r-- | sys/src/9/bcm64/l.s | 13 |
3 files changed, 15 insertions, 12 deletions
diff --git a/sys/src/9/bcm64/fns.h b/sys/src/9/bcm64/fns.h index 40e136513..96c15fa28 100644 --- a/sys/src/9/bcm64/fns.h +++ b/sys/src/9/bcm64/fns.h @@ -14,6 +14,8 @@ extern void touser(uintptr sp); extern void forkret(void); extern void noteret(void); extern void returnto(void*); +extern void fpon(void); +extern void fpoff(void); extern void fpsaveregs(void*); extern void fploadregs(void*); diff --git a/sys/src/9/bcm64/fpu.c b/sys/src/9/bcm64/fpu.c index 163678294..bf914daaa 100644 --- a/sys/src/9/bcm64/fpu.c +++ b/sys/src/9/bcm64/fpu.c @@ -20,18 +20,6 @@ fpuinit(void) } void -fpon(void) -{ - syswr(CPACR_EL1, 3<<20); -} - -void -fpoff(void) -{ - syswr(CPACR_EL1, 0<<20); -} - -void fpinit(void) { fpon(); diff --git a/sys/src/9/bcm64/l.s b/sys/src/9/bcm64/l.s index 1e9bdb217..77322e972 100644 --- a/sys/src/9/bcm64/l.s +++ b/sys/src/9/bcm64/l.s @@ -382,6 +382,19 @@ TEXT tlbivmalle1(SB), 1, $-4 ISB $SY RETURN +/* + * floating-point support. + */ +TEXT fpon(SB), 1, $-4 + MOVW $(3<<20), R0 + MSR R0, CPACR_EL1 + RETURN + +TEXT fpoff(SB), 1, $-4 + MOVW $(0<<20), R0 + MSR R0, CPACR_EL1 + RETURN + TEXT fpsaveregs(SB), 1, $-4 WORD $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 0) /* MOV { V0, V1, V2, V3 }, (R0)64! */ WORD $(1<<30 | 3 << 26 | 2<<22 | 0x1F<<16 | 3<<10 | 0<<5 | 4) /* MOV { V4, V5, V6, V7 }, (R0)64! */ |