mpvecsub.s 788 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  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. /* MOVQ a+0(FP),SI */
  10. MOVQ RARG, SI
  11. MOVQ b+16(FP),BX
  12. MOVL alen+8(FP),DX
  13. MOVL blen+24(FP),CX
  14. MOVQ diff+32(FP),DI
  15. SUBL CX,DX
  16. XORL BP,BP /* this also sets carry to 0 */
  17. /* skip subraction if b is zero */
  18. TESTL CX,CX
  19. JZ _sub1
  20. /* diff[0:blen-1],borrow = a[0:blen-1] - b[0:blen-1] */
  21. _subloop1:
  22. MOVL (SI)(BP*4),AX
  23. SBBL (BX)(BP*4),AX
  24. MOVL AX,(DI)(BP*4)
  25. INCL BP
  26. LOOP _subloop1
  27. _sub1:
  28. INCL DX
  29. MOVL DX,CX
  30. LOOP _subloop2
  31. RET
  32. /* diff[blen:alen-1] = a[blen:alen-1] - 0 */
  33. _subloop2:
  34. MOVL (SI)(BP*4),AX
  35. SBBL $0,AX
  36. MOVL AX,(DI)(BP*4)
  37. INCL BP
  38. LOOP _subloop2
  39. RET