Proper support for OpenBSD-i386 shared build, including assember modules!
[oweals/openssl.git] / crypto / perlasm / x86ms.pl
index 35f1a4ddb931bc10e737b2272e0abccdb72a9fd1..1de1277920c0a3f50386a7a42003447e8b5fa66e 100644 (file)
@@ -51,6 +51,11 @@ sub main'DWP
        &get_mem("DWORD",@_);
        }
 
+sub main'QWP
+       {
+       &get_mem("QWORD",@_);
+       }
+
 sub main'BC
        {
        return @_;
@@ -144,7 +149,10 @@ sub main'jle       { &out1("jle",@_); }
 sub main'jz    { &out1("jz",@_); }
 sub main'jge   { &out1("jge",@_); }
 sub main'jl    { &out1("jl",@_); }
+sub main'ja    { &out1("ja",@_); }
+sub main'jae   { &out1("jae",@_); }
 sub main'jb    { &out1("jb",@_); }
+sub main'jbe   { &out1("jbe",@_); }
 sub main'jc    { &out1("jc",@_); }
 sub main'jnc   { &out1("jnc",@_); }
 sub main'jnz   { &out1("jnz",@_); }
@@ -152,11 +160,34 @@ sub main'jne      { &out1("jne",@_); }
 sub main'jno   { &out1("jno",@_); }
 sub main'push  { &out1("push",@_); $stack+=4; }
 sub main'pop   { &out1("pop",@_); $stack-=4; }
+sub main'pushf { &out0("pushf"); $stack+=4; }
+sub main'popf  { &out0("popf"); $stack-=4; }
 sub main'bswap { &out1("bswap",@_); &using486(); }
 sub main'not   { &out1("not",@_); }
 sub main'call  { &out1("call",($_[0]=~/^\$L/?'':'_').$_[0]); }
 sub main'ret   { &out0("ret"); }
 sub main'nop   { &out0("nop"); }
+sub main'test  { &out2("test",@_); }
+sub main'bt    { &out2("bt",@_); }
+sub main'leave { &out0("leave"); }
+sub main'cpuid  { &out0("DW\t0A20Fh"); }
+sub main'rdtsc  { &out0("DW\t0310Fh"); }
+
+# SSE2
+sub main'emms  { &out0("emms"); }
+sub main'movd  { &out2("movd",@_); }
+sub main'movq  { &out2("movq",@_); }
+sub main'movdqu        { &out2("movdqu",@_); }
+sub main'movdqa        { &out2("movdqa",@_); }
+sub main'movdq2q{ &out2("movdq2q",@_); }
+sub main'movq2dq{ &out2("movq2dq",@_); }
+sub main'paddq { &out2("paddq",@_); }
+sub main'pmuludq{ &out2("pmuludq",@_); }
+sub main'psrlq { &out2("psrlq",@_); }
+sub main'psllq { &out2("psllq",@_); }
+sub main'pxor  { &out2("pxor",@_); }
+sub main'por   { &out2("por",@_); }
+sub main'pand  { &out2("pand",@_); }
 
 sub out2
        {
@@ -296,6 +327,13 @@ EOF
 
 sub main'file_end
        {
+       # try to detect if SSE2 or MMX extensions were used...
+       if (grep {/xmm[0-7]\s*,/i} @out) {
+               grep {s/\.[3-7]86/\.686\n\t\.XMM/} @out;
+               }
+       elsif (grep {/mm[0-7]\s*,/i} @out) {
+               grep {s/\.[3-7]86/\.686\n\t\.MMX/} @out;
+               }
        push(@out,"END\n");
        }
 
@@ -356,7 +394,12 @@ sub main'set_label
 
 sub main'data_word
        {
-       push(@out,"\tDD\t$_[0]\n");
+       push(@out,"\tDD\t".join(',',@_)."\n");
+       }
+
+sub main'align
+       {
+       push(@out,"\tALIGN\t$_[0]\n");
        }
 
 sub out1p
@@ -374,3 +417,18 @@ sub main'picmeup
        }
 
 sub main'blindpop { &out1("pop",@_); }
+
+sub main'initseg 
+       {
+       local($f)=@_;
+       local($tmp)=<<___;
+OPTION DOTNAME
+.CRT\$XIU      SEGMENT DWORD PUBLIC 'DATA'
+EXTRN  _$f:NEAR
+DD     _$f
+.CRT\$XIU      ENDS
+___
+       push(@out,$tmp);
+       }
+
+1;