mpvecsub.s 767 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. /*
  2. * mpvecsub(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *diff)
  3. *
  4. * diff[0:alen-1] = a[0:alen-1] - b[0:blen-1]
  5. *
  6. * prereq: alen >= blen, diff has room for alen digits
  7. */
  8. TEXT mpvecsub(SB),$0
  9. MOVL a+0(FP),SI
  10. MOVL b+8(FP),BX
  11. MOVL alen+4(FP),DX
  12. MOVL blen+12(FP),CX
  13. MOVL diff+16(FP),DI
  14. SUBL CX,DX
  15. XORL BP,BP /* this also sets carry to 0 */
  16. /* skip subraction if b is zero */
  17. TESTL CX,CX
  18. JZ _sub1
  19. /* diff[0:blen-1],borrow = a[0:blen-1] - b[0:blen-1] */
  20. _subloop1:
  21. MOVL (SI)(BP*4),AX
  22. SBBL (BX)(BP*4),AX
  23. MOVL AX,(DI)(BP*4)
  24. INCL BP
  25. LOOP _subloop1
  26. _sub1:
  27. INCL DX
  28. MOVL DX,CX
  29. LOOP _subloop2
  30. RET
  31. /* diff[blen:alen-1] = a[blen:alen-1] - 0 */
  32. _subloop2:
  33. MOVL (SI)(BP*4),AX
  34. SBBL $0,AX
  35. MOVL AX,(DI)(BP*4)
  36. INCL BP
  37. LOOP _subloop2
  38. RET