Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Original implementation written by Andy Polyakov, @dot-asm.
0004  * This is an adaptation of the original code for kernel use.
0005  *
0006  * Copyright (C) 2006-2019 CRYPTOGAMS by <appro@openssl.org>. All Rights Reserved.
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