summaryrefslogtreecommitdiff
path: root/libmp/Plan9-386/mpvecsub.s
diff options
context:
space:
mode:
Diffstat (limited to 'libmp/Plan9-386/mpvecsub.s')
-rw-r--r--libmp/Plan9-386/mpvecsub.s44
1 files changed, 44 insertions, 0 deletions
diff --git a/libmp/Plan9-386/mpvecsub.s b/libmp/Plan9-386/mpvecsub.s
new file mode 100644
index 00000000..ebe8d29a
--- /dev/null
+++ b/libmp/Plan9-386/mpvecsub.s
@@ -0,0 +1,44 @@
+/*
+ * mpvecsub(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *diff)
+ *
+ * diff[0:alen-1] = a[0:alen-1] - b[0:blen-1]
+ *
+ * prereq: alen >= blen, diff has room for alen digits
+ */
+TEXT mpvecsub(SB),$0
+
+ MOVL a+0(FP),SI
+ MOVL b+8(FP),BX
+ MOVL alen+4(FP),DX
+ MOVL blen+12(FP),CX
+ MOVL diff+16(FP),DI
+ SUBL CX,DX
+ XORL BP,BP /* this also sets carry to 0 */
+
+ /* skip subraction if b is zero */
+ TESTL CX,CX
+ JZ _sub1
+
+ /* diff[0:blen-1],borrow = a[0:blen-1] - b[0:blen-1] */
+_subloop1:
+ MOVL (SI)(BP*4),AX
+ SBBL (BX)(BP*4),AX
+ MOVL AX,(DI)(BP*4)
+ INCL BP
+ LOOP _subloop1
+
+_sub1:
+ INCL DX
+ MOVL DX,CX
+ LOOP _subloop2
+ RET
+
+ /* diff[blen:alen-1] = a[blen:alen-1] - 0 */
+_subloop2:
+ MOVL (SI)(BP*4),AX
+ SBBL $0,AX
+ MOVL AX,(DI)(BP*4)
+ INCL BP
+ LOOP _subloop2
+ RET
+