MC/AsmParser: Attempt to constant fold expressions up-front. This ensures we avoid...
authorDaniel Dunbar <daniel@zuster.org>
Sat, 13 Feb 2010 01:28:07 +0000 (01:28 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Sat, 13 Feb 2010 01:28:07 +0000 (01:28 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96064 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/MCParser/AsmParser.cpp
test/MC/AsmParser/X86/x86_32-new-encoder.s
test/MC/AsmParser/X86/x86_operands.s
test/MC/AsmParser/conditional_asm.s

index d5bc396103fe4b32da158c8461ff31a767cd46a0..51ad5d18f3bfce6524869c5e86fa67801a9568cf 100644 (file)
@@ -325,9 +325,17 @@ bool AsmParser::ParseExpression(const MCExpr *&Res) {
 ///  expr ::= primaryexpr
 ///
 bool AsmParser::ParseExpression(const MCExpr *&Res, SMLoc &EndLoc) {
+  // Parse the expression.
   Res = 0;
-  return ParsePrimaryExpr(Res, EndLoc) ||
-         ParseBinOpRHS(1, Res, EndLoc);
+  if (ParsePrimaryExpr(Res, EndLoc) || ParseBinOpRHS(1, Res, EndLoc))
+    return true;
+
+  // Try to constant fold it up front, if possible.
+  int64_t Value;
+  if (Res->EvaluateAsAbsolute(Value))
+    Res = MCConstantExpr::Create(Value, getContext());
+
+  return false;
 }
 
 bool AsmParser::ParseParenExpression(const MCExpr *&Res, SMLoc &EndLoc) {
index a440a253df533be4cccc84709dc788b78aae5af6..efac73f845e063e572e262a2341977d8e2cca85a 100644 (file)
@@ -28,3 +28,9 @@
        swapgs
 // CHECK: swapgs
 // CHECK: encoding: [0x0f,0x01,0xf8]
+
+// CHECK: movl %eax, 16(%ebp)          # encoding: [0x89,0x45,0x10]
+       movl    %eax, 16(%ebp)
+// CHECK: movl %eax, -16(%ebp)          # encoding: [0x89,0x45,0xf0]
+       movl    %eax, -16(%ebp)
+        
index 8e6543e7bd68bce6388c6f35288711c523038bb3..edddd1fc44920116efdcd57bebb7a123937674ef 100644 (file)
@@ -5,28 +5,28 @@
 # Immediates
 # CHECK: addl $1, %eax
         addl $1, %eax
-# CHECK: addl $1+2, %eax
+# CHECK: addl $3, %eax
         addl $(1+2), %eax
 # CHECK: addl $a, %eax
         addl $a, %eax
-# CHECK: addl $1+2, %eax
+# CHECK: addl $3, %eax
         addl $1 + 2, %eax
         
 # Disambiguation
 
-        # FIXME: Add back when we can match this.
-        #addl $1, 4+4
-        # FIXME: Add back when we can match this.
-        #addl $1, (4+4)
-# CHECK: addl $1, 4+4(%eax)
+# CHECK: addl $1, 8
+        addl $1, 4+4
+# CHECK: addl $1, 8
+        addl $1, (4+4)
+# CHECK: addl $1, 8(%eax)
         addl $1, 4+4(%eax)
-# CHECK: addl $1, 4+4(%eax)
+# CHECK: addl $1, 8(%eax)
         addl $1, (4+4)(%eax)
 # CHECK: addl $1, 8(%eax)
         addl $1, 8(%eax)
 # CHECK: addl $1, (%eax)
         addl $1, (%eax)
-# CHECK: addl $1, 4+4(,%eax)
+# CHECK: addl $1, 8(,%eax)
         addl $1, (4+4)(,%eax)
         
 # Indirect Memory Operands
index b8a514fb4fa876f9a1f7a4b04e0d4774e1b66beb..f619ef9bb428a4fe53958d961a8a8f6020375dfe 100644 (file)
@@ -1,6 +1,6 @@
 # RUN: llvm-mc -triple i386-unknown-unknown %s -I  %p | FileCheck %s
 
-# CHECK: .byte 1+1
+# CHECK: .byte 2
 .if 1+2
     .if 1-1
         .byte 1