0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/linkage.h>
0010 #include <asm/nospec-insn.h>
0011 #include <asm/vx-insn.h>
0012
0013 #define SP %r15
0014 #define FRAME (16 * 8 + 4 * 8)
0015
0016 .data
0017 .align 32
0018
0019 .Lsigma:
0020 .long 0x61707865,0x3320646e,0x79622d32,0x6b206574 # endian-neutral
0021 .long 1,0,0,0
0022 .long 2,0,0,0
0023 .long 3,0,0,0
0024 .long 0x03020100,0x07060504,0x0b0a0908,0x0f0e0d0c # byte swap
0025
0026 .long 0,1,2,3
0027 .long 0x61707865,0x61707865,0x61707865,0x61707865 # smashed sigma
0028 .long 0x3320646e,0x3320646e,0x3320646e,0x3320646e
0029 .long 0x79622d32,0x79622d32,0x79622d32,0x79622d32
0030 .long 0x6b206574,0x6b206574,0x6b206574,0x6b206574
0031
0032 .previous
0033
0034 GEN_BR_THUNK %r14
0035
0036 .text
0037
0038 #############################################################################
0039 # void chacha20_vx_4x(u8 *out, counst u8 *inp, size_t len,
0040 # counst u32 *key, const u32 *counter)
0041
0042 #define OUT %r2
0043 #define INP %r3
0044 #define LEN %r4
0045 #define KEY %r5
0046 #define COUNTER %r6
0047
0048 #define BEPERM %v31
0049 #define CTR %v26
0050
0051 #define K0 %v16
0052 #define K1 %v17
0053 #define K2 %v18
0054 #define K3 %v19
0055
0056 #define XA0 %v0
0057 #define XA1 %v1
0058 #define XA2 %v2
0059 #define XA3 %v3
0060
0061 #define XB0 %v4
0062 #define XB1 %v5
0063 #define XB2 %v6
0064 #define XB3 %v7
0065
0066 #define XC0 %v8
0067 #define XC1 %v9
0068 #define XC2 %v10
0069 #define XC3 %v11
0070
0071 #define XD0 %v12
0072 #define XD1 %v13
0073 #define XD2 %v14
0074 #define XD3 %v15
0075
0076 #define XT0 %v27
0077 #define XT1 %v28
0078 #define XT2 %v29
0079 #define XT3 %v30
0080
0081 ENTRY(chacha20_vx_4x)
0082 stmg %r6,%r7,6*8(SP)
0083
0084 larl %r7,.Lsigma
0085 lhi %r0,10
0086 lhi %r1,0
0087
0088 VL K0,0,,%r7 # load sigma
0089 VL K1,0,,KEY # load key
0090 VL K2,16,,KEY
0091 VL K3,0,,COUNTER # load counter
0092
0093 VL BEPERM,0x40,,%r7
0094 VL CTR,0x50,,%r7
0095
0096 VLM XA0,XA3,0x60,%r7,4 # load [smashed] sigma
0097
0098 VREPF XB0,K1,0 # smash the key
0099 VREPF XB1,K1,1
0100 VREPF XB2,K1,2
0101 VREPF XB3,K1,3
0102
0103 VREPF XD0,K3,0
0104 VREPF XD1,K3,1
0105 VREPF XD2,K3,2
0106 VREPF XD3,K3,3
0107 VAF XD0,XD0,CTR
0108
0109 VREPF XC0,K2,0
0110 VREPF XC1,K2,1
0111 VREPF XC2,K2,2
0112 VREPF XC3,K2,3
0113
0114 .Loop_4x:
0115 VAF XA0,XA0,XB0
0116 VX XD0,XD0,XA0
0117 VERLLF XD0,XD0,16
0118
0119 VAF XA1,XA1,XB1
0120 VX XD1,XD1,XA1
0121 VERLLF XD1,XD1,16
0122
0123 VAF XA2,XA2,XB2
0124 VX XD2,XD2,XA2
0125 VERLLF XD2,XD2,16
0126
0127 VAF XA3,XA3,XB3
0128 VX XD3,XD3,XA3
0129 VERLLF XD3,XD3,16
0130
0131 VAF XC0,XC0,XD0
0132 VX XB0,XB0,XC0
0133 VERLLF XB0,XB0,12
0134
0135 VAF XC1,XC1,XD1
0136 VX XB1,XB1,XC1
0137 VERLLF XB1,XB1,12
0138
0139 VAF XC2,XC2,XD2
0140 VX XB2,XB2,XC2
0141 VERLLF XB2,XB2,12
0142
0143 VAF XC3,XC3,XD3
0144 VX XB3,XB3,XC3
0145 VERLLF XB3,XB3,12
0146
0147 VAF XA0,XA0,XB0
0148 VX XD0,XD0,XA0
0149 VERLLF XD0,XD0,8
0150
0151 VAF XA1,XA1,XB1
0152 VX XD1,XD1,XA1
0153 VERLLF XD1,XD1,8
0154
0155 VAF XA2,XA2,XB2
0156 VX XD2,XD2,XA2
0157 VERLLF XD2,XD2,8
0158
0159 VAF XA3,XA3,XB3
0160 VX XD3,XD3,XA3
0161 VERLLF XD3,XD3,8
0162
0163 VAF XC0,XC0,XD0
0164 VX XB0,XB0,XC0
0165 VERLLF XB0,XB0,7
0166
0167 VAF XC1,XC1,XD1
0168 VX XB1,XB1,XC1
0169 VERLLF XB1,XB1,7
0170
0171 VAF XC2,XC2,XD2
0172 VX XB2,XB2,XC2
0173 VERLLF XB2,XB2,7
0174
0175 VAF XC3,XC3,XD3
0176 VX XB3,XB3,XC3
0177 VERLLF XB3,XB3,7
0178
0179 VAF XA0,XA0,XB1
0180 VX XD3,XD3,XA0
0181 VERLLF XD3,XD3,16
0182
0183 VAF XA1,XA1,XB2
0184 VX XD0,XD0,XA1
0185 VERLLF XD0,XD0,16
0186
0187 VAF XA2,XA2,XB3
0188 VX XD1,XD1,XA2
0189 VERLLF XD1,XD1,16
0190
0191 VAF XA3,XA3,XB0
0192 VX XD2,XD2,XA3
0193 VERLLF XD2,XD2,16
0194
0195 VAF XC2,XC2,XD3
0196 VX XB1,XB1,XC2
0197 VERLLF XB1,XB1,12
0198
0199 VAF XC3,XC3,XD0
0200 VX XB2,XB2,XC3
0201 VERLLF XB2,XB2,12
0202
0203 VAF XC0,XC0,XD1
0204 VX XB3,XB3,XC0
0205 VERLLF XB3,XB3,12
0206
0207 VAF XC1,XC1,XD2
0208 VX XB0,XB0,XC1
0209 VERLLF XB0,XB0,12
0210
0211 VAF XA0,XA0,XB1
0212 VX XD3,XD3,XA0
0213 VERLLF XD3,XD3,8
0214
0215 VAF XA1,XA1,XB2
0216 VX XD0,XD0,XA1
0217 VERLLF XD0,XD0,8
0218
0219 VAF XA2,XA2,XB3
0220 VX XD1,XD1,XA2
0221 VERLLF XD1,XD1,8
0222
0223 VAF XA3,XA3,XB0
0224 VX XD2,XD2,XA3
0225 VERLLF XD2,XD2,8
0226
0227 VAF XC2,XC2,XD3
0228 VX XB1,XB1,XC2
0229 VERLLF XB1,XB1,7
0230
0231 VAF XC3,XC3,XD0
0232 VX XB2,XB2,XC3
0233 VERLLF XB2,XB2,7
0234
0235 VAF XC0,XC0,XD1
0236 VX XB3,XB3,XC0
0237 VERLLF XB3,XB3,7
0238
0239 VAF XC1,XC1,XD2
0240 VX XB0,XB0,XC1
0241 VERLLF XB0,XB0,7
0242 brct %r0,.Loop_4x
0243
0244 VAF XD0,XD0,CTR
0245
0246 VMRHF XT0,XA0,XA1 # transpose data
0247 VMRHF XT1,XA2,XA3
0248 VMRLF XT2,XA0,XA1
0249 VMRLF XT3,XA2,XA3
0250 VPDI XA0,XT0,XT1,0b0000
0251 VPDI XA1,XT0,XT1,0b0101
0252 VPDI XA2,XT2,XT3,0b0000
0253 VPDI XA3,XT2,XT3,0b0101
0254
0255 VMRHF XT0,XB0,XB1
0256 VMRHF XT1,XB2,XB3
0257 VMRLF XT2,XB0,XB1
0258 VMRLF XT3,XB2,XB3
0259 VPDI XB0,XT0,XT1,0b0000
0260 VPDI XB1,XT0,XT1,0b0101
0261 VPDI XB2,XT2,XT3,0b0000
0262 VPDI XB3,XT2,XT3,0b0101
0263
0264 VMRHF XT0,XC0,XC1
0265 VMRHF XT1,XC2,XC3
0266 VMRLF XT2,XC0,XC1
0267 VMRLF XT3,XC2,XC3
0268 VPDI XC0,XT0,XT1,0b0000
0269 VPDI XC1,XT0,XT1,0b0101
0270 VPDI XC2,XT2,XT3,0b0000
0271 VPDI XC3,XT2,XT3,0b0101
0272
0273 VMRHF XT0,XD0,XD1
0274 VMRHF XT1,XD2,XD3
0275 VMRLF XT2,XD0,XD1
0276 VMRLF XT3,XD2,XD3
0277 VPDI XD0,XT0,XT1,0b0000
0278 VPDI XD1,XT0,XT1,0b0101
0279 VPDI XD2,XT2,XT3,0b0000
0280 VPDI XD3,XT2,XT3,0b0101
0281
0282 VAF XA0,XA0,K0
0283 VAF XB0,XB0,K1
0284 VAF XC0,XC0,K2
0285 VAF XD0,XD0,K3
0286
0287 VPERM XA0,XA0,XA0,BEPERM
0288 VPERM XB0,XB0,XB0,BEPERM
0289 VPERM XC0,XC0,XC0,BEPERM
0290 VPERM XD0,XD0,XD0,BEPERM
0291
0292 VLM XT0,XT3,0,INP,0
0293
0294 VX XT0,XT0,XA0
0295 VX XT1,XT1,XB0
0296 VX XT2,XT2,XC0
0297 VX XT3,XT3,XD0
0298
0299 VSTM XT0,XT3,0,OUT,0
0300
0301 la INP,0x40(INP)
0302 la OUT,0x40(OUT)
0303 aghi LEN,-0x40
0304
0305 VAF XA0,XA1,K0
0306 VAF XB0,XB1,K1
0307 VAF XC0,XC1,K2
0308 VAF XD0,XD1,K3
0309
0310 VPERM XA0,XA0,XA0,BEPERM
0311 VPERM XB0,XB0,XB0,BEPERM
0312 VPERM XC0,XC0,XC0,BEPERM
0313 VPERM XD0,XD0,XD0,BEPERM
0314
0315 clgfi LEN,0x40
0316 jl .Ltail_4x
0317
0318 VLM XT0,XT3,0,INP,0
0319
0320 VX XT0,XT0,XA0
0321 VX XT1,XT1,XB0
0322 VX XT2,XT2,XC0
0323 VX XT3,XT3,XD0
0324
0325 VSTM XT0,XT3,0,OUT,0
0326
0327 la INP,0x40(INP)
0328 la OUT,0x40(OUT)
0329 aghi LEN,-0x40
0330 je .Ldone_4x
0331
0332 VAF XA0,XA2,K0
0333 VAF XB0,XB2,K1
0334 VAF XC0,XC2,K2
0335 VAF XD0,XD2,K3
0336
0337 VPERM XA0,XA0,XA0,BEPERM
0338 VPERM XB0,XB0,XB0,BEPERM
0339 VPERM XC0,XC0,XC0,BEPERM
0340 VPERM XD0,XD0,XD0,BEPERM
0341
0342 clgfi LEN,0x40
0343 jl .Ltail_4x
0344
0345 VLM XT0,XT3,0,INP,0
0346
0347 VX XT0,XT0,XA0
0348 VX XT1,XT1,XB0
0349 VX XT2,XT2,XC0
0350 VX XT3,XT3,XD0
0351
0352 VSTM XT0,XT3,0,OUT,0
0353
0354 la INP,0x40(INP)
0355 la OUT,0x40(OUT)
0356 aghi LEN,-0x40
0357 je .Ldone_4x
0358
0359 VAF XA0,XA3,K0
0360 VAF XB0,XB3,K1
0361 VAF XC0,XC3,K2
0362 VAF XD0,XD3,K3
0363
0364 VPERM XA0,XA0,XA0,BEPERM
0365 VPERM XB0,XB0,XB0,BEPERM
0366 VPERM XC0,XC0,XC0,BEPERM
0367 VPERM XD0,XD0,XD0,BEPERM
0368
0369 clgfi LEN,0x40
0370 jl .Ltail_4x
0371
0372 VLM XT0,XT3,0,INP,0
0373
0374 VX XT0,XT0,XA0
0375 VX XT1,XT1,XB0
0376 VX XT2,XT2,XC0
0377 VX XT3,XT3,XD0
0378
0379 VSTM XT0,XT3,0,OUT,0
0380
0381 .Ldone_4x:
0382 lmg %r6,%r7,6*8(SP)
0383 BR_EX %r14
0384
0385 .Ltail_4x:
0386 VLR XT0,XC0
0387 VLR XT1,XD0
0388
0389 VST XA0,8*8+0x00,,SP
0390 VST XB0,8*8+0x10,,SP
0391 VST XT0,8*8+0x20,,SP
0392 VST XT1,8*8+0x30,,SP
0393
0394 lghi %r1,0
0395
0396 .Loop_tail_4x:
0397 llgc %r5,0(%r1,INP)
0398 llgc %r6,8*8(%r1,SP)
0399 xr %r6,%r5
0400 stc %r6,0(%r1,OUT)
0401 la %r1,1(%r1)
0402 brct LEN,.Loop_tail_4x
0403
0404 lmg %r6,%r7,6*8(SP)
0405 BR_EX %r14
0406 ENDPROC(chacha20_vx_4x)
0407
0408 #undef OUT
0409 #undef INP
0410 #undef LEN
0411 #undef KEY
0412 #undef COUNTER
0413
0414 #undef BEPERM
0415
0416 #undef K0
0417 #undef K1
0418 #undef K2
0419 #undef K3
0420
0421
0422 #############################################################################
0423 # void chacha20_vx(u8 *out, counst u8 *inp, size_t len,
0424 # counst u32 *key, const u32 *counter)
0425
0426 #define OUT %r2
0427 #define INP %r3
0428 #define LEN %r4
0429 #define KEY %r5
0430 #define COUNTER %r6
0431
0432 #define BEPERM %v31
0433
0434 #define K0 %v27
0435 #define K1 %v24
0436 #define K2 %v25
0437 #define K3 %v26
0438
0439 #define A0 %v0
0440 #define B0 %v1
0441 #define C0 %v2
0442 #define D0 %v3
0443
0444 #define A1 %v4
0445 #define B1 %v5
0446 #define C1 %v6
0447 #define D1 %v7
0448
0449 #define A2 %v8
0450 #define B2 %v9
0451 #define C2 %v10
0452 #define D2 %v11
0453
0454 #define A3 %v12
0455 #define B3 %v13
0456 #define C3 %v14
0457 #define D3 %v15
0458
0459 #define A4 %v16
0460 #define B4 %v17
0461 #define C4 %v18
0462 #define D4 %v19
0463
0464 #define A5 %v20
0465 #define B5 %v21
0466 #define C5 %v22
0467 #define D5 %v23
0468
0469 #define T0 %v27
0470 #define T1 %v28
0471 #define T2 %v29
0472 #define T3 %v30
0473
0474 ENTRY(chacha20_vx)
0475 clgfi LEN,256
0476 jle chacha20_vx_4x
0477 stmg %r6,%r7,6*8(SP)
0478
0479 lghi %r1,-FRAME
0480 lgr %r0,SP
0481 la SP,0(%r1,SP)
0482 stg %r0,0(SP) # back-chain
0483
0484 larl %r7,.Lsigma
0485 lhi %r0,10
0486
0487 VLM K1,K2,0,KEY,0 # load key
0488 VL K3,0,,COUNTER # load counter
0489
0490 VLM K0,BEPERM,0,%r7,4 # load sigma, increments, ...
0491
0492 .Loop_outer_vx:
0493 VLR A0,K0
0494 VLR B0,K1
0495 VLR A1,K0
0496 VLR B1,K1
0497 VLR A2,K0
0498 VLR B2,K1
0499 VLR A3,K0
0500 VLR B3,K1
0501 VLR A4,K0
0502 VLR B4,K1
0503 VLR A5,K0
0504 VLR B5,K1
0505
0506 VLR D0,K3
0507 VAF D1,K3,T1 # K[3]+1
0508 VAF D2,K3,T2 # K[3]+2
0509 VAF D3,K3,T3 # K[3]+3
0510 VAF D4,D2,T2 # K[3]+4
0511 VAF D5,D2,T3 # K[3]+5
0512
0513 VLR C0,K2
0514 VLR C1,K2
0515 VLR C2,K2
0516 VLR C3,K2
0517 VLR C4,K2
0518 VLR C5,K2
0519
0520 VLR T1,D1
0521 VLR T2,D2
0522 VLR T3,D3
0523
0524 .Loop_vx:
0525 VAF A0,A0,B0
0526 VAF A1,A1,B1
0527 VAF A2,A2,B2
0528 VAF A3,A3,B3
0529 VAF A4,A4,B4
0530 VAF A5,A5,B5
0531 VX D0,D0,A0
0532 VX D1,D1,A1
0533 VX D2,D2,A2
0534 VX D3,D3,A3
0535 VX D4,D4,A4
0536 VX D5,D5,A5
0537 VERLLF D0,D0,16
0538 VERLLF D1,D1,16
0539 VERLLF D2,D2,16
0540 VERLLF D3,D3,16
0541 VERLLF D4,D4,16
0542 VERLLF D5,D5,16
0543
0544 VAF C0,C0,D0
0545 VAF C1,C1,D1
0546 VAF C2,C2,D2
0547 VAF C3,C3,D3
0548 VAF C4,C4,D4
0549 VAF C5,C5,D5
0550 VX B0,B0,C0
0551 VX B1,B1,C1
0552 VX B2,B2,C2
0553 VX B3,B3,C3
0554 VX B4,B4,C4
0555 VX B5,B5,C5
0556 VERLLF B0,B0,12
0557 VERLLF B1,B1,12
0558 VERLLF B2,B2,12
0559 VERLLF B3,B3,12
0560 VERLLF B4,B4,12
0561 VERLLF B5,B5,12
0562
0563 VAF A0,A0,B0
0564 VAF A1,A1,B1
0565 VAF A2,A2,B2
0566 VAF A3,A3,B3
0567 VAF A4,A4,B4
0568 VAF A5,A5,B5
0569 VX D0,D0,A0
0570 VX D1,D1,A1
0571 VX D2,D2,A2
0572 VX D3,D3,A3
0573 VX D4,D4,A4
0574 VX D5,D5,A5
0575 VERLLF D0,D0,8
0576 VERLLF D1,D1,8
0577 VERLLF D2,D2,8
0578 VERLLF D3,D3,8
0579 VERLLF D4,D4,8
0580 VERLLF D5,D5,8
0581
0582 VAF C0,C0,D0
0583 VAF C1,C1,D1
0584 VAF C2,C2,D2
0585 VAF C3,C3,D3
0586 VAF C4,C4,D4
0587 VAF C5,C5,D5
0588 VX B0,B0,C0
0589 VX B1,B1,C1
0590 VX B2,B2,C2
0591 VX B3,B3,C3
0592 VX B4,B4,C4
0593 VX B5,B5,C5
0594 VERLLF B0,B0,7
0595 VERLLF B1,B1,7
0596 VERLLF B2,B2,7
0597 VERLLF B3,B3,7
0598 VERLLF B4,B4,7
0599 VERLLF B5,B5,7
0600
0601 VSLDB C0,C0,C0,8
0602 VSLDB C1,C1,C1,8
0603 VSLDB C2,C2,C2,8
0604 VSLDB C3,C3,C3,8
0605 VSLDB C4,C4,C4,8
0606 VSLDB C5,C5,C5,8
0607 VSLDB B0,B0,B0,4
0608 VSLDB B1,B1,B1,4
0609 VSLDB B2,B2,B2,4
0610 VSLDB B3,B3,B3,4
0611 VSLDB B4,B4,B4,4
0612 VSLDB B5,B5,B5,4
0613 VSLDB D0,D0,D0,12
0614 VSLDB D1,D1,D1,12
0615 VSLDB D2,D2,D2,12
0616 VSLDB D3,D3,D3,12
0617 VSLDB D4,D4,D4,12
0618 VSLDB D5,D5,D5,12
0619
0620 VAF A0,A0,B0
0621 VAF A1,A1,B1
0622 VAF A2,A2,B2
0623 VAF A3,A3,B3
0624 VAF A4,A4,B4
0625 VAF A5,A5,B5
0626 VX D0,D0,A0
0627 VX D1,D1,A1
0628 VX D2,D2,A2
0629 VX D3,D3,A3
0630 VX D4,D4,A4
0631 VX D5,D5,A5
0632 VERLLF D0,D0,16
0633 VERLLF D1,D1,16
0634 VERLLF D2,D2,16
0635 VERLLF D3,D3,16
0636 VERLLF D4,D4,16
0637 VERLLF D5,D5,16
0638
0639 VAF C0,C0,D0
0640 VAF C1,C1,D1
0641 VAF C2,C2,D2
0642 VAF C3,C3,D3
0643 VAF C4,C4,D4
0644 VAF C5,C5,D5
0645 VX B0,B0,C0
0646 VX B1,B1,C1
0647 VX B2,B2,C2
0648 VX B3,B3,C3
0649 VX B4,B4,C4
0650 VX B5,B5,C5
0651 VERLLF B0,B0,12
0652 VERLLF B1,B1,12
0653 VERLLF B2,B2,12
0654 VERLLF B3,B3,12
0655 VERLLF B4,B4,12
0656 VERLLF B5,B5,12
0657
0658 VAF A0,A0,B0
0659 VAF A1,A1,B1
0660 VAF A2,A2,B2
0661 VAF A3,A3,B3
0662 VAF A4,A4,B4
0663 VAF A5,A5,B5
0664 VX D0,D0,A0
0665 VX D1,D1,A1
0666 VX D2,D2,A2
0667 VX D3,D3,A3
0668 VX D4,D4,A4
0669 VX D5,D5,A5
0670 VERLLF D0,D0,8
0671 VERLLF D1,D1,8
0672 VERLLF D2,D2,8
0673 VERLLF D3,D3,8
0674 VERLLF D4,D4,8
0675 VERLLF D5,D5,8
0676
0677 VAF C0,C0,D0
0678 VAF C1,C1,D1
0679 VAF C2,C2,D2
0680 VAF C3,C3,D3
0681 VAF C4,C4,D4
0682 VAF C5,C5,D5
0683 VX B0,B0,C0
0684 VX B1,B1,C1
0685 VX B2,B2,C2
0686 VX B3,B3,C3
0687 VX B4,B4,C4
0688 VX B5,B5,C5
0689 VERLLF B0,B0,7
0690 VERLLF B1,B1,7
0691 VERLLF B2,B2,7
0692 VERLLF B3,B3,7
0693 VERLLF B4,B4,7
0694 VERLLF B5,B5,7
0695
0696 VSLDB C0,C0,C0,8
0697 VSLDB C1,C1,C1,8
0698 VSLDB C2,C2,C2,8
0699 VSLDB C3,C3,C3,8
0700 VSLDB C4,C4,C4,8
0701 VSLDB C5,C5,C5,8
0702 VSLDB B0,B0,B0,12
0703 VSLDB B1,B1,B1,12
0704 VSLDB B2,B2,B2,12
0705 VSLDB B3,B3,B3,12
0706 VSLDB B4,B4,B4,12
0707 VSLDB B5,B5,B5,12
0708 VSLDB D0,D0,D0,4
0709 VSLDB D1,D1,D1,4
0710 VSLDB D2,D2,D2,4
0711 VSLDB D3,D3,D3,4
0712 VSLDB D4,D4,D4,4
0713 VSLDB D5,D5,D5,4
0714 brct %r0,.Loop_vx
0715
0716 VAF A0,A0,K0
0717 VAF B0,B0,K1
0718 VAF C0,C0,K2
0719 VAF D0,D0,K3
0720 VAF A1,A1,K0
0721 VAF D1,D1,T1 # +K[3]+1
0722
0723 VPERM A0,A0,A0,BEPERM
0724 VPERM B0,B0,B0,BEPERM
0725 VPERM C0,C0,C0,BEPERM
0726 VPERM D0,D0,D0,BEPERM
0727
0728 clgfi LEN,0x40
0729 jl .Ltail_vx
0730
0731 VAF D2,D2,T2 # +K[3]+2
0732 VAF D3,D3,T3 # +K[3]+3
0733 VLM T0,T3,0,INP,0
0734
0735 VX A0,A0,T0
0736 VX B0,B0,T1
0737 VX C0,C0,T2
0738 VX D0,D0,T3
0739
0740 VLM K0,T3,0,%r7,4 # re-load sigma and increments
0741
0742 VSTM A0,D0,0,OUT,0
0743
0744 la INP,0x40(INP)
0745 la OUT,0x40(OUT)
0746 aghi LEN,-0x40
0747 je .Ldone_vx
0748
0749 VAF B1,B1,K1
0750 VAF C1,C1,K2
0751
0752 VPERM A0,A1,A1,BEPERM
0753 VPERM B0,B1,B1,BEPERM
0754 VPERM C0,C1,C1,BEPERM
0755 VPERM D0,D1,D1,BEPERM
0756
0757 clgfi LEN,0x40
0758 jl .Ltail_vx
0759
0760 VLM A1,D1,0,INP,0
0761
0762 VX A0,A0,A1
0763 VX B0,B0,B1
0764 VX C0,C0,C1
0765 VX D0,D0,D1
0766
0767 VSTM A0,D0,0,OUT,0
0768
0769 la INP,0x40(INP)
0770 la OUT,0x40(OUT)
0771 aghi LEN,-0x40
0772 je .Ldone_vx
0773
0774 VAF A2,A2,K0
0775 VAF B2,B2,K1
0776 VAF C2,C2,K2
0777
0778 VPERM A0,A2,A2,BEPERM
0779 VPERM B0,B2,B2,BEPERM
0780 VPERM C0,C2,C2,BEPERM
0781 VPERM D0,D2,D2,BEPERM
0782
0783 clgfi LEN,0x40
0784 jl .Ltail_vx
0785
0786 VLM A1,D1,0,INP,0
0787
0788 VX A0,A0,A1
0789 VX B0,B0,B1
0790 VX C0,C0,C1
0791 VX D0,D0,D1
0792
0793 VSTM A0,D0,0,OUT,0
0794
0795 la INP,0x40(INP)
0796 la OUT,0x40(OUT)
0797 aghi LEN,-0x40
0798 je .Ldone_vx
0799
0800 VAF A3,A3,K0
0801 VAF B3,B3,K1
0802 VAF C3,C3,K2
0803 VAF D2,K3,T3 # K[3]+3
0804
0805 VPERM A0,A3,A3,BEPERM
0806 VPERM B0,B3,B3,BEPERM
0807 VPERM C0,C3,C3,BEPERM
0808 VPERM D0,D3,D3,BEPERM
0809
0810 clgfi LEN,0x40
0811 jl .Ltail_vx
0812
0813 VAF D3,D2,T1 # K[3]+4
0814 VLM A1,D1,0,INP,0
0815
0816 VX A0,A0,A1
0817 VX B0,B0,B1
0818 VX C0,C0,C1
0819 VX D0,D0,D1
0820
0821 VSTM A0,D0,0,OUT,0
0822
0823 la INP,0x40(INP)
0824 la OUT,0x40(OUT)
0825 aghi LEN,-0x40
0826 je .Ldone_vx
0827
0828 VAF A4,A4,K0
0829 VAF B4,B4,K1
0830 VAF C4,C4,K2
0831 VAF D4,D4,D3 # +K[3]+4
0832 VAF D3,D3,T1 # K[3]+5
0833 VAF K3,D2,T3 # K[3]+=6
0834
0835 VPERM A0,A4,A4,BEPERM
0836 VPERM B0,B4,B4,BEPERM
0837 VPERM C0,C4,C4,BEPERM
0838 VPERM D0,D4,D4,BEPERM
0839
0840 clgfi LEN,0x40
0841 jl .Ltail_vx
0842
0843 VLM A1,D1,0,INP,0
0844
0845 VX A0,A0,A1
0846 VX B0,B0,B1
0847 VX C0,C0,C1
0848 VX D0,D0,D1
0849
0850 VSTM A0,D0,0,OUT,0
0851
0852 la INP,0x40(INP)
0853 la OUT,0x40(OUT)
0854 aghi LEN,-0x40
0855 je .Ldone_vx
0856
0857 VAF A5,A5,K0
0858 VAF B5,B5,K1
0859 VAF C5,C5,K2
0860 VAF D5,D5,D3 # +K[3]+5
0861
0862 VPERM A0,A5,A5,BEPERM
0863 VPERM B0,B5,B5,BEPERM
0864 VPERM C0,C5,C5,BEPERM
0865 VPERM D0,D5,D5,BEPERM
0866
0867 clgfi LEN,0x40
0868 jl .Ltail_vx
0869
0870 VLM A1,D1,0,INP,0
0871
0872 VX A0,A0,A1
0873 VX B0,B0,B1
0874 VX C0,C0,C1
0875 VX D0,D0,D1
0876
0877 VSTM A0,D0,0,OUT,0
0878
0879 la INP,0x40(INP)
0880 la OUT,0x40(OUT)
0881 lhi %r0,10
0882 aghi LEN,-0x40
0883 jne .Loop_outer_vx
0884
0885 .Ldone_vx:
0886 lmg %r6,%r7,FRAME+6*8(SP)
0887 la SP,FRAME(SP)
0888 BR_EX %r14
0889
0890 .Ltail_vx:
0891 VSTM A0,D0,8*8,SP,3
0892 lghi %r1,0
0893
0894 .Loop_tail_vx:
0895 llgc %r5,0(%r1,INP)
0896 llgc %r6,8*8(%r1,SP)
0897 xr %r6,%r5
0898 stc %r6,0(%r1,OUT)
0899 la %r1,1(%r1)
0900 brct LEN,.Loop_tail_vx
0901
0902 lmg %r6,%r7,FRAME+6*8(SP)
0903 la SP,FRAME(SP)
0904 BR_EX %r14
0905 ENDPROC(chacha20_vx)
0906
0907 .previous