aesp8-ppc.pl: add optimized CBC decrypt.
This commit is contained in:
parent
b83d09f552
commit
fda29b6db0
@ -24,12 +24,14 @@ if ($flavour =~ /64/) {
|
|||||||
$STU ="stdu";
|
$STU ="stdu";
|
||||||
$POP ="ld";
|
$POP ="ld";
|
||||||
$PUSH ="std";
|
$PUSH ="std";
|
||||||
|
$UCMP ="cmpld";
|
||||||
} elsif ($flavour =~ /32/) {
|
} elsif ($flavour =~ /32/) {
|
||||||
$SIZE_T =4;
|
$SIZE_T =4;
|
||||||
$LRSAVE =$SIZE_T;
|
$LRSAVE =$SIZE_T;
|
||||||
$STU ="stwu";
|
$STU ="stwu";
|
||||||
$POP ="lwz";
|
$POP ="lwz";
|
||||||
$PUSH ="stw";
|
$PUSH ="stw";
|
||||||
|
$UCMP ="cmplw";
|
||||||
} else { die "nonsense $flavour"; }
|
} else { die "nonsense $flavour"; }
|
||||||
|
|
||||||
$LITTLE_ENDIAN = ($flavour=~/le$/) ? $SIZE_T : 0;
|
$LITTLE_ENDIAN = ($flavour=~/le$/) ? $SIZE_T : 0;
|
||||||
@ -79,7 +81,7 @@ Lconsts:
|
|||||||
.${prefix}_set_encrypt_key:
|
.${prefix}_set_encrypt_key:
|
||||||
Lset_encrypt_key:
|
Lset_encrypt_key:
|
||||||
mflr r11
|
mflr r11
|
||||||
li r0,0xfff
|
lis r0,0xfff0
|
||||||
$PUSH r11,$LRSAVE($sp)
|
$PUSH r11,$LRSAVE($sp)
|
||||||
mfspr $vrsave,256
|
mfspr $vrsave,256
|
||||||
mtspr 256,r0
|
mtspr 256,r0
|
||||||
@ -369,14 +371,17 @@ Ldeckey:
|
|||||||
___
|
___
|
||||||
}}}
|
}}}
|
||||||
{{{
|
{{{
|
||||||
|
sub gen_block () {
|
||||||
|
my $dir = shift;
|
||||||
|
my $n = $dir eq "de" ? "n" : "";
|
||||||
my ($inp,$out,$key,$rounds,$idx)=map("r$_",(3..7));
|
my ($inp,$out,$key,$rounds,$idx)=map("r$_",(3..7));
|
||||||
|
|
||||||
$code.=<<___;
|
$code.=<<___;
|
||||||
.globl .${prefix}_encrypt
|
.globl .${prefix}_${dir}crypt
|
||||||
.align 5
|
.align 5
|
||||||
.${prefix}_encrypt:
|
.${prefix}_${dir}crypt:
|
||||||
lwz $rounds,240($key)
|
lwz $rounds,240($key)
|
||||||
li r0,0x3f
|
lis r0,0xfc00
|
||||||
mfspr $vrsave,256
|
mfspr $vrsave,256
|
||||||
li $idx,15 # 15 is not typo
|
li $idx,15 # 15 is not typo
|
||||||
mtspr 256,r0
|
mtspr 256,r0
|
||||||
@ -403,22 +408,22 @@ $code.=<<___;
|
|||||||
addi $idx,$idx,16
|
addi $idx,$idx,16
|
||||||
mtctr $rounds
|
mtctr $rounds
|
||||||
|
|
||||||
Loop_enc:
|
Loop_${dir}c:
|
||||||
?vperm v2,v2,v1,v5
|
?vperm v2,v2,v1,v5
|
||||||
vcipher v0,v0,v2
|
v${n}cipher v0,v0,v2
|
||||||
lvx v2,$idx,$key
|
lvx v2,$idx,$key
|
||||||
addi $idx,$idx,16
|
addi $idx,$idx,16
|
||||||
?vperm v1,v1,v2,v5
|
?vperm v1,v1,v2,v5
|
||||||
vcipher v0,v0,v1
|
v${n}cipher v0,v0,v1
|
||||||
lvx v1,$idx,$key
|
lvx v1,$idx,$key
|
||||||
addi $idx,$idx,16
|
addi $idx,$idx,16
|
||||||
bdnz Loop_enc
|
bdnz Loop_${dir}c
|
||||||
|
|
||||||
?vperm v2,v2,v1,v5
|
?vperm v2,v2,v1,v5
|
||||||
vcipher v0,v0,v2
|
v${n}cipher v0,v0,v2
|
||||||
lvx v2,$idx,$key
|
lvx v2,$idx,$key
|
||||||
?vperm v1,v1,v2,v5
|
?vperm v1,v1,v2,v5
|
||||||
vcipherlast v0,v0,v1
|
v${n}cipherlast v0,v0,v1
|
||||||
|
|
||||||
vspltisb v2,-1
|
vspltisb v2,-1
|
||||||
vxor v1,v1,v1
|
vxor v1,v1,v1
|
||||||
@ -437,90 +442,26 @@ Loop_enc:
|
|||||||
blr
|
blr
|
||||||
.long 0
|
.long 0
|
||||||
.byte 0,12,0x14,0,0,0,3,0
|
.byte 0,12,0x14,0,0,0,3,0
|
||||||
.size .${prefix}_encrypt,.-.${prefix}_encrypt
|
.size .${prefix}_${dir}crypt,.-.${prefix}_${dir}crypt
|
||||||
|
|
||||||
.globl .${prefix}_decrypt
|
|
||||||
.align 5
|
|
||||||
.${prefix}_decrypt:
|
|
||||||
lwz $rounds,240($key)
|
|
||||||
li r0,0x3f
|
|
||||||
mfspr $vrsave,256
|
|
||||||
li $idx,15 # 15 is not typo
|
|
||||||
mtspr 256,r0
|
|
||||||
|
|
||||||
lvx v0,0,$inp
|
|
||||||
neg r11,$out
|
|
||||||
lvx v1,$idx,$inp
|
|
||||||
lvsl v2,0,$inp # inpperm
|
|
||||||
`"vspltisb v4,0x0f" if ($LITTLE_ENDIAN)`
|
|
||||||
?lvsl v3,0,r11 # outperm
|
|
||||||
`"vxor v2,v2,v4" if ($LITTLE_ENDIAN)`
|
|
||||||
li $idx,16
|
|
||||||
vperm v0,v0,v1,v2 # align [and byte swap in LE]
|
|
||||||
lvx v1,0,$key
|
|
||||||
?lvsl v5,0,$key # keyperm
|
|
||||||
srwi $rounds,$rounds,1
|
|
||||||
lvx v2,$idx,$key
|
|
||||||
addi $idx,$idx,16
|
|
||||||
subi $rounds,$rounds,1
|
|
||||||
?vperm v1,v1,v2,v5 # align round key
|
|
||||||
|
|
||||||
vxor v0,v0,v1
|
|
||||||
lvx v1,$idx,$key
|
|
||||||
addi $idx,$idx,16
|
|
||||||
mtctr $rounds
|
|
||||||
|
|
||||||
Loop_dec:
|
|
||||||
?vperm v2,v2,v1,v5
|
|
||||||
vncipher v0,v0,v2
|
|
||||||
lvx v2,$idx,$key
|
|
||||||
addi $idx,$idx,16
|
|
||||||
?vperm v1,v1,v2,v5
|
|
||||||
vncipher v0,v0,v1
|
|
||||||
lvx v1,$idx,$key
|
|
||||||
addi $idx,$idx,16
|
|
||||||
bdnz Loop_dec
|
|
||||||
|
|
||||||
?vperm v2,v2,v1,v5
|
|
||||||
vncipher v0,v0,v2
|
|
||||||
lvx v2,$idx,$key
|
|
||||||
?vperm v1,v1,v2,v5
|
|
||||||
vncipherlast v0,v0,v1
|
|
||||||
|
|
||||||
vspltisb v2,-1
|
|
||||||
vxor v1,v1,v1
|
|
||||||
li $idx,15 # 15 is not typo
|
|
||||||
?vperm v2,v1,v2,v3 # outmask
|
|
||||||
`"vxor v3,v3,v4" if ($LITTLE_ENDIAN)`
|
|
||||||
lvx v1,0,$out # outhead
|
|
||||||
vperm v0,v0,v0,v3 # rotate [and byte swap in LE]
|
|
||||||
vsel v1,v1,v0,v2
|
|
||||||
lvx v4,$idx,$out
|
|
||||||
stvx v1,0,$out
|
|
||||||
vsel v0,v0,v4,v2
|
|
||||||
stvx v0,$idx,$out
|
|
||||||
|
|
||||||
mtspr 256,$vrsave
|
|
||||||
blr
|
|
||||||
.long 0
|
|
||||||
.byte 0,12,0x14,0,0,0,3,0
|
|
||||||
.size .${prefix}_decrypt,.-.${prefix}_decrypt
|
|
||||||
___
|
___
|
||||||
|
}
|
||||||
|
&gen_block("en");
|
||||||
|
&gen_block("de");
|
||||||
}}}
|
}}}
|
||||||
{{{
|
{{{
|
||||||
my ($inp,$out,$len,$key,$ivp,$enc,$rounds,$idx)=map("r$_",(3..10));
|
my ($inp,$out,$len,$key,$ivp,$enc,$rounds,$idx)=map("r$_",(3..10));
|
||||||
my ($rndkey0,$rndkey1,$inout,$ivec,$tmp)=map("v$_",(0..4));
|
my ($rndkey0,$rndkey1,$inout,$tmp)=map("v$_",(0..3));
|
||||||
my ($inptail,$inpperm,$outhead,$outperm,$outmask,$keyperm)=map("v$_",(5..10));
|
my ($ivec,$inptail,$inpperm,$outhead,$outperm,$outmask,$keyperm)=map("v$_",(4..10));
|
||||||
|
|
||||||
$code.=<<___;
|
$code.=<<___;
|
||||||
.globl .${prefix}_cbc_encrypt
|
.globl .${prefix}_cbc_encrypt
|
||||||
.align 5
|
.align 5
|
||||||
.${prefix}_cbc_encrypt:
|
.${prefix}_cbc_encrypt:
|
||||||
subic. $len,$len,16
|
${UCMP}i $len,16
|
||||||
bltlr-
|
bltlr-
|
||||||
|
|
||||||
cmpwi $enc,0 # test direction
|
cmpwi $enc,0 # test direction
|
||||||
li r0,0x7ff
|
lis r0,0xffe0
|
||||||
mfspr $vrsave,256
|
mfspr $vrsave,256
|
||||||
mtspr 256,r0
|
mtspr 256,r0
|
||||||
|
|
||||||
@ -534,10 +475,11 @@ $code.=<<___;
|
|||||||
`"vxor $inpperm,$inpperm,$tmp" if ($LITTLE_ENDIAN)`
|
`"vxor $inpperm,$inpperm,$tmp" if ($LITTLE_ENDIAN)`
|
||||||
vperm $ivec,$ivec,$inptail,$inpperm
|
vperm $ivec,$ivec,$inptail,$inpperm
|
||||||
|
|
||||||
|
neg r11,$inp
|
||||||
?lvsl $keyperm,0,$key # prepare for unaligned key
|
?lvsl $keyperm,0,$key # prepare for unaligned key
|
||||||
lwz $rounds,240($key)
|
lwz $rounds,240($key)
|
||||||
|
|
||||||
lvsl $inpperm,0,$inp # prepare for unaligned load
|
lvsr $inpperm,0,r11 # prepare for unaligned load
|
||||||
lvx $inptail,0,$inp
|
lvx $inptail,0,$inp
|
||||||
addi $inp,$inp,15 # 15 is not typo
|
addi $inp,$inp,15 # 15 is not typo
|
||||||
`"vxor $inpperm,$inpperm,$tmp" if ($LITTLE_ENDIAN)`
|
`"vxor $inpperm,$inpperm,$tmp" if ($LITTLE_ENDIAN)`
|
||||||
@ -558,6 +500,7 @@ Lcbc_enc:
|
|||||||
lvx $inptail,0,$inp
|
lvx $inptail,0,$inp
|
||||||
addi $inp,$inp,16
|
addi $inp,$inp,16
|
||||||
mtctr $rounds
|
mtctr $rounds
|
||||||
|
subi $len,$len,16 # len-=16
|
||||||
|
|
||||||
lvx $rndkey0,0,$key
|
lvx $rndkey0,0,$key
|
||||||
vperm $inout,$inout,$inptail,$inpperm
|
vperm $inout,$inout,$inptail,$inpperm
|
||||||
@ -586,7 +529,7 @@ Loop_cbc_enc:
|
|||||||
li $idx,16
|
li $idx,16
|
||||||
?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm
|
?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm
|
||||||
vcipherlast $ivec,$inout,$rndkey0
|
vcipherlast $ivec,$inout,$rndkey0
|
||||||
sub. $len,$len,$idx # len -=16
|
${UCMP}i $len,16
|
||||||
|
|
||||||
vperm $tmp,$ivec,$ivec,$outperm
|
vperm $tmp,$ivec,$ivec,$outperm
|
||||||
vsel $inout,$outhead,$tmp,$outmask
|
vsel $inout,$outhead,$tmp,$outmask
|
||||||
@ -599,10 +542,13 @@ Loop_cbc_enc:
|
|||||||
|
|
||||||
.align 4
|
.align 4
|
||||||
Lcbc_dec:
|
Lcbc_dec:
|
||||||
|
${UCMP}i $len,128
|
||||||
|
bge _aesp8_cbc_decrypt8x
|
||||||
vmr $tmp,$inptail
|
vmr $tmp,$inptail
|
||||||
lvx $inptail,0,$inp
|
lvx $inptail,0,$inp
|
||||||
addi $inp,$inp,16
|
addi $inp,$inp,16
|
||||||
mtctr $rounds
|
mtctr $rounds
|
||||||
|
subi $len,$len,16 # len-=16
|
||||||
|
|
||||||
lvx $rndkey0,0,$key
|
lvx $rndkey0,0,$key
|
||||||
vperm $tmp,$tmp,$inptail,$inpperm
|
vperm $tmp,$tmp,$inptail,$inpperm
|
||||||
@ -630,7 +576,7 @@ Loop_cbc_dec:
|
|||||||
li $idx,16
|
li $idx,16
|
||||||
?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm
|
?vperm $rndkey0,$rndkey0,$rndkey1,$keyperm
|
||||||
vncipherlast $inout,$inout,$rndkey0
|
vncipherlast $inout,$inout,$rndkey0
|
||||||
sub. $len,$len,$idx # len -=16
|
${UCMP}i $len,16
|
||||||
|
|
||||||
vxor $inout,$inout,$ivec
|
vxor $inout,$inout,$ivec
|
||||||
vmr $ivec,$tmp
|
vmr $ivec,$tmp
|
||||||
@ -667,9 +613,710 @@ Lcbc_done:
|
|||||||
blr
|
blr
|
||||||
.long 0
|
.long 0
|
||||||
.byte 0,12,0x14,0,0,0,6,0
|
.byte 0,12,0x14,0,0,0,6,0
|
||||||
|
___
|
||||||
|
{{
|
||||||
|
my $key_="r11";
|
||||||
|
my ($in0, $in1, $in2, $in3, $in4, $in5, $in6, $in7 )=map("v$_",(0..3,10..13));
|
||||||
|
my ($out0,$out1,$out2,$out3,$out4,$out5,$out6,$out7)=map("v$_",(14..21));
|
||||||
|
my $rndkey0="v23"; # v24-v25 rotating buffer for first found keys
|
||||||
|
# v26-v31 last 6 round keys
|
||||||
|
my ($tmp,$keyperm)=($in3,$in4); # aliases with "caller", redundant assignment
|
||||||
|
|
||||||
|
$code.=<<___;
|
||||||
|
.align 5
|
||||||
|
_aesp8_cbc_decrypt8x:
|
||||||
|
$STU $sp,-`($FRAME+21*16)`($sp)
|
||||||
|
li r10,`$FRAME+8*16+15`
|
||||||
|
li r11,`$FRAME+8*16+31`
|
||||||
|
stvx v20,r10,$sp # ABI says so
|
||||||
|
addi r10,r10,32
|
||||||
|
stvx v21,r11,$sp
|
||||||
|
addi r11,r11,32
|
||||||
|
stvx v22,r10,$sp
|
||||||
|
addi r10,r10,32
|
||||||
|
stvx v23,r11,$sp
|
||||||
|
addi r11,r11,32
|
||||||
|
stvx v24,r10,$sp
|
||||||
|
addi r10,r10,32
|
||||||
|
stvx v25,r11,$sp
|
||||||
|
addi r11,r11,32
|
||||||
|
stvx v26,r10,$sp
|
||||||
|
addi r10,r10,32
|
||||||
|
stvx v27,r11,$sp
|
||||||
|
addi r11,r11,32
|
||||||
|
stvx v28,r10,$sp
|
||||||
|
addi r10,r10,32
|
||||||
|
stvx v29,r11,$sp
|
||||||
|
addi r11,r11,32
|
||||||
|
stvx v30,r10,$sp
|
||||||
|
stvx v31,r11,$sp
|
||||||
|
stw $vrsave,`$FRAME+21*16-4`($sp) # save vrsave
|
||||||
|
li r0,-1
|
||||||
|
mtspr 256,r0
|
||||||
|
|
||||||
|
subi $rounds,$rounds,3 # -4 in total
|
||||||
|
subi $len,$len,128 # bias
|
||||||
|
|
||||||
|
addi $idx,$key,16 # load key schedule
|
||||||
|
lvx $rndkey0,0,$key
|
||||||
|
addi $key,$key,32
|
||||||
|
lvx v30,0,$idx
|
||||||
|
addi $idx,$idx,32
|
||||||
|
lvx v31,0,$key
|
||||||
|
addi $key,$key,32
|
||||||
|
?vperm $rndkey0,$rndkey0,v30,$keyperm
|
||||||
|
addi $key_,$sp,$FRAME+15
|
||||||
|
mtctr $rounds
|
||||||
|
|
||||||
|
Load_cbc_dec_key:
|
||||||
|
?vperm v24,v30,v31,$keyperm
|
||||||
|
lvx v30,0,$idx
|
||||||
|
addi $idx,$idx,32
|
||||||
|
stvx v24,0,$key_ # off-load round[1]
|
||||||
|
addi $key_,$key_,16
|
||||||
|
?vperm v25,v31,v30,$keyperm
|
||||||
|
lvx v31,0,$key
|
||||||
|
addi $key,$key,32
|
||||||
|
stvx v25,0,$key_ # off-load round[2]
|
||||||
|
addi $key_,$key_,16
|
||||||
|
bdnz Load_cbc_dec_key
|
||||||
|
|
||||||
|
lvx v26,0,$idx
|
||||||
|
addi $idx,$idx,32
|
||||||
|
?vperm v24,v30,v31,$keyperm
|
||||||
|
lvx v27,0,$key
|
||||||
|
addi $key,$key,32
|
||||||
|
stvx v24,0,$key_ # off-load round[3]
|
||||||
|
addi $key_,$key_,16
|
||||||
|
?vperm v25,v31,v26,$keyperm
|
||||||
|
lvx v28,0,$idx
|
||||||
|
addi $idx,$idx,32
|
||||||
|
stvx v25,0,$key_ # off-load round[4]
|
||||||
|
addi $key_,$sp,$FRAME+15 # rewind $key_
|
||||||
|
?vperm v26,v26,v27,$keyperm
|
||||||
|
lvx v29,0,$key
|
||||||
|
addi $key,$key,32
|
||||||
|
?vperm v27,v27,v28,$keyperm
|
||||||
|
lvx v30,0,$idx
|
||||||
|
addi $idx,$idx,32
|
||||||
|
?vperm v28,v28,v29,$keyperm
|
||||||
|
lvx v31,0,$key
|
||||||
|
?vperm v29,v29,v30,$keyperm
|
||||||
|
lvx $out0,0,$idx # borrow $out0
|
||||||
|
?vperm v30,v30,v31,$keyperm
|
||||||
|
lvx v24,0,$key_ # pre-load round[1]
|
||||||
|
addi $key_,$key_,16
|
||||||
|
?vperm v31,v31,$out0,$keyperm
|
||||||
|
lvx v25,0,$key_ # pre-load round[2]
|
||||||
|
addi $key_,$key_,16
|
||||||
|
|
||||||
|
|
||||||
|
#lvx $inptail,0,$inp # "caller" already did this
|
||||||
|
#addi $inp,$inp,15 # 15 is not typo
|
||||||
|
|
||||||
|
lvx $in1,0,$inp # load first 8 "words"
|
||||||
|
addi $inp,$inp,16
|
||||||
|
lvx $in2,0,$inp
|
||||||
|
addi $inp,$inp,16
|
||||||
|
lvx $in3,0,$inp
|
||||||
|
addi $inp,$inp,16
|
||||||
|
vperm $in0,$inptail,$in1,$inpperm
|
||||||
|
lvx $in4,0,$inp
|
||||||
|
addi $inp,$inp,16
|
||||||
|
vperm $in1,$in1,$in2,$inpperm
|
||||||
|
lvx $in5,0,$inp
|
||||||
|
addi $inp,$inp,16
|
||||||
|
vperm $in2,$in2,$in3,$inpperm
|
||||||
|
vxor $out0,$in0,$rndkey0
|
||||||
|
lvx $in6,0,$inp
|
||||||
|
addi $inp,$inp,16
|
||||||
|
vperm $in3,$in3,$in4,$inpperm
|
||||||
|
vxor $out1,$in1,$rndkey0
|
||||||
|
lvx $in7,0,$inp
|
||||||
|
addi $inp,$inp,16
|
||||||
|
vperm $in4,$in4,$in5,$inpperm
|
||||||
|
vxor $out2,$in2,$rndkey0
|
||||||
|
lvx $inptail,0,$inp
|
||||||
|
addi $inp,$inp,16
|
||||||
|
vperm $in5,$in5,$in6,$inpperm
|
||||||
|
vxor $out3,$in3,$rndkey0
|
||||||
|
vperm $in6,$in6,$in7,$inpperm
|
||||||
|
vxor $out4,$in4,$rndkey0
|
||||||
|
vperm $in7,$in7,$inptail,$inpperm
|
||||||
|
vxor $out5,$in5,$rndkey0
|
||||||
|
vxor $out6,$in6,$rndkey0
|
||||||
|
vxor $out7,$in7,$rndkey0
|
||||||
|
|
||||||
|
mtctr $rounds
|
||||||
|
Loop_cbc_dec8x:
|
||||||
|
vncipher $out0,$out0,v24
|
||||||
|
vncipher $out1,$out1,v24
|
||||||
|
vncipher $out2,$out2,v24
|
||||||
|
vncipher $out3,$out3,v24
|
||||||
|
vncipher $out4,$out4,v24
|
||||||
|
vncipher $out5,$out5,v24
|
||||||
|
vncipher $out6,$out6,v24
|
||||||
|
vncipher $out7,$out7,v24
|
||||||
|
lvx v24,0,$key_ # round[3]
|
||||||
|
addi $key_,$key_,16
|
||||||
|
|
||||||
|
vncipher $out0,$out0,v25
|
||||||
|
vncipher $out1,$out1,v25
|
||||||
|
vncipher $out2,$out2,v25
|
||||||
|
vncipher $out3,$out3,v25
|
||||||
|
vncipher $out4,$out4,v25
|
||||||
|
vncipher $out5,$out5,v25
|
||||||
|
vncipher $out6,$out6,v25
|
||||||
|
vncipher $out7,$out7,v25
|
||||||
|
lvx v25,0,$key_ # round[4]
|
||||||
|
addi $key_,$key_,16
|
||||||
|
bdnz Loop_cbc_dec8x
|
||||||
|
|
||||||
|
subic $len,$len,128 # $len-=128
|
||||||
|
vncipher $out0,$out0,v24
|
||||||
|
vncipher $out1,$out1,v24
|
||||||
|
vncipher $out2,$out2,v24
|
||||||
|
vncipher $out3,$out3,v24
|
||||||
|
vncipher $out4,$out4,v24
|
||||||
|
vncipher $out5,$out5,v24
|
||||||
|
vncipher $out6,$out6,v24
|
||||||
|
vncipher $out7,$out7,v24
|
||||||
|
|
||||||
|
subfe. r0,r0,r0 # borrow?-1:0
|
||||||
|
vncipher $out0,$out0,v25
|
||||||
|
vncipher $out1,$out1,v25
|
||||||
|
vncipher $out2,$out2,v25
|
||||||
|
vncipher $out3,$out3,v25
|
||||||
|
vncipher $out4,$out4,v25
|
||||||
|
vncipher $out5,$out5,v25
|
||||||
|
vncipher $out6,$out6,v25
|
||||||
|
vncipher $out7,$out7,v25
|
||||||
|
|
||||||
|
and r0,r0,$len
|
||||||
|
vncipher $out0,$out0,v26
|
||||||
|
vncipher $out1,$out1,v26
|
||||||
|
vncipher $out2,$out2,v26
|
||||||
|
vncipher $out3,$out3,v26
|
||||||
|
vncipher $out4,$out4,v26
|
||||||
|
vncipher $out5,$out5,v26
|
||||||
|
vncipher $out6,$out6,v26
|
||||||
|
vncipher $out7,$out7,v26
|
||||||
|
|
||||||
|
add $inp,$inp,r0 # $inp is adjusted in such
|
||||||
|
# way that at exit from the
|
||||||
|
# loop inX-in7 are loaded
|
||||||
|
# with last "words"
|
||||||
|
vncipher $out0,$out0,v27
|
||||||
|
vncipher $out1,$out1,v27
|
||||||
|
vncipher $out2,$out2,v27
|
||||||
|
vncipher $out3,$out3,v27
|
||||||
|
vncipher $out4,$out4,v27
|
||||||
|
vncipher $out5,$out5,v27
|
||||||
|
vncipher $out6,$out6,v27
|
||||||
|
vncipher $out7,$out7,v27
|
||||||
|
|
||||||
|
addi $key_,$sp,$FRAME+15 # rewind $key_
|
||||||
|
vncipher $out0,$out0,v28
|
||||||
|
vncipher $out1,$out1,v28
|
||||||
|
vncipher $out2,$out2,v28
|
||||||
|
vncipher $out3,$out3,v28
|
||||||
|
vncipher $out4,$out4,v28
|
||||||
|
vncipher $out5,$out5,v28
|
||||||
|
vncipher $out6,$out6,v28
|
||||||
|
vncipher $out7,$out7,v28
|
||||||
|
lvx v24,0,$key_ # re-pre-load round[1]
|
||||||
|
addi $key_,$key_,16
|
||||||
|
|
||||||
|
vncipher $out0,$out0,v29
|
||||||
|
vncipher $out1,$out1,v29
|
||||||
|
vncipher $out2,$out2,v29
|
||||||
|
vncipher $out3,$out3,v29
|
||||||
|
vncipher $out4,$out4,v29
|
||||||
|
vncipher $out5,$out5,v29
|
||||||
|
vncipher $out6,$out6,v29
|
||||||
|
vncipher $out7,$out7,v29
|
||||||
|
lvx v25,0,$key_ # re-pre-load round[2]
|
||||||
|
addi $key_,$key_,16
|
||||||
|
|
||||||
|
vncipher $out0,$out0,v30
|
||||||
|
vxor $ivec,$ivec,v31 # xor with last round key
|
||||||
|
vncipher $out1,$out1,v30
|
||||||
|
vxor $in0,$in0,v31
|
||||||
|
vncipher $out2,$out2,v30
|
||||||
|
vxor $in1,$in1,v31
|
||||||
|
vncipher $out3,$out3,v30
|
||||||
|
vxor $in2,$in2,v31
|
||||||
|
vncipher $out4,$out4,v30
|
||||||
|
vxor $in3,$in3,v31
|
||||||
|
vncipher $out5,$out5,v30
|
||||||
|
vxor $in4,$in4,v31
|
||||||
|
vncipher $out6,$out6,v30
|
||||||
|
vxor $in5,$in5,v31
|
||||||
|
vncipher $out7,$out7,v30
|
||||||
|
vxor $in6,$in6,v31
|
||||||
|
|
||||||
|
vncipherlast $out0,$out0,$ivec
|
||||||
|
vncipherlast $out1,$out1,$in0
|
||||||
|
vncipherlast $out2,$out2,$in1
|
||||||
|
lvx $in1,0,$inp # load next input block
|
||||||
|
addi $inp,$inp,16
|
||||||
|
vncipherlast $out3,$out3,$in2
|
||||||
|
lvx $in2,0,$inp
|
||||||
|
addi $inp,$inp,16
|
||||||
|
vncipherlast $out4,$out4,$in3
|
||||||
|
lvx $in3,0,$inp
|
||||||
|
addi $inp,$inp,16
|
||||||
|
vperm $in0,$inptail,$in1,$inpperm
|
||||||
|
vncipherlast $out5,$out5,$in4
|
||||||
|
lvx $in4,0,$inp
|
||||||
|
addi $inp,$inp,16
|
||||||
|
vperm $in1,$in1,$in2,$inpperm
|
||||||
|
vncipherlast $out6,$out6,$in5
|
||||||
|
lvx $in5,0,$inp
|
||||||
|
addi $inp,$inp,16
|
||||||
|
vperm $in2,$in2,$in3,$inpperm
|
||||||
|
vncipherlast $out7,$out7,$in6
|
||||||
|
lvx $in6,0,$inp
|
||||||
|
addi $inp,$inp,16
|
||||||
|
vperm $in3,$in3,$in4,$inpperm
|
||||||
|
vmr $ivec,$in7
|
||||||
|
|
||||||
|
|
||||||
|
vperm $out0,$out0,$out0,$outperm
|
||||||
|
lvx $in7,0,$inp
|
||||||
|
addi $inp,$inp,16
|
||||||
|
vperm $out1,$out1,$out1,$outperm
|
||||||
|
vsel $outhead,$outhead,$out0,$outmask
|
||||||
|
vperm $in4,$in4,$in5,$inpperm
|
||||||
|
lvx $inptail,0,$inp
|
||||||
|
addi $inp,$inp,16
|
||||||
|
vsel $out0,$out0,$out1,$outmask
|
||||||
|
stvx $outhead,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $out2,$out2,$out2,$outperm
|
||||||
|
vperm $in5,$in5,$in6,$inpperm
|
||||||
|
vsel $out1,$out1,$out2,$outmask
|
||||||
|
stvx $out0,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $out3,$out3,$out3,$outperm
|
||||||
|
vxor $out0,$in0,$rndkey0
|
||||||
|
vperm $in6,$in6,$in7,$inpperm
|
||||||
|
vsel $out2,$out2,$out3,$outmask
|
||||||
|
stvx $out1,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $out4,$out4,$out4,$outperm
|
||||||
|
vxor $out1,$in1,$rndkey0
|
||||||
|
vperm $in7,$in7,$inptail,$inpperm
|
||||||
|
vsel $out3,$out3,$out4,$outmask
|
||||||
|
stvx $out2,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $out5,$out5,$out5,$outperm
|
||||||
|
vxor $out2,$in2,$rndkey0
|
||||||
|
vsel $out4,$out4,$out5,$outmask
|
||||||
|
stvx $out3,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $out6,$out6,$out6,$outperm
|
||||||
|
vxor $out3,$in3,$rndkey0
|
||||||
|
vsel $out5,$out5,$out6,$outmask
|
||||||
|
stvx $out4,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $outhead,$out7,$out7,$outperm
|
||||||
|
vxor $out4,$in4,$rndkey0
|
||||||
|
vsel $out6,$out6,$outhead,$outmask
|
||||||
|
stvx $out5,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vxor $out5,$in5,$rndkey0
|
||||||
|
stvx $out6,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vxor $out6,$in6,$rndkey0
|
||||||
|
vxor $out7,$in7,$rndkey0
|
||||||
|
|
||||||
|
mtctr $rounds
|
||||||
|
beq Loop_cbc_dec8x # did $len-=128 borrow?
|
||||||
|
|
||||||
|
addic. $len,$len,128
|
||||||
|
beq Lcbc_dec8x_done
|
||||||
|
nop
|
||||||
|
|
||||||
|
Loop_cbc_dec8x_tail: # up to 7 "words" tail...
|
||||||
|
vncipher $out1,$out1,v24
|
||||||
|
vncipher $out2,$out2,v24
|
||||||
|
vncipher $out3,$out3,v24
|
||||||
|
vncipher $out4,$out4,v24
|
||||||
|
vncipher $out5,$out5,v24
|
||||||
|
vncipher $out6,$out6,v24
|
||||||
|
vncipher $out7,$out7,v24
|
||||||
|
lvx v24,0,$key_ # round[3]
|
||||||
|
addi $key_,$key_,16
|
||||||
|
|
||||||
|
vncipher $out1,$out1,v25
|
||||||
|
vncipher $out2,$out2,v25
|
||||||
|
vncipher $out3,$out3,v25
|
||||||
|
vncipher $out4,$out4,v25
|
||||||
|
vncipher $out5,$out5,v25
|
||||||
|
vncipher $out6,$out6,v25
|
||||||
|
vncipher $out7,$out7,v25
|
||||||
|
lvx v25,0,$key_ # round[4]
|
||||||
|
addi $key_,$key_,16
|
||||||
|
bdnz Loop_cbc_dec8x_tail
|
||||||
|
|
||||||
|
vncipher $out1,$out1,v24
|
||||||
|
vncipher $out2,$out2,v24
|
||||||
|
vncipher $out3,$out3,v24
|
||||||
|
vncipher $out4,$out4,v24
|
||||||
|
vncipher $out5,$out5,v24
|
||||||
|
vncipher $out6,$out6,v24
|
||||||
|
vncipher $out7,$out7,v24
|
||||||
|
|
||||||
|
vncipher $out1,$out1,v25
|
||||||
|
vncipher $out2,$out2,v25
|
||||||
|
vncipher $out3,$out3,v25
|
||||||
|
vncipher $out4,$out4,v25
|
||||||
|
vncipher $out5,$out5,v25
|
||||||
|
vncipher $out6,$out6,v25
|
||||||
|
vncipher $out7,$out7,v25
|
||||||
|
|
||||||
|
vncipher $out1,$out1,v26
|
||||||
|
vncipher $out2,$out2,v26
|
||||||
|
vncipher $out3,$out3,v26
|
||||||
|
vncipher $out4,$out4,v26
|
||||||
|
vncipher $out5,$out5,v26
|
||||||
|
vncipher $out6,$out6,v26
|
||||||
|
vncipher $out7,$out7,v26
|
||||||
|
|
||||||
|
vncipher $out1,$out1,v27
|
||||||
|
vncipher $out2,$out2,v27
|
||||||
|
vncipher $out3,$out3,v27
|
||||||
|
vncipher $out4,$out4,v27
|
||||||
|
vncipher $out5,$out5,v27
|
||||||
|
vncipher $out6,$out6,v27
|
||||||
|
vncipher $out7,$out7,v27
|
||||||
|
|
||||||
|
vncipher $out1,$out1,v28
|
||||||
|
vncipher $out2,$out2,v28
|
||||||
|
vncipher $out3,$out3,v28
|
||||||
|
vncipher $out4,$out4,v28
|
||||||
|
vncipher $out5,$out5,v28
|
||||||
|
vncipher $out6,$out6,v28
|
||||||
|
vncipher $out7,$out7,v28
|
||||||
|
|
||||||
|
vncipher $out1,$out1,v29
|
||||||
|
vncipher $out2,$out2,v29
|
||||||
|
vncipher $out3,$out3,v29
|
||||||
|
vncipher $out4,$out4,v29
|
||||||
|
vncipher $out5,$out5,v29
|
||||||
|
vncipher $out6,$out6,v29
|
||||||
|
vncipher $out7,$out7,v29
|
||||||
|
|
||||||
|
vncipher $out1,$out1,v30
|
||||||
|
vxor $ivec,$ivec,v31 # last round key
|
||||||
|
vncipher $out2,$out2,v30
|
||||||
|
vxor $in1,$in1,v31
|
||||||
|
vncipher $out3,$out3,v30
|
||||||
|
vxor $in2,$in2,v31
|
||||||
|
vncipher $out4,$out4,v30
|
||||||
|
vxor $in3,$in3,v31
|
||||||
|
vncipher $out5,$out5,v30
|
||||||
|
vxor $in4,$in4,v31
|
||||||
|
vncipher $out6,$out6,v30
|
||||||
|
vxor $in5,$in5,v31
|
||||||
|
vncipher $out7,$out7,v30
|
||||||
|
vxor $in6,$in6,v31
|
||||||
|
|
||||||
|
cmplwi $len,32 # switch($len)
|
||||||
|
blt Lcbc_dec8x_one
|
||||||
|
nop
|
||||||
|
beq Lcbc_dec8x_two
|
||||||
|
cmplwi $len,64
|
||||||
|
blt Lcbc_dec8x_three
|
||||||
|
nop
|
||||||
|
beq Lcbc_dec8x_four
|
||||||
|
cmplwi $len,96
|
||||||
|
blt Lcbc_dec8x_five
|
||||||
|
nop
|
||||||
|
beq Lcbc_dec8x_six
|
||||||
|
|
||||||
|
vncipherlast $out1,$out1,$ivec
|
||||||
|
vncipherlast $out2,$out2,$in1
|
||||||
|
vncipherlast $out3,$out3,$in2
|
||||||
|
vncipherlast $out4,$out4,$in3
|
||||||
|
vncipherlast $out5,$out5,$in4
|
||||||
|
vncipherlast $out6,$out6,$in5
|
||||||
|
vncipherlast $out7,$out7,$in6
|
||||||
|
vmr $ivec,$in7
|
||||||
|
|
||||||
|
vperm $out1,$out1,$out1,$outperm
|
||||||
|
vsel $outhead,$outhead,$out1,$outmask
|
||||||
|
stvx $outhead,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $out2,$out2,$out2,$outperm
|
||||||
|
vsel $out1,$out1,$out2,$outmask
|
||||||
|
stvx $out1,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $out3,$out3,$out3,$outperm
|
||||||
|
vsel $out2,$out2,$out3,$outmask
|
||||||
|
stvx $out2,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $out4,$out4,$out4,$outperm
|
||||||
|
vsel $out3,$out3,$out4,$outmask
|
||||||
|
stvx $out3,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $out5,$out5,$out5,$outperm
|
||||||
|
vsel $out4,$out4,$out5,$outmask
|
||||||
|
stvx $out4,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $out6,$out6,$out6,$outperm
|
||||||
|
vsel $out5,$out5,$out6,$outmask
|
||||||
|
stvx $out5,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $outhead,$out7,$out7,$outperm
|
||||||
|
vsel $out6,$out6,$outhead,$outmask
|
||||||
|
stvx $out6,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
b Lcbc_dec8x_done
|
||||||
|
|
||||||
|
.align 5
|
||||||
|
Lcbc_dec8x_six:
|
||||||
|
vncipherlast $out2,$out2,$ivec
|
||||||
|
vncipherlast $out3,$out3,$in2
|
||||||
|
vncipherlast $out4,$out4,$in3
|
||||||
|
vncipherlast $out5,$out5,$in4
|
||||||
|
vncipherlast $out6,$out6,$in5
|
||||||
|
vncipherlast $out7,$out7,$in6
|
||||||
|
vmr $ivec,$in7
|
||||||
|
|
||||||
|
vperm $out2,$out2,$out2,$outperm
|
||||||
|
vsel $outhead,$outhead,$out2,$outmask
|
||||||
|
stvx $outhead,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $out3,$out3,$out3,$outperm
|
||||||
|
vsel $out2,$out2,$out3,$outmask
|
||||||
|
stvx $out2,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $out4,$out4,$out4,$outperm
|
||||||
|
vsel $out3,$out3,$out4,$outmask
|
||||||
|
stvx $out3,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $out5,$out5,$out5,$outperm
|
||||||
|
vsel $out4,$out4,$out5,$outmask
|
||||||
|
stvx $out4,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $out6,$out6,$out6,$outperm
|
||||||
|
vsel $out5,$out5,$out6,$outmask
|
||||||
|
stvx $out5,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $outhead,$out7,$out7,$outperm
|
||||||
|
vsel $out6,$out6,$outhead,$outmask
|
||||||
|
stvx $out6,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
b Lcbc_dec8x_done
|
||||||
|
|
||||||
|
.align 5
|
||||||
|
Lcbc_dec8x_five:
|
||||||
|
vncipherlast $out3,$out3,$ivec
|
||||||
|
vncipherlast $out4,$out4,$in3
|
||||||
|
vncipherlast $out5,$out5,$in4
|
||||||
|
vncipherlast $out6,$out6,$in5
|
||||||
|
vncipherlast $out7,$out7,$in6
|
||||||
|
vmr $ivec,$in7
|
||||||
|
|
||||||
|
vperm $out3,$out3,$out3,$outperm
|
||||||
|
vsel $outhead,$outhead,$out3,$outmask
|
||||||
|
stvx $outhead,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $out4,$out4,$out4,$outperm
|
||||||
|
vsel $out3,$out3,$out4,$outmask
|
||||||
|
stvx $out3,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $out5,$out5,$out5,$outperm
|
||||||
|
vsel $out4,$out4,$out5,$outmask
|
||||||
|
stvx $out4,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $out6,$out6,$out6,$outperm
|
||||||
|
vsel $out5,$out5,$out6,$outmask
|
||||||
|
stvx $out5,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $outhead,$out7,$out7,$outperm
|
||||||
|
vsel $out6,$out6,$outhead,$outmask
|
||||||
|
stvx $out6,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
b Lcbc_dec8x_done
|
||||||
|
|
||||||
|
.align 5
|
||||||
|
Lcbc_dec8x_four:
|
||||||
|
vncipherlast $out4,$out4,$ivec
|
||||||
|
vncipherlast $out5,$out5,$in4
|
||||||
|
vncipherlast $out6,$out6,$in5
|
||||||
|
vncipherlast $out7,$out7,$in6
|
||||||
|
vmr $ivec,$in7
|
||||||
|
|
||||||
|
vperm $out4,$out4,$out4,$outperm
|
||||||
|
vsel $outhead,$outhead,$out4,$outmask
|
||||||
|
stvx $outhead,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $out5,$out5,$out5,$outperm
|
||||||
|
vsel $out4,$out4,$out5,$outmask
|
||||||
|
stvx $out4,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $out6,$out6,$out6,$outperm
|
||||||
|
vsel $out5,$out5,$out6,$outmask
|
||||||
|
stvx $out5,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $outhead,$out7,$out7,$outperm
|
||||||
|
vsel $out6,$out6,$outhead,$outmask
|
||||||
|
stvx $out6,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
b Lcbc_dec8x_done
|
||||||
|
|
||||||
|
.align 5
|
||||||
|
Lcbc_dec8x_three:
|
||||||
|
vncipherlast $out5,$out5,$ivec
|
||||||
|
vncipherlast $out6,$out6,$in5
|
||||||
|
vncipherlast $out7,$out7,$in6
|
||||||
|
vmr $ivec,$in7
|
||||||
|
|
||||||
|
vperm $out5,$out5,$out5,$outperm
|
||||||
|
vsel $outhead,$outhead,$out5,$outmask
|
||||||
|
stvx $outhead,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $out6,$out6,$out6,$outperm
|
||||||
|
vsel $out5,$out5,$out6,$outmask
|
||||||
|
stvx $out5,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $outhead,$out7,$out7,$outperm
|
||||||
|
vsel $out6,$out6,$outhead,$outmask
|
||||||
|
stvx $out6,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
b Lcbc_dec8x_done
|
||||||
|
|
||||||
|
.align 5
|
||||||
|
Lcbc_dec8x_two:
|
||||||
|
vncipherlast $out6,$out6,$ivec
|
||||||
|
vncipherlast $out7,$out7,$in6
|
||||||
|
vmr $ivec,$in7
|
||||||
|
|
||||||
|
vperm $out6,$out6,$out6,$outperm
|
||||||
|
vsel $outhead,$outhead,$out6,$outmask
|
||||||
|
stvx $outhead,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
|
||||||
|
vperm $outhead,$out7,$out7,$outperm
|
||||||
|
vsel $out6,$out6,$outhead,$outmask
|
||||||
|
stvx $out6,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
b Lcbc_dec8x_done
|
||||||
|
|
||||||
|
.align 5
|
||||||
|
Lcbc_dec8x_one:
|
||||||
|
vncipherlast $out7,$out7,$ivec
|
||||||
|
vmr $ivec,$in7
|
||||||
|
|
||||||
|
vperm $out7,$out7,$out7,$outperm
|
||||||
|
vsel $outhead,$outhead,$out7,$outmask
|
||||||
|
stvx $outhead,0,$out
|
||||||
|
addi $out,$out,16
|
||||||
|
vmr $outhead,$out7
|
||||||
|
nop
|
||||||
|
|
||||||
|
Lcbc_dec8x_done:
|
||||||
|
addi $out,$out,-1
|
||||||
|
lvx $out7,0,$out # redundant in aligned case
|
||||||
|
vsel $out7,$outhead,$out7,$outmask
|
||||||
|
stvx $out7,0,$out
|
||||||
|
|
||||||
|
neg $enc,$ivp # write [unaligned] iv
|
||||||
|
li $idx,15 # 15 is not typo
|
||||||
|
vxor $rndkey0,$rndkey0,$rndkey0
|
||||||
|
vspltisb $outmask,-1
|
||||||
|
`"vspltisb $tmp,0x0f" if ($LITTLE_ENDIAN)`
|
||||||
|
?lvsl $outperm,0,$enc
|
||||||
|
?vperm $outmask,$rndkey0,$outmask,$outperm
|
||||||
|
`"vxor $outperm,$outperm,$tmp" if ($LITTLE_ENDIAN)`
|
||||||
|
lvx $outhead,0,$ivp
|
||||||
|
vperm $ivec,$ivec,$ivec,$outperm
|
||||||
|
vsel $in0,$outhead,$ivec,$outmask
|
||||||
|
lvx $inptail,$idx,$ivp
|
||||||
|
stvx $in0,0,$ivp
|
||||||
|
vsel $in0,$ivec,$inptail,$outmask
|
||||||
|
stvx $in0,$idx,$ivp
|
||||||
|
|
||||||
|
li r10,`$FRAME+15`
|
||||||
|
li r11,`$FRAME+31`
|
||||||
|
stvx $outmask,r10,$sp # wipe copies of rounds keys
|
||||||
|
addi r10,r10,32
|
||||||
|
stvx $outmask,r11,$sp
|
||||||
|
addi r11,r11,32
|
||||||
|
stvx $outmask,r10,$sp
|
||||||
|
addi r10,r10,32
|
||||||
|
stvx $outmask,r11,$sp
|
||||||
|
addi r11,r11,32
|
||||||
|
stvx $outmask,r10,$sp
|
||||||
|
addi r10,r10,32
|
||||||
|
stvx $outmask,r11,$sp
|
||||||
|
addi r11,r11,32
|
||||||
|
stvx $outmask,r10,$sp
|
||||||
|
addi r10,r10,32
|
||||||
|
stvx $outmask,r11,$sp
|
||||||
|
addi r11,r11,32
|
||||||
|
|
||||||
|
mtspr 256,$vrsave
|
||||||
|
lvx v20,r10,$sp # ABI says so
|
||||||
|
addi r10,r10,32
|
||||||
|
lvx v21,r11,$sp
|
||||||
|
addi r11,r11,32
|
||||||
|
lvx v22,r10,$sp
|
||||||
|
addi r10,r10,32
|
||||||
|
lvx v23,r11,$sp
|
||||||
|
addi r11,r11,32
|
||||||
|
lvx v24,r10,$sp
|
||||||
|
addi r10,r10,32
|
||||||
|
lvx v25,r11,$sp
|
||||||
|
addi r11,r11,32
|
||||||
|
lvx v26,r10,$sp
|
||||||
|
addi r10,r10,32
|
||||||
|
lvx v27,r11,$sp
|
||||||
|
addi r11,r11,32
|
||||||
|
lvx v28,r10,$sp
|
||||||
|
addi r10,r10,32
|
||||||
|
lvx v29,r11,$sp
|
||||||
|
addi r11,r11,32
|
||||||
|
lvx v30,r10,$sp
|
||||||
|
lvx v31,r11,$sp
|
||||||
|
addi $sp,$sp,`$FRAME+21*16`
|
||||||
|
blr
|
||||||
|
.long 0
|
||||||
|
.byte 0,12,0x14,0,0x80,0,6,0
|
||||||
.size .${prefix}_cbc_encrypt,.-.${prefix}_cbc_encrypt
|
.size .${prefix}_cbc_encrypt,.-.${prefix}_cbc_encrypt
|
||||||
___
|
___
|
||||||
}}}
|
}} }}}
|
||||||
|
|
||||||
my $consts=1;
|
my $consts=1;
|
||||||
foreach(split("\n",$code)) {
|
foreach(split("\n",$code)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user