summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2023-05-13 11:27:42 +0000
committercinap_lenrek <cinap_lenrek@felloff.net>2023-05-13 11:27:42 +0000
commit88e8cb58529889ac04caff7c3e3c8393b58dc874 (patch)
tree4e44cea2bc79fe44064c26dbacc0fc97425e8953
parent462c67a09fefcb408a8bcfc43a847745b28bba3d (diff)
imx8: move fpon()/fpoff() into l.s
avoid the dynamic code generating syswr() in the hot path...
-rw-r--r--sys/src/9/imx8/fns.h2
-rw-r--r--sys/src/9/imx8/fpu.c12
-rw-r--r--sys/src/9/imx8/l.s13
3 files changed, 15 insertions, 12 deletions
diff --git a/sys/src/9/imx8/fns.h b/sys/src/9/imx8/fns.h
index 29cf6f3a7..80500edce 100644
--- a/sys/src/9/imx8/fns.h
+++ b/sys/src/9/imx8/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*);
extern void smccall(Ureg*);
diff --git a/sys/src/9/imx8/fpu.c b/sys/src/9/imx8/fpu.c
index 163678294..bf914daaa 100644
--- a/sys/src/9/imx8/fpu.c
+++ b/sys/src/9/imx8/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/imx8/l.s b/sys/src/9/imx8/l.s
index 4953e68a6..250e5305f 100644
--- a/sys/src/9/imx8/l.s
+++ b/sys/src/9/imx8/l.s
@@ -394,6 +394,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! */