diff options
| author | Bill Wendling <isanbard@gmail.com> | 2018-05-14 05:25:36 +0000 |
|---|---|---|
| committer | Bill Wendling <isanbard@gmail.com> | 2018-05-14 05:25:36 +0000 |
| commit | 2a302210d0a34ee6406c88ef727004b826eeca32 (patch) | |
| tree | cbbe5fb5e6ab7c3b3d3aad066adcdf8b3cf4a6e1 | |
| parent | f633f3eb67dbbb337ae1f929b0f840bd2ba00a67 (diff) | |
| download | bcm5719-llvm-2a302210d0a34ee6406c88ef727004b826eeca32.tar.gz bcm5719-llvm-2a302210d0a34ee6406c88ef727004b826eeca32.zip | |
Correct compatibility with the GNU Assembler's handling of comparison ops
GAS returns -1 for a comparison operator if the result is true and 0 if false.
https://www.sourceware.org/binutils/docs-2.12/as.info/Infix-Ops.html#Infix%20Ops
llvm-svn: 332215
| -rw-r--r-- | llvm/lib/MC/MCExpr.cpp | 22 | ||||
| -rw-r--r-- | llvm/test/MC/AsmParser/altmacro_string.s | 2 | ||||
| -rw-r--r-- | llvm/test/MC/AsmParser/directive_space.s | 18 | ||||
| -rw-r--r-- | llvm/test/MC/AsmParser/exprs.s | 12 |
4 files changed, 41 insertions, 13 deletions
diff --git a/llvm/lib/MC/MCExpr.cpp b/llvm/lib/MC/MCExpr.cpp index f9b88895245..831c692fb2e 100644 --- a/llvm/lib/MC/MCExpr.cpp +++ b/llvm/lib/MC/MCExpr.cpp @@ -74,7 +74,10 @@ void MCExpr::print(raw_ostream &OS, const MCAsmInfo *MAI, bool InParens) const { 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 @@ bool MCExpr::evaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm, // 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 @@ bool MCExpr::evaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm, 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; } } diff --git a/llvm/test/MC/AsmParser/altmacro_string.s b/llvm/test/MC/AsmParser/altmacro_string.s index 70012b2b852..ce024676b25 100644 --- a/llvm/test/MC/AsmParser/altmacro_string.s +++ b/llvm/test/MC/AsmParser/altmacro_string.s @@ -32,7 +32,7 @@ concat <simple>,<Check>,<0> # 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 diff --git a/llvm/test/MC/AsmParser/directive_space.s b/llvm/test/MC/AsmParser/directive_space.s index eadc4fc6383..dc21a3b88e2 100644 --- a/llvm/test/MC/AsmParser/directive_space.s +++ b/llvm/test/MC/AsmParser/directive_space.s @@ -11,11 +11,21 @@ TEST1: .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) diff --git a/llvm/test/MC/AsmParser/exprs.s b/llvm/test/MC/AsmParser/exprs.s index 1c3e284bcf7..d2e2334e836 100644 --- a/llvm/test/MC/AsmParser/exprs.s +++ b/llvm/test/MC/AsmParser/exprs.s @@ -21,12 +21,12 @@ k: 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 @@ k: 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 |

