mpvecadd.s 927 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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+8(FP),DX
  10. MOVL blen+24(FP),CX
  11. /* MOVL a+0(FP),SI */
  12. MOVQ RARG, SI
  13. MOVQ b+16(FP),BX
  14. SUBL CX,DX
  15. MOVQ sum+32(FP),DI
  16. XORL BP,BP /* this also sets carry to 0 */
  17. /* skip addition if b is zero */
  18. TESTL CX,CX
  19. JZ _add1
  20. /* sum[0:blen-1],carry = a[0:blen-1] + b[0:blen-1] */
  21. _addloop1:
  22. MOVL (SI)(BP*4), AX
  23. ADCL (BX)(BP*4), AX
  24. MOVL AX,(DI)(BP*4)
  25. INCL BP
  26. LOOP _addloop1
  27. _add1:
  28. /* jump if alen > blen */
  29. INCL DX
  30. MOVL DX,CX
  31. LOOP _addloop2
  32. /* sum[alen] = carry */
  33. _addend:
  34. JC _addcarry
  35. MOVL $0,(DI)(BP*4)
  36. RET
  37. _addcarry:
  38. MOVL $1,(DI)(BP*4)
  39. RET
  40. /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 */
  41. _addloop2:
  42. MOVL (SI)(BP*4),AX
  43. ADCL $0,AX
  44. MOVL AX,(DI)(BP*4)
  45. INCL BP
  46. LOOP _addloop2
  47. JMP _addend