x86_64 assembly pack: improve masm support.
(cherry picked from commit 1b0fe79f3ee27ebd20510da3af9ec04c6ee0f800)
This commit is contained in:
parent
f50f0c6aa3
commit
371feee876
@ -56,7 +56,7 @@ if (!$avx && $win64 && ($flavour =~ /nasm/ || $ENV{ASM} =~ /nasm/) &&
|
|||||||
|
|
||||||
if (!$avx && $win64 && ($flavour =~ /masm/ || $ENV{ASM} =~ /ml64/) &&
|
if (!$avx && $win64 && ($flavour =~ /masm/ || $ENV{ASM} =~ /ml64/) &&
|
||||||
`ml64 2>&1` =~ /Version ([0-9]+)\./) {
|
`ml64 2>&1` =~ /Version ([0-9]+)\./) {
|
||||||
$avx = ($1>=10) + ($1>=11);
|
$avx = ($1>=10) + ($1>=12);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$avx && `$ENV{CC} -v 2>&1` =~ /(^clang version|based on LLVM) ([3-9]\.[0-9]+)/) {
|
if (!$avx && `$ENV{CC} -v 2>&1` =~ /(^clang version|based on LLVM) ([3-9]\.[0-9]+)/) {
|
||||||
|
@ -110,7 +110,7 @@ if (!$addx && $win64 && ($flavour =~ /nasm/ || $ENV{ASM} =~ /nasm/) &&
|
|||||||
|
|
||||||
if (!$addx && $win64 && ($flavour =~ /masm/ || $ENV{ASM} =~ /ml64/) &&
|
if (!$addx && $win64 && ($flavour =~ /masm/ || $ENV{ASM} =~ /ml64/) &&
|
||||||
`ml64 2>&1` =~ /Version ([0-9]+)\./) {
|
`ml64 2>&1` =~ /Version ([0-9]+)\./) {
|
||||||
$addx = ($1>=11);
|
$addx = ($1>=12);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$addx && `$ENV{CC} -v 2>&1` =~ /(^clang version|based on LLVM) ([3-9])\.([0-9]+)/) {
|
if (!$addx && `$ENV{CC} -v 2>&1` =~ /(^clang version|based on LLVM) ([3-9])\.([0-9]+)/) {
|
||||||
|
@ -65,7 +65,7 @@ if (!$addx && $win64 && ($flavour =~ /nasm/ || $ENV{ASM} =~ /nasm/) &&
|
|||||||
|
|
||||||
if (!$addx && $win64 && ($flavour =~ /masm/ || $ENV{ASM} =~ /ml64/) &&
|
if (!$addx && $win64 && ($flavour =~ /masm/ || $ENV{ASM} =~ /ml64/) &&
|
||||||
`ml64 2>&1` =~ /Version ([0-9]+)\./) {
|
`ml64 2>&1` =~ /Version ([0-9]+)\./) {
|
||||||
$addx = ($1>=11);
|
$addx = ($1>=12);
|
||||||
}
|
}
|
||||||
|
|
||||||
# int bn_mul_mont(
|
# int bn_mul_mont(
|
||||||
@ -742,9 +742,11 @@ my @A0=("%r10","%r11");
|
|||||||
my @A1=("%r12","%r13");
|
my @A1=("%r12","%r13");
|
||||||
my ($a0,$a1,$ai)=("%r14","%r15","%rbx");
|
my ($a0,$a1,$ai)=("%r14","%r15","%rbx");
|
||||||
|
|
||||||
|
$code.=<<___ if ($addx);
|
||||||
|
.extern bn_sqrx8x_internal # see x86_64-mont5 module
|
||||||
|
___
|
||||||
$code.=<<___;
|
$code.=<<___;
|
||||||
.extern bn_sqr8x_internal # see x86_64-mont5 module
|
.extern bn_sqr8x_internal # see x86_64-mont5 module
|
||||||
.extern bn_sqrx8x_internal # see x86_64-mont5 module
|
|
||||||
|
|
||||||
.type bn_sqr8x_mont,\@function,6
|
.type bn_sqr8x_mont,\@function,6
|
||||||
.align 32
|
.align 32
|
||||||
|
@ -50,7 +50,7 @@ if (!$addx && $win64 && ($flavour =~ /nasm/ || $ENV{ASM} =~ /nasm/) &&
|
|||||||
|
|
||||||
if (!$addx && $win64 && ($flavour =~ /masm/ || $ENV{ASM} =~ /ml64/) &&
|
if (!$addx && $win64 && ($flavour =~ /masm/ || $ENV{ASM} =~ /ml64/) &&
|
||||||
`ml64 2>&1` =~ /Version ([0-9]+)\./) {
|
`ml64 2>&1` =~ /Version ([0-9]+)\./) {
|
||||||
$addx = ($1>=11);
|
$addx = ($1>=12);
|
||||||
}
|
}
|
||||||
|
|
||||||
# int bn_mul_mont_gather5(
|
# int bn_mul_mont_gather5(
|
||||||
|
@ -92,7 +92,7 @@ _aesni_ctr32_ghash_6x:
|
|||||||
|
|
||||||
.align 32
|
.align 32
|
||||||
.Loop6x:
|
.Loop6x:
|
||||||
add \$6<<24,$counter
|
add \$`6<<24`,$counter
|
||||||
jc .Lhandle_ctr32 # discard $inout[1-5]?
|
jc .Lhandle_ctr32 # discard $inout[1-5]?
|
||||||
vmovdqu 0x00-0x20($Xip),$Hkey # $Hkey^1
|
vmovdqu 0x00-0x20($Xip),$Hkey # $Hkey^1
|
||||||
vpaddb $T2,$inout5,$T1 # next counter value
|
vpaddb $T2,$inout5,$T1 # next counter value
|
||||||
@ -520,7 +520,7 @@ _aesni_ctr32_6x:
|
|||||||
vmovups 0x10-0x80($key),$rndkey
|
vmovups 0x10-0x80($key),$rndkey
|
||||||
lea 0x20-0x80($key),%r12
|
lea 0x20-0x80($key),%r12
|
||||||
vpxor $Z0,$T1,$inout0
|
vpxor $Z0,$T1,$inout0
|
||||||
add \$6<<24,$counter
|
add \$`6<<24`,$counter
|
||||||
jc .Lhandle_ctr32_2
|
jc .Lhandle_ctr32_2
|
||||||
vpaddb $T2,$T1,$inout1
|
vpaddb $T2,$T1,$inout1
|
||||||
vpaddb $T2,$inout1,$inout2
|
vpaddb $T2,$inout1,$inout2
|
||||||
|
@ -270,15 +270,20 @@ my %globals;
|
|||||||
sprintf "%s%s(%%%s)", $self->{asterisk},$self->{label},$self->{base};
|
sprintf "%s%s(%%%s)", $self->{asterisk},$self->{label},$self->{base};
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
%szmap = ( b=>"BYTE$PTR", w=>"WORD$PTR", l=>"DWORD$PTR",
|
%szmap = ( b=>"BYTE$PTR", w=>"WORD$PTR",
|
||||||
q=>"QWORD$PTR",o=>"OWORD$PTR",x=>"XMMWORD$PTR",
|
l=>"DWORD$PTR", d=>"DWORD$PTR",
|
||||||
y=>"" );
|
q=>"QWORD$PTR", o=>"OWORD$PTR",
|
||||||
|
x=>"XMMWORD$PTR", y=>"YMMWORD$PTR", z=>"ZMMWORD$PTR" );
|
||||||
|
|
||||||
$self->{label} =~ s/\./\$/g;
|
$self->{label} =~ s/\./\$/g;
|
||||||
$self->{label} =~ s/(?<![\w\$\.])0x([0-9a-f]+)/0$1h/ig;
|
$self->{label} =~ s/(?<![\w\$\.])0x([0-9a-f]+)/0$1h/ig;
|
||||||
$self->{label} = "($self->{label})" if ($self->{label} =~ /[\*\+\-\/]/);
|
$self->{label} = "($self->{label})" if ($self->{label} =~ /[\*\+\-\/]/);
|
||||||
$sz="q" if ($self->{asterisk} || opcode->mnemonic() =~ /^v?movq$/);
|
|
||||||
$sz="l" if (opcode->mnemonic() =~ /^v?movd$/);
|
($self->{asterisk}) && ($sz="q") ||
|
||||||
|
(opcode->mnemonic() =~ /^v?mov([qd])$/) && ($sz=$1) ||
|
||||||
|
(opcode->mnemonic() =~ /^v?pinsr([qdwb])$/) && ($sz=$1) ||
|
||||||
|
(opcode->mnemonic() =~ /^vpbroadcast([qdwb])$/) && ($sz=$1) ||
|
||||||
|
(opcode->mnemonic() =~ /^vinsert[fi]128$/) && ($sz="x");
|
||||||
|
|
||||||
if (defined($self->{index})) {
|
if (defined($self->{index})) {
|
||||||
sprintf "%s[%s%s*%d%s]",$szmap{$sz},
|
sprintf "%s[%s%s*%d%s]",$szmap{$sz},
|
||||||
@ -536,7 +541,7 @@ my %globals;
|
|||||||
$v="$current_segment\tENDS\n" if ($current_segment);
|
$v="$current_segment\tENDS\n" if ($current_segment);
|
||||||
$current_segment = ".text\$";
|
$current_segment = ".text\$";
|
||||||
$v.="$current_segment\tSEGMENT ";
|
$v.="$current_segment\tSEGMENT ";
|
||||||
$v.=$masm>=$masmref ? "ALIGN(64)" : "PAGE";
|
$v.=$masm>=$masmref ? "ALIGN(256)" : "PAGE";
|
||||||
$v.=" 'CODE'";
|
$v.=" 'CODE'";
|
||||||
}
|
}
|
||||||
$self->{value} = $v;
|
$self->{value} = $v;
|
||||||
@ -834,6 +839,8 @@ if ($nasm) {
|
|||||||
print <<___;
|
print <<___;
|
||||||
default rel
|
default rel
|
||||||
%define XMMWORD
|
%define XMMWORD
|
||||||
|
%define YMMWORD
|
||||||
|
%define ZMMWORD
|
||||||
___
|
___
|
||||||
} elsif ($masm) {
|
} elsif ($masm) {
|
||||||
print <<___;
|
print <<___;
|
||||||
@ -897,6 +904,7 @@ while($line=<>) {
|
|||||||
# $insn.=$sz compensates for movq, pinsrw, ...
|
# $insn.=$sz compensates for movq, pinsrw, ...
|
||||||
if ($arg =~ /^xmm[0-9]+$/) { $insn.=$sz; $sz="x" if(!$sz); last; }
|
if ($arg =~ /^xmm[0-9]+$/) { $insn.=$sz; $sz="x" if(!$sz); last; }
|
||||||
if ($arg =~ /^ymm[0-9]+$/) { $insn.=$sz; $sz="y" if(!$sz); last; }
|
if ($arg =~ /^ymm[0-9]+$/) { $insn.=$sz; $sz="y" if(!$sz); last; }
|
||||||
|
if ($arg =~ /^zmm[0-9]+$/) { $insn.=$sz; $sz="z" if(!$sz); last; }
|
||||||
if ($arg =~ /^mm[0-9]+$/) { $insn.=$sz; $sz="q" if(!$sz); last; }
|
if ($arg =~ /^mm[0-9]+$/) { $insn.=$sz; $sz="q" if(!$sz); last; }
|
||||||
}
|
}
|
||||||
@args = reverse(@args);
|
@args = reverse(@args);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user