More NASM support code it still doesn't work but it doesn't work less than it
[openssl.git] / crypto / perlasm / x86unix.pl
index deb1185fc960d91b3f4d0b886a53350bd8907e66..8c456b14aff46d55c1d80a355473a6240410e441 100644 (file)
@@ -1,11 +1,5 @@
 #!/usr/local/bin/perl
 
-# Because the bswapl instruction is not supported for old assembers
-# (it was a new instruction for the 486), I've added .byte xxxx code
-# to put it in.
-# eric 24-Apr-1998
-#
-
 package x86unix;
 
 $label="L000";
@@ -90,7 +84,12 @@ sub main'DWP
        $reg2="$regs{$reg2}" if defined($regs{$reg2});
        $ret.=$addr if ($addr ne "") && ($addr ne 0);
        if ($reg2 ne "")
-               { $ret.="($reg1,$reg2,$idx)"; }
+               {
+               if($idx ne "")
+                   { $ret.="($reg1,$reg2,$idx)"; }
+               else
+                   { $ret.="($reg1,$reg2)"; }
+               }
        else
                { $ret.="($reg1)" }
        return($ret);
@@ -101,6 +100,16 @@ sub main'BP
        return(&main'DWP(@_));
        }
 
+sub main'BC
+       {
+       return @_;
+       }
+
+sub main'DWC
+       {
+       return @_;
+       }
+
 #sub main'BP
 #      {
 #      local($addr,$reg1,$reg2,$idx)=@_;
@@ -153,12 +162,27 @@ sub main'dec      { &out1("decl",@_); }
 sub main'inc   { &out1("incl",@_); }
 sub main'push  { &out1("pushl",@_); $stack+=4; }
 sub main'pop   { &out1("popl",@_); $stack-=4; }
-sub main'bswap { &out1("bswapl",@_); }
 sub main'not   { &out1("notl",@_); }
 sub main'call  { &out1("call",$under.$_[0]); }
 sub main'ret   { &out0("ret"); }
 sub main'nop   { &out0("nop"); }
 
+# The bswapl instruction is new for the 486. Emulate if i386.
+sub main'bswap
+       {
+       if ($main'i386)
+               {
+               &main'comment("bswapl @_");
+               &main'exch(main'HB(@_),main'LB(@_));
+               &main'rotr(@_,16);
+               &main'exch(main'HB(@_),main'LB(@_));
+               }
+       else
+               {
+               &out1("bswapl",@_);
+               }
+       }
+
 sub out2
        {
        local($name,$p1,$p2)=@_;