Skip to content

Commit

Permalink
PPC: fix Regex addi overflow
Browse files Browse the repository at this point in the history
using add insetad of addi when Operand is more than 16 bits long

Change-Id: I7f9452381ed8b321ec71e68d0d90485508b69885
Reviewed-on: https://chromium-review.googlesource.com/c/1430619
Commit-Queue: Junliang Yan <jyan@ca.ibm.com>
Reviewed-by: Junliang Yan <jyan@ca.ibm.com>
Cr-Commit-Position: refs/heads/master@{#59049}
  • Loading branch information
Farazmand authored and Commit Bot committed Jan 23, 2019
1 parent 40b0be4 commit 3cc6919
Showing 1 changed file with 13 additions and 3 deletions.
16 changes: 13 additions & 3 deletions src/regexp/ppc/regexp-macro-assembler-ppc.cc
Expand Up @@ -143,8 +143,13 @@ int RegExpMacroAssemblerPPC::stack_limit_slack() {

void RegExpMacroAssemblerPPC::AdvanceCurrentPosition(int by) {
if (by != 0) {
__ addi(current_input_offset(), current_input_offset(),
Operand(by * char_size()));
if (is_int16(by * char_size())) {
__ addi(current_input_offset(), current_input_offset(),
Operand(by * char_size()));
} else {
__ mov(r0, Operand(by * char_size()));
__ add(current_input_offset(), r0, current_input_offset());
}
}
}

Expand Down Expand Up @@ -1275,7 +1280,12 @@ void RegExpMacroAssemblerPPC::LoadCurrentCharacterUnchecked(int cp_offset,
Register offset = current_input_offset();
if (cp_offset != 0) {
// r25 is not being used to store the capture start index at this point.
__ addi(r25, current_input_offset(), Operand(cp_offset * char_size()));
if (is_int16(cp_offset * char_size())) {
__ addi(r25, current_input_offset(), Operand(cp_offset * char_size()));
} else {
__ mov(r25, Operand(cp_offset * char_size()));
__ add(r25, r25, current_input_offset());
}
offset = r25;
}
// The lwz, stw, lhz, sth instructions can do unaligned accesses, if the CPU
Expand Down

0 comments on commit 3cc6919

Please sign in to comment.