aes-armv8-bcm.S 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612
  1. #define __ARM_ARCH__ __LINUX_ARM_ARCH__
  2. #include <linux/linkage.h>
  3. #if __ARM_ARCH__>=7
  4. .fpu crypto-neon-fp-armv8
  5. .text
  6. # AES assembly implementation for ARMv8 AArch32
  7. # - aes_v8_cbc_encrypt
  8. # - aes_v8_cbc_decrypt
  9. .align 5
  10. rcon:
  11. .long 0x00000001,0x00000001,0x00000001,0x00000001
  12. .long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d
  13. .long 0x0000001b,0x0000001b,0x0000001b,0x0000001b
  14. # void aes_v8_cbc_encrypt(u8 out[], u8 const in[], u8 const rk[],
  15. # int rounds, int blocks, u8 iv[], int first);
  16. .align 5
  17. ENTRY(aes_v8_cbc_encrypt)
  18. push {r4, r5, r6}
  19. vpush {q4, q5, q6, q7}
  20. ldr r4, [sp, #76] // blocks
  21. ldr r5, [sp, #80] // iv
  22. ldr r6, [sp, #84] // first
  23. cmp r6, #0
  24. beq .LcbcencDispatch
  25. vld1.8 {d2-d3}, [r5]
  26. .LcbcencDispatch:
  27. cmp r3, #12
  28. bhi .Lcbcenc256
  29. beq .Lcbcenc192
  30. .Lcbcenc128:
  31. // Load round keys
  32. vld1.8 {d4-d5}, [r2]!
  33. vld1.8 {d6-d7}, [r2]!
  34. vld1.8 {d8-d9}, [r2]!
  35. vld1.8 {d10-d11}, [r2]!
  36. vld1.8 {d12-d13}, [r2]!
  37. vld1.8 {d14-d15}, [r2]!
  38. vld1.8 {d16-d17}, [r2]!
  39. vld1.8 {d18-d19}, [r2]!
  40. vld1.8 {d20-d21}, [r2]!
  41. vld1.8 {d22-d23}, [r2]!
  42. vld1.8 {d24-d25}, [r2]
  43. .Lcbcenc128Loop:
  44. // load input 16 bytes, and eor with iv
  45. vld1.8 {d0-d1}, [r1]!
  46. veor.8 q0, q0, q1
  47. pld [r1, #16]
  48. // aes kernel
  49. aese.8 q0, q2
  50. aesmc.8 q0, q0
  51. aese.8 q0, q3
  52. aesmc.8 q0, q0
  53. aese.8 q0, q4
  54. aesmc.8 q0, q0
  55. aese.8 q0, q5
  56. aesmc.8 q0, q0
  57. aese.8 q0, q6
  58. aesmc.8 q0, q0
  59. aese.8 q0, q7
  60. aesmc.8 q0, q0
  61. aese.8 q0, q8
  62. aesmc.8 q0, q0
  63. aese.8 q0, q9
  64. aesmc.8 q0, q0
  65. aese.8 q0, q10
  66. aesmc.8 q0, q0
  67. aese.8 q0, q11
  68. veor.8 q1, q0, q12
  69. // store output 16 bytes, and continue next round
  70. vst1.8 {d2-d3}, [r0]!
  71. subs r4, r4, #1
  72. bne .Lcbcenc128Loop
  73. .Lcbcenc128Done:
  74. vpop {q4, q5, q6, q7}
  75. pop {r4, r5, r6}
  76. bx lr
  77. .Lcbcenc192:
  78. // Load round keys
  79. vld1.8 {d4-d5}, [r2]!
  80. vld1.8 {d6-d7}, [r2]!
  81. vld1.8 {d8-d9}, [r2]!
  82. vld1.8 {d10-d11}, [r2]!
  83. vld1.8 {d12-d13}, [r2]!
  84. vld1.8 {d14-d15}, [r2]!
  85. vld1.8 {d16-d17}, [r2]!
  86. vld1.8 {d18-d19}, [r2]!
  87. vld1.8 {d20-d21}, [r2]!
  88. vld1.8 {d22-d23}, [r2]!
  89. vld1.8 {d24-d25}, [r2]!
  90. vld1.8 {d26-d27}, [r2]!
  91. vld1.8 {d28-d29}, [r2]
  92. .Lcbcenc192Loop:
  93. // load input 16 bytes, and eor with iv
  94. vld1.8 {d0-d1}, [r1]!
  95. veor.8 q0, q0, q1
  96. pld [r1, #16]
  97. // aes kernel
  98. aese.8 q0, q2
  99. aesmc.8 q0, q0
  100. aese.8 q0, q3
  101. aesmc.8 q0, q0
  102. aese.8 q0, q4
  103. aesmc.8 q0, q0
  104. aese.8 q0, q5
  105. aesmc.8 q0, q0
  106. aese.8 q0, q6
  107. aesmc.8 q0, q0
  108. aese.8 q0, q7
  109. aesmc.8 q0, q0
  110. aese.8 q0, q8
  111. aesmc.8 q0, q0
  112. aese.8 q0, q9
  113. aesmc.8 q0, q0
  114. aese.8 q0, q10
  115. aesmc.8 q0, q0
  116. aese.8 q0, q11
  117. aesmc.8 q0, q0
  118. aese.8 q0, q12
  119. aesmc.8 q0, q0
  120. aese.8 q0, q13
  121. veor.8 q1, q0, q14
  122. // store output 16 bytes, and continue next round
  123. vst1.8 {d2-d3}, [r0]!
  124. subs r4, r4, #1
  125. bne .Lcbcenc192Loop
  126. .Lcbcenc192Done:
  127. vpop {q4, q5, q6, q7}
  128. pop {r4, r5, r6}
  129. bx lr
  130. .Lcbcenc256:
  131. // Load round keys
  132. vld1.8 {d4-d5}, [r2]!
  133. vld1.8 {d6-d7}, [r2]!
  134. vld1.8 {d8-d9}, [r2]!
  135. vld1.8 {d10-d11}, [r2]!
  136. vld1.8 {d12-d13}, [r2]!
  137. vld1.8 {d14-d15}, [r2]!
  138. vld1.8 {d16-d17}, [r2]!
  139. vld1.8 {d18-d19}, [r2]!
  140. vld1.8 {d20-d21}, [r2]!
  141. vld1.8 {d22-d23}, [r2]!
  142. vld1.8 {d24-d25}, [r2]!
  143. vld1.8 {d26-d27}, [r2]!
  144. vld1.8 {d28-d29}, [r2]!
  145. mov r3, r2
  146. .Lcbcenc256Loop:
  147. // load input 16 bytes, and eor with iv
  148. vld1.8 {d0-d1}, [r1]!
  149. veor.8 q0, q0, q1
  150. pld [r1, #16]
  151. // aes kernel
  152. aese.8 q0, q2
  153. aesmc.8 q0, q0
  154. aese.8 q0, q3
  155. aesmc.8 q0, q0
  156. vld1.8 {d30}, [r2]!
  157. aese.8 q0, q4
  158. aesmc.8 q0, q0
  159. aese.8 q0, q5
  160. aesmc.8 q0, q0
  161. vld1.8 {d31}, [r2]!
  162. aese.8 q0, q6
  163. aesmc.8 q0, q0
  164. aese.8 q0, q7
  165. aesmc.8 q0, q0
  166. aese.8 q0, q8
  167. aesmc.8 q0, q0
  168. aese.8 q0, q9
  169. aesmc.8 q0, q0
  170. aese.8 q0, q10
  171. aesmc.8 q0, q0
  172. aese.8 q0, q11
  173. aesmc.8 q0, q0
  174. aese.8 q0, q12
  175. aesmc.8 q0, q0
  176. aese.8 q0, q13
  177. aesmc.8 q0, q0
  178. aese.8 q0, q14
  179. aesmc.8 q0, q0
  180. aese.8 q0, q15
  181. vld1.8 {d30-d31}, [r2]
  182. veor.8 q1, q0, q15
  183. mov r2, r3
  184. // store output 16 bytes, and continue next round
  185. vst1.8 {d2-d3}, [r0]!
  186. subs r4, r4, #1
  187. bne .Lcbcenc256Loop
  188. .Lcbcenc256Done:
  189. vpop {q4, q5, q6, q7}
  190. pop {r4, r5, r6}
  191. bx lr
  192. ENDPROC(aes_v8_cbc_encrypt)
  193. # void aes_v8_cbc_decrypt(u8 out[], u8 const in[], u8 const rk[],
  194. # int rounds, int blocks, u8 iv[], int first);
  195. .align 5
  196. ENTRY(aes_v8_cbc_decrypt)
  197. push {r4, r5, r6}
  198. vpush {q4, q5, q6, q7}
  199. ldr r4, [sp, #76] // blocks
  200. ldr r5, [sp, #80] // iv
  201. ldr r6, [sp, #84] // first
  202. cmp r6, #0
  203. beq .LcbcdecDispatch
  204. vld1.8 {d4-d5}, [r5]
  205. .LcbcdecDispatch:
  206. cmp r3, #12
  207. bhi .Lcbcdec256
  208. beq .Lcbcdec192
  209. .Lcbcdec128:
  210. // Load round keys
  211. vld1.8 {d10-d11}, [r2]!
  212. vld1.8 {d12-d13}, [r2]!
  213. vld1.8 {d14-d15}, [r2]!
  214. vld1.8 {d16-d17}, [r2]!
  215. vld1.8 {d18-d19}, [r2]!
  216. vld1.8 {d20-d21}, [r2]!
  217. vld1.8 {d22-d23}, [r2]!
  218. vld1.8 {d24-d25}, [r2]!
  219. vld1.8 {d26-d27}, [r2]!
  220. vld1.8 {d28-d29}, [r2]!
  221. vld1.8 {d30-d31}, [r2]!
  222. // Sub by 2
  223. subs r4, r4, #2
  224. bmi .Lcbcdec128_1X
  225. .Lcbcdec128_2XLoop:
  226. // Load input 32 bytes
  227. vld1.8 {d0-d3}, [r1]!
  228. pld [r1, #32]
  229. vmov q3, q0
  230. vmov q4, q1
  231. // aes kernel
  232. aesd.8 q0, q5
  233. aesimc.8 q0, q0
  234. aesd.8 q1, q5
  235. aesimc.8 q1, q1
  236. aesd.8 q0, q6
  237. aesimc.8 q0, q0
  238. aesd.8 q1, q6
  239. aesimc.8 q1, q1
  240. aesd.8 q0, q7
  241. aesimc.8 q0, q0
  242. aesd.8 q1, q7
  243. aesimc.8 q1, q1
  244. aesd.8 q0, q8
  245. aesimc.8 q0, q0
  246. aesd.8 q1, q8
  247. aesimc.8 q1, q1
  248. aesd.8 q0, q9
  249. aesimc.8 q0, q0
  250. aesd.8 q1, q9
  251. aesimc.8 q1, q1
  252. aesd.8 q0, q10
  253. aesimc.8 q0, q0
  254. aesd.8 q1, q10
  255. aesimc.8 q1, q1
  256. aesd.8 q0, q11
  257. aesimc.8 q0, q0
  258. aesd.8 q1, q11
  259. aesimc.8 q1, q1
  260. aesd.8 q0, q12
  261. aesimc.8 q0, q0
  262. aesd.8 q1, q12
  263. aesimc.8 q1, q1
  264. aesd.8 q0, q13
  265. aesimc.8 q0, q0
  266. aesd.8 q1, q13
  267. aesimc.8 q1, q1
  268. aesd.8 q0, q14
  269. aesd.8 q1, q14
  270. veor.8 q0, q0, q15
  271. veor.8 q1, q1, q15
  272. veor.8 q0, q0, q2
  273. veor.8 q1, q1, q3
  274. vmov q2, q4
  275. vst1.8 {d0-d1}, [r0]!
  276. vst1.8 {d2-d3}, [r0]!
  277. vst1.8 {d4-d5}, [r5]
  278. subs r4, r4, #2
  279. bpl .Lcbcdec128_2XLoop
  280. .Lcbcdec128_1X:
  281. adds r4, r4, #2
  282. bne .Lcbcdec128_FinalRound
  283. vpop {q4, q5, q6, q7}
  284. pop {r4, r5, r6}
  285. bx lr
  286. .Lcbcdec128_FinalRound:
  287. // load input 16 bytes
  288. vld1.8 {d0-d1}, [r1]!
  289. vmov q3, q0
  290. vst1.8 {d0-d1}, [r5]
  291. // aes kernel
  292. aesd.8 q0, q5
  293. aesimc.8 q0, q0
  294. aesd.8 q0, q6
  295. aesimc.8 q0, q0
  296. aesd.8 q0, q7
  297. aesimc.8 q0, q0
  298. aesd.8 q0, q8
  299. aesimc.8 q0, q0
  300. aesd.8 q0, q9
  301. aesimc.8 q0, q0
  302. aesd.8 q0, q10
  303. aesimc.8 q0, q0
  304. aesd.8 q0, q11
  305. aesimc.8 q0, q0
  306. aesd.8 q0, q12
  307. aesimc.8 q0, q0
  308. aesd.8 q0, q13
  309. aesimc.8 q0, q0
  310. aesd.8 q0, q14
  311. veor.8 q0, q0, q15
  312. veor.8 q0, q0, q2
  313. vmov q2, q3
  314. vst1.8 {d0-d1}, [r0]!
  315. vpop {q4, q5, q6, q7}
  316. pop {r4, r5, r6}
  317. bx lr
  318. .Lcbcdec192:
  319. // Load round keys
  320. vld1.8 {d10-d11}, [r2]!
  321. vld1.8 {d12-d13}, [r2]!
  322. vld1.8 {d14-d15}, [r2]!
  323. vld1.8 {d16-d17}, [r2]!
  324. vld1.8 {d18-d19}, [r2]!
  325. vld1.8 {d20-d21}, [r2]!
  326. vld1.8 {d22-d23}, [r2]!
  327. vld1.8 {d24-d25}, [r2]!
  328. vld1.8 {d26-d27}, [r2]!
  329. vld1.8 {d28-d29}, [r2]!
  330. mov r3, r2
  331. // Sub by 2
  332. subs r4, r4, #2
  333. bmi .Lcbcdec192_1X
  334. .Lcbcdec192_2XLoop:
  335. // Load input 32 bytes
  336. vld1.8 {d0-d3}, [r1]!
  337. pld [r1, #32]
  338. vmov q3, q0
  339. vmov q4, q1
  340. // aes kernel
  341. aesd.8 q0, q5
  342. aesimc.8 q0, q0
  343. aesd.8 q1, q5
  344. aesimc.8 q1, q1
  345. aesd.8 q0, q6
  346. aesimc.8 q0, q0
  347. aesd.8 q1, q6
  348. aesimc.8 q1, q1
  349. aesd.8 q0, q7
  350. aesimc.8 q0, q0
  351. aesd.8 q1, q7
  352. aesimc.8 q1, q1
  353. aesd.8 q0, q8
  354. aesimc.8 q0, q0
  355. aesd.8 q1, q8
  356. aesimc.8 q1, q1
  357. aesd.8 q0, q9
  358. aesimc.8 q0, q0
  359. aesd.8 q1, q9
  360. aesimc.8 q1, q1
  361. aesd.8 q0, q10
  362. aesimc.8 q0, q0
  363. aesd.8 q1, q10
  364. aesimc.8 q1, q1
  365. aesd.8 q0, q11
  366. aesimc.8 q0, q0
  367. aesd.8 q1, q11
  368. aesimc.8 q1, q1
  369. aesd.8 q0, q12
  370. aesimc.8 q0, q0
  371. aesd.8 q1, q12
  372. aesimc.8 q1, q1
  373. aesd.8 q0, q13
  374. aesimc.8 q0, q0
  375. aesd.8 q1, q13
  376. aesimc.8 q1, q1
  377. aesd.8 q0, q14
  378. aesimc.8 q0, q0
  379. aesd.8 q1, q14
  380. aesimc.8 q1, q1
  381. vld1.8 {d30-d31}, [r2]!
  382. aesd.8 q0, q15
  383. aesimc.8 q0, q0
  384. aesd.8 q1, q15
  385. aesimc.8 q1, q1
  386. vld1.8 {d30-d31}, [r2]!
  387. aesd.8 q0, q15
  388. aesd.8 q1, q15
  389. vld1.8 {d30-d31}, [r2]!
  390. veor.8 q0, q0, q15
  391. veor.8 q1, q1, q15
  392. mov r2, r3
  393. veor.8 q0, q0, q2
  394. veor.8 q1, q1, q3
  395. vmov q2, q4
  396. vst1.8 {d0-d1}, [r0]!
  397. vst1.8 {d2-d3}, [r0]!
  398. vst1.8 {d4-d5}, [r5]
  399. subs r4, r4, #2
  400. bpl .Lcbcdec192_2XLoop
  401. .Lcbcdec192_1X:
  402. adds r4, r4, #2
  403. bne .Lcbcdec192_FinalRound
  404. vpop {q4, q5, q6, q7}
  405. pop {r4, r5, r6}
  406. bx lr
  407. .Lcbcdec192_FinalRound:
  408. // load input 16 bytes
  409. vld1.8 {d0-d1}, [r1]!
  410. vmov q3, q0
  411. vst1.8 {d0-d1}, [r5]
  412. // aes kernel
  413. aesd.8 q0, q5
  414. aesimc.8 q0, q0
  415. vld1.8 {d30}, [r2]!
  416. aesd.8 q0, q6
  417. aesimc.8 q0, q0
  418. vld1.8 {d31}, [r2]!
  419. aesd.8 q0, q7
  420. aesimc.8 q0, q0
  421. aesd.8 q0, q8
  422. aesimc.8 q0, q0
  423. aesd.8 q0, q9
  424. aesimc.8 q0, q0
  425. aesd.8 q0, q10
  426. aesimc.8 q0, q0
  427. aesd.8 q0, q11
  428. aesimc.8 q0, q0
  429. aesd.8 q0, q12
  430. aesimc.8 q0, q0
  431. aesd.8 q0, q13
  432. aesimc.8 q0, q0
  433. aesd.8 q0, q14
  434. aesimc.8 q0, q0
  435. aesd.8 q0, q15
  436. aesimc.8 q0, q0
  437. vld1.8 {d30-d31}, [r2]!
  438. aesd.8 q0, q15
  439. vld1.8 {d30-d31}, [r2]!
  440. veor.8 q0, q0, q15
  441. veor.8 q0, q0, q2
  442. vmov q2, q3
  443. vst1.8 {d0-d1}, [r0]!
  444. vpop {q4, q5, q6, q7}
  445. pop {r4, r5, r6}
  446. bx lr
  447. .Lcbcdec256:
  448. // Load round keys
  449. vld1.8 {d10-d11}, [r2]!
  450. vld1.8 {d12-d13}, [r2]!
  451. vld1.8 {d14-d15}, [r2]!
  452. vld1.8 {d16-d17}, [r2]!
  453. vld1.8 {d18-d19}, [r2]!
  454. vld1.8 {d20-d21}, [r2]!
  455. vld1.8 {d22-d23}, [r2]!
  456. vld1.8 {d24-d25}, [r2]!
  457. vld1.8 {d26-d27}, [r2]!
  458. vld1.8 {d28-d29}, [r2]!
  459. mov r3, r2
  460. // Sub by 2
  461. subs r4, r4, #2
  462. bmi .Lcbcdec256_1X
  463. .Lcbcdec256_2XLoop:
  464. // Load input 32 bytes
  465. vld1.8 {d0-d3}, [r1]!
  466. pld [r1, #32]
  467. vmov q3, q0
  468. vmov q4, q1
  469. // aes kernel
  470. aesd.8 q0, q5
  471. aesimc.8 q0, q0
  472. aesd.8 q1, q5
  473. aesimc.8 q1, q1
  474. aesd.8 q0, q6
  475. aesimc.8 q0, q0
  476. aesd.8 q1, q6
  477. aesimc.8 q1, q1
  478. aesd.8 q0, q7
  479. aesimc.8 q0, q0
  480. aesd.8 q1, q7
  481. aesimc.8 q1, q1
  482. aesd.8 q0, q8
  483. aesimc.8 q0, q0
  484. aesd.8 q1, q8
  485. aesimc.8 q1, q1
  486. aesd.8 q0, q9
  487. aesimc.8 q0, q0
  488. aesd.8 q1, q9
  489. aesimc.8 q1, q1
  490. aesd.8 q0, q10
  491. aesimc.8 q0, q0
  492. aesd.8 q1, q10
  493. aesimc.8 q1, q1
  494. aesd.8 q0, q11
  495. aesimc.8 q0, q0
  496. aesd.8 q1, q11
  497. aesimc.8 q1, q1
  498. aesd.8 q0, q12
  499. aesimc.8 q0, q0
  500. aesd.8 q1, q12
  501. aesimc.8 q1, q1
  502. aesd.8 q0, q13
  503. aesimc.8 q0, q0
  504. aesd.8 q1, q13
  505. aesimc.8 q1, q1
  506. aesd.8 q0, q14
  507. aesimc.8 q0, q0
  508. aesd.8 q1, q14
  509. aesimc.8 q1, q1
  510. vld1.8 {d30-d31}, [r2]!
  511. aesd.8 q0, q15
  512. aesimc.8 q0, q0
  513. aesd.8 q1, q15
  514. aesimc.8 q1, q1
  515. vld1.8 {d30-d31}, [r2]!
  516. aesd.8 q0, q15
  517. aesimc.8 q0, q0
  518. aesd.8 q1, q15
  519. aesimc.8 q1, q1
  520. vld1.8 {d30-d31}, [r2]!
  521. aesd.8 q0, q15
  522. aesimc.8 q0, q0
  523. aesd.8 q1, q15
  524. aesimc.8 q1, q1
  525. vld1.8 {d30-d31}, [r2]!
  526. aesd.8 q0, q15
  527. aesd.8 q1, q15
  528. vld1.8 {d30-d31}, [r2]!
  529. veor.8 q0, q0, q15
  530. veor.8 q1, q1, q15
  531. mov r2, r3
  532. veor.8 q0, q0, q2
  533. veor.8 q1, q1, q3
  534. vmov q2, q4
  535. vst1.8 {d0-d1}, [r0]!
  536. vst1.8 {d2-d3}, [r0]!
  537. vst1.8 {d4-d5}, [r5]
  538. subs r4, r4, #2
  539. bpl .Lcbcdec256_2XLoop
  540. .Lcbcdec256_1X:
  541. adds r4, r4, #2
  542. bne .Lcbcdec256_FinalRound
  543. vpop {q4, q5, q6, q7}
  544. pop {r4, r5, r6}
  545. bx lr
  546. .Lcbcdec256_FinalRound:
  547. // load input 16 bytes
  548. vld1.8 {d0-d1}, [r1]!
  549. vmov q3, q0
  550. vst1.8 {d0-d1}, [r5]
  551. // aes kernel
  552. aesd.8 q0, q5
  553. aesimc.8 q0, q0
  554. vld1.8 {d30}, [r2]!
  555. aesd.8 q0, q6
  556. aesimc.8 q0, q0
  557. vld1.8 {d31}, [r2]!
  558. aesd.8 q0, q7
  559. aesimc.8 q0, q0
  560. aesd.8 q0, q8
  561. aesimc.8 q0, q0
  562. aesd.8 q0, q9
  563. aesimc.8 q0, q0
  564. aesd.8 q0, q10
  565. aesimc.8 q0, q0
  566. aesd.8 q0, q11
  567. aesimc.8 q0, q0
  568. aesd.8 q0, q12
  569. aesimc.8 q0, q0
  570. aesd.8 q0, q13
  571. aesimc.8 q0, q0
  572. aesd.8 q0, q14
  573. aesimc.8 q0, q0
  574. aesd.8 q0, q15
  575. aesimc.8 q0, q0
  576. vld1.8 {d30-d31}, [r2]!
  577. aesd.8 q0, q15
  578. aesimc.8 q0, q0
  579. vld1.8 {d30-d31}, [r2]!
  580. aesd.8 q0, q15
  581. aesimc.8 q0, q0
  582. vld1.8 {d30-d31}, [r2]!
  583. aesd.8 q0, q15
  584. vld1.8 {d30-d31}, [r2]!
  585. veor.8 q0, q0, q15
  586. veor.8 q0, q0, q2
  587. vmov q2, q3
  588. vst1.8 {d0-d1}, [r0]!
  589. vpop {q4, q5, q6, q7}
  590. pop {r4, r5, r6}
  591. bx lr
  592. ENDPROC(aes_v8_cbc_decrypt)
  593. #endif