aesni-gcm-x86_64.S 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850
  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. #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM)
  5. #define OPENSSL_NO_ASM
  6. #endif
  7. #endif
  8. #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM)
  9. #if defined(BORINGSSL_PREFIX)
  10. #include <boringssl_prefix_symbols_asm.h>
  11. #endif
  12. .text
  13. .p2align 5
  14. _aesni_ctr32_ghash_6x:
  15. vmovdqu 32(%r11),%xmm2
  16. subq $6,%rdx
  17. vpxor %xmm4,%xmm4,%xmm4
  18. vmovdqu 0-128(%rcx),%xmm15
  19. vpaddb %xmm2,%xmm1,%xmm10
  20. vpaddb %xmm2,%xmm10,%xmm11
  21. vpaddb %xmm2,%xmm11,%xmm12
  22. vpaddb %xmm2,%xmm12,%xmm13
  23. vpaddb %xmm2,%xmm13,%xmm14
  24. vpxor %xmm15,%xmm1,%xmm9
  25. vmovdqu %xmm4,16+8(%rsp)
  26. jmp L$oop6x
  27. .p2align 5
  28. L$oop6x:
  29. addl $100663296,%ebx
  30. jc L$handle_ctr32
  31. vmovdqu 0-32(%r9),%xmm3
  32. vpaddb %xmm2,%xmm14,%xmm1
  33. vpxor %xmm15,%xmm10,%xmm10
  34. vpxor %xmm15,%xmm11,%xmm11
  35. L$resume_ctr32:
  36. vmovdqu %xmm1,(%r8)
  37. vpclmulqdq $0x10,%xmm3,%xmm7,%xmm5
  38. vpxor %xmm15,%xmm12,%xmm12
  39. vmovups 16-128(%rcx),%xmm2
  40. vpclmulqdq $0x01,%xmm3,%xmm7,%xmm6
  41. xorq %r12,%r12
  42. cmpq %r14,%r15
  43. vaesenc %xmm2,%xmm9,%xmm9
  44. vmovdqu 48+8(%rsp),%xmm0
  45. vpxor %xmm15,%xmm13,%xmm13
  46. vpclmulqdq $0x00,%xmm3,%xmm7,%xmm1
  47. vaesenc %xmm2,%xmm10,%xmm10
  48. vpxor %xmm15,%xmm14,%xmm14
  49. setnc %r12b
  50. vpclmulqdq $0x11,%xmm3,%xmm7,%xmm7
  51. vaesenc %xmm2,%xmm11,%xmm11
  52. vmovdqu 16-32(%r9),%xmm3
  53. negq %r12
  54. vaesenc %xmm2,%xmm12,%xmm12
  55. vpxor %xmm5,%xmm6,%xmm6
  56. vpclmulqdq $0x00,%xmm3,%xmm0,%xmm5
  57. vpxor %xmm4,%xmm8,%xmm8
  58. vaesenc %xmm2,%xmm13,%xmm13
  59. vpxor %xmm5,%xmm1,%xmm4
  60. andq $0x60,%r12
  61. vmovups 32-128(%rcx),%xmm15
  62. vpclmulqdq $0x10,%xmm3,%xmm0,%xmm1
  63. vaesenc %xmm2,%xmm14,%xmm14
  64. vpclmulqdq $0x01,%xmm3,%xmm0,%xmm2
  65. leaq (%r14,%r12,1),%r14
  66. vaesenc %xmm15,%xmm9,%xmm9
  67. vpxor 16+8(%rsp),%xmm8,%xmm8
  68. vpclmulqdq $0x11,%xmm3,%xmm0,%xmm3
  69. vmovdqu 64+8(%rsp),%xmm0
  70. vaesenc %xmm15,%xmm10,%xmm10
  71. movbeq 88(%r14),%r13
  72. vaesenc %xmm15,%xmm11,%xmm11
  73. movbeq 80(%r14),%r12
  74. vaesenc %xmm15,%xmm12,%xmm12
  75. movq %r13,32+8(%rsp)
  76. vaesenc %xmm15,%xmm13,%xmm13
  77. movq %r12,40+8(%rsp)
  78. vmovdqu 48-32(%r9),%xmm5
  79. vaesenc %xmm15,%xmm14,%xmm14
  80. vmovups 48-128(%rcx),%xmm15
  81. vpxor %xmm1,%xmm6,%xmm6
  82. vpclmulqdq $0x00,%xmm5,%xmm0,%xmm1
  83. vaesenc %xmm15,%xmm9,%xmm9
  84. vpxor %xmm2,%xmm6,%xmm6
  85. vpclmulqdq $0x10,%xmm5,%xmm0,%xmm2
  86. vaesenc %xmm15,%xmm10,%xmm10
  87. vpxor %xmm3,%xmm7,%xmm7
  88. vpclmulqdq $0x01,%xmm5,%xmm0,%xmm3
  89. vaesenc %xmm15,%xmm11,%xmm11
  90. vpclmulqdq $0x11,%xmm5,%xmm0,%xmm5
  91. vmovdqu 80+8(%rsp),%xmm0
  92. vaesenc %xmm15,%xmm12,%xmm12
  93. vaesenc %xmm15,%xmm13,%xmm13
  94. vpxor %xmm1,%xmm4,%xmm4
  95. vmovdqu 64-32(%r9),%xmm1
  96. vaesenc %xmm15,%xmm14,%xmm14
  97. vmovups 64-128(%rcx),%xmm15
  98. vpxor %xmm2,%xmm6,%xmm6
  99. vpclmulqdq $0x00,%xmm1,%xmm0,%xmm2
  100. vaesenc %xmm15,%xmm9,%xmm9
  101. vpxor %xmm3,%xmm6,%xmm6
  102. vpclmulqdq $0x10,%xmm1,%xmm0,%xmm3
  103. vaesenc %xmm15,%xmm10,%xmm10
  104. movbeq 72(%r14),%r13
  105. vpxor %xmm5,%xmm7,%xmm7
  106. vpclmulqdq $0x01,%xmm1,%xmm0,%xmm5
  107. vaesenc %xmm15,%xmm11,%xmm11
  108. movbeq 64(%r14),%r12
  109. vpclmulqdq $0x11,%xmm1,%xmm0,%xmm1
  110. vmovdqu 96+8(%rsp),%xmm0
  111. vaesenc %xmm15,%xmm12,%xmm12
  112. movq %r13,48+8(%rsp)
  113. vaesenc %xmm15,%xmm13,%xmm13
  114. movq %r12,56+8(%rsp)
  115. vpxor %xmm2,%xmm4,%xmm4
  116. vmovdqu 96-32(%r9),%xmm2
  117. vaesenc %xmm15,%xmm14,%xmm14
  118. vmovups 80-128(%rcx),%xmm15
  119. vpxor %xmm3,%xmm6,%xmm6
  120. vpclmulqdq $0x00,%xmm2,%xmm0,%xmm3
  121. vaesenc %xmm15,%xmm9,%xmm9
  122. vpxor %xmm5,%xmm6,%xmm6
  123. vpclmulqdq $0x10,%xmm2,%xmm0,%xmm5
  124. vaesenc %xmm15,%xmm10,%xmm10
  125. movbeq 56(%r14),%r13
  126. vpxor %xmm1,%xmm7,%xmm7
  127. vpclmulqdq $0x01,%xmm2,%xmm0,%xmm1
  128. vpxor 112+8(%rsp),%xmm8,%xmm8
  129. vaesenc %xmm15,%xmm11,%xmm11
  130. movbeq 48(%r14),%r12
  131. vpclmulqdq $0x11,%xmm2,%xmm0,%xmm2
  132. vaesenc %xmm15,%xmm12,%xmm12
  133. movq %r13,64+8(%rsp)
  134. vaesenc %xmm15,%xmm13,%xmm13
  135. movq %r12,72+8(%rsp)
  136. vpxor %xmm3,%xmm4,%xmm4
  137. vmovdqu 112-32(%r9),%xmm3
  138. vaesenc %xmm15,%xmm14,%xmm14
  139. vmovups 96-128(%rcx),%xmm15
  140. vpxor %xmm5,%xmm6,%xmm6
  141. vpclmulqdq $0x10,%xmm3,%xmm8,%xmm5
  142. vaesenc %xmm15,%xmm9,%xmm9
  143. vpxor %xmm1,%xmm6,%xmm6
  144. vpclmulqdq $0x01,%xmm3,%xmm8,%xmm1
  145. vaesenc %xmm15,%xmm10,%xmm10
  146. movbeq 40(%r14),%r13
  147. vpxor %xmm2,%xmm7,%xmm7
  148. vpclmulqdq $0x00,%xmm3,%xmm8,%xmm2
  149. vaesenc %xmm15,%xmm11,%xmm11
  150. movbeq 32(%r14),%r12
  151. vpclmulqdq $0x11,%xmm3,%xmm8,%xmm8
  152. vaesenc %xmm15,%xmm12,%xmm12
  153. movq %r13,80+8(%rsp)
  154. vaesenc %xmm15,%xmm13,%xmm13
  155. movq %r12,88+8(%rsp)
  156. vpxor %xmm5,%xmm6,%xmm6
  157. vaesenc %xmm15,%xmm14,%xmm14
  158. vpxor %xmm1,%xmm6,%xmm6
  159. vmovups 112-128(%rcx),%xmm15
  160. vpslldq $8,%xmm6,%xmm5
  161. vpxor %xmm2,%xmm4,%xmm4
  162. vmovdqu 16(%r11),%xmm3
  163. vaesenc %xmm15,%xmm9,%xmm9
  164. vpxor %xmm8,%xmm7,%xmm7
  165. vaesenc %xmm15,%xmm10,%xmm10
  166. vpxor %xmm5,%xmm4,%xmm4
  167. movbeq 24(%r14),%r13
  168. vaesenc %xmm15,%xmm11,%xmm11
  169. movbeq 16(%r14),%r12
  170. vpalignr $8,%xmm4,%xmm4,%xmm0
  171. vpclmulqdq $0x10,%xmm3,%xmm4,%xmm4
  172. movq %r13,96+8(%rsp)
  173. vaesenc %xmm15,%xmm12,%xmm12
  174. movq %r12,104+8(%rsp)
  175. vaesenc %xmm15,%xmm13,%xmm13
  176. vmovups 128-128(%rcx),%xmm1
  177. vaesenc %xmm15,%xmm14,%xmm14
  178. vaesenc %xmm1,%xmm9,%xmm9
  179. vmovups 144-128(%rcx),%xmm15
  180. vaesenc %xmm1,%xmm10,%xmm10
  181. vpsrldq $8,%xmm6,%xmm6
  182. vaesenc %xmm1,%xmm11,%xmm11
  183. vpxor %xmm6,%xmm7,%xmm7
  184. vaesenc %xmm1,%xmm12,%xmm12
  185. vpxor %xmm0,%xmm4,%xmm4
  186. movbeq 8(%r14),%r13
  187. vaesenc %xmm1,%xmm13,%xmm13
  188. movbeq 0(%r14),%r12
  189. vaesenc %xmm1,%xmm14,%xmm14
  190. vmovups 160-128(%rcx),%xmm1
  191. cmpl $11,%ebp
  192. jb L$enc_tail
  193. vaesenc %xmm15,%xmm9,%xmm9
  194. vaesenc %xmm15,%xmm10,%xmm10
  195. vaesenc %xmm15,%xmm11,%xmm11
  196. vaesenc %xmm15,%xmm12,%xmm12
  197. vaesenc %xmm15,%xmm13,%xmm13
  198. vaesenc %xmm15,%xmm14,%xmm14
  199. vaesenc %xmm1,%xmm9,%xmm9
  200. vaesenc %xmm1,%xmm10,%xmm10
  201. vaesenc %xmm1,%xmm11,%xmm11
  202. vaesenc %xmm1,%xmm12,%xmm12
  203. vaesenc %xmm1,%xmm13,%xmm13
  204. vmovups 176-128(%rcx),%xmm15
  205. vaesenc %xmm1,%xmm14,%xmm14
  206. vmovups 192-128(%rcx),%xmm1
  207. je L$enc_tail
  208. vaesenc %xmm15,%xmm9,%xmm9
  209. vaesenc %xmm15,%xmm10,%xmm10
  210. vaesenc %xmm15,%xmm11,%xmm11
  211. vaesenc %xmm15,%xmm12,%xmm12
  212. vaesenc %xmm15,%xmm13,%xmm13
  213. vaesenc %xmm15,%xmm14,%xmm14
  214. vaesenc %xmm1,%xmm9,%xmm9
  215. vaesenc %xmm1,%xmm10,%xmm10
  216. vaesenc %xmm1,%xmm11,%xmm11
  217. vaesenc %xmm1,%xmm12,%xmm12
  218. vaesenc %xmm1,%xmm13,%xmm13
  219. vmovups 208-128(%rcx),%xmm15
  220. vaesenc %xmm1,%xmm14,%xmm14
  221. vmovups 224-128(%rcx),%xmm1
  222. jmp L$enc_tail
  223. .p2align 5
  224. L$handle_ctr32:
  225. vmovdqu (%r11),%xmm0
  226. vpshufb %xmm0,%xmm1,%xmm6
  227. vmovdqu 48(%r11),%xmm5
  228. vpaddd 64(%r11),%xmm6,%xmm10
  229. vpaddd %xmm5,%xmm6,%xmm11
  230. vmovdqu 0-32(%r9),%xmm3
  231. vpaddd %xmm5,%xmm10,%xmm12
  232. vpshufb %xmm0,%xmm10,%xmm10
  233. vpaddd %xmm5,%xmm11,%xmm13
  234. vpshufb %xmm0,%xmm11,%xmm11
  235. vpxor %xmm15,%xmm10,%xmm10
  236. vpaddd %xmm5,%xmm12,%xmm14
  237. vpshufb %xmm0,%xmm12,%xmm12
  238. vpxor %xmm15,%xmm11,%xmm11
  239. vpaddd %xmm5,%xmm13,%xmm1
  240. vpshufb %xmm0,%xmm13,%xmm13
  241. vpshufb %xmm0,%xmm14,%xmm14
  242. vpshufb %xmm0,%xmm1,%xmm1
  243. jmp L$resume_ctr32
  244. .p2align 5
  245. L$enc_tail:
  246. vaesenc %xmm15,%xmm9,%xmm9
  247. vmovdqu %xmm7,16+8(%rsp)
  248. vpalignr $8,%xmm4,%xmm4,%xmm8
  249. vaesenc %xmm15,%xmm10,%xmm10
  250. vpclmulqdq $0x10,%xmm3,%xmm4,%xmm4
  251. vpxor 0(%rdi),%xmm1,%xmm2
  252. vaesenc %xmm15,%xmm11,%xmm11
  253. vpxor 16(%rdi),%xmm1,%xmm0
  254. vaesenc %xmm15,%xmm12,%xmm12
  255. vpxor 32(%rdi),%xmm1,%xmm5
  256. vaesenc %xmm15,%xmm13,%xmm13
  257. vpxor 48(%rdi),%xmm1,%xmm6
  258. vaesenc %xmm15,%xmm14,%xmm14
  259. vpxor 64(%rdi),%xmm1,%xmm7
  260. vpxor 80(%rdi),%xmm1,%xmm3
  261. vmovdqu (%r8),%xmm1
  262. vaesenclast %xmm2,%xmm9,%xmm9
  263. vmovdqu 32(%r11),%xmm2
  264. vaesenclast %xmm0,%xmm10,%xmm10
  265. vpaddb %xmm2,%xmm1,%xmm0
  266. movq %r13,112+8(%rsp)
  267. leaq 96(%rdi),%rdi
  268. vaesenclast %xmm5,%xmm11,%xmm11
  269. vpaddb %xmm2,%xmm0,%xmm5
  270. movq %r12,120+8(%rsp)
  271. leaq 96(%rsi),%rsi
  272. vmovdqu 0-128(%rcx),%xmm15
  273. vaesenclast %xmm6,%xmm12,%xmm12
  274. vpaddb %xmm2,%xmm5,%xmm6
  275. vaesenclast %xmm7,%xmm13,%xmm13
  276. vpaddb %xmm2,%xmm6,%xmm7
  277. vaesenclast %xmm3,%xmm14,%xmm14
  278. vpaddb %xmm2,%xmm7,%xmm3
  279. addq $0x60,%r10
  280. subq $0x6,%rdx
  281. jc L$6x_done
  282. vmovups %xmm9,-96(%rsi)
  283. vpxor %xmm15,%xmm1,%xmm9
  284. vmovups %xmm10,-80(%rsi)
  285. vmovdqa %xmm0,%xmm10
  286. vmovups %xmm11,-64(%rsi)
  287. vmovdqa %xmm5,%xmm11
  288. vmovups %xmm12,-48(%rsi)
  289. vmovdqa %xmm6,%xmm12
  290. vmovups %xmm13,-32(%rsi)
  291. vmovdqa %xmm7,%xmm13
  292. vmovups %xmm14,-16(%rsi)
  293. vmovdqa %xmm3,%xmm14
  294. vmovdqu 32+8(%rsp),%xmm7
  295. jmp L$oop6x
  296. L$6x_done:
  297. vpxor 16+8(%rsp),%xmm8,%xmm8
  298. vpxor %xmm4,%xmm8,%xmm8
  299. .byte 0xf3,0xc3
  300. .globl _aesni_gcm_decrypt
  301. .private_extern _aesni_gcm_decrypt
  302. .p2align 5
  303. _aesni_gcm_decrypt:
  304. xorq %r10,%r10
  305. cmpq $0x60,%rdx
  306. jb L$gcm_dec_abort
  307. leaq (%rsp),%rax
  308. pushq %rbx
  309. pushq %rbp
  310. pushq %r12
  311. pushq %r13
  312. pushq %r14
  313. pushq %r15
  314. vzeroupper
  315. vmovdqu (%r8),%xmm1
  316. addq $-128,%rsp
  317. movl 12(%r8),%ebx
  318. leaq L$bswap_mask(%rip),%r11
  319. leaq -128(%rcx),%r14
  320. movq $0xf80,%r15
  321. vmovdqu (%r9),%xmm8
  322. andq $-128,%rsp
  323. vmovdqu (%r11),%xmm0
  324. leaq 128(%rcx),%rcx
  325. leaq 32+32(%r9),%r9
  326. movl 240-128(%rcx),%ebp
  327. vpshufb %xmm0,%xmm8,%xmm8
  328. andq %r15,%r14
  329. andq %rsp,%r15
  330. subq %r14,%r15
  331. jc L$dec_no_key_aliasing
  332. cmpq $768,%r15
  333. jnc L$dec_no_key_aliasing
  334. subq %r15,%rsp
  335. L$dec_no_key_aliasing:
  336. vmovdqu 80(%rdi),%xmm7
  337. leaq (%rdi),%r14
  338. vmovdqu 64(%rdi),%xmm4
  339. leaq -192(%rdi,%rdx,1),%r15
  340. vmovdqu 48(%rdi),%xmm5
  341. shrq $4,%rdx
  342. xorq %r10,%r10
  343. vmovdqu 32(%rdi),%xmm6
  344. vpshufb %xmm0,%xmm7,%xmm7
  345. vmovdqu 16(%rdi),%xmm2
  346. vpshufb %xmm0,%xmm4,%xmm4
  347. vmovdqu (%rdi),%xmm3
  348. vpshufb %xmm0,%xmm5,%xmm5
  349. vmovdqu %xmm4,48(%rsp)
  350. vpshufb %xmm0,%xmm6,%xmm6
  351. vmovdqu %xmm5,64(%rsp)
  352. vpshufb %xmm0,%xmm2,%xmm2
  353. vmovdqu %xmm6,80(%rsp)
  354. vpshufb %xmm0,%xmm3,%xmm3
  355. vmovdqu %xmm2,96(%rsp)
  356. vmovdqu %xmm3,112(%rsp)
  357. call _aesni_ctr32_ghash_6x
  358. vmovups %xmm9,-96(%rsi)
  359. vmovups %xmm10,-80(%rsi)
  360. vmovups %xmm11,-64(%rsi)
  361. vmovups %xmm12,-48(%rsi)
  362. vmovups %xmm13,-32(%rsi)
  363. vmovups %xmm14,-16(%rsi)
  364. vpshufb (%r11),%xmm8,%xmm8
  365. vmovdqu %xmm8,-64(%r9)
  366. vzeroupper
  367. movq -48(%rax),%r15
  368. movq -40(%rax),%r14
  369. movq -32(%rax),%r13
  370. movq -24(%rax),%r12
  371. movq -16(%rax),%rbp
  372. movq -8(%rax),%rbx
  373. leaq (%rax),%rsp
  374. L$gcm_dec_abort:
  375. movq %r10,%rax
  376. .byte 0xf3,0xc3
  377. .p2align 5
  378. _aesni_ctr32_6x:
  379. vmovdqu 0-128(%rcx),%xmm4
  380. vmovdqu 32(%r11),%xmm2
  381. leaq -1(%rbp),%r13
  382. vmovups 16-128(%rcx),%xmm15
  383. leaq 32-128(%rcx),%r12
  384. vpxor %xmm4,%xmm1,%xmm9
  385. addl $100663296,%ebx
  386. jc L$handle_ctr32_2
  387. vpaddb %xmm2,%xmm1,%xmm10
  388. vpaddb %xmm2,%xmm10,%xmm11
  389. vpxor %xmm4,%xmm10,%xmm10
  390. vpaddb %xmm2,%xmm11,%xmm12
  391. vpxor %xmm4,%xmm11,%xmm11
  392. vpaddb %xmm2,%xmm12,%xmm13
  393. vpxor %xmm4,%xmm12,%xmm12
  394. vpaddb %xmm2,%xmm13,%xmm14
  395. vpxor %xmm4,%xmm13,%xmm13
  396. vpaddb %xmm2,%xmm14,%xmm1
  397. vpxor %xmm4,%xmm14,%xmm14
  398. jmp L$oop_ctr32
  399. .p2align 4
  400. L$oop_ctr32:
  401. vaesenc %xmm15,%xmm9,%xmm9
  402. vaesenc %xmm15,%xmm10,%xmm10
  403. vaesenc %xmm15,%xmm11,%xmm11
  404. vaesenc %xmm15,%xmm12,%xmm12
  405. vaesenc %xmm15,%xmm13,%xmm13
  406. vaesenc %xmm15,%xmm14,%xmm14
  407. vmovups (%r12),%xmm15
  408. leaq 16(%r12),%r12
  409. decl %r13d
  410. jnz L$oop_ctr32
  411. vmovdqu (%r12),%xmm3
  412. vaesenc %xmm15,%xmm9,%xmm9
  413. vpxor 0(%rdi),%xmm3,%xmm4
  414. vaesenc %xmm15,%xmm10,%xmm10
  415. vpxor 16(%rdi),%xmm3,%xmm5
  416. vaesenc %xmm15,%xmm11,%xmm11
  417. vpxor 32(%rdi),%xmm3,%xmm6
  418. vaesenc %xmm15,%xmm12,%xmm12
  419. vpxor 48(%rdi),%xmm3,%xmm8
  420. vaesenc %xmm15,%xmm13,%xmm13
  421. vpxor 64(%rdi),%xmm3,%xmm2
  422. vaesenc %xmm15,%xmm14,%xmm14
  423. vpxor 80(%rdi),%xmm3,%xmm3
  424. leaq 96(%rdi),%rdi
  425. vaesenclast %xmm4,%xmm9,%xmm9
  426. vaesenclast %xmm5,%xmm10,%xmm10
  427. vaesenclast %xmm6,%xmm11,%xmm11
  428. vaesenclast %xmm8,%xmm12,%xmm12
  429. vaesenclast %xmm2,%xmm13,%xmm13
  430. vaesenclast %xmm3,%xmm14,%xmm14
  431. vmovups %xmm9,0(%rsi)
  432. vmovups %xmm10,16(%rsi)
  433. vmovups %xmm11,32(%rsi)
  434. vmovups %xmm12,48(%rsi)
  435. vmovups %xmm13,64(%rsi)
  436. vmovups %xmm14,80(%rsi)
  437. leaq 96(%rsi),%rsi
  438. .byte 0xf3,0xc3
  439. .p2align 5
  440. L$handle_ctr32_2:
  441. vpshufb %xmm0,%xmm1,%xmm6
  442. vmovdqu 48(%r11),%xmm5
  443. vpaddd 64(%r11),%xmm6,%xmm10
  444. vpaddd %xmm5,%xmm6,%xmm11
  445. vpaddd %xmm5,%xmm10,%xmm12
  446. vpshufb %xmm0,%xmm10,%xmm10
  447. vpaddd %xmm5,%xmm11,%xmm13
  448. vpshufb %xmm0,%xmm11,%xmm11
  449. vpxor %xmm4,%xmm10,%xmm10
  450. vpaddd %xmm5,%xmm12,%xmm14
  451. vpshufb %xmm0,%xmm12,%xmm12
  452. vpxor %xmm4,%xmm11,%xmm11
  453. vpaddd %xmm5,%xmm13,%xmm1
  454. vpshufb %xmm0,%xmm13,%xmm13
  455. vpxor %xmm4,%xmm12,%xmm12
  456. vpshufb %xmm0,%xmm14,%xmm14
  457. vpxor %xmm4,%xmm13,%xmm13
  458. vpshufb %xmm0,%xmm1,%xmm1
  459. vpxor %xmm4,%xmm14,%xmm14
  460. jmp L$oop_ctr32
  461. .globl _aesni_gcm_encrypt
  462. .private_extern _aesni_gcm_encrypt
  463. .p2align 5
  464. _aesni_gcm_encrypt:
  465. #ifdef BORINGSSL_DISPATCH_TEST
  466. movb $1,_BORINGSSL_function_hit+2(%rip)
  467. #endif
  468. xorq %r10,%r10
  469. cmpq $288,%rdx
  470. jb L$gcm_enc_abort
  471. leaq (%rsp),%rax
  472. pushq %rbx
  473. pushq %rbp
  474. pushq %r12
  475. pushq %r13
  476. pushq %r14
  477. pushq %r15
  478. vzeroupper
  479. vmovdqu (%r8),%xmm1
  480. addq $-128,%rsp
  481. movl 12(%r8),%ebx
  482. leaq L$bswap_mask(%rip),%r11
  483. leaq -128(%rcx),%r14
  484. movq $0xf80,%r15
  485. leaq 128(%rcx),%rcx
  486. vmovdqu (%r11),%xmm0
  487. andq $-128,%rsp
  488. movl 240-128(%rcx),%ebp
  489. andq %r15,%r14
  490. andq %rsp,%r15
  491. subq %r14,%r15
  492. jc L$enc_no_key_aliasing
  493. cmpq $768,%r15
  494. jnc L$enc_no_key_aliasing
  495. subq %r15,%rsp
  496. L$enc_no_key_aliasing:
  497. leaq (%rsi),%r14
  498. leaq -192(%rsi,%rdx,1),%r15
  499. shrq $4,%rdx
  500. call _aesni_ctr32_6x
  501. vpshufb %xmm0,%xmm9,%xmm8
  502. vpshufb %xmm0,%xmm10,%xmm2
  503. vmovdqu %xmm8,112(%rsp)
  504. vpshufb %xmm0,%xmm11,%xmm4
  505. vmovdqu %xmm2,96(%rsp)
  506. vpshufb %xmm0,%xmm12,%xmm5
  507. vmovdqu %xmm4,80(%rsp)
  508. vpshufb %xmm0,%xmm13,%xmm6
  509. vmovdqu %xmm5,64(%rsp)
  510. vpshufb %xmm0,%xmm14,%xmm7
  511. vmovdqu %xmm6,48(%rsp)
  512. call _aesni_ctr32_6x
  513. vmovdqu (%r9),%xmm8
  514. leaq 32+32(%r9),%r9
  515. subq $12,%rdx
  516. movq $192,%r10
  517. vpshufb %xmm0,%xmm8,%xmm8
  518. call _aesni_ctr32_ghash_6x
  519. vmovdqu 32(%rsp),%xmm7
  520. vmovdqu (%r11),%xmm0
  521. vmovdqu 0-32(%r9),%xmm3
  522. vpunpckhqdq %xmm7,%xmm7,%xmm1
  523. vmovdqu 32-32(%r9),%xmm15
  524. vmovups %xmm9,-96(%rsi)
  525. vpshufb %xmm0,%xmm9,%xmm9
  526. vpxor %xmm7,%xmm1,%xmm1
  527. vmovups %xmm10,-80(%rsi)
  528. vpshufb %xmm0,%xmm10,%xmm10
  529. vmovups %xmm11,-64(%rsi)
  530. vpshufb %xmm0,%xmm11,%xmm11
  531. vmovups %xmm12,-48(%rsi)
  532. vpshufb %xmm0,%xmm12,%xmm12
  533. vmovups %xmm13,-32(%rsi)
  534. vpshufb %xmm0,%xmm13,%xmm13
  535. vmovups %xmm14,-16(%rsi)
  536. vpshufb %xmm0,%xmm14,%xmm14
  537. vmovdqu %xmm9,16(%rsp)
  538. vmovdqu 48(%rsp),%xmm6
  539. vmovdqu 16-32(%r9),%xmm0
  540. vpunpckhqdq %xmm6,%xmm6,%xmm2
  541. vpclmulqdq $0x00,%xmm3,%xmm7,%xmm5
  542. vpxor %xmm6,%xmm2,%xmm2
  543. vpclmulqdq $0x11,%xmm3,%xmm7,%xmm7
  544. vpclmulqdq $0x00,%xmm15,%xmm1,%xmm1
  545. vmovdqu 64(%rsp),%xmm9
  546. vpclmulqdq $0x00,%xmm0,%xmm6,%xmm4
  547. vmovdqu 48-32(%r9),%xmm3
  548. vpxor %xmm5,%xmm4,%xmm4
  549. vpunpckhqdq %xmm9,%xmm9,%xmm5
  550. vpclmulqdq $0x11,%xmm0,%xmm6,%xmm6
  551. vpxor %xmm9,%xmm5,%xmm5
  552. vpxor %xmm7,%xmm6,%xmm6
  553. vpclmulqdq $0x10,%xmm15,%xmm2,%xmm2
  554. vmovdqu 80-32(%r9),%xmm15
  555. vpxor %xmm1,%xmm2,%xmm2
  556. vmovdqu 80(%rsp),%xmm1
  557. vpclmulqdq $0x00,%xmm3,%xmm9,%xmm7
  558. vmovdqu 64-32(%r9),%xmm0
  559. vpxor %xmm4,%xmm7,%xmm7
  560. vpunpckhqdq %xmm1,%xmm1,%xmm4
  561. vpclmulqdq $0x11,%xmm3,%xmm9,%xmm9
  562. vpxor %xmm1,%xmm4,%xmm4
  563. vpxor %xmm6,%xmm9,%xmm9
  564. vpclmulqdq $0x00,%xmm15,%xmm5,%xmm5
  565. vpxor %xmm2,%xmm5,%xmm5
  566. vmovdqu 96(%rsp),%xmm2
  567. vpclmulqdq $0x00,%xmm0,%xmm1,%xmm6
  568. vmovdqu 96-32(%r9),%xmm3
  569. vpxor %xmm7,%xmm6,%xmm6
  570. vpunpckhqdq %xmm2,%xmm2,%xmm7
  571. vpclmulqdq $0x11,%xmm0,%xmm1,%xmm1
  572. vpxor %xmm2,%xmm7,%xmm7
  573. vpxor %xmm9,%xmm1,%xmm1
  574. vpclmulqdq $0x10,%xmm15,%xmm4,%xmm4
  575. vmovdqu 128-32(%r9),%xmm15
  576. vpxor %xmm5,%xmm4,%xmm4
  577. vpxor 112(%rsp),%xmm8,%xmm8
  578. vpclmulqdq $0x00,%xmm3,%xmm2,%xmm5
  579. vmovdqu 112-32(%r9),%xmm0
  580. vpunpckhqdq %xmm8,%xmm8,%xmm9
  581. vpxor %xmm6,%xmm5,%xmm5
  582. vpclmulqdq $0x11,%xmm3,%xmm2,%xmm2
  583. vpxor %xmm8,%xmm9,%xmm9
  584. vpxor %xmm1,%xmm2,%xmm2
  585. vpclmulqdq $0x00,%xmm15,%xmm7,%xmm7
  586. vpxor %xmm4,%xmm7,%xmm4
  587. vpclmulqdq $0x00,%xmm0,%xmm8,%xmm6
  588. vmovdqu 0-32(%r9),%xmm3
  589. vpunpckhqdq %xmm14,%xmm14,%xmm1
  590. vpclmulqdq $0x11,%xmm0,%xmm8,%xmm8
  591. vpxor %xmm14,%xmm1,%xmm1
  592. vpxor %xmm5,%xmm6,%xmm5
  593. vpclmulqdq $0x10,%xmm15,%xmm9,%xmm9
  594. vmovdqu 32-32(%r9),%xmm15
  595. vpxor %xmm2,%xmm8,%xmm7
  596. vpxor %xmm4,%xmm9,%xmm6
  597. vmovdqu 16-32(%r9),%xmm0
  598. vpxor %xmm5,%xmm7,%xmm9
  599. vpclmulqdq $0x00,%xmm3,%xmm14,%xmm4
  600. vpxor %xmm9,%xmm6,%xmm6
  601. vpunpckhqdq %xmm13,%xmm13,%xmm2
  602. vpclmulqdq $0x11,%xmm3,%xmm14,%xmm14
  603. vpxor %xmm13,%xmm2,%xmm2
  604. vpslldq $8,%xmm6,%xmm9
  605. vpclmulqdq $0x00,%xmm15,%xmm1,%xmm1
  606. vpxor %xmm9,%xmm5,%xmm8
  607. vpsrldq $8,%xmm6,%xmm6
  608. vpxor %xmm6,%xmm7,%xmm7
  609. vpclmulqdq $0x00,%xmm0,%xmm13,%xmm5
  610. vmovdqu 48-32(%r9),%xmm3
  611. vpxor %xmm4,%xmm5,%xmm5
  612. vpunpckhqdq %xmm12,%xmm12,%xmm9
  613. vpclmulqdq $0x11,%xmm0,%xmm13,%xmm13
  614. vpxor %xmm12,%xmm9,%xmm9
  615. vpxor %xmm14,%xmm13,%xmm13
  616. vpalignr $8,%xmm8,%xmm8,%xmm14
  617. vpclmulqdq $0x10,%xmm15,%xmm2,%xmm2
  618. vmovdqu 80-32(%r9),%xmm15
  619. vpxor %xmm1,%xmm2,%xmm2
  620. vpclmulqdq $0x00,%xmm3,%xmm12,%xmm4
  621. vmovdqu 64-32(%r9),%xmm0
  622. vpxor %xmm5,%xmm4,%xmm4
  623. vpunpckhqdq %xmm11,%xmm11,%xmm1
  624. vpclmulqdq $0x11,%xmm3,%xmm12,%xmm12
  625. vpxor %xmm11,%xmm1,%xmm1
  626. vpxor %xmm13,%xmm12,%xmm12
  627. vxorps 16(%rsp),%xmm7,%xmm7
  628. vpclmulqdq $0x00,%xmm15,%xmm9,%xmm9
  629. vpxor %xmm2,%xmm9,%xmm9
  630. vpclmulqdq $0x10,16(%r11),%xmm8,%xmm8
  631. vxorps %xmm14,%xmm8,%xmm8
  632. vpclmulqdq $0x00,%xmm0,%xmm11,%xmm5
  633. vmovdqu 96-32(%r9),%xmm3
  634. vpxor %xmm4,%xmm5,%xmm5
  635. vpunpckhqdq %xmm10,%xmm10,%xmm2
  636. vpclmulqdq $0x11,%xmm0,%xmm11,%xmm11
  637. vpxor %xmm10,%xmm2,%xmm2
  638. vpalignr $8,%xmm8,%xmm8,%xmm14
  639. vpxor %xmm12,%xmm11,%xmm11
  640. vpclmulqdq $0x10,%xmm15,%xmm1,%xmm1
  641. vmovdqu 128-32(%r9),%xmm15
  642. vpxor %xmm9,%xmm1,%xmm1
  643. vxorps %xmm7,%xmm14,%xmm14
  644. vpclmulqdq $0x10,16(%r11),%xmm8,%xmm8
  645. vxorps %xmm14,%xmm8,%xmm8
  646. vpclmulqdq $0x00,%xmm3,%xmm10,%xmm4
  647. vmovdqu 112-32(%r9),%xmm0
  648. vpxor %xmm5,%xmm4,%xmm4
  649. vpunpckhqdq %xmm8,%xmm8,%xmm9
  650. vpclmulqdq $0x11,%xmm3,%xmm10,%xmm10
  651. vpxor %xmm8,%xmm9,%xmm9
  652. vpxor %xmm11,%xmm10,%xmm10
  653. vpclmulqdq $0x00,%xmm15,%xmm2,%xmm2
  654. vpxor %xmm1,%xmm2,%xmm2
  655. vpclmulqdq $0x00,%xmm0,%xmm8,%xmm5
  656. vpclmulqdq $0x11,%xmm0,%xmm8,%xmm7
  657. vpxor %xmm4,%xmm5,%xmm5
  658. vpclmulqdq $0x10,%xmm15,%xmm9,%xmm6
  659. vpxor %xmm10,%xmm7,%xmm7
  660. vpxor %xmm2,%xmm6,%xmm6
  661. vpxor %xmm5,%xmm7,%xmm4
  662. vpxor %xmm4,%xmm6,%xmm6
  663. vpslldq $8,%xmm6,%xmm1
  664. vmovdqu 16(%r11),%xmm3
  665. vpsrldq $8,%xmm6,%xmm6
  666. vpxor %xmm1,%xmm5,%xmm8
  667. vpxor %xmm6,%xmm7,%xmm7
  668. vpalignr $8,%xmm8,%xmm8,%xmm2
  669. vpclmulqdq $0x10,%xmm3,%xmm8,%xmm8
  670. vpxor %xmm2,%xmm8,%xmm8
  671. vpalignr $8,%xmm8,%xmm8,%xmm2
  672. vpclmulqdq $0x10,%xmm3,%xmm8,%xmm8
  673. vpxor %xmm7,%xmm2,%xmm2
  674. vpxor %xmm2,%xmm8,%xmm8
  675. vpshufb (%r11),%xmm8,%xmm8
  676. vmovdqu %xmm8,-64(%r9)
  677. vzeroupper
  678. movq -48(%rax),%r15
  679. movq -40(%rax),%r14
  680. movq -32(%rax),%r13
  681. movq -24(%rax),%r12
  682. movq -16(%rax),%rbp
  683. movq -8(%rax),%rbx
  684. leaq (%rax),%rsp
  685. L$gcm_enc_abort:
  686. movq %r10,%rax
  687. .byte 0xf3,0xc3
  688. .p2align 6
  689. L$bswap_mask:
  690. .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
  691. L$poly:
  692. .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2
  693. L$one_msb:
  694. .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
  695. L$two_lsb:
  696. .byte 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  697. L$one_lsb:
  698. .byte 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  699. .byte 65,69,83,45,78,73,32,71,67,77,32,109,111,100,117,108,101,32,102,111,114,32,120,56,54,95,54,52,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
  700. .p2align 6
  701. #endif