Commit 55eab3b7 authored by Andy Polyakov's avatar Andy Polyakov
Browse files

Make x86_64 modules work under Win64/x64.

parent dc0fcb98
Loading
Loading
Loading
Loading
+16 −11
Original line number Diff line number Diff line
@@ -626,14 +626,13 @@ AES_encrypt:

	call	_x86_64_AES_encrypt_compact

	lea	16(%rsp),%rsp
	pop	$out		# restore out
	mov	16(%rsp),$out	# restore out
	mov	24(%rsp),%rsp
	mov	$s0,0($out)	# write output vector
	mov	$s1,4($out)
	mov	$s2,8($out)
	mov	$s3,12($out)

	mov	(%rsp),%rsp
	pop	%r15
	pop	%r14
	pop	%r13
@@ -1222,14 +1221,13 @@ AES_decrypt:

	call	_x86_64_AES_decrypt_compact

	lea	16(%rsp),%rsp
	pop	$out	# restore out
	mov	$s0,0($out)
	mov	16(%rsp),$out	# restore out
	mov	24(%rsp),%rsp
	mov	$s0,0($out)	# write output vector
	mov	$s1,4($out)
	mov	$s2,8($out)
	mov	$s3,12($out)

	mov	(%rsp),%rsp
	pop	%r15
	pop	%r14
	pop	%r13
@@ -1275,6 +1273,13 @@ $code.=<<___;
.type	AES_set_encrypt_key,\@function,3
.align	16
AES_set_encrypt_key:
	call	_x86_64_AES_set_encrypt_key
	ret
.size	AES_set_encrypt_key,.-AES_set_encrypt_key

.type	_x86_64_AES_set_encrypt_key,\@abi-omnipotent
.align	16
_x86_64_AES_set_encrypt_key:
	push	%rbx
	push	%rbp

@@ -1461,8 +1466,8 @@ $code.=<<___;
.Lexit:
	pop	%rbp
	pop	%rbx
	ret
.size	AES_set_encrypt_key,.-AES_set_encrypt_key
	.byte	0xf3,0xc3			# rep ret
.size	_x86_64_AES_set_encrypt_key,.-_x86_64_AES_set_encrypt_key
___

sub deckey_ref()
@@ -1527,7 +1532,7 @@ $code.=<<___;
.align	16
AES_set_decrypt_key:
	push	%rdx			# save key schedule
	call	AES_set_encrypt_key
	call	_x86_64_AES_set_encrypt_key
	cmp	\$0,%eax
	pop	%r8			# restore key schedule
	jne	.Labort
+12 −3
Original line number Diff line number Diff line
@@ -85,6 +85,8 @@ my $current_function;
	    if ($self->{op} =~ /(movz)b.*/) {	# movz is pain...
		$self->{op} = $1;
		$self->{sz} = "b";
	    } elsif ($self->{op} =~ /call/) {
		$self->{sz} = ""
	    } elsif ($self->{op} =~ /([a-z]{3,})([qlwb])/) {
		$self->{op} = $1;
		$self->{sz} = $2;
@@ -358,7 +360,7 @@ my $current_function;
				    $self->{value} = $v;
				    last;
				  };
		/\.extern/  && do { $self->{value} = "EXTRN\t".$line; last;  };
		/\.extern/  && do { $self->{value} = "EXTRN\t".$line.":BYTE"; last;  };
		/\.globl/   && do { $self->{value} = "PUBLIC\t".$line; last; };
		/\.type/    && do { ($sym,$type,$narg) = split(',',$line);
				    if ($type eq "\@function") {
@@ -394,8 +396,15 @@ my $current_function;
				    last;
				  };
		/\.asciz/   && do { if ($line =~ /^"(.*)"$/) {
					$self->{value} = "DB\t"
						.join(",",unpack("C*",$1),0);
					my @str=unpack("C*",$1);
					push @str,0;
					while ($#str>15) {
					    $self->{value}.="DB\t"
						.join(",",@str[0..15])."\n";
					    foreach (0..15) { shift @str; }
					}
					$self->{value}.="DB\t"
						.join(",",@str) if (@str);
				    }
				    last;
				  };
+7 −1
Original line number Diff line number Diff line
@@ -41,7 +41,13 @@
# apparently are not atomic instructions, but implemented in microcode.

$output=shift;
open STDOUT,"| $^X ../perlasm/x86_64-xlate.pl $output";

$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or
( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or
die "can't locate x86_64-xlate.pl";

open STDOUT,"| $^X $xlate $output";

if ($output =~ /512/) {
	$func="sha512_block_data_order";
+2 −2
Original line number Diff line number Diff line
@@ -136,11 +136,11 @@ OPENSSL_ia32_cpuid:
	cpuid
	cmp	\$0,%r9d
	jne	.Lnotintel
	or	\$1<<20,%edx		# use reserved bit to engage RC4_CHAR
	or	\$0x00100000,%edx	# use reserved 20th bit to engage RC4_CHAR
	and	\$15,%ah
	cmp	\$15,%ah		# examine Family ID
	je	.Lnotintel
	or	\$1<<30,%edx		# use reserved bit to skip unrolled loop
	or	\$0x40000000,%edx	# use reserved bit to skip unrolled loop
.Lnotintel:
	bt	\$28,%edx		# test hyper-threading bit
	jnc	.Ldone