#!/usr/local/bin/perl
# Normal is the
# ripemd160_block_asm_data_order(RIPEMD160_CTX *c, ULONG *X,int blocks);
$normal=0;
push(@INC,"perlasm","../../perlasm");
require "x86asm.pl";
&asm_init($ARGV[0],$0);
$A="ecx";
$B="esi";
$C="edi";
$D="ebx";
$E="ebp";
$tmp1="eax";
$tmp2="edx";
$KL1=0x5A827999;
$KL2=0x6ED9EBA1;
$KL3=0x8F1BBCDC;
$KL4=0xA953FD4E;
$KR0=0x50A28BE6;
$KR1=0x5C4DD124;
$KR2=0x6D703EF3;
$KR3=0x7A6D76E9;
@wl=( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,
7, 4,13, 1,10, 6,15, 3,12, 0, 9, 5, 2,14,11, 8,
3,10,14, 4, 9,15, 8, 1, 2, 7, 0, 6,13,11, 5,12,
1, 9,11,10, 0, 8,12, 4,13, 3, 7,15,14, 5, 6, 2,
4, 0, 5, 9, 7,12, 2,10,14, 1, 3, 8,11, 6,15,13,
);
@wr=( 5,14, 7, 0, 9, 2,11, 4,13, 6,15, 8, 1,10, 3,12,
6,11, 3, 7, 0,13, 5,10,14,15, 8,12, 4, 9, 1, 2,
15, 5, 1, 3, 7,14, 6, 9,11, 8,12, 2,10, 0, 4,13,
8, 6, 4, 1, 3,11,15, 0, 5,12, 2,13, 9, 7,10,14,
12,15,10, 4, 1, 5, 8, 7, 6, 2,13,14, 0, 3, 9,11,
);
@sl=( 11,14,15,12, 5, 8, 7, 9,11,13,14,15, 6, 7, 9, 8,
7, 6, 8,13,11, 9, 7,15, 7,12,15, 9,11, 7,13,12,
11,13, 6, 7,14, 9,13,15,14, 8,13, 6, 5,12, 7, 5,
11,12,14,15,14,15, 9, 8, 9,14, 5, 6, 8, 6, 5,12,
9,15, 5,11, 6, 8,13,12, 5,12,13,14,11, 8, 5, 6,
);
@sr=( 8, 9, 9,11,13,15,15, 5, 7, 7, 8,11,14,14,12, 6,
9,13,15, 7,12, 8, 9,11, 7, 7,12, 7, 6,15,13,11,
9, 7,15,11, 8, 6, 6,14,12,13, 5,14,13,13, 7, 5,
15, 5, 8,11,14,14, 6,14, 6, 9,12, 9,12, 5,15, 8,
8, 5,12, 9,12, 5,14, 6, 8,13, 6, 5,15,13,11,11,
);
&ripemd160_block("ripemd160_block_asm_data_order");
&asm_finish();
sub Xv
{
local($n)=@_;
return(&swtmp($n));
# tmp on stack
}
sub Np
{
local($p)=@_;
local(%n)=($A,$E,$B,$A,$C,$B,$D,$C,$E,$D);
return($n{$p});
}
sub RIP1
{
local($a,$b,$c,$d,$e,$pos,$s,$o,$pos2)=@_;
&comment($p++);
if ($p & 1)
{
#&mov($tmp1, $c) if $o == -1;
&xor($tmp1, $d) if $o == -1;
&mov($tmp2, &Xv($pos));
&xor($tmp1, $b);
&add($a, $tmp2);
&rotl($c, 10);
&add($a, $tmp1);
&mov($tmp1, &Np($c)); # NEXT
# XXX
&rotl($a, $s);
&add($a, $e);
}
else
{
&xor($tmp1, $d);
&mov($tmp2, &Xv($pos));
&xor($tmp1, $b);
&add($a, $tmp1);
&mov($tmp1, &Np($c)) if $o <= 0;
&mov($tmp1, -1) if $o == 1;
# XXX if $o == 2;
&rotl($c, 10);
&add($a, $tmp2);
&xor($tmp1, &Np($d)) if $o <= 0;
&mov($tmp2, &Xv($pos2)) if $o == 1;
&mov($tmp2, &wparam(0)) if $o == 2;
&rotl($a, $s);
&add($a, $e);
}
}
sub RIP2
{
local($a,$b,$c,$d,$e,$pos,$pos2<