mpvecdigmuladd.s 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /*
  2. * mpvecdigmul(mpdigit *b, int n, mpdigit m, mpdigit *p)
  3. *
  4. * p += b*m
  5. *
  6. * each step look like:
  7. * hi,lo = m*b[i]
  8. * lo += oldhi + carry
  9. * hi += carry
  10. * p[i] += lo
  11. * oldhi = hi
  12. *
  13. * the registers are:
  14. * hi = DX - constrained by hardware
  15. * lo = AX - constrained by hardware
  16. * b+n = SI - can't be BP
  17. * p+n = DI - can't be BP
  18. * i-n = BP
  19. * m = BX
  20. * oldhi = CX
  21. *
  22. */
  23. TEXT mpvecdigmuladd(SB),$0
  24. MOVL b+0(FP),SI
  25. MOVL n+4(FP),CX
  26. MOVL m+8(FP),BX
  27. MOVL p+12(FP),DI
  28. MOVL CX,BP
  29. NEGL BP /* BP = -n */
  30. SHLL $2,CX
  31. ADDL CX,SI /* SI = b + n */
  32. ADDL CX,DI /* DI = p + n */
  33. XORL CX,CX
  34. _muladdloop:
  35. MOVL (SI)(BP*4),AX /* lo = b[i] */
  36. MULL BX /* hi, lo = b[i] * m */
  37. ADDL CX,AX /* lo += oldhi */
  38. JCC _muladdnocarry1
  39. INCL DX /* hi += carry */
  40. _muladdnocarry1:
  41. ADDL AX,(DI)(BP*4) /* p[i] += lo */
  42. JCC _muladdnocarry2
  43. INCL DX /* hi += carry */
  44. _muladdnocarry2:
  45. MOVL DX,CX /* oldhi = hi */
  46. INCL BP /* i++ */
  47. JNZ _muladdloop
  48. XORL AX,AX
  49. ADDL CX,(DI)(BP*4) /* p[n] + oldhi */
  50. ADCL AX,AX /* return carry out of p[n] */
  51. RET