Add support for the x86 instructions "pusha" and "popa".
authorNico Weber <nicolasweber@gmx.de>
Wed, 23 Jun 2010 20:00:58 +0000 (20:00 +0000)
committerNico Weber <nicolasweber@gmx.de>
Wed, 23 Jun 2010 20:00:58 +0000 (20:00 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@106671 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86InstrInfo.td
test/MC/AsmParser/X86/x86_32-new-encoder.s
utils/TableGen/EDEmitter.cpp

index 14982e79ea2f6d4b15f1d46c9732ab7250f0b6b8..b90403949c20281e1b42995c2acdd04be5bce687 100644 (file)
@@ -820,6 +820,17 @@ def PUSHF32  : I<0x9C, RawFrm, (outs), (ins), "pushf{l|d}", []>,
                Requires<[In32BitMode]>;
 }
 
+let Defs = [EDI, ESI, EBP, EBX, EDX, ECX, EAX, ESP], Uses = [ESP],
+    mayLoad=1, neverHasSideEffects=1 in {
+def POPA32   : I<0x61, RawFrm, (outs), (ins), "popa{l}", []>,
+               Requires<[In32BitMode]>;
+}
+let Defs = [ESP], Uses = [EDI, ESI, EBP, EBX, EDX, ECX, EAX, ESP],
+    mayStore=1, neverHasSideEffects=1 in {
+def PUSHA32  : I<0x60, RawFrm, (outs), (ins), "pusha{l}", []>,
+               Requires<[In32BitMode]>;
+}
+
 let Uses = [EFLAGS], Constraints = "$src = $dst" in     // GR32 = bswap GR32
   def BSWAP32r : I<0xC8, AddRegFrm,
                    (outs GR32:$dst), (ins GR32:$src),
index c93b698d0b3d9012ee9301f06b857da682ce6b72..e97e4940a42c50dc4f97024c5d7a16b9012648c9 100644 (file)
@@ -398,3 +398,20 @@ retl
 // CHECK: [0x65,0x8b,0x05,0x7c,0x00,0x00,0x00]
 // FIXME: This is a correct bug poor encoding: Use 65 a1 7c 00 00 00 
         movl   %gs:124, %eax
+
+// CHECK: pusha
+// CHECK:  encoding: [0x60]
+               pusha
+
+// CHECK: popa
+// CHECK:  encoding: [0x61]
+               popa
+
+// CHECK: pushal
+// CHECK:  encoding: [0x60]
+               pushal
+
+// CHECK: popal
+// CHECK:  encoding: [0x61]
+               popal
+
index 7f6436c1fee02c147954f177abb132f89a3bb07b..cfc13677c321accf97d42c772f251c71fa509ecc 100644 (file)
@@ -500,6 +500,8 @@ static void X86ExtractSemantics(
       // TODO add support for fixed operands
     } else if (name.find("F") != name.npos) {
       // ignore (this pushes onto the FP stack)
+    } else if (name.find("A") != name.npos) {
+      // ignore (pushes all GP registoers onto the stack)
     } else if (name[name.length() - 1] == 'm') {
       PUSH("src");
     } else if (name.find("i") != name.npos) {
@@ -518,6 +520,8 @@ static void X86ExtractSemantics(
       // TODO add support for fixed operands
     } else if (name.find("F") != name.npos) {
       // ignore (this pops from the FP stack)
+    } else if (name.find("A") != name.npos) {
+      // ignore (pushes all GP registoers onto the stack)
     } else if (name[name.length() - 1] == 'm') {
       POP("dst");
     } else {