Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 

66 rindas
1.3 KiB

  1. #include "textflag.h"
  2. // Digits of 3^238 - 1
  3. #define THREE238M1_0 $0xedcd718a828384f8
  4. #define THREE238M1_1 $0x733b35bfd4427a14
  5. #define THREE238M1_2 $0xf88229cf94d7cf38
  6. #define THREE238M1_3 $0x63c56c990c7c2ad6
  7. #define THREE238M1_4 $0xb858a87e8f4222c7
  8. #define THREE238M1_5 $0x254c9c6b525eaf5
  9. TEXT ·checkLessThanThree238(SB), NOSPLIT, $0-16
  10. MOVQ scalar+0(FP), SI
  11. MOVQ result+8(FP), DI
  12. XORQ AX, AX
  13. // Set [R10,...,R15] = 3^238
  14. MOVQ THREE238M1_0, R10
  15. MOVQ THREE238M1_1, R11
  16. MOVQ THREE238M1_2, R12
  17. MOVQ THREE238M1_3, R13
  18. MOVQ THREE238M1_4, R14
  19. MOVQ THREE238M1_5, R15
  20. // Set [R10,...,R15] = 3^238 - scalar
  21. SUBQ (SI), R10
  22. SBBQ (8)(SI), R11
  23. SBBQ (16)(SI), R12
  24. SBBQ (24)(SI), R13
  25. SBBQ (32)(SI), R14
  26. SBBQ (40)(SI), R15
  27. // Save borrow flag indicating 3^238 - scalar < 0 as a mask in AX (eax)
  28. SBBL $0, AX
  29. MOVL AX, (DI)
  30. RET
  31. TEXT ·multiplyByThree(SB), NOSPLIT, $0-8
  32. MOVQ scalar+0(FP), SI
  33. // Set [R10,...,R15] = scalar
  34. MOVQ (SI), R10
  35. MOVQ (8)(SI), R11
  36. MOVQ (16)(SI), R12
  37. MOVQ (24)(SI), R13
  38. MOVQ (32)(SI), R14
  39. MOVQ (40)(SI), R15
  40. // Add scalar twice to compute 3*scalar
  41. ADDQ R10, (SI)
  42. ADCQ R11, (8)(SI)
  43. ADCQ R12, (16)(SI)
  44. ADCQ R13, (24)(SI)
  45. ADCQ R14, (32)(SI)
  46. ADCQ R15, (40)(SI)
  47. ADDQ R10, (SI)
  48. ADCQ R11, (8)(SI)
  49. ADCQ R12, (16)(SI)
  50. ADCQ R13, (24)(SI)
  51. ADCQ R14, (32)(SI)
  52. ADCQ R15, (40)(SI)
  53. RET