chacha-s390.S 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Original implementation written by Andy Polyakov, @dot-asm.
  4. * This is an adaptation of the original code for kernel use.
  5. *
  6. * Copyright (C) 2006-2019 CRYPTOGAMS by <[email protected]>. All Rights Reserved.
  7. */
  8. #include <linux/linkage.h>
  9. #include <asm/nospec-insn.h>
  10. #include <asm/vx-insn.h>
  11. #define SP %r15
  12. #define FRAME (16 * 8 + 4 * 8)
  13. .data
  14. .align 32
  15. .Lsigma:
  16. .long 0x61707865,0x3320646e,0x79622d32,0x6b206574 # endian-neutral
  17. .long 1,0,0,0
  18. .long 2,0,0,0
  19. .long 3,0,0,0
  20. .long 0x03020100,0x07060504,0x0b0a0908,0x0f0e0d0c # byte swap
  21. .long 0,1,2,3
  22. .long 0x61707865,0x61707865,0x61707865,0x61707865 # smashed sigma
  23. .long 0x3320646e,0x3320646e,0x3320646e,0x3320646e
  24. .long 0x79622d32,0x79622d32,0x79622d32,0x79622d32
  25. .long 0x6b206574,0x6b206574,0x6b206574,0x6b206574
  26. .previous
  27. GEN_BR_THUNK %r14
  28. .text
  29. #############################################################################
  30. # void chacha20_vx_4x(u8 *out, counst u8 *inp, size_t len,
  31. # counst u32 *key, const u32 *counter)
  32. #define OUT %r2
  33. #define INP %r3
  34. #define LEN %r4
  35. #define KEY %r5
  36. #define COUNTER %r6
  37. #define BEPERM %v31
  38. #define CTR %v26
  39. #define K0 %v16
  40. #define K1 %v17
  41. #define K2 %v18
  42. #define K3 %v19
  43. #define XA0 %v0
  44. #define XA1 %v1
  45. #define XA2 %v2
  46. #define XA3 %v3
  47. #define XB0 %v4
  48. #define XB1 %v5
  49. #define XB2 %v6
  50. #define XB3 %v7
  51. #define XC0 %v8
  52. #define XC1 %v9
  53. #define XC2 %v10
  54. #define XC3 %v11
  55. #define XD0 %v12
  56. #define XD1 %v13
  57. #define XD2 %v14
  58. #define XD3 %v15
  59. #define XT0 %v27
  60. #define XT1 %v28
  61. #define XT2 %v29
  62. #define XT3 %v30
  63. ENTRY(chacha20_vx_4x)
  64. stmg %r6,%r7,6*8(SP)
  65. larl %r7,.Lsigma
  66. lhi %r0,10
  67. lhi %r1,0
  68. VL K0,0,,%r7 # load sigma
  69. VL K1,0,,KEY # load key
  70. VL K2,16,,KEY
  71. VL K3,0,,COUNTER # load counter
  72. VL BEPERM,0x40,,%r7
  73. VL CTR,0x50,,%r7
  74. VLM XA0,XA3,0x60,%r7,4 # load [smashed] sigma
  75. VREPF XB0,K1,0 # smash the key
  76. VREPF XB1,K1,1
  77. VREPF XB2,K1,2
  78. VREPF XB3,K1,3
  79. VREPF XD0,K3,0
  80. VREPF XD1,K3,1
  81. VREPF XD2,K3,2
  82. VREPF XD3,K3,3
  83. VAF XD0,XD0,CTR
  84. VREPF XC0,K2,0
  85. VREPF XC1,K2,1
  86. VREPF XC2,K2,2
  87. VREPF XC3,K2,3
  88. .Loop_4x:
  89. VAF XA0,XA0,XB0
  90. VX XD0,XD0,XA0
  91. VERLLF XD0,XD0,16
  92. VAF XA1,XA1,XB1
  93. VX XD1,XD1,XA1
  94. VERLLF XD1,XD1,16
  95. VAF XA2,XA2,XB2
  96. VX XD2,XD2,XA2
  97. VERLLF XD2,XD2,16
  98. VAF XA3,XA3,XB3
  99. VX XD3,XD3,XA3
  100. VERLLF XD3,XD3,16
  101. VAF XC0,XC0,XD0
  102. VX XB0,XB0,XC0
  103. VERLLF XB0,XB0,12
  104. VAF XC1,XC1,XD1
  105. VX XB1,XB1,XC1
  106. VERLLF XB1,XB1,12
  107. VAF XC2,XC2,XD2
  108. VX XB2,XB2,XC2
  109. VERLLF XB2,XB2,12
  110. VAF XC3,XC3,XD3
  111. VX XB3,XB3,XC3
  112. VERLLF XB3,XB3,12
  113. VAF XA0,XA0,XB0
  114. VX XD0,XD0,XA0
  115. VERLLF XD0,XD0,8
  116. VAF XA1,XA1,XB1
  117. VX XD1,XD1,XA1
  118. VERLLF XD1,XD1,8
  119. VAF XA2,XA2,XB2
  120. VX XD2,XD2,XA2
  121. VERLLF XD2,XD2,8
  122. VAF XA3,XA3,XB3
  123. VX XD3,XD3,XA3
  124. VERLLF XD3,XD3,8
  125. VAF XC0,XC0,XD0
  126. VX XB0,XB0,XC0
  127. VERLLF XB0,XB0,7
  128. VAF XC1,XC1,XD1
  129. VX XB1,XB1,XC1
  130. VERLLF XB1,XB1,7
  131. VAF XC2,XC2,XD2
  132. VX XB2,XB2,XC2
  133. VERLLF XB2,XB2,7
  134. VAF XC3,XC3,XD3
  135. VX XB3,XB3,XC3
  136. VERLLF XB3,XB3,7
  137. VAF XA0,XA0,XB1
  138. VX XD3,XD3,XA0
  139. VERLLF XD3,XD3,16
  140. VAF XA1,XA1,XB2
  141. VX XD0,XD0,XA1
  142. VERLLF XD0,XD0,16
  143. VAF XA2,XA2,XB3
  144. VX XD1,XD1,XA2
  145. VERLLF XD1,XD1,16
  146. VAF XA3,XA3,XB0
  147. VX XD2,XD2,XA3
  148. VERLLF XD2,XD2,16
  149. VAF XC2,XC2,XD3
  150. VX XB1,XB1,XC2
  151. VERLLF XB1,XB1,12
  152. VAF XC3,XC3,XD0
  153. VX XB2,XB2,XC3
  154. VERLLF XB2,XB2,12
  155. VAF XC0,XC0,XD1
  156. VX XB3,XB3,XC0
  157. VERLLF XB3,XB3,12
  158. VAF XC1,XC1,XD2
  159. VX XB0,XB0,XC1
  160. VERLLF XB0,XB0,12
  161. VAF XA0,XA0,XB1
  162. VX XD3,XD3,XA0
  163. VERLLF XD3,XD3,8
  164. VAF XA1,XA1,XB2
  165. VX XD0,XD0,XA1
  166. VERLLF XD0,XD0,8
  167. VAF XA2,XA2,XB3
  168. VX XD1,XD1,XA2
  169. VERLLF XD1,XD1,8
  170. VAF XA3,XA3,XB0
  171. VX XD2,XD2,XA3
  172. VERLLF XD2,XD2,8
  173. VAF XC2,XC2,XD3
  174. VX XB1,XB1,XC2
  175. VERLLF XB1,XB1,7
  176. VAF XC3,XC3,XD0
  177. VX XB2,XB2,XC3
  178. VERLLF XB2,XB2,7
  179. VAF XC0,XC0,XD1
  180. VX XB3,XB3,XC0
  181. VERLLF XB3,XB3,7
  182. VAF XC1,XC1,XD2
  183. VX XB0,XB0,XC1
  184. VERLLF XB0,XB0,7
  185. brct %r0,.Loop_4x
  186. VAF XD0,XD0,CTR
  187. VMRHF XT0,XA0,XA1 # transpose data
  188. VMRHF XT1,XA2,XA3
  189. VMRLF XT2,XA0,XA1
  190. VMRLF XT3,XA2,XA3
  191. VPDI XA0,XT0,XT1,0b0000
  192. VPDI XA1,XT0,XT1,0b0101
  193. VPDI XA2,XT2,XT3,0b0000
  194. VPDI XA3,XT2,XT3,0b0101
  195. VMRHF XT0,XB0,XB1
  196. VMRHF XT1,XB2,XB3
  197. VMRLF XT2,XB0,XB1
  198. VMRLF XT3,XB2,XB3
  199. VPDI XB0,XT0,XT1,0b0000
  200. VPDI XB1,XT0,XT1,0b0101
  201. VPDI XB2,XT2,XT3,0b0000
  202. VPDI XB3,XT2,XT3,0b0101
  203. VMRHF XT0,XC0,XC1
  204. VMRHF XT1,XC2,XC3
  205. VMRLF XT2,XC0,XC1
  206. VMRLF XT3,XC2,XC3
  207. VPDI XC0,XT0,XT1,0b0000
  208. VPDI XC1,XT0,XT1,0b0101
  209. VPDI XC2,XT2,XT3,0b0000
  210. VPDI XC3,XT2,XT3,0b0101
  211. VMRHF XT0,XD0,XD1
  212. VMRHF XT1,XD2,XD3
  213. VMRLF XT2,XD0,XD1
  214. VMRLF XT3,XD2,XD3
  215. VPDI XD0,XT0,XT1,0b0000
  216. VPDI XD1,XT0,XT1,0b0101
  217. VPDI XD2,XT2,XT3,0b0000
  218. VPDI XD3,XT2,XT3,0b0101
  219. VAF XA0,XA0,K0
  220. VAF XB0,XB0,K1
  221. VAF XC0,XC0,K2
  222. VAF XD0,XD0,K3
  223. VPERM XA0,XA0,XA0,BEPERM
  224. VPERM XB0,XB0,XB0,BEPERM
  225. VPERM XC0,XC0,XC0,BEPERM
  226. VPERM XD0,XD0,XD0,BEPERM
  227. VLM XT0,XT3,0,INP,0
  228. VX XT0,XT0,XA0
  229. VX XT1,XT1,XB0
  230. VX XT2,XT2,XC0
  231. VX XT3,XT3,XD0
  232. VSTM XT0,XT3,0,OUT,0
  233. la INP,0x40(INP)
  234. la OUT,0x40(OUT)
  235. aghi LEN,-0x40
  236. VAF XA0,XA1,K0
  237. VAF XB0,XB1,K1
  238. VAF XC0,XC1,K2
  239. VAF XD0,XD1,K3
  240. VPERM XA0,XA0,XA0,BEPERM
  241. VPERM XB0,XB0,XB0,BEPERM
  242. VPERM XC0,XC0,XC0,BEPERM
  243. VPERM XD0,XD0,XD0,BEPERM
  244. clgfi LEN,0x40
  245. jl .Ltail_4x
  246. VLM XT0,XT3,0,INP,0
  247. VX XT0,XT0,XA0
  248. VX XT1,XT1,XB0
  249. VX XT2,XT2,XC0
  250. VX XT3,XT3,XD0
  251. VSTM XT0,XT3,0,OUT,0
  252. la INP,0x40(INP)
  253. la OUT,0x40(OUT)
  254. aghi LEN,-0x40
  255. je .Ldone_4x
  256. VAF XA0,XA2,K0
  257. VAF XB0,XB2,K1
  258. VAF XC0,XC2,K2
  259. VAF XD0,XD2,K3
  260. VPERM XA0,XA0,XA0,BEPERM
  261. VPERM XB0,XB0,XB0,BEPERM
  262. VPERM XC0,XC0,XC0,BEPERM
  263. VPERM XD0,XD0,XD0,BEPERM
  264. clgfi LEN,0x40
  265. jl .Ltail_4x
  266. VLM XT0,XT3,0,INP,0
  267. VX XT0,XT0,XA0
  268. VX XT1,XT1,XB0
  269. VX XT2,XT2,XC0
  270. VX XT3,XT3,XD0
  271. VSTM XT0,XT3,0,OUT,0
  272. la INP,0x40(INP)
  273. la OUT,0x40(OUT)
  274. aghi LEN,-0x40
  275. je .Ldone_4x
  276. VAF XA0,XA3,K0
  277. VAF XB0,XB3,K1
  278. VAF XC0,XC3,K2
  279. VAF XD0,XD3,K3
  280. VPERM XA0,XA0,XA0,BEPERM
  281. VPERM XB0,XB0,XB0,BEPERM
  282. VPERM XC0,XC0,XC0,BEPERM
  283. VPERM XD0,XD0,XD0,BEPERM
  284. clgfi LEN,0x40
  285. jl .Ltail_4x
  286. VLM XT0,XT3,0,INP,0
  287. VX XT0,XT0,XA0
  288. VX XT1,XT1,XB0
  289. VX XT2,XT2,XC0
  290. VX XT3,XT3,XD0
  291. VSTM XT0,XT3,0,OUT,0
  292. .Ldone_4x:
  293. lmg %r6,%r7,6*8(SP)
  294. BR_EX %r14
  295. .Ltail_4x:
  296. VLR XT0,XC0
  297. VLR XT1,XD0
  298. VST XA0,8*8+0x00,,SP
  299. VST XB0,8*8+0x10,,SP
  300. VST XT0,8*8+0x20,,SP
  301. VST XT1,8*8+0x30,,SP
  302. lghi %r1,0
  303. .Loop_tail_4x:
  304. llgc %r5,0(%r1,INP)
  305. llgc %r6,8*8(%r1,SP)
  306. xr %r6,%r5
  307. stc %r6,0(%r1,OUT)
  308. la %r1,1(%r1)
  309. brct LEN,.Loop_tail_4x
  310. lmg %r6,%r7,6*8(SP)
  311. BR_EX %r14
  312. ENDPROC(chacha20_vx_4x)
  313. #undef OUT
  314. #undef INP
  315. #undef LEN
  316. #undef KEY
  317. #undef COUNTER
  318. #undef BEPERM
  319. #undef K0
  320. #undef K1
  321. #undef K2
  322. #undef K3
  323. #############################################################################
  324. # void chacha20_vx(u8 *out, counst u8 *inp, size_t len,
  325. # counst u32 *key, const u32 *counter)
  326. #define OUT %r2
  327. #define INP %r3
  328. #define LEN %r4
  329. #define KEY %r5
  330. #define COUNTER %r6
  331. #define BEPERM %v31
  332. #define K0 %v27
  333. #define K1 %v24
  334. #define K2 %v25
  335. #define K3 %v26
  336. #define A0 %v0
  337. #define B0 %v1
  338. #define C0 %v2
  339. #define D0 %v3
  340. #define A1 %v4
  341. #define B1 %v5
  342. #define C1 %v6
  343. #define D1 %v7
  344. #define A2 %v8
  345. #define B2 %v9
  346. #define C2 %v10
  347. #define D2 %v11
  348. #define A3 %v12
  349. #define B3 %v13
  350. #define C3 %v14
  351. #define D3 %v15
  352. #define A4 %v16
  353. #define B4 %v17
  354. #define C4 %v18
  355. #define D4 %v19
  356. #define A5 %v20
  357. #define B5 %v21
  358. #define C5 %v22
  359. #define D5 %v23
  360. #define T0 %v27
  361. #define T1 %v28
  362. #define T2 %v29
  363. #define T3 %v30
  364. ENTRY(chacha20_vx)
  365. clgfi LEN,256
  366. jle chacha20_vx_4x
  367. stmg %r6,%r7,6*8(SP)
  368. lghi %r1,-FRAME
  369. lgr %r0,SP
  370. la SP,0(%r1,SP)
  371. stg %r0,0(SP) # back-chain
  372. larl %r7,.Lsigma
  373. lhi %r0,10
  374. VLM K1,K2,0,KEY,0 # load key
  375. VL K3,0,,COUNTER # load counter
  376. VLM K0,BEPERM,0,%r7,4 # load sigma, increments, ...
  377. .Loop_outer_vx:
  378. VLR A0,K0
  379. VLR B0,K1
  380. VLR A1,K0
  381. VLR B1,K1
  382. VLR A2,K0
  383. VLR B2,K1
  384. VLR A3,K0
  385. VLR B3,K1
  386. VLR A4,K0
  387. VLR B4,K1
  388. VLR A5,K0
  389. VLR B5,K1
  390. VLR D0,K3
  391. VAF D1,K3,T1 # K[3]+1
  392. VAF D2,K3,T2 # K[3]+2
  393. VAF D3,K3,T3 # K[3]+3
  394. VAF D4,D2,T2 # K[3]+4
  395. VAF D5,D2,T3 # K[3]+5
  396. VLR C0,K2
  397. VLR C1,K2
  398. VLR C2,K2
  399. VLR C3,K2
  400. VLR C4,K2
  401. VLR C5,K2
  402. VLR T1,D1
  403. VLR T2,D2
  404. VLR T3,D3
  405. .Loop_vx:
  406. VAF A0,A0,B0
  407. VAF A1,A1,B1
  408. VAF A2,A2,B2
  409. VAF A3,A3,B3
  410. VAF A4,A4,B4
  411. VAF A5,A5,B5
  412. VX D0,D0,A0
  413. VX D1,D1,A1
  414. VX D2,D2,A2
  415. VX D3,D3,A3
  416. VX D4,D4,A4
  417. VX D5,D5,A5
  418. VERLLF D0,D0,16
  419. VERLLF D1,D1,16
  420. VERLLF D2,D2,16
  421. VERLLF D3,D3,16
  422. VERLLF D4,D4,16
  423. VERLLF D5,D5,16
  424. VAF C0,C0,D0
  425. VAF C1,C1,D1
  426. VAF C2,C2,D2
  427. VAF C3,C3,D3
  428. VAF C4,C4,D4
  429. VAF C5,C5,D5
  430. VX B0,B0,C0
  431. VX B1,B1,C1
  432. VX B2,B2,C2
  433. VX B3,B3,C3
  434. VX B4,B4,C4
  435. VX B5,B5,C5
  436. VERLLF B0,B0,12
  437. VERLLF B1,B1,12
  438. VERLLF B2,B2,12
  439. VERLLF B3,B3,12
  440. VERLLF B4,B4,12
  441. VERLLF B5,B5,12
  442. VAF A0,A0,B0
  443. VAF A1,A1,B1
  444. VAF A2,A2,B2
  445. VAF A3,A3,B3
  446. VAF A4,A4,B4
  447. VAF A5,A5,B5
  448. VX D0,D0,A0
  449. VX D1,D1,A1
  450. VX D2,D2,A2
  451. VX D3,D3,A3
  452. VX D4,D4,A4
  453. VX D5,D5,A5
  454. VERLLF D0,D0,8
  455. VERLLF D1,D1,8
  456. VERLLF D2,D2,8
  457. VERLLF D3,D3,8
  458. VERLLF D4,D4,8
  459. VERLLF D5,D5,8
  460. VAF C0,C0,D0
  461. VAF C1,C1,D1
  462. VAF C2,C2,D2
  463. VAF C3,C3,D3
  464. VAF C4,C4,D4
  465. VAF C5,C5,D5
  466. VX B0,B0,C0
  467. VX B1,B1,C1
  468. VX B2,B2,C2
  469. VX B3,B3,C3
  470. VX B4,B4,C4
  471. VX B5,B5,C5
  472. VERLLF B0,B0,7
  473. VERLLF B1,B1,7
  474. VERLLF B2,B2,7
  475. VERLLF B3,B3,7
  476. VERLLF B4,B4,7
  477. VERLLF B5,B5,7
  478. VSLDB C0,C0,C0,8
  479. VSLDB C1,C1,C1,8
  480. VSLDB C2,C2,C2,8
  481. VSLDB C3,C3,C3,8
  482. VSLDB C4,C4,C4,8
  483. VSLDB C5,C5,C5,8
  484. VSLDB B0,B0,B0,4
  485. VSLDB B1,B1,B1,4
  486. VSLDB B2,B2,B2,4
  487. VSLDB B3,B3,B3,4
  488. VSLDB B4,B4,B4,4
  489. VSLDB B5,B5,B5,4
  490. VSLDB D0,D0,D0,12
  491. VSLDB D1,D1,D1,12
  492. VSLDB D2,D2,D2,12
  493. VSLDB D3,D3,D3,12
  494. VSLDB D4,D4,D4,12
  495. VSLDB D5,D5,D5,12
  496. VAF A0,A0,B0
  497. VAF A1,A1,B1
  498. VAF A2,A2,B2
  499. VAF A3,A3,B3
  500. VAF A4,A4,B4
  501. VAF A5,A5,B5
  502. VX D0,D0,A0
  503. VX D1,D1,A1
  504. VX D2,D2,A2
  505. VX D3,D3,A3
  506. VX D4,D4,A4
  507. VX D5,D5,A5
  508. VERLLF D0,D0,16
  509. VERLLF D1,D1,16
  510. VERLLF D2,D2,16
  511. VERLLF D3,D3,16
  512. VERLLF D4,D4,16
  513. VERLLF D5,D5,16
  514. VAF C0,C0,D0
  515. VAF C1,C1,D1
  516. VAF C2,C2,D2
  517. VAF C3,C3,D3
  518. VAF C4,C4,D4
  519. VAF C5,C5,D5
  520. VX B0,B0,C0
  521. VX B1,B1,C1
  522. VX B2,B2,C2
  523. VX B3,B3,C3
  524. VX B4,B4,C4
  525. VX B5,B5,C5
  526. VERLLF B0,B0,12
  527. VERLLF B1,B1,12
  528. VERLLF B2,B2,12
  529. VERLLF B3,B3,12
  530. VERLLF B4,B4,12
  531. VERLLF B5,B5,12
  532. VAF A0,A0,B0
  533. VAF A1,A1,B1
  534. VAF A2,A2,B2
  535. VAF A3,A3,B3
  536. VAF A4,A4,B4
  537. VAF A5,A5,B5
  538. VX D0,D0,A0
  539. VX D1,D1,A1
  540. VX D2,D2,A2
  541. VX D3,D3,A3
  542. VX D4,D4,A4
  543. VX D5,D5,A5
  544. VERLLF D0,D0,8
  545. VERLLF D1,D1,8
  546. VERLLF D2,D2,8
  547. VERLLF D3,D3,8
  548. VERLLF D4,D4,8
  549. VERLLF D5,D5,8
  550. VAF C0,C0,D0
  551. VAF C1,C1,D1
  552. VAF C2,C2,D2
  553. VAF C3,C3,D3
  554. VAF C4,C4,D4
  555. VAF C5,C5,D5
  556. VX B0,B0,C0
  557. VX B1,B1,C1
  558. VX B2,B2,C2
  559. VX B3,B3,C3
  560. VX B4,B4,C4
  561. VX B5,B5,C5
  562. VERLLF B0,B0,7
  563. VERLLF B1,B1,7
  564. VERLLF B2,B2,7
  565. VERLLF B3,B3,7
  566. VERLLF B4,B4,7
  567. VERLLF B5,B5,7
  568. VSLDB C0,C0,C0,8
  569. VSLDB C1,C1,C1,8
  570. VSLDB C2,C2,C2,8
  571. VSLDB C3,C3,C3,8
  572. VSLDB C4,C4,C4,8
  573. VSLDB C5,C5,C5,8
  574. VSLDB B0,B0,B0,12
  575. VSLDB B1,B1,B1,12
  576. VSLDB B2,B2,B2,12
  577. VSLDB B3,B3,B3,12
  578. VSLDB B4,B4,B4,12
  579. VSLDB B5,B5,B5,12
  580. VSLDB D0,D0,D0,4
  581. VSLDB D1,D1,D1,4
  582. VSLDB D2,D2,D2,4
  583. VSLDB D3,D3,D3,4
  584. VSLDB D4,D4,D4,4
  585. VSLDB D5,D5,D5,4
  586. brct %r0,.Loop_vx
  587. VAF A0,A0,K0
  588. VAF B0,B0,K1
  589. VAF C0,C0,K2
  590. VAF D0,D0,K3
  591. VAF A1,A1,K0
  592. VAF D1,D1,T1 # +K[3]+1
  593. VPERM A0,A0,A0,BEPERM
  594. VPERM B0,B0,B0,BEPERM
  595. VPERM C0,C0,C0,BEPERM
  596. VPERM D0,D0,D0,BEPERM
  597. clgfi LEN,0x40
  598. jl .Ltail_vx
  599. VAF D2,D2,T2 # +K[3]+2
  600. VAF D3,D3,T3 # +K[3]+3
  601. VLM T0,T3,0,INP,0
  602. VX A0,A0,T0
  603. VX B0,B0,T1
  604. VX C0,C0,T2
  605. VX D0,D0,T3
  606. VLM K0,T3,0,%r7,4 # re-load sigma and increments
  607. VSTM A0,D0,0,OUT,0
  608. la INP,0x40(INP)
  609. la OUT,0x40(OUT)
  610. aghi LEN,-0x40
  611. je .Ldone_vx
  612. VAF B1,B1,K1
  613. VAF C1,C1,K2
  614. VPERM A0,A1,A1,BEPERM
  615. VPERM B0,B1,B1,BEPERM
  616. VPERM C0,C1,C1,BEPERM
  617. VPERM D0,D1,D1,BEPERM
  618. clgfi LEN,0x40
  619. jl .Ltail_vx
  620. VLM A1,D1,0,INP,0
  621. VX A0,A0,A1
  622. VX B0,B0,B1
  623. VX C0,C0,C1
  624. VX D0,D0,D1
  625. VSTM A0,D0,0,OUT,0
  626. la INP,0x40(INP)
  627. la OUT,0x40(OUT)
  628. aghi LEN,-0x40
  629. je .Ldone_vx
  630. VAF A2,A2,K0
  631. VAF B2,B2,K1
  632. VAF C2,C2,K2
  633. VPERM A0,A2,A2,BEPERM
  634. VPERM B0,B2,B2,BEPERM
  635. VPERM C0,C2,C2,BEPERM
  636. VPERM D0,D2,D2,BEPERM
  637. clgfi LEN,0x40
  638. jl .Ltail_vx
  639. VLM A1,D1,0,INP,0
  640. VX A0,A0,A1
  641. VX B0,B0,B1
  642. VX C0,C0,C1
  643. VX D0,D0,D1
  644. VSTM A0,D0,0,OUT,0
  645. la INP,0x40(INP)
  646. la OUT,0x40(OUT)
  647. aghi LEN,-0x40
  648. je .Ldone_vx
  649. VAF A3,A3,K0
  650. VAF B3,B3,K1
  651. VAF C3,C3,K2
  652. VAF D2,K3,T3 # K[3]+3
  653. VPERM A0,A3,A3,BEPERM
  654. VPERM B0,B3,B3,BEPERM
  655. VPERM C0,C3,C3,BEPERM
  656. VPERM D0,D3,D3,BEPERM
  657. clgfi LEN,0x40
  658. jl .Ltail_vx
  659. VAF D3,D2,T1 # K[3]+4
  660. VLM A1,D1,0,INP,0
  661. VX A0,A0,A1
  662. VX B0,B0,B1
  663. VX C0,C0,C1
  664. VX D0,D0,D1
  665. VSTM A0,D0,0,OUT,0
  666. la INP,0x40(INP)
  667. la OUT,0x40(OUT)
  668. aghi LEN,-0x40
  669. je .Ldone_vx
  670. VAF A4,A4,K0
  671. VAF B4,B4,K1
  672. VAF C4,C4,K2
  673. VAF D4,D4,D3 # +K[3]+4
  674. VAF D3,D3,T1 # K[3]+5
  675. VAF K3,D2,T3 # K[3]+=6
  676. VPERM A0,A4,A4,BEPERM
  677. VPERM B0,B4,B4,BEPERM
  678. VPERM C0,C4,C4,BEPERM
  679. VPERM D0,D4,D4,BEPERM
  680. clgfi LEN,0x40
  681. jl .Ltail_vx
  682. VLM A1,D1,0,INP,0
  683. VX A0,A0,A1
  684. VX B0,B0,B1
  685. VX C0,C0,C1
  686. VX D0,D0,D1
  687. VSTM A0,D0,0,OUT,0
  688. la INP,0x40(INP)
  689. la OUT,0x40(OUT)
  690. aghi LEN,-0x40
  691. je .Ldone_vx
  692. VAF A5,A5,K0
  693. VAF B5,B5,K1
  694. VAF C5,C5,K2
  695. VAF D5,D5,D3 # +K[3]+5
  696. VPERM A0,A5,A5,BEPERM
  697. VPERM B0,B5,B5,BEPERM
  698. VPERM C0,C5,C5,BEPERM
  699. VPERM D0,D5,D5,BEPERM
  700. clgfi LEN,0x40
  701. jl .Ltail_vx
  702. VLM A1,D1,0,INP,0
  703. VX A0,A0,A1
  704. VX B0,B0,B1
  705. VX C0,C0,C1
  706. VX D0,D0,D1
  707. VSTM A0,D0,0,OUT,0
  708. la INP,0x40(INP)
  709. la OUT,0x40(OUT)
  710. lhi %r0,10
  711. aghi LEN,-0x40
  712. jne .Loop_outer_vx
  713. .Ldone_vx:
  714. lmg %r6,%r7,FRAME+6*8(SP)
  715. la SP,FRAME(SP)
  716. BR_EX %r14
  717. .Ltail_vx:
  718. VSTM A0,D0,8*8,SP,3
  719. lghi %r1,0
  720. .Loop_tail_vx:
  721. llgc %r5,0(%r1,INP)
  722. llgc %r6,8*8(%r1,SP)
  723. xr %r6,%r5
  724. stc %r6,0(%r1,OUT)
  725. la %r1,1(%r1)
  726. brct LEN,.Loop_tail_vx
  727. lmg %r6,%r7,FRAME+6*8(SP)
  728. la SP,FRAME(SP)
  729. BR_EX %r14
  730. ENDPROC(chacha20_vx)
  731. .previous