summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/backend/ia32/code-generator-ia32.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/backend/ia32/code-generator-ia32.cc')
-rw-r--r--deps/v8/src/compiler/backend/ia32/code-generator-ia32.cc59
1 files changed, 24 insertions, 35 deletions
diff --git a/deps/v8/src/compiler/backend/ia32/code-generator-ia32.cc b/deps/v8/src/compiler/backend/ia32/code-generator-ia32.cc
index 84cb574821..2730728cdd 100644
--- a/deps/v8/src/compiler/backend/ia32/code-generator-ia32.cc
+++ b/deps/v8/src/compiler/backend/ia32/code-generator-ia32.cc
@@ -328,8 +328,10 @@ class OutOfLineRecordWrite final : public OutOfLineCode {
exit());
__ lea(scratch1_, operand_);
RememberedSetAction const remembered_set_action =
- mode_ > RecordWriteMode::kValueIsMap ? RememberedSetAction::kEmit
- : RememberedSetAction::kOmit;
+ mode_ > RecordWriteMode::kValueIsMap ||
+ FLAG_use_full_record_write_builtin
+ ? RememberedSetAction::kEmit
+ : RememberedSetAction::kOmit;
SaveFPRegsMode const save_fp_mode = frame()->DidAllocateDoubleRegisters()
? SaveFPRegsMode::kSave
: SaveFPRegsMode::kIgnore;
@@ -3736,8 +3738,9 @@ void CodeGenerator::AssembleArchDeoptBranch(Instruction* instr,
AssembleArchBranch(instr, branch);
}
-void CodeGenerator::AssembleArchJump(RpoNumber target) {
- if (!IsNextInAssemblyOrder(target)) __ jmp(GetLabel(target));
+void CodeGenerator::AssembleArchJumpRegardlessOfAssemblyOrder(
+ RpoNumber target) {
+ __ jmp(GetLabel(target));
}
#if V8_ENABLE_WEBASSEMBLY
@@ -3996,14 +3999,9 @@ void CodeGenerator::AssembleArchSelect(Instruction* instr,
void CodeGenerator::FinishFrame(Frame* frame) {
auto call_descriptor = linkage()->GetIncomingDescriptor();
const RegList saves = call_descriptor->CalleeSavedRegisters();
- if (saves != 0) { // Save callee-saved registers.
+ if (!saves.is_empty()) { // Save callee-saved registers.
DCHECK(!info()->is_osr());
- int pushed = 0;
- for (int i = Register::kNumRegisters - 1; i >= 0; i--) {
- if (!((1 << i) & saves)) continue;
- ++pushed;
- }
- frame->AllocateSavedCalleeRegisterSlots(pushed);
+ frame->AllocateSavedCalleeRegisterSlots(saves.Count());
}
}
@@ -4093,17 +4091,17 @@ void CodeGenerator::AssembleConstructFrame() {
#endif // V8_ENABLE_WEBASSEMBLY
// Skip callee-saved and return slots, which are created below.
- required_slots -= base::bits::CountPopulation(saves);
+ required_slots -= saves.Count();
required_slots -= frame()->GetReturnSlotCount();
if (required_slots > 0) {
__ AllocateStackSpace(required_slots * kSystemPointerSize);
}
}
- if (saves != 0) { // Save callee-saved registers.
+ if (!saves.is_empty()) { // Save callee-saved registers.
DCHECK(!info()->is_osr());
- for (int i = Register::kNumRegisters - 1; i >= 0; i--) {
- if (((1 << i) & saves)) __ push(Register::from_code(i));
+ for (Register reg : base::Reversed(saves)) {
+ __ push(reg);
}
}
@@ -4118,14 +4116,13 @@ void CodeGenerator::AssembleReturn(InstructionOperand* additional_pop_count) {
const RegList saves = call_descriptor->CalleeSavedRegisters();
// Restore registers.
- if (saves != 0) {
+ if (!saves.is_empty()) {
const int returns = frame()->GetReturnSlotCount();
if (returns != 0) {
__ add(esp, Immediate(returns * kSystemPointerSize));
}
- for (int i = 0; i < Register::kNumRegisters; i++) {
- if (!((1 << i) & saves)) continue;
- __ pop(Register::from_code(i));
+ for (Register reg : saves) {
+ __ pop(reg);
}
}
@@ -4169,7 +4166,7 @@ void CodeGenerator::AssembleReturn(InstructionOperand* additional_pop_count) {
if (drop_jsargs) {
// Get the actual argument count.
__ mov(argc_reg, Operand(ebp, StandardFrameConstants::kArgCOffset));
- DCHECK_EQ(0u, call_descriptor->CalleeSavedRegisters() & argc_reg.bit());
+ DCHECK(!call_descriptor->CalleeSavedRegisters().has(argc_reg));
}
AssembleDeconstructFrame();
}
@@ -4182,21 +4179,14 @@ void CodeGenerator::AssembleReturn(InstructionOperand* additional_pop_count) {
Label mismatch_return;
Register scratch_reg = edx;
DCHECK_NE(argc_reg, scratch_reg);
- DCHECK_EQ(0u, call_descriptor->CalleeSavedRegisters() & argc_reg.bit());
- DCHECK_EQ(0u, call_descriptor->CalleeSavedRegisters() & scratch_reg.bit());
- if (kJSArgcIncludesReceiver) {
- __ cmp(argc_reg, Immediate(parameter_slots));
- } else {
- int parameter_slots_without_receiver = parameter_slots - 1;
- __ cmp(argc_reg, Immediate(parameter_slots_without_receiver));
- }
+ DCHECK(!call_descriptor->CalleeSavedRegisters().has(argc_reg));
+ DCHECK(!call_descriptor->CalleeSavedRegisters().has(scratch_reg));
+ __ cmp(argc_reg, Immediate(parameter_slots));
__ j(greater, &mismatch_return, Label::kNear);
__ Ret(parameter_slots * kSystemPointerSize, scratch_reg);
__ bind(&mismatch_return);
__ DropArguments(argc_reg, scratch_reg, TurboAssembler::kCountIsInteger,
- kJSArgcIncludesReceiver
- ? TurboAssembler::kCountIncludesReceiver
- : TurboAssembler::kCountExcludesReceiver);
+ TurboAssembler::kCountIncludesReceiver);
// We use a return instead of a jump for better return address prediction.
__ Ret();
} else if (additional_pop_count->IsImmediate()) {
@@ -4208,16 +4198,15 @@ void CodeGenerator::AssembleReturn(InstructionOperand* additional_pop_count) {
__ ret(static_cast<int>(pop_size));
} else {
Register scratch_reg = ecx;
- DCHECK_EQ(0u,
- call_descriptor->CalleeSavedRegisters() & scratch_reg.bit());
+ DCHECK(!call_descriptor->CalleeSavedRegisters().has(scratch_reg));
CHECK_LE(pop_size, static_cast<size_t>(std::numeric_limits<int>::max()));
__ Ret(static_cast<int>(pop_size), scratch_reg);
}
} else {
Register pop_reg = g.ToRegister(additional_pop_count);
Register scratch_reg = pop_reg == ecx ? edx : ecx;
- DCHECK_EQ(0u, call_descriptor->CalleeSavedRegisters() & scratch_reg.bit());
- DCHECK_EQ(0u, call_descriptor->CalleeSavedRegisters() & pop_reg.bit());
+ DCHECK(!call_descriptor->CalleeSavedRegisters().has(scratch_reg));
+ DCHECK(!call_descriptor->CalleeSavedRegisters().has(pop_reg));
int pop_size = static_cast<int>(parameter_slots * kSystemPointerSize);
__ PopReturnAddressTo(scratch_reg);
__ lea(esp, Operand(esp, pop_reg, times_system_pointer_size,