226 lines
3.5 KiB
Raku
226 lines
3.5 KiB
Raku
#!/usr/bin/env perl
|
|
|
|
$flavour = shift;
|
|
$output = shift;
|
|
open STDOUT,">$output";
|
|
|
|
if ($flavour =~ /64/) {
|
|
$LEVEL ="2.0W";
|
|
$SIZE_T =8;
|
|
$ST ="std";
|
|
} else {
|
|
$LEVEL ="1.1";
|
|
$SIZE_T =4;
|
|
$ST ="stw";
|
|
}
|
|
|
|
$rp="%r2";
|
|
$sp="%r30";
|
|
$rv="%r28";
|
|
|
|
$code=<<___;
|
|
.LEVEL $LEVEL
|
|
.SPACE \$TEXT\$
|
|
.SUBSPA \$CODE\$,QUAD=0,ALIGN=8,ACCESS=0x2C,CODE_ONLY
|
|
|
|
.EXPORT OPENSSL_cpuid_setup,ENTRY
|
|
.ALIGN 8
|
|
OPENSSL_cpuid_setup
|
|
.PROC
|
|
.CALLINFO NO_CALLS
|
|
.ENTRY
|
|
bv ($rp)
|
|
.EXIT
|
|
nop
|
|
.PROCEND
|
|
|
|
.EXPORT OPENSSL_rdtsc,ENTRY
|
|
.ALIGN 8
|
|
OPENSSL_rdtsc
|
|
.PROC
|
|
.CALLINFO NO_CALLS
|
|
.ENTRY
|
|
mfctl %cr16,$rv
|
|
bv ($rp)
|
|
.EXIT
|
|
nop
|
|
.PROCEND
|
|
|
|
.EXPORT OPENSSL_wipe_cpu,ENTRY
|
|
.ALIGN 8
|
|
OPENSSL_wipe_cpu
|
|
.PROC
|
|
.CALLINFO NO_CALLS
|
|
.ENTRY
|
|
xor %r0,%r0,%r1
|
|
fcpy,dbl %fr0,%fr4
|
|
xor %r0,%r0,%r19
|
|
fcpy,dbl %fr0,%fr5
|
|
xor %r0,%r0,%r20
|
|
fcpy,dbl %fr0,%fr6
|
|
xor %r0,%r0,%r21
|
|
fcpy,dbl %fr0,%fr7
|
|
xor %r0,%r0,%r22
|
|
fcpy,dbl %fr0,%fr8
|
|
xor %r0,%r0,%r23
|
|
fcpy,dbl %fr0,%fr9
|
|
xor %r0,%r0,%r24
|
|
fcpy,dbl %fr0,%fr10
|
|
xor %r0,%r0,%r25
|
|
fcpy,dbl %fr0,%fr11
|
|
xor %r0,%r0,%r26
|
|
fcpy,dbl %fr0,%fr22
|
|
xor %r0,%r0,%r29
|
|
fcpy,dbl %fr0,%fr23
|
|
xor %r0,%r0,%r31
|
|
fcpy,dbl %fr0,%fr24
|
|
fcpy,dbl %fr0,%fr25
|
|
fcpy,dbl %fr0,%fr26
|
|
fcpy,dbl %fr0,%fr27
|
|
fcpy,dbl %fr0,%fr28
|
|
fcpy,dbl %fr0,%fr29
|
|
fcpy,dbl %fr0,%fr30
|
|
fcpy,dbl %fr0,%fr31
|
|
bv ($rp)
|
|
.EXIT
|
|
ldo 0($sp),$rv
|
|
.PROCEND
|
|
___
|
|
{
|
|
my $inp="%r26";
|
|
my $len="%r25";
|
|
|
|
$code.=<<___;
|
|
.EXPORT OPENSSL_cleanse,ENTRY,ARGW0=GR,ARGW1=GR
|
|
.ALIGN 8
|
|
OPENSSL_cleanse
|
|
.PROC
|
|
.CALLINFO NO_CALLS
|
|
.ENTRY
|
|
cmpib,*= 0,$len,L\$done
|
|
nop
|
|
cmpib,*>>= 15,$len,L\$ittle
|
|
ldi $SIZE_T-1,%r1
|
|
|
|
L\$align
|
|
and,*<> $inp,%r1,%r28
|
|
b,n L\$aligned
|
|
stb %r0,0($inp)
|
|
ldo -1($len),$len
|
|
b L\$align
|
|
ldo 1($inp),$inp
|
|
|
|
L\$aligned
|
|
andcm $len,%r1,%r28
|
|
L\$ot
|
|
$ST %r0,0($inp)
|
|
addib,*<> -$SIZE_T,%r28,L\$ot
|
|
ldo $SIZE_T($inp),$inp
|
|
|
|
and,*<> $len,%r1,$len
|
|
b,n L\$done
|
|
L\$ittle
|
|
stb %r0,0($inp)
|
|
addib,*<> -1,$len,L\$ittle
|
|
ldo 1($inp),$inp
|
|
L\$done
|
|
bv ($rp)
|
|
.EXIT
|
|
nop
|
|
.PROCEND
|
|
___
|
|
}
|
|
{
|
|
my ($out,$cnt,$max)=("%r26","%r25","%r24");
|
|
my ($tick,$lasttick)=("%r23","%r22");
|
|
my ($diff,$lastdiff)=("%r21","%r20");
|
|
|
|
$code.=<<___;
|
|
.EXPORT OPENSSL_instrument_bus,ENTRY,ARGW0=GR,ARGW1=GR
|
|
.ALIGN 8
|
|
OPENSSL_instrument_bus
|
|
.PROC
|
|
.CALLINFO NO_CALLS
|
|
.ENTRY
|
|
copy $cnt,$rv
|
|
mfctl %cr16,$tick
|
|
copy $tick,$lasttick
|
|
ldi 0,$diff
|
|
|
|
fdc 0($out)
|
|
ldw 0($out),$tick
|
|
add $diff,$tick,$tick
|
|
stw $tick,0($out)
|
|
L\$oop
|
|
mfctl %cr16,$tick
|
|
sub $tick,$lasttick,$diff
|
|
copy $tick,$lasttick
|
|
|
|
fdc 0($out)
|
|
ldw 0($out),$tick
|
|
add $diff,$tick,$tick
|
|
stw $tick,0($out)
|
|
|
|
addib,<> -1,$cnt,L\$oop
|
|
addi 4,$out,$out
|
|
|
|
bv ($rp)
|
|
.EXIT
|
|
sub $rv,$cnt,$rv
|
|
.PROCEND
|
|
|
|
.EXPORT OPENSSL_instrument_bus2,ENTRY,ARGW0=GR,ARGW1=GR
|
|
.ALIGN 8
|
|
OPENSSL_instrument_bus2
|
|
.PROC
|
|
.CALLINFO NO_CALLS
|
|
.ENTRY
|
|
copy $cnt,$rv
|
|
sub %r0,$cnt,$cnt
|
|
|
|
mfctl %cr16,$tick
|
|
copy $tick,$lasttick
|
|
ldi 0,$diff
|
|
|
|
fdc 0($out)
|
|
ldw 0($out),$tick
|
|
add $diff,$tick,$tick
|
|
stw $tick,0($out)
|
|
|
|
mfctl %cr16,$tick
|
|
sub $tick,$lasttick,$diff
|
|
copy $tick,$lasttick
|
|
L\$oop2
|
|
copy $diff,$lastdiff
|
|
fdc 0($out)
|
|
ldw 0($out),$tick
|
|
add $diff,$tick,$tick
|
|
stw $tick,0($out)
|
|
|
|
addib,= -1,$max,L\$done2
|
|
nop
|
|
|
|
mfctl %cr16,$tick
|
|
sub $tick,$lasttick,$diff
|
|
copy $tick,$lasttick
|
|
cmpclr,<> $lastdiff,$diff,$tick
|
|
ldi 1,$tick
|
|
|
|
ldi 1,%r1
|
|
xor %r1,$tick,$tick
|
|
addb,<> $tick,$cnt,L\$oop2
|
|
shladd,l $tick,2,$out,$out
|
|
L\$done2
|
|
bv ($rp)
|
|
.EXIT
|
|
add $rv,$cnt,$rv
|
|
.PROCEND
|
|
___
|
|
}
|
|
$code =~ s/cmpib,\*/comib,/gm if ($SIZE_T==4);
|
|
$code =~ s/,\*/,/gm if ($SIZE_T==4);
|
|
$code =~ s/\bbv\b/bve/gm if ($SIZE_T==8);
|
|
print $code;
|
|
close STDOUT;
|
|
|