mpvecadd.s 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #define BDNZ BC 16,0,
  2. #define BDNE BC 0,2,
  3. /*
  4. * mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum)
  5. *
  6. * sum[0:alen] = a[0:alen-1] + b[0:blen-1]
  7. *
  8. * prereq: alen >= blen, sum has room for alen+1 digits
  9. *
  10. * R1 == a (first arg passed in R1)
  11. * R3 == carry
  12. * R4 == alen
  13. * R5 == b
  14. * R6 == blen
  15. * R7 == sum
  16. * R2 == temporary
  17. * R8 == temporary
  18. * R9 == temporary
  19. */
  20. TEXT mpvecadd(SB),$-4
  21. MOVW alen+4(FP), R4
  22. MOVW b+8(FP), R5
  23. MOVW blen+12(FP), R6
  24. MOVW sum+16(FP), R7
  25. SUBU R6, R4 /* calculate counter for second loop (alen > blen) */
  26. MOVW R0, R3
  27. /* if blen == 0, don't need to add it in */
  28. BEQ R6,_add1
  29. /* sum[0:blen-1],carry = a[0:blen-1] + b[0:blen-1] */
  30. _addloop1:
  31. MOVW 0(R1), R8
  32. ADDU $4, R1
  33. MOVW 0(R5), R9
  34. ADDU $4, R5
  35. ADDU R3, R8
  36. SGTU R3, R8, R3
  37. ADDU R8, R9
  38. SGTU R8, R9, R2
  39. ADDU R2, R3
  40. MOVW R9, 0(R7)
  41. ADDU $4, R7
  42. SUBU $1, R6
  43. BNE R6, _addloop1
  44. _add1:
  45. /* if alen == blen, we're done */
  46. BEQ R4, _addend
  47. /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 + carry */
  48. _addloop2:
  49. MOVW 0(R1), R8
  50. ADDU $4, R1
  51. ADDU R3, R8
  52. SGTU R3, R8, R3
  53. MOVW R8, 0(R7)
  54. ADDU $4, R7
  55. SUBU $1, R4
  56. BNE R4, _addloop2
  57. /* sum[alen] = carry */
  58. _addend:
  59. MOVW R3, 0(R7)
  60. RET