Platform update from 8-stable.
[openssl.git] / ms / uplink.pl
index 801f6e0..102400e 100755 (executable)
@@ -29,10 +29,37 @@ $arg = shift;
 
 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
@@ -141,23 +168,23 @@ _DATA     SEGMENT
 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
@@ -170,7 +197,7 @@ ALIGN       4
 ___
 }
 print <<___;
-TEXT   ENDS
+_TEXT  ENDS
 END
 ___
 }