git: 9front

Download patch

ref: ab1a9b834fe7429ca81acec199bd245e20eaf500
parent: 5d354bf7c61f9fd4ec345978b52f415c54acf5aa
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Jun 26 11:16:23 EDT 2016

libc: native _addv() and _subv() routines for arm

--- a/sys/src/libc/arm/vlop.s
+++ b/sys/src/libc/arm/vlop.s
@@ -3,11 +3,30 @@
 	MOVW	8(FP),R11	/* h0 */
 	MOVW	12(FP),R4	/* l1 */
 	MOVW	16(FP),R5	/* h1 */
-	MULLU	R8,R4,(R6, R7)	/* l0*l1 */
+	MULLU	R8,R4,(R7,R6)	/* l0*l1 */
 	MUL	R8,R5,R5	/* l0*h1 */
+	ADD	R5,R7
 	MUL	R11,R4,R4	/* h0*l1 */
-	ADD	R4,R6
-	ADD	R5,R6
-	MOVW	R6,4(R0)
-	MOVW	R7,0(R0)
+	ADD	R4,R7
+	MOVM.IA	[R6,R7],(R0)
+	RET
+
+TEXT	_addv(SB), 1, $0
+	MOVW	4(FP),R8	/* l0 */
+	MOVW	8(FP),R11	/* h0 */
+	MOVW	12(FP),R4	/* l1 */
+	MOVW	16(FP),R5	/* h1 */
+	ADD.S	R8,R4
+	ADC	R11,R5
+	MOVM.IA	[R4,R5],(R0)
+	RET
+
+TEXT	_subv(SB), 1, $0
+	MOVW	4(FP),R8	/* l0 */
+	MOVW	8(FP),R11	/* h0 */
+	MOVW	12(FP),R4	/* l1 */
+	MOVW	16(FP),R5	/* h1 */
+	SUB.S	R4,R8,R4
+	SBC	R5,R11,R5
+	MOVM.IA	[R4,R5],(R0)
 	RET
--- a/sys/src/libc/arm/vlrt.c
+++ b/sys/src/libc/arm/vlrt.c
@@ -15,37 +15,6 @@
 
 void	abort(void);
 
-/* needed by profiler; can't be profiled */
-#pragma profile off
-
-void
-_addv(Vlong *r, Vlong a, Vlong b)
-{
-	ulong lo, hi;
-
-	lo = a.lo + b.lo;
-	hi = a.hi + b.hi;
-	if(lo < a.lo)
-		hi++;
-	r->lo = lo;
-	r->hi = hi;
-}
-
-void
-_subv(Vlong *r, Vlong a, Vlong b)
-{
-	ulong lo, hi;
-
-	lo = a.lo - b.lo;
-	hi = a.hi - b.hi;
-	if(lo > a.lo)
-		hi--;
-	r->lo = lo;
-	r->hi = hi;
-}
-
-#pragma profile on
-
 void
 _d2v(Vlong *y, double d)
 {
--