summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2018-05-14 05:25:36 +0000
committerBill Wendling <isanbard@gmail.com>2018-05-14 05:25:36 +0000
commit2a302210d0a34ee6406c88ef727004b826eeca32 (patch)
treecbbe5fb5e6ab7c3b3d3aad066adcdf8b3cf4a6e1
parentf633f3eb67dbbb337ae1f929b0f840bd2ba00a67 (diff)
downloadbcm5719-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.cpp22
-rw-r--r--llvm/test/MC/AsmParser/altmacro_string.s2
-rw-r--r--llvm/test/MC/AsmParser/directive_space.s18
-rw-r--r--llvm/test/MC/AsmParser/exprs.s12
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
OpenPOWER on IntegriCloud