[mips] Fix kArchStackPointerGreaterThan
OutputRegister does not always exist, so we add a TempRegister to store the comparison result. Change-Id: I47b2500c28be85a66cab1de669ed62401f878e1a Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2885475 Auto-Submit: Liu yu <liuyu@loongson.cn> Reviewed-by: Zhao Jiazhong <zhaojiazhong-hf@loongson.cn> Commit-Queue: Zhao Jiazhong <zhaojiazhong-hf@loongson.cn> Cr-Commit-Position: refs/heads/master@{#74554}
This commit is contained in:
parent
eb53d53bdb
commit
2dd71b3ecf
@ -877,10 +877,10 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
||||
Register lhs_register = sp;
|
||||
uint32_t offset;
|
||||
if (ShouldApplyOffsetToStackCheck(instr, &offset)) {
|
||||
lhs_register = i.TempRegister(0);
|
||||
lhs_register = i.TempRegister(1);
|
||||
__ Subu(lhs_register, sp, offset);
|
||||
}
|
||||
__ Sltu(i.OutputRegister(), i.InputRegister(0), lhs_register);
|
||||
__ Sltu(i.TempRegister(0), i.InputRegister(0), lhs_register);
|
||||
break;
|
||||
}
|
||||
case kArchStackCheckOffset:
|
||||
@ -3716,9 +3716,9 @@ void AssembleBranchToLabels(CodeGenerator* gen, TurboAssembler* tasm,
|
||||
cc = FlagsConditionToConditionCmp(condition);
|
||||
DCHECK((cc == ls) || (cc == hi));
|
||||
if (cc == ls) {
|
||||
__ xori(i.OutputRegister(), i.OutputRegister(), 1);
|
||||
__ xori(i.TempRegister(0), i.TempRegister(0), 1);
|
||||
}
|
||||
__ Branch(tlabel, ne, i.OutputRegister(), Operand(zero_reg));
|
||||
__ Branch(tlabel, ne, i.TempRegister(0), Operand(zero_reg));
|
||||
} else if (instr->arch_opcode() == kMipsCmpS ||
|
||||
instr->arch_opcode() == kMipsCmpD) {
|
||||
bool predicate;
|
||||
@ -4032,7 +4032,7 @@ void CodeGenerator::AssembleArchBoolean(Instruction* instr,
|
||||
cc = FlagsConditionToConditionCmp(condition);
|
||||
DCHECK((cc == ls) || (cc == hi));
|
||||
if (cc == ls) {
|
||||
__ xori(i.OutputRegister(), i.OutputRegister(), 1);
|
||||
__ xori(i.OutputRegister(), i.TempRegister(0), 1);
|
||||
}
|
||||
return;
|
||||
} else {
|
||||
|
@ -1634,11 +1634,12 @@ void InstructionSelector::VisitStackPointerGreaterThan(
|
||||
InstructionOperand* const outputs = nullptr;
|
||||
const int output_count = 0;
|
||||
|
||||
// TempRegister(0) is used to store the comparison result.
|
||||
// Applying an offset to this stack check requires a temp register. Offsets
|
||||
// are only applied to the first stack check. If applying an offset, we must
|
||||
// ensure the input and temp registers do not alias, thus kUniqueRegister.
|
||||
InstructionOperand temps[] = {g.TempRegister()};
|
||||
const int temp_count = (kind == StackCheckKind::kJSFunctionEntry ? 1 : 0);
|
||||
InstructionOperand temps[] = {g.TempRegister(), g.TempRegister()};
|
||||
const int temp_count = (kind == StackCheckKind::kJSFunctionEntry ? 2 : 1);
|
||||
const auto register_mode = (kind == StackCheckKind::kJSFunctionEntry)
|
||||
? OperandGenerator::kUniqueRegister
|
||||
: OperandGenerator::kRegister;
|
||||
|
@ -839,10 +839,10 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
||||
Register lhs_register = sp;
|
||||
uint32_t offset;
|
||||
if (ShouldApplyOffsetToStackCheck(instr, &offset)) {
|
||||
lhs_register = i.TempRegister(0);
|
||||
lhs_register = i.TempRegister(1);
|
||||
__ Dsubu(lhs_register, sp, offset);
|
||||
}
|
||||
__ Sltu(i.OutputRegister(), i.InputRegister(0), lhs_register);
|
||||
__ Sltu(i.TempRegister(0), i.InputRegister(0), lhs_register);
|
||||
break;
|
||||
}
|
||||
case kArchStackCheckOffset:
|
||||
@ -3892,9 +3892,9 @@ void AssembleBranchToLabels(CodeGenerator* gen, TurboAssembler* tasm,
|
||||
cc = FlagsConditionToConditionCmp(condition);
|
||||
DCHECK((cc == ls) || (cc == hi));
|
||||
if (cc == ls) {
|
||||
__ xori(i.OutputRegister(), i.OutputRegister(), 1);
|
||||
__ xori(i.TempRegister(0), i.TempRegister(0), 1);
|
||||
}
|
||||
__ Branch(tlabel, ne, i.OutputRegister(), Operand(zero_reg));
|
||||
__ Branch(tlabel, ne, i.TempRegister(0), Operand(zero_reg));
|
||||
} else if (instr->arch_opcode() == kMips64CmpS ||
|
||||
instr->arch_opcode() == kMips64CmpD) {
|
||||
bool predicate;
|
||||
@ -4244,7 +4244,7 @@ void CodeGenerator::AssembleArchBoolean(Instruction* instr,
|
||||
cc = FlagsConditionToConditionCmp(condition);
|
||||
DCHECK((cc == ls) || (cc == hi));
|
||||
if (cc == ls) {
|
||||
__ xori(i.OutputRegister(), i.OutputRegister(), 1);
|
||||
__ xori(i.OutputRegister(), i.TempRegister(0), 1);
|
||||
}
|
||||
return;
|
||||
} else {
|
||||
|
@ -2271,11 +2271,12 @@ void InstructionSelector::VisitStackPointerGreaterThan(
|
||||
InstructionOperand* const outputs = nullptr;
|
||||
const int output_count = 0;
|
||||
|
||||
// TempRegister(0) is used to store the comparison result.
|
||||
// Applying an offset to this stack check requires a temp register. Offsets
|
||||
// are only applied to the first stack check. If applying an offset, we must
|
||||
// ensure the input and temp registers do not alias, thus kUniqueRegister.
|
||||
InstructionOperand temps[] = {g.TempRegister()};
|
||||
const int temp_count = (kind == StackCheckKind::kJSFunctionEntry ? 1 : 0);
|
||||
InstructionOperand temps[] = {g.TempRegister(), g.TempRegister()};
|
||||
const int temp_count = (kind == StackCheckKind::kJSFunctionEntry ? 2 : 1);
|
||||
const auto register_mode = (kind == StackCheckKind::kJSFunctionEntry)
|
||||
? OperandGenerator::kUniqueRegister
|
||||
: OperandGenerator::kRegister;
|
||||
|
Loading…
Reference in New Issue
Block a user