if ($arg =~ /win32n/) { ia32nasm(); }
elsif ($arg =~ /win32/) { ia32masm(); }
-elsif ($arg =~ /ia64/) { ia64ias(); }
-elsif ($arg =~ /amd64/) { amd64masm(); }
+elsif ($arg =~ /coff/) { ia32gas(); }
+elsif ($arg =~ /win64i/ or $arg =~ /ia64/) { ia64ias(); }
+elsif ($arg =~ /win64a/ or $arg =~ /amd64/) { amd64masm(); }
else { die "nonsense $arg"; }
+sub ia32gas() {
+print <<___;
+.text
+___
+for ($i=1;$i<=$N;$i++) {
+print <<___;
+.def .Lazy$i; .scl 3; .type 32; .endef
+.align 4
+.Lazy$i:
+ pushl \$$i
+ pushl \$_OPENSSL_UplinkTable
+ call _OPENSSL_Uplink
+ addl \$8,%esp
+ jmp *(_OPENSSL_UplinkTable+4*$i)
+___
+}
+print <<___;
+.data
+.align 4
+.globl _OPENSSL_UplinkTable
+_OPENSSL_UplinkTable:
+ .long $N
+___
+for ($i=1;$i<=$N;$i++) { print " .long .Lazy$i\n"; }
+}
+
sub ia32masm() {
print <<___;
.386P
PUBLIC OPENSSL_UplinkTable
OPENSSL_UplinkTable DQ $N
___
-for ($i=1;$i<=$N;$i++) { print " DQ FLAT:\$lazy$i\n"; }
+for ($i=1;$i<=$N;$i++) { print " DQ \$lazy$i\n"; }
print <<___;
_DATA ENDS
-TEXT SEGMENT
-EXTERN OPENSSL_Uplink:NEAR
+_TEXT SEGMENT
+EXTERN OPENSSL_Uplink:PROC
___
for ($i=1;$i<=$N;$i++) {
print <<___;
ALIGN 4
-\$lazy$i PROC NEAR
+\$lazy$i PROC
push r9
push r8
push rdx
push rcx
sub rsp,40
- mov rcx,OFFSET FLAT:OPENSSL_UplinkTable
+ lea rcx,OFFSET OPENSSL_UplinkTable
mov rdx,$i
call OPENSSL_Uplink
add rsp,40
___
}
print <<___;
-TEXT ENDS
+_TEXT ENDS
END
___
}