summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-01-26 17:00:38 +0100
committercinap_lenrek <cinap_lenrek@gmx.de>2013-01-26 17:00:38 +0100
commitae116c94460e3b3e0eab82f06bf1c92c425ee1ac (patch)
tree584f2dc5de85c5917add37ffe71b6bc51645ca9c /sys
parent68c5dc801409a8a24cfe48977df62e040e92cc90 (diff)
libc: update atomic ops and fp code for arm (from sources)
Diffstat (limited to 'sys')
-rw-r--r--sys/src/libc/arm/atom.s25
-rw-r--r--sys/src/libc/arm/cycles.c5
-rw-r--r--sys/src/libc/arm/getcallerpc.s2
-rw-r--r--sys/src/libc/arm/getfcr.vfp.S21
-rw-r--r--sys/src/libc/arm/main9p.s4
-rw-r--r--sys/src/libc/arm/memmove.s4
-rw-r--r--sys/src/libc/arm/strchr.s2
-rw-r--r--sys/src/libc/arm/strcmp.s2
-rw-r--r--sys/src/libc/arm/strcpy.s2
-rw-r--r--sys/src/libc/arm/tas.s2
-rw-r--r--sys/src/libc/arm/vlop.s2
-rw-r--r--sys/src/libc/arm/vlrt.c3
12 files changed, 52 insertions, 22 deletions
diff --git a/sys/src/libc/arm/atom.s b/sys/src/libc/arm/atom.s
index 674021391..b59a89d90 100644
--- a/sys/src/libc/arm/atom.s
+++ b/sys/src/libc/arm/atom.s
@@ -1,44 +1,47 @@
+#define CLREX WORD $0xf57ff01f
+#define LDREX(a,r) WORD $(0xe<<28|0x01900f9f | (a)<<16 | (r)<<12)
+/* `The order of operands is from left to right in dataflow order' - asm man */
+#define STREX(v,a,r) WORD $(0xe<<28|0x01800f90 | (a)<<16 | (r)<<12 | (v)<<0)
/*
* int cas(ulong *p, ulong ov, ulong nv);
*/
-#define LDREX(a,r) WORD $(0xe<<28|0x01900f9f | (a)<<16 | (r)<<12)
-#define STREX(a,v,r) WORD $(0xe<<28|0x01800f90 | (a)<<16 | (r)<<12 | (v)<<0)
-
-TEXT cas+0(SB),0,$12 /* r0 holds p */
-TEXT casp+0(SB),0,$12 /* r0 holds p */
-TEXT casl+0(SB),0,$12 /* r0 holds p */
+TEXT cas+0(SB),0,$0 /* r0 holds p */
+TEXT casp+0(SB),0,$0 /* r0 holds p */
MOVW ov+4(FP), R1
MOVW nv+8(FP), R2
spincas:
LDREX(0,3) /* LDREX 0(R0),R3 */
CMP.S R3, R1
BNE fail
- STREX(0,2,4) /* STREX 0(R0),R2,R4 */
+ STREX(2,0,4) /* STREX 0(R0),R2,R4 */
CMP.S $0, R4
BNE spincas
MOVW $1, R0
RET
fail:
+ CLREX
MOVW $0, R0
RET
+TEXT _xinc(SB), $0 /* void _xinc(long *); */
TEXT ainc(SB), $0 /* long ainc(long *); */
spinainc:
LDREX(0,3) /* LDREX 0(R0),R3 */
ADD $1,R3
- STREX(0,3,4) /* STREX 0(R0),R2,R4 */
+ STREX(3,0,4) /* STREX 0(R0),R3,R4 */
CMP.S $0, R4
BNE spinainc
MOVW R3, R0
RET
-TEXT adec(SB), $0 /* long ainc(long *); */
+TEXT _xdec(SB), $0 /* long _xdec(long *); */
+TEXT adec(SB), $0 /* long adec(long *); */
spinadec:
LDREX(0,3) /* LDREX 0(R0),R3 */
SUB $1,R3
- STREX(0,3,4) /* STREX 0(R0),R3,R4 */
+ STREX(3,0,4) /* STREX 0(R0),R3,R4 */
CMP.S $0, R4
BNE spinadec
MOVW R3, R0
@@ -50,6 +53,6 @@ TEXT loadlinked(SB), $0 /* long loadlinked(long *); */
TEXT storecond(SB), $0 /* int storecond(long *, long); */
MOVW ov+4(FP), R3
- STREX(0,3,4) /* STREX 0(R0),R3,R0 */
+ STREX(3,0,0) /* STREX 0(R0),R3,R0 */
RSB $1, R0
RET
diff --git a/sys/src/libc/arm/cycles.c b/sys/src/libc/arm/cycles.c
index 9bad3a989..d03e827ce 100644
--- a/sys/src/libc/arm/cycles.c
+++ b/sys/src/libc/arm/cycles.c
@@ -1,7 +1,10 @@
#include <u.h>
#include <libc.h>
-void cycles(uvlong*u)
+#pragma profile off
+
+void
+cycles(uvlong*u)
{
*u = 0LL;
}
diff --git a/sys/src/libc/arm/getcallerpc.s b/sys/src/libc/arm/getcallerpc.s
index ac4575913..3405985e6 100644
--- a/sys/src/libc/arm/getcallerpc.s
+++ b/sys/src/libc/arm/getcallerpc.s
@@ -1,3 +1,3 @@
-TEXT getcallerpc(SB), $-4
+TEXT getcallerpc(SB), 1, $-4
MOVW 0(R13), R0
RET
diff --git a/sys/src/libc/arm/getfcr.vfp.S b/sys/src/libc/arm/getfcr.vfp.S
new file mode 100644
index 000000000..4822a5f5b
--- /dev/null
+++ b/sys/src/libc/arm/getfcr.vfp.S
@@ -0,0 +1,21 @@
+/* for VFP */
+#define VMRS(fp, cpu) WORD $(0xeef00a10 | (fp)<<16 | (cpu)<<12) /* FP → arm */
+#define VMSR(cpu, fp) WORD $(0xeee00a10 | (fp)<<16 | (cpu)<<12) /* arm → FP */
+
+#define Fpscr 1
+
+TEXT setfcr(SB), $0
+ VMSR(0, Fpscr)
+ RET
+
+TEXT getfcr(SB), $0
+ VMRS(Fpscr, 0)
+ RET
+
+TEXT getfsr(SB), $0
+ VMSR(0, Fpscr)
+ RET
+
+TEXT setfsr(SB), $0
+ VMRS(Fpscr, 0)
+ RET
diff --git a/sys/src/libc/arm/main9p.s b/sys/src/libc/arm/main9p.s
index e77df7162..cb51a4379 100644
--- a/sys/src/libc/arm/main9p.s
+++ b/sys/src/libc/arm/main9p.s
@@ -34,8 +34,8 @@ loop:
TEXT _savearg(SB), 1, $0
RET
-TEXT _callpc(SB), 1, $0
- MOVW argp-4(FP), R(arg)
+TEXT _callpc(SB), 1, $-4
+ MOVW 0(R13), R(arg)
RET
DATA _exitstr<>+0(SB)/4, $"main"
diff --git a/sys/src/libc/arm/memmove.s b/sys/src/libc/arm/memmove.s
index 346a23d72..d78ee39cf 100644
--- a/sys/src/libc/arm/memmove.s
+++ b/sys/src/libc/arm/memmove.s
@@ -5,9 +5,9 @@ N = 3
TMP = 3 /* N and TMP don't overlap */
TMP1 = 4
-TEXT memcpy(SB), $-4
+TEXT memcpy(SB), $0
B _memmove
-TEXT memmove(SB), $-4
+TEXT memmove(SB), $0
_memmove:
MOVW R(TS), to+0(FP) /* need to save for return value */
MOVW from+4(FP), R(FROM)
diff --git a/sys/src/libc/arm/strchr.s b/sys/src/libc/arm/strchr.s
index 349b5a49f..7e411df7c 100644
--- a/sys/src/libc/arm/strchr.s
+++ b/sys/src/libc/arm/strchr.s
@@ -1,4 +1,4 @@
-TEXT strchr(SB), $-4
+TEXT strchr(SB), $0
MOVBU c+4(FP), R1
CMP $0, R1
BEQ _null
diff --git a/sys/src/libc/arm/strcmp.s b/sys/src/libc/arm/strcmp.s
index 015e51596..e438b8019 100644
--- a/sys/src/libc/arm/strcmp.s
+++ b/sys/src/libc/arm/strcmp.s
@@ -1,4 +1,4 @@
-TEXT strcmp(SB), $-4
+TEXT strcmp(SB), $0
MOVW R0, R1
MOVW s2+4(FP), R2
diff --git a/sys/src/libc/arm/strcpy.s b/sys/src/libc/arm/strcpy.s
index 3e69fdc7d..bd2ea0dd9 100644
--- a/sys/src/libc/arm/strcpy.s
+++ b/sys/src/libc/arm/strcpy.s
@@ -1,4 +1,4 @@
-TEXT strcpy(SB), $-4
+TEXT strcpy(SB), $0
MOVW R0, to+0(FP) /* need to save for return value */
MOVW from+4(FP), R1
MOVW $0xFF, R2 /* mask */
diff --git a/sys/src/libc/arm/tas.s b/sys/src/libc/arm/tas.s
index 15febbd2c..6c34f5227 100644
--- a/sys/src/libc/arm/tas.s
+++ b/sys/src/libc/arm/tas.s
@@ -1,4 +1,4 @@
-TEXT _tas(SB), $-4
+TEXT _tas(SB), 1, $-4
MOVW R0,R1
MOVW $1,R0
SWPW R0,(R1) /* fix: deprecated in armv7 */
diff --git a/sys/src/libc/arm/vlop.s b/sys/src/libc/arm/vlop.s
index 3a5375541..13f4948fe 100644
--- a/sys/src/libc/arm/vlop.s
+++ b/sys/src/libc/arm/vlop.s
@@ -1,4 +1,4 @@
-TEXT _mulv(SB), $0
+TEXT _mulv(SB), 1, $0
MOVW 4(FP),R8 /* l0 */
MOVW 8(FP),R11 /* h0 */
MOVW 12(FP),R4 /* l1 */
diff --git a/sys/src/libc/arm/vlrt.c b/sys/src/libc/arm/vlrt.c
index 5e9524d34..6a0c5df6a 100644
--- a/sys/src/libc/arm/vlrt.c
+++ b/sys/src/libc/arm/vlrt.c
@@ -128,6 +128,8 @@ _v2f(Vlong x)
return _v2d(x);
}
+/* too many of these are also needed by profiler; leave them out */
+#pragma profile off
static void
dodiv(Vlong num, Vlong den, Vlong *q, Vlong *r)
@@ -503,6 +505,7 @@ _sl2v(Vlong *ret, long sl)
ret->hi = t >> 31;
}
+
void
_ul2v(Vlong *ret, ulong ul)
{