mpvecsub.s 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #define BDNZ BC 16,0,
  2. #define BDNE BC 0,2,
  3. /*
  4. * mpvecsub(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *diff)
  5. *
  6. * diff[0:alen-1] = a[0:alen-1] - b[0:blen-1]
  7. *
  8. * prereq: alen >= blen, diff has room for alen digits
  9. *
  10. * R3 == a
  11. * R4 == alen
  12. * R5 == b
  13. * R6 == blen
  14. * R7 == diff
  15. * R8 == temporary
  16. * R9 == temporary
  17. */
  18. TEXT mpvecsub(SB),$-4
  19. MOVW alen+4(FP),R4
  20. MOVW b+8(FP),R5
  21. MOVW blen+12(FP),R6
  22. MOVW diff+16(FP),R7
  23. SUB R6, R4 /* calculate counter for second loop (alen > blen) */
  24. SUB $4, R3 /* pre decrement for MOVWU's */
  25. SUB $4, R5 /* pre decrement for MOVWU's */
  26. SUBC $4, R7 /* pre decrement for MOVWU's and set carry */
  27. /* skip subraction if b is zero */
  28. CMP R0,R6
  29. BEQ _sub1
  30. /* diff[0:blen-1],borrow = a[0:blen-1] - b[0:blen-1] */
  31. MOVW R6, CTR
  32. _subloop1:
  33. MOVWU 4(R3), R8
  34. MOVWU 4(R5), R9
  35. SUBE R9, R8, R8
  36. MOVWU R8, 4(R7)
  37. BDNZ _subloop1
  38. _sub1:
  39. /* skip subtraction if a is zero */
  40. CMP R0, R4
  41. BEQ _subend
  42. /* diff[blen:alen-1] = a[blen:alen-1] - 0 + carry */
  43. MOVW R4, CTR
  44. _subloop2:
  45. MOVWU 4(R3), R8
  46. SUBE R0, R8
  47. MOVWU R8, 4(R7)
  48. BDNZ _subloop2
  49. _subend:
  50. RETURN