mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
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
This commit is contained in:
parent
14ee840734
commit
77a2814a9a
@ -74,7 +74,10 @@ void MCExpr::print(raw_ostream &OS, const MCAsmInfo *MAI, bool InParens) const {
|
|||||||
case MCUnaryExpr::Not: OS << '~'; break;
|
case MCUnaryExpr::Not: OS << '~'; break;
|
||||||
case MCUnaryExpr::Plus: OS << '+'; break;
|
case MCUnaryExpr::Plus: OS << '+'; break;
|
||||||
}
|
}
|
||||||
|
bool Binary = UE.getSubExpr()->getKind() == MCExpr::Binary;
|
||||||
|
if (Binary) OS << "(";
|
||||||
UE.getSubExpr()->print(OS, MAI);
|
UE.getSubExpr()->print(OS, MAI);
|
||||||
|
if (Binary) OS << ")";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -756,7 +759,8 @@ bool MCExpr::evaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm,
|
|||||||
// Apple as.
|
// Apple as.
|
||||||
int64_t LHS = LHSValue.getConstant(), RHS = RHSValue.getConstant();
|
int64_t LHS = LHSValue.getConstant(), RHS = RHSValue.getConstant();
|
||||||
int64_t Result = 0;
|
int64_t Result = 0;
|
||||||
switch (ABE->getOpcode()) {
|
auto Op = ABE->getOpcode();
|
||||||
|
switch (Op) {
|
||||||
case MCBinaryExpr::AShr: Result = LHS >> RHS; break;
|
case MCBinaryExpr::AShr: Result = LHS >> RHS; break;
|
||||||
case MCBinaryExpr::Add: Result = LHS + RHS; break;
|
case MCBinaryExpr::Add: Result = LHS + RHS; break;
|
||||||
case MCBinaryExpr::And: 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;
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,7 @@ concat <simple>,<Check>,<0>
|
|||||||
# Test #3:
|
# Test #3:
|
||||||
# The altmacro cannot affect the regular less/greater behavior.
|
# The altmacro cannot affect the regular less/greater behavior.
|
||||||
|
|
||||||
# CHECK: addl $1, %eax
|
# CHECK: addl $-1, %eax
|
||||||
# CHECK: addl $0, %eax
|
# CHECK: addl $0, %eax
|
||||||
|
|
||||||
.macro fun3 arg1 arg2
|
.macro fun3 arg1 arg2
|
||||||
|
@ -11,11 +11,21 @@ TEST1:
|
|||||||
.space 2, 3
|
.space 2, 3
|
||||||
|
|
||||||
# CHECK: TEST2:
|
# CHECK: TEST2:
|
||||||
|
# CHECK: .space 1,3
|
||||||
|
TEST2:
|
||||||
|
.space -(2 > 0), 3
|
||||||
|
|
||||||
|
# CHECK: TEST3:
|
||||||
# CHECK: .space 1
|
# CHECK: .space 1
|
||||||
TEST2:
|
TEST3:
|
||||||
.skip 1
|
.skip 1
|
||||||
|
|
||||||
# CHECK: TEST3
|
# CHECK: TEST4
|
||||||
# CHECK: .space TEST0-TEST1
|
# CHECK: .space TEST0-TEST1
|
||||||
TEST3:
|
TEST4:
|
||||||
.space TEST0 - TEST1
|
.skip TEST0 - TEST1
|
||||||
|
|
||||||
|
# CHECK: TEST5
|
||||||
|
# CHECK: .space -((TEST0-TEST1)>0)
|
||||||
|
TEST5:
|
||||||
|
.skip -((TEST0 - TEST1) > 0)
|
||||||
|
@ -21,12 +21,12 @@ k:
|
|||||||
check_expr 1 & 3, 1
|
check_expr 1 & 3, 1
|
||||||
check_expr 4 / 2, 2
|
check_expr 4 / 2, 2
|
||||||
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, 0
|
||||||
check_expr 1 > 0, 1
|
check_expr 1 > 0, -1
|
||||||
check_expr 1 >= 1, 1
|
check_expr 1 >= 1, -1
|
||||||
check_expr 1 < 2, 1
|
check_expr 1 < 2, -1
|
||||||
check_expr 1 <= 1, 1
|
check_expr 1 <= 1, -1
|
||||||
check_expr 4 % 3, 1
|
check_expr 4 % 3, 1
|
||||||
check_expr 2 * 2, 4
|
check_expr 2 * 2, 4
|
||||||
check_expr 2 != 2, 0
|
check_expr 2 != 2, 0
|
||||||
@ -43,7 +43,7 @@ k:
|
|||||||
check_expr 1 || 2, 1
|
check_expr 1 || 2, 1
|
||||||
check_expr 0 || 1, 1
|
check_expr 0 || 1, 1
|
||||||
check_expr 0 || 0, 0
|
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 1 << 8 - 1, 128
|
||||||
check_expr 3 * 9 - 2 * 9 + 1, 10
|
check_expr 3 * 9 - 2 * 9 + 1, 10
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user