galois_ppc64le.s 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. //+build !noasm !appengine !gccgo
  2. // Copyright 2015, Klaus Post, see LICENSE for details.
  3. // Copyright 2018, Minio, Inc.
  4. #include "textflag.h"
  5. #define LOW R3
  6. #define HIGH R4
  7. #define IN R5
  8. #define LEN R6
  9. #define OUT R7
  10. #define CONSTANTS R8
  11. #define OFFSET R9
  12. #define OFFSET1 R10
  13. #define OFFSET2 R11
  14. #define X6 VS34
  15. #define X6_ V2
  16. #define X7 VS35
  17. #define X7_ V3
  18. #define MSG VS36
  19. #define MSG_ V4
  20. #define MSG_HI VS37
  21. #define MSG_HI_ V5
  22. #define RESULT VS38
  23. #define RESULT_ V6
  24. #define ROTATE VS39
  25. #define ROTATE_ V7
  26. #define MASK VS40
  27. #define MASK_ V8
  28. #define FLIP VS41
  29. #define FLIP_ V9
  30. // func galMulPpc(low, high, in, out []byte)
  31. TEXT ·galMulPpc(SB), NOFRAME|NOSPLIT, $0-96
  32. MOVD low+0(FP), LOW
  33. MOVD high+24(FP), HIGH
  34. MOVD in+48(FP), IN
  35. MOVD in_len+56(FP), LEN
  36. MOVD out+72(FP), OUT
  37. MOVD $16, OFFSET1
  38. MOVD $32, OFFSET2
  39. MOVD $·constants(SB), CONSTANTS
  40. LXVD2X (CONSTANTS)(R0), ROTATE
  41. LXVD2X (CONSTANTS)(OFFSET1), MASK
  42. LXVD2X (CONSTANTS)(OFFSET2), FLIP
  43. LXVD2X (LOW)(R0), X6
  44. LXVD2X (HIGH)(R0), X7
  45. VPERM X6_, V31, FLIP_, X6_
  46. VPERM X7_, V31, FLIP_, X7_
  47. MOVD $0, OFFSET
  48. loop:
  49. LXVD2X (IN)(OFFSET), MSG
  50. VSRB MSG_, ROTATE_, MSG_HI_
  51. VAND MSG_, MASK_, MSG_
  52. VPERM X6_, V31, MSG_, MSG_
  53. VPERM X7_, V31, MSG_HI_, MSG_HI_
  54. VXOR MSG_, MSG_HI_, MSG_
  55. STXVD2X MSG, (OUT)(OFFSET)
  56. ADD $16, OFFSET, OFFSET
  57. CMP LEN, OFFSET
  58. BGT loop
  59. RET
  60. // func galMulPpcXorlow, high, in, out []byte)
  61. TEXT ·galMulPpcXor(SB), NOFRAME|NOSPLIT, $0-96
  62. MOVD low+0(FP), LOW
  63. MOVD high+24(FP), HIGH
  64. MOVD in+48(FP), IN
  65. MOVD in_len+56(FP), LEN
  66. MOVD out+72(FP), OUT
  67. MOVD $16, OFFSET1
  68. MOVD $32, OFFSET2
  69. MOVD $·constants(SB), CONSTANTS
  70. LXVD2X (CONSTANTS)(R0), ROTATE
  71. LXVD2X (CONSTANTS)(OFFSET1), MASK
  72. LXVD2X (CONSTANTS)(OFFSET2), FLIP
  73. LXVD2X (LOW)(R0), X6
  74. LXVD2X (HIGH)(R0), X7
  75. VPERM X6_, V31, FLIP_, X6_
  76. VPERM X7_, V31, FLIP_, X7_
  77. MOVD $0, OFFSET
  78. loopXor:
  79. LXVD2X (IN)(OFFSET), MSG
  80. LXVD2X (OUT)(OFFSET), RESULT
  81. VSRB MSG_, ROTATE_, MSG_HI_
  82. VAND MSG_, MASK_, MSG_
  83. VPERM X6_, V31, MSG_, MSG_
  84. VPERM X7_, V31, MSG_HI_, MSG_HI_
  85. VXOR MSG_, MSG_HI_, MSG_
  86. VXOR MSG_, RESULT_, RESULT_
  87. STXVD2X RESULT, (OUT)(OFFSET)
  88. ADD $16, OFFSET, OFFSET
  89. CMP LEN, OFFSET
  90. BGT loopXor
  91. RET
  92. DATA ·constants+0x0(SB)/8, $0x0404040404040404
  93. DATA ·constants+0x8(SB)/8, $0x0404040404040404
  94. DATA ·constants+0x10(SB)/8, $0x0f0f0f0f0f0f0f0f
  95. DATA ·constants+0x18(SB)/8, $0x0f0f0f0f0f0f0f0f
  96. DATA ·constants+0x20(SB)/8, $0x0706050403020100
  97. DATA ·constants+0x28(SB)/8, $0x0f0e0d0c0b0a0908
  98. GLOBL ·constants(SB), 8, $48