mpvecadd.s 906 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. /*
  2. * mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum)
  3. *
  4. * sum[0:alen] = a[0:alen-1] + b[0:blen-1]
  5. *
  6. * prereq: alen >= blen, sum has room for alen+1 digits
  7. */
  8. TEXT mpvecadd(SB),$0
  9. MOVL alen+4(FP),DX
  10. MOVL blen+12(FP),CX
  11. MOVL a+0(FP),SI
  12. MOVL b+8(FP),BX
  13. SUBL CX,DX
  14. MOVL sum+16(FP),DI
  15. XORL BP,BP /* this also sets carry to 0 */
  16. /* skip addition if b is zero */
  17. TESTL CX,CX
  18. JZ _add1
  19. /* sum[0:blen-1],carry = a[0:blen-1] + b[0:blen-1] */
  20. _addloop1:
  21. MOVL (SI)(BP*4), AX
  22. ADCL (BX)(BP*4), AX
  23. MOVL AX,(DI)(BP*4)
  24. INCL BP
  25. LOOP _addloop1
  26. _add1:
  27. /* jump if alen > blen */
  28. INCL DX
  29. MOVL DX,CX
  30. LOOP _addloop2
  31. /* sum[alen] = carry */
  32. _addend:
  33. JC _addcarry
  34. MOVL $0,(DI)(BP*4)
  35. RET
  36. _addcarry:
  37. MOVL $1,(DI)(BP*4)
  38. RET
  39. /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 */
  40. _addloop2:
  41. MOVL (SI)(BP*4),AX
  42. ADCL $0,AX
  43. MOVL AX,(DI)(BP*4)
  44. INCL BP
  45. LOOP _addloop2
  46. JMP _addend