Index: lib/MC/MCExpr.cpp =================================================================== --- lib/MC/MCExpr.cpp +++ lib/MC/MCExpr.cpp @@ -74,7 +74,10 @@ case MCUnaryExpr::Not: OS << '~'; break; case MCUnaryExpr::Plus: OS << '+'; break; } + bool Binary = UE.getSubExpr()->getKind() == MCExpr::Binary; + if (Binary) OS << "("; UE.getSubExpr()->print(OS, MAI); + if (Binary) OS << ")"; return; } @@ -756,7 +759,8 @@ // Apple as. int64_t LHS = LHSValue.getConstant(), RHS = RHSValue.getConstant(); int64_t Result = 0; - switch (ABE->getOpcode()) { + auto Op = ABE->getOpcode(); + switch (Op) { case MCBinaryExpr::AShr: Result = LHS >> RHS; break; case MCBinaryExpr::Add: Result = LHS + RHS; break; case MCBinaryExpr::And: Result = LHS & RHS; break; @@ -791,7 +795,21 @@ case MCBinaryExpr::Xor: Result = LHS ^ RHS; break; } - Res = MCValue::get(Result); + switch (Op) { + default: + Res = MCValue::get(Result); + break; + case MCBinaryExpr::EQ: + case MCBinaryExpr::GT: + case MCBinaryExpr::GTE: + case MCBinaryExpr::LT: + case MCBinaryExpr::LTE: + case MCBinaryExpr::NE: + // A comparison operator returns a -1 if true and 0 if false. + Res = MCValue::get(Result ? -1 : 0); + break; + } + return true; } } Index: test/MC/AsmParser/altmacro_string.s =================================================================== --- test/MC/AsmParser/altmacro_string.s +++ test/MC/AsmParser/altmacro_string.s @@ -32,7 +32,7 @@ # Test #3: # The altmacro cannot affect the regular less/greater behavior. -# CHECK: addl $1, %eax +# CHECK: addl $-1, %eax # CHECK: addl $0, %eax .macro fun3 arg1 arg2 Index: test/MC/AsmParser/directive_space.s =================================================================== --- test/MC/AsmParser/directive_space.s +++ test/MC/AsmParser/directive_space.s @@ -11,11 +11,21 @@ .space 2, 3 # CHECK: TEST2: +# CHECK: .space 1,3 +TEST2: + .space -(2 > 0), 3 + +# CHECK: TEST3: # CHECK: .space 1 -TEST2: +TEST3: .skip 1 -# CHECK: TEST3 +# CHECK: TEST4 # CHECK: .space TEST0-TEST1 -TEST3: - .space TEST0 - TEST1 +TEST4: + .skip TEST0 - TEST1 + +# CHECK: TEST5 +# CHECK: .space -((TEST0-TEST1)>0) +TEST5: + .skip -((TEST0 - TEST1) > 0) Index: test/MC/AsmParser/exprs.s =================================================================== --- test/MC/AsmParser/exprs.s +++ test/MC/AsmParser/exprs.s @@ -21,12 +21,12 @@ check_expr 1 & 3, 1 check_expr 4 / 2, 2 check_expr 4 / -2, -2 - check_expr 1 == 1, 1 + check_expr 1 == 1, -1 check_expr 1 == 0, 0 - check_expr 1 > 0, 1 - check_expr 1 >= 1, 1 - check_expr 1 < 2, 1 - check_expr 1 <= 1, 1 + check_expr 1 > 0, -1 + check_expr 1 >= 1, -1 + check_expr 1 < 2, -1 + check_expr 1 <= 1, -1 check_expr 4 % 3, 1 check_expr 2 * 2, 4 check_expr 2 != 2, 0 @@ -43,7 +43,7 @@ check_expr 1 || 2, 1 check_expr 0 || 1, 1 check_expr 0 || 0, 0 - check_expr 1 + 2 < 3 + 4, 1 + check_expr 1 + 2 < 3 + 4, -1 check_expr 1 << 8 - 1, 128 check_expr 3 * 9 - 2 * 9 + 1, 10