Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 

71 řádky
1.5 KiB

  1. // +build amd64,!noasm
  2. #include "textflag.h"
  3. // Digits of 3^238 - 1
  4. #define THREE238M1_0 $0xedcd718a828384f8
  5. #define THREE238M1_1 $0x733b35bfd4427a14
  6. #define THREE238M1_2 $0xf88229cf94d7cf38
  7. #define THREE238M1_3 $0x63c56c990c7c2ad6
  8. #define THREE238M1_4 $0xb858a87e8f4222c7
  9. #define THREE238M1_5 $0x254c9c6b525eaf5
  10. // Set result to zero if the input scalar is <= 3^238, otherwise result is 1.
  11. // Scalar must be array of 48 bytes
  12. // func checkLessThanThree238(s_base uintptr, s_len uint, s_cap uint) uint8
  13. TEXT ·checkLessThanThree238(SB), NOSPLIT, $0-16
  14. MOVQ scalar+0(FP), SI
  15. XORQ AX, AX
  16. // Set [R10,...,R15] = 3^238
  17. MOVQ THREE238M1_0, R10
  18. MOVQ THREE238M1_1, R11
  19. MOVQ THREE238M1_2, R12
  20. MOVQ THREE238M1_3, R13
  21. MOVQ THREE238M1_4, R14
  22. MOVQ THREE238M1_5, R15
  23. // Set [R10,...,R15] = 3^238 - scalar
  24. SUBQ (SI), R10
  25. SBBQ 8(SI), R11
  26. SBBQ 16(SI), R12
  27. SBBQ 24(SI), R13
  28. SBBQ 32(SI), R14
  29. SBBQ 40(SI), R15
  30. // Save borrow flag indicating 3^238 - scalar < 0 as a mask in AX (rax)
  31. ADCB $0, AX
  32. MOVB AX, ret+24(FP)
  33. RET
  34. // Multiply 48-byte scalar by 3 to get a scalar in 3*[0,3^238)
  35. TEXT ·multiplyByThree(SB), NOSPLIT, $0-8
  36. MOVQ scalar+0(FP), SI
  37. // Set [R10,...,R15] = scalar
  38. MOVQ (SI), R10
  39. MOVQ 8(SI), R11
  40. MOVQ 16(SI), R12
  41. MOVQ 24(SI), R13
  42. MOVQ 32(SI), R14
  43. MOVQ 40(SI), R15
  44. // Add scalar twice to compute 3*scalar
  45. ADDQ R10, (SI)
  46. ADCQ R11, (8)(SI)
  47. ADCQ R12, (16)(SI)
  48. ADCQ R13, (24)(SI)
  49. ADCQ R14, (32)(SI)
  50. ADCQ R15, (40)(SI)
  51. ADDQ R10, (SI)
  52. ADCQ R11, (8)(SI)
  53. ADCQ R12, (16)(SI)
  54. ADCQ R13, (24)(SI)
  55. ADCQ R14, (32)(SI)
  56. ADCQ R15, (40)(SI)
  57. RET