-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi all,

I added support for pushl xxx(%esp) instruction and also I managed to create
smarter wrapper code which means 10% drop in size (measured if -O0 is used).

Signed-off-by: Rudolf Marek <[email protected]>

Rudolf
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAkrPdyAACgkQ3J9wPJqZRNWhGwCeJcqRNRfZJf889PcP/RFhychk
SUoAn2lcBzedRFFpxOcBwDg34VluHGUs
=D22D
-----END PGP SIGNATURE-----
Index: xmmstack.c
===================================================================
--- xmmstack.c	(revision 10)
+++ xmmstack.c	(working copy)
@@ -162,6 +162,30 @@
 //bswap and xchg also not affect flags.
 //dr2 must be initially 0x7f
 
+    fprintf(w,"docall:\nmovl %%eax,%%dr0 #NOSTACK\n\
+    ovl %%dr2,%%eax #NOSTACK\n\
+    movzbl %%al,%%eax #NOSTACK\n\
+    leal -4(%%eax),%%eax #NOSTACK\n\
+    movb %%al,%%ah #NOSTACK\n\
+    movl %%eax,%%dr2 #NOSTACK\n\
+    leal 8(%%esp),%%eax #NOSTACK\n\
+    jmp setxmml\n\
+    dopop:\n movl %%eax,%%dr0 #NOSTACK\n\
+    movl %%dr2,%%eax #NOSTACK\n\
+    movzbl %%al,%%eax #NOSTACK\n\
+    movb %%al,%%ah #NOSTACK\n\
+    leal 4(%%eax),%%eax #NOSTACK\n\
+    movl %%eax,%%dr2 #NOSTACK\n\
+    jmp getxmml\n\
+    dopush:\n movl %%eax,%%dr3 #NOSTACK\n\
+    movl %%dr2,%%eax #NOSTACK\n\
+    movzbl %%al,%%eax #NOSTACK\n\
+    leal -4(%%eax),%%eax #NOSTACK\n\
+    movb %%al,%%ah #NOSTACK\n\
+    movl %%eax,%%dr2 #NOSTACK\n\
+    movl %%dr3,%%eax\n\
+    jmp setxmml\n");
+
     //16 bytes table xmm/12 mmx, pextrw and pinsrw consumes 5 bytes, and jmp *esp consumes 2, nop consumes 1 byte, movb consumes 2 bytes
     //Align of each,must 16 bytes, for use 1,2,4,8 escalar multiple.
     fprintf(w,"setxmm:\n");
@@ -550,6 +574,23 @@
 
 	fprintf(w,"#%s #ORIG\n", buf);
 
+	/* handle pushl xxx(%esp) */
+        if (regexp("^pushl\\s+(\\d*)\\(\\%esp\\)",buf,len,find)) {
+            fprintf(w,"movl %%eax,%%dr0 #NOSTACK\n");
+            fprintf(w,"movl %%dr2,%%eax #NOSTACK\n");
+            fprintf(w,"movzbl %%al,%%eax #NOSTACK\n");
+            fprintf(w,"movb %%al,%%ah #NOSTACK\n");
+            fprintf(w,"leal %d(%%eax),%%eax #NOSTACK\n",256*atoi(find[1]));
+            fprintf(w,"movl %%eax,%%dr2 #NOSTACK\n");
+            fprintf(w,"movl %%dr0,%%eax #NOSTACK\n");
+            fprintf(w,"movl $.+10,%%esp\n");
+            fprintf(w,"jmp getxmml\n");
+            fprintf(w,"movl $.+10,%%esp\n");
+            fprintf(w,"jmp dopush\n");
+            fprintf(w,"movl %%dr0,%%eax #NOSTACK\n");
+            continue;
+	}
+
 	/* leal is tricky */
 	if (regexp("^leal\\s+(\\d*)\\(\\%esp\\)\\s*,\\s*(.*)$",buf,len,find))
 	{
@@ -675,27 +716,17 @@
         if (regexp("^pushl\\s+(.*)$",buf,len,find))
         {
             fprintf(w,"movl %%eax,%%dr0 #NOSTACK\n");
-            fprintf(w,"movl %%dr2,%%eax #NOSTACK\n");
-            fprintf(w,"movzbl %%al,%%eax #NOSTACK\n");
-            fprintf(w,"leal -4(%%eax),%%eax #NOSTACK\n");
-            fprintf(w,"movb %%al,%%ah #NOSTACK\n");
-            fprintf(w,"movl %%eax,%%dr2 #NOSTACK\n");
             fprintf(w,"movl %s,%%eax\n",find[1]);
             fprintf(w,"movl $.+10,%%esp\n");
-            fprintf(w,"jmp setxmml\n");
+            fprintf(w,"jmp dopush\n");
             fprintf(w,"movl %%dr0,%%eax #NOSTACK\n");
             continue;
         }
         if (regexp("^popl\\s+(.*)$",buf,len,find))
         {
-            fprintf(w,"movl %%eax,%%dr0 #NOSTACK\n");
-            fprintf(w,"movl %%dr2,%%eax #NOSTACK\n");
-            fprintf(w,"movzbl %%al,%%eax #NOSTACK\n");
-            fprintf(w,"movb %%al,%%ah #NOSTACK\n");
-            fprintf(w,"leal 4(%%eax),%%eax #NOSTACK\n");
-            fprintf(w,"movl %%eax,%%dr2 #NOSTACK\n");
+
             fprintf(w,"movl $.+10,%%esp\n");
-            fprintf(w,"jmp getxmml\n");
+            fprintf(w,"jmp dopop\n");
             fprintf(w,"movl %%eax,%s\n",find[1]);
             if (strcmp(find[1],"%eax"))
                 fprintf(w,"movl %%dr0,%%eax #NOSTACK\n");
@@ -703,15 +734,8 @@
         }
         if (regexp("^call\\s+(.*)$",buf,len,find))
         {
-            fprintf(w,"movl %%eax,%%dr0 #NOSTACK\n");
-            fprintf(w,"movl %%dr2,%%eax #NOSTACK\n");
-            fprintf(w,"movzbl %%al,%%eax #NOSTACK\n");
-            fprintf(w,"leal -4(%%eax),%%eax #NOSTACK\n");
-            fprintf(w,"movb %%al,%%ah #NOSTACK\n");
-            fprintf(w,"movl %%eax,%%dr2 #NOSTACK\n");
-            fprintf(w,"movl $.+23,%%eax #NOSTACK\n");
             fprintf(w,"movl $.+10,%%esp\n");
-            fprintf(w,"jmp setxmml\n");
+            fprintf(w,"jmp docall\n");
             fprintf(w,"movl %%dr0,%%eax #NOSTACK\n");
             fprintf(w,".byte 0xe9\n.long %s-4-. #NOSTACK\n",find[1]);//jmp, not works with .global??? gcc???            
             continue;

Attachment: a.patch.sig
Description: Binary data

-- 
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to