aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartyn Capewell <martyn.capewell@arm.com>2020-08-03 16:39:59 +0100
committerMartyn Capewell <martyn.capewell@arm.com>2020-08-03 16:39:59 +0100
commitb8da04db2b3c59c595bc1efd0540c3d1c595f4cc (patch)
tree88f92e81ecd3cad91614ff117b1b2acf8e6058bd /src
parentf84b4643727572209374b58fdd88ef6c34913704 (diff)
downloadvixl-b8da04db2b3c59c595bc1efd0540c3d1c595f4cc.tar.gz
Remove undefined behaviour in add/sub immediate
The macro assembler support for add/sub immediate could attempt to negate the minimum int64_t value, which is undefined behaviour. Check the value before negation. Change-Id: If5c12515fbef490318a90930e7a362876b0e6dc5
Diffstat (limited to 'src')
-rw-r--r--src/aarch64/macro-assembler-aarch64.cc26
1 files changed, 16 insertions, 10 deletions
diff --git a/src/aarch64/macro-assembler-aarch64.cc b/src/aarch64/macro-assembler-aarch64.cc
index 1e81a8d7..56c6eaf6 100644
--- a/src/aarch64/macro-assembler-aarch64.cc
+++ b/src/aarch64/macro-assembler-aarch64.cc
@@ -1427,12 +1427,15 @@ void MacroAssembler::Add(const Register& rd,
const Operand& operand,
FlagsUpdate S) {
VIXL_ASSERT(allow_macro_instructions_);
- if (operand.IsImmediate() && (operand.GetImmediate() < 0) &&
- IsImmAddSub(-operand.GetImmediate())) {
- AddSubMacro(rd, rn, -operand.GetImmediate(), S, SUB);
- } else {
- AddSubMacro(rd, rn, operand, S, ADD);
+ if (operand.IsImmediate()) {
+ int64_t imm = operand.GetImmediate();
+ if ((imm < 0) && (imm != std::numeric_limits<int64_t>::min()) &&
+ IsImmAddSub(-imm)) {
+ AddSubMacro(rd, rn, -imm, S, SUB);
+ return;
+ }
}
+ AddSubMacro(rd, rn, operand, S, ADD);
}
@@ -1448,12 +1451,15 @@ void MacroAssembler::Sub(const Register& rd,
const Operand& operand,
FlagsUpdate S) {
VIXL_ASSERT(allow_macro_instructions_);
- if (operand.IsImmediate() && (operand.GetImmediate() < 0) &&
- IsImmAddSub(-operand.GetImmediate())) {
- AddSubMacro(rd, rn, -operand.GetImmediate(), S, ADD);
- } else {
- AddSubMacro(rd, rn, operand, S, SUB);
+ if (operand.IsImmediate()) {
+ int64_t imm = operand.GetImmediate();
+ if ((imm < 0) && (imm != std::numeric_limits<int64_t>::min()) &&
+ IsImmAddSub(-imm)) {
+ AddSubMacro(rd, rn, -imm, S, ADD);
+ return;
+ }
}
+ AddSubMacro(rd, rn, operand, S, SUB);
}