diff options
author | Martyn Capewell <martyn.capewell@arm.com> | 2020-08-03 16:39:59 +0100 |
---|---|---|
committer | Martyn Capewell <martyn.capewell@arm.com> | 2020-08-03 16:39:59 +0100 |
commit | b8da04db2b3c59c595bc1efd0540c3d1c595f4cc (patch) | |
tree | 88f92e81ecd3cad91614ff117b1b2acf8e6058bd /src | |
parent | f84b4643727572209374b58fdd88ef6c34913704 (diff) | |
download | vixl-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.cc | 26 |
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); } |