From 6c8b9259fc0ddd429e4ae4c4ad90356e91a669ff Mon Sep 17 00:00:00 2001 From: Andy Polyakov Date: Sun, 26 Apr 2009 17:58:58 +0000 Subject: [PATCH] AESNI perlasm update. --- crypto/perlasm/x86_64-xlate.pl | 1 + crypto/perlasm/x86asm.pl | 17 +++++++++++++++++ crypto/perlasm/x86masm.pl | 8 +++++--- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/crypto/perlasm/x86_64-xlate.pl b/crypto/perlasm/x86_64-xlate.pl index 131109d849..6776bf3ccd 100755 --- a/crypto/perlasm/x86_64-xlate.pl +++ b/crypto/perlasm/x86_64-xlate.pl @@ -662,6 +662,7 @@ while($line=<>) { $insn = $opcode->out($#args>=1?$args[$#args]->size():$sz); } else { $insn = $opcode->out(); + $insn .= $sz if (map($_->out() =~ /xmm|mmx/,@args)); @args = reverse(@args); undef $sz if ($nasm && $opcode->mnemonic() eq "lea"); } diff --git a/crypto/perlasm/x86asm.pl b/crypto/perlasm/x86asm.pl index 28080caaa6..34244c1ce0 100644 --- a/crypto/perlasm/x86asm.pl +++ b/crypto/perlasm/x86asm.pl @@ -80,6 +80,23 @@ sub ::movq { &::generic("movq",@_); } } +# AESNI extenstion +sub ::aeskeygenassist +{ my($dst,$src,$imm)=@_; + if ("$dst:$src" =~ /xmm([0-7]):xmm([0-7])/) + { &data_byte(0x66,0x0f,0x3a,0xdf,0xc0|($1<<3)|$2,$imm); } +} +sub ::aescommon +{ my($opcodelet,$dst,$src)=@_; + if ("$dst:$src" =~ /xmm([0-7]):xmm([0-7])/) + { &data_byte(0x66,0x0f,0x38,$opcodelet,0xc0|($1<<3)|$2); } +} +sub ::aesimc { ::aescommon(0xdb,@_); } +sub ::aesenc { ::aescommon(0xdc,@_); } +sub ::aesenclast { ::aescommon(0xdd,@_); } +sub ::aesdec { ::aescommon(0xde,@_); } +sub ::aesdeclast { ::aescommon(0xdf,@_); } + # label management $lbdecor="L"; # local label decoration, set by package $label="000"; diff --git a/crypto/perlasm/x86masm.pl b/crypto/perlasm/x86masm.pl index 3365114cd0..2e2b3152c3 100644 --- a/crypto/perlasm/x86masm.pl +++ b/crypto/perlasm/x86masm.pl @@ -16,9 +16,11 @@ sub ::generic # fix hexadecimal constants for (@arg) { s/0x([0-9a-f]+)/0$1h/oi; } - # fix xmm references - $arg[0] =~ s/\b[A-Z]+WORD\s+PTR/XMMWORD PTR/i if ($arg[1]=~/\bxmm[0-7]\b/i); - $arg[1] =~ s/\b[A-Z]+WORD\s+PTR/XMMWORD PTR/i if ($arg[0]=~/\bxmm[0-7]\b/i); + if ($opcode !~ /movq/) + { # fix xmm references + $arg[0] =~ s/\b[A-Z]+WORD\s+PTR/XMMWORD PTR/i if ($arg[1]=~/\bxmm[0-7]\b/i); + $arg[1] =~ s/\b[A-Z]+WORD\s+PTR/XMMWORD PTR/i if ($arg[0]=~/\bxmm[0-7]\b/i); + } &::emit($opcode,@arg); 1; -- 2.25.1