summaryrefslogtreecommitdiff
path: root/sys/src/9
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2023-05-13 11:33:34 +0000
committercinap_lenrek <cinap_lenrek@felloff.net>2023-05-13 11:33:34 +0000
commit84c995e12e87e8d0ffe2855fee147d86c05e8023 (patch)
treeaa57350f56f5b9aa24aaeaf6e5073b29350e79da /sys/src/9
parent88e8cb58529889ac04caff7c3e3c8393b58dc874 (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.h2
-rw-r--r--sys/src/9/bcm64/fpu.c12
-rw-r--r--sys/src/9/bcm64/l.s13
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! */