ghash-armv4.S 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. // This file is generated from a similarly-named Perl script in the BoringSSL
  2. // source tree. Do not edit by hand.
  3. #if !defined(__has_feature)
  4. #define __has_feature(x) 0
  5. #endif
  6. #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM)
  7. #define OPENSSL_NO_ASM
  8. #endif
  9. #if !defined(OPENSSL_NO_ASM)
  10. #if defined(BORINGSSL_PREFIX)
  11. #include <boringssl_prefix_symbols_asm.h>
  12. #endif
  13. #include <openssl/arm_arch.h>
  14. @ Silence ARMv8 deprecated IT instruction warnings. This file is used by both
  15. @ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. (ARMv8 PMULL
  16. @ instructions are in aesv8-armx.pl.)
  17. .text
  18. #if defined(__thumb2__) || defined(__clang__)
  19. .syntax unified
  20. #define ldrplb ldrbpl
  21. #define ldrneb ldrbne
  22. #endif
  23. #if defined(__thumb2__)
  24. .thumb
  25. #else
  26. .code 32
  27. #endif
  28. #if __ARM_MAX_ARCH__>=7
  29. .globl _gcm_init_neon
  30. .private_extern _gcm_init_neon
  31. #ifdef __thumb2__
  32. .thumb_func _gcm_init_neon
  33. #endif
  34. .align 4
  35. _gcm_init_neon:
  36. vld1.64 d7,[r1]! @ load H
  37. vmov.i8 q8,#0xe1
  38. vld1.64 d6,[r1]
  39. vshl.i64 d17,#57
  40. vshr.u64 d16,#63 @ t0=0xc2....01
  41. vdup.8 q9,d7[7]
  42. vshr.u64 d26,d6,#63
  43. vshr.s8 q9,#7 @ broadcast carry bit
  44. vshl.i64 q3,q3,#1
  45. vand q8,q8,q9
  46. vorr d7,d26 @ H<<<=1
  47. veor q3,q3,q8 @ twisted H
  48. vstmia r0,{q3}
  49. bx lr @ bx lr
  50. .globl _gcm_gmult_neon
  51. .private_extern _gcm_gmult_neon
  52. #ifdef __thumb2__
  53. .thumb_func _gcm_gmult_neon
  54. #endif
  55. .align 4
  56. _gcm_gmult_neon:
  57. vld1.64 d7,[r0]! @ load Xi
  58. vld1.64 d6,[r0]!
  59. vmov.i64 d29,#0x0000ffffffffffff
  60. vldmia r1,{d26,d27} @ load twisted H
  61. vmov.i64 d30,#0x00000000ffffffff
  62. #ifdef __ARMEL__
  63. vrev64.8 q3,q3
  64. #endif
  65. vmov.i64 d31,#0x000000000000ffff
  66. veor d28,d26,d27 @ Karatsuba pre-processing
  67. mov r3,#16
  68. b Lgmult_neon
  69. .globl _gcm_ghash_neon
  70. .private_extern _gcm_ghash_neon
  71. #ifdef __thumb2__
  72. .thumb_func _gcm_ghash_neon
  73. #endif
  74. .align 4
  75. _gcm_ghash_neon:
  76. vld1.64 d1,[r0]! @ load Xi
  77. vld1.64 d0,[r0]!
  78. vmov.i64 d29,#0x0000ffffffffffff
  79. vldmia r1,{d26,d27} @ load twisted H
  80. vmov.i64 d30,#0x00000000ffffffff
  81. #ifdef __ARMEL__
  82. vrev64.8 q0,q0
  83. #endif
  84. vmov.i64 d31,#0x000000000000ffff
  85. veor d28,d26,d27 @ Karatsuba pre-processing
  86. Loop_neon:
  87. vld1.64 d7,[r2]! @ load inp
  88. vld1.64 d6,[r2]!
  89. #ifdef __ARMEL__
  90. vrev64.8 q3,q3
  91. #endif
  92. veor q3,q0 @ inp^=Xi
  93. Lgmult_neon:
  94. vext.8 d16, d26, d26, #1 @ A1
  95. vmull.p8 q8, d16, d6 @ F = A1*B
  96. vext.8 d0, d6, d6, #1 @ B1
  97. vmull.p8 q0, d26, d0 @ E = A*B1
  98. vext.8 d18, d26, d26, #2 @ A2
  99. vmull.p8 q9, d18, d6 @ H = A2*B
  100. vext.8 d22, d6, d6, #2 @ B2
  101. vmull.p8 q11, d26, d22 @ G = A*B2
  102. vext.8 d20, d26, d26, #3 @ A3
  103. veor q8, q8, q0 @ L = E + F
  104. vmull.p8 q10, d20, d6 @ J = A3*B
  105. vext.8 d0, d6, d6, #3 @ B3
  106. veor q9, q9, q11 @ M = G + H
  107. vmull.p8 q0, d26, d0 @ I = A*B3
  108. veor d16, d16, d17 @ t0 = (L) (P0 + P1) << 8
  109. vand d17, d17, d29
  110. vext.8 d22, d6, d6, #4 @ B4
  111. veor d18, d18, d19 @ t1 = (M) (P2 + P3) << 16
  112. vand d19, d19, d30
  113. vmull.p8 q11, d26, d22 @ K = A*B4
  114. veor q10, q10, q0 @ N = I + J
  115. veor d16, d16, d17
  116. veor d18, d18, d19
  117. veor d20, d20, d21 @ t2 = (N) (P4 + P5) << 24
  118. vand d21, d21, d31
  119. vext.8 q8, q8, q8, #15
  120. veor d22, d22, d23 @ t3 = (K) (P6 + P7) << 32
  121. vmov.i64 d23, #0
  122. vext.8 q9, q9, q9, #14
  123. veor d20, d20, d21
  124. vmull.p8 q0, d26, d6 @ D = A*B
  125. vext.8 q11, q11, q11, #12
  126. vext.8 q10, q10, q10, #13
  127. veor q8, q8, q9
  128. veor q10, q10, q11
  129. veor q0, q0, q8
  130. veor q0, q0, q10
  131. veor d6,d6,d7 @ Karatsuba pre-processing
  132. vext.8 d16, d28, d28, #1 @ A1
  133. vmull.p8 q8, d16, d6 @ F = A1*B
  134. vext.8 d2, d6, d6, #1 @ B1
  135. vmull.p8 q1, d28, d2 @ E = A*B1
  136. vext.8 d18, d28, d28, #2 @ A2
  137. vmull.p8 q9, d18, d6 @ H = A2*B
  138. vext.8 d22, d6, d6, #2 @ B2
  139. vmull.p8 q11, d28, d22 @ G = A*B2
  140. vext.8 d20, d28, d28, #3 @ A3
  141. veor q8, q8, q1 @ L = E + F
  142. vmull.p8 q10, d20, d6 @ J = A3*B
  143. vext.8 d2, d6, d6, #3 @ B3
  144. veor q9, q9, q11 @ M = G + H
  145. vmull.p8 q1, d28, d2 @ I = A*B3
  146. veor d16, d16, d17 @ t0 = (L) (P0 + P1) << 8
  147. vand d17, d17, d29
  148. vext.8 d22, d6, d6, #4 @ B4
  149. veor d18, d18, d19 @ t1 = (M) (P2 + P3) << 16
  150. vand d19, d19, d30
  151. vmull.p8 q11, d28, d22 @ K = A*B4
  152. veor q10, q10, q1 @ N = I + J
  153. veor d16, d16, d17
  154. veor d18, d18, d19
  155. veor d20, d20, d21 @ t2 = (N) (P4 + P5) << 24
  156. vand d21, d21, d31
  157. vext.8 q8, q8, q8, #15
  158. veor d22, d22, d23 @ t3 = (K) (P6 + P7) << 32
  159. vmov.i64 d23, #0
  160. vext.8 q9, q9, q9, #14
  161. veor d20, d20, d21
  162. vmull.p8 q1, d28, d6 @ D = A*B
  163. vext.8 q11, q11, q11, #12
  164. vext.8 q10, q10, q10, #13
  165. veor q8, q8, q9
  166. veor q10, q10, q11
  167. veor q1, q1, q8
  168. veor q1, q1, q10
  169. vext.8 d16, d27, d27, #1 @ A1
  170. vmull.p8 q8, d16, d7 @ F = A1*B
  171. vext.8 d4, d7, d7, #1 @ B1
  172. vmull.p8 q2, d27, d4 @ E = A*B1
  173. vext.8 d18, d27, d27, #2 @ A2
  174. vmull.p8 q9, d18, d7 @ H = A2*B
  175. vext.8 d22, d7, d7, #2 @ B2
  176. vmull.p8 q11, d27, d22 @ G = A*B2
  177. vext.8 d20, d27, d27, #3 @ A3
  178. veor q8, q8, q2 @ L = E + F
  179. vmull.p8 q10, d20, d7 @ J = A3*B
  180. vext.8 d4, d7, d7, #3 @ B3
  181. veor q9, q9, q11 @ M = G + H
  182. vmull.p8 q2, d27, d4 @ I = A*B3
  183. veor d16, d16, d17 @ t0 = (L) (P0 + P1) << 8
  184. vand d17, d17, d29
  185. vext.8 d22, d7, d7, #4 @ B4
  186. veor d18, d18, d19 @ t1 = (M) (P2 + P3) << 16
  187. vand d19, d19, d30
  188. vmull.p8 q11, d27, d22 @ K = A*B4
  189. veor q10, q10, q2 @ N = I + J
  190. veor d16, d16, d17
  191. veor d18, d18, d19
  192. veor d20, d20, d21 @ t2 = (N) (P4 + P5) << 24
  193. vand d21, d21, d31
  194. vext.8 q8, q8, q8, #15
  195. veor d22, d22, d23 @ t3 = (K) (P6 + P7) << 32
  196. vmov.i64 d23, #0
  197. vext.8 q9, q9, q9, #14
  198. veor d20, d20, d21
  199. vmull.p8 q2, d27, d7 @ D = A*B
  200. vext.8 q11, q11, q11, #12
  201. vext.8 q10, q10, q10, #13
  202. veor q8, q8, q9
  203. veor q10, q10, q11
  204. veor q2, q2, q8
  205. veor q2, q2, q10
  206. veor q1,q1,q0 @ Karatsuba post-processing
  207. veor q1,q1,q2
  208. veor d1,d1,d2
  209. veor d4,d4,d3 @ Xh|Xl - 256-bit result
  210. @ equivalent of reduction_avx from ghash-x86_64.pl
  211. vshl.i64 q9,q0,#57 @ 1st phase
  212. vshl.i64 q10,q0,#62
  213. veor q10,q10,q9 @
  214. vshl.i64 q9,q0,#63
  215. veor q10, q10, q9 @
  216. veor d1,d1,d20 @
  217. veor d4,d4,d21
  218. vshr.u64 q10,q0,#1 @ 2nd phase
  219. veor q2,q2,q0
  220. veor q0,q0,q10 @
  221. vshr.u64 q10,q10,#6
  222. vshr.u64 q0,q0,#1 @
  223. veor q0,q0,q2 @
  224. veor q0,q0,q10 @
  225. subs r3,#16
  226. bne Loop_neon
  227. #ifdef __ARMEL__
  228. vrev64.8 q0,q0
  229. #endif
  230. sub r0,#16
  231. vst1.64 d1,[r0]! @ write out Xi
  232. vst1.64 d0,[r0]
  233. bx lr @ bx lr
  234. #endif
  235. .byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
  236. .align 2
  237. .align 2
  238. #endif // !OPENSSL_NO_ASM