Index: src/compiler/arm/instruction-selector-arm.cc |
diff --git a/src/compiler/arm/instruction-selector-arm.cc b/src/compiler/arm/instruction-selector-arm.cc |
index 7219ca3b30c2b1ab0dce71495d16266cf482a205..9122359a293555a409c54fef96cd920d0b1e0224 100644 |
--- a/src/compiler/arm/instruction-selector-arm.cc |
+++ b/src/compiler/arm/instruction-selector-arm.cc |
@@ -99,8 +99,8 @@ template <IrOpcode::Value kOpcode, int kImmMin, int kImmMax, |
AddressingMode kImmMode, AddressingMode kRegMode> |
bool TryMatchShift(InstructionSelector* selector, |
InstructionCode* opcode_return, Node* node, |
- InstructionOperand** value_return, |
- InstructionOperand** shift_return) { |
+ InstructionOperand* value_return, |
+ InstructionOperand* shift_return) { |
ArmOperandGenerator g(selector); |
if (node->opcode() == kOpcode) { |
Int32BinopMatcher m(node); |
@@ -119,8 +119,8 @@ bool TryMatchShift(InstructionSelector* selector, |
bool TryMatchROR(InstructionSelector* selector, InstructionCode* opcode_return, |
- Node* node, InstructionOperand** value_return, |
- InstructionOperand** shift_return) { |
+ Node* node, InstructionOperand* value_return, |
+ InstructionOperand* shift_return) { |
return TryMatchShift<IrOpcode::kWord32Ror, 1, 31, kMode_Operand2_R_ROR_I, |
kMode_Operand2_R_ROR_R>(selector, opcode_return, node, |
value_return, shift_return); |
@@ -128,8 +128,8 @@ bool TryMatchROR(InstructionSelector* selector, InstructionCode* opcode_return, |
bool TryMatchASR(InstructionSelector* selector, InstructionCode* opcode_return, |
- Node* node, InstructionOperand** value_return, |
- InstructionOperand** shift_return) { |
+ Node* node, InstructionOperand* value_return, |
+ InstructionOperand* shift_return) { |
return TryMatchShift<IrOpcode::kWord32Sar, 1, 32, kMode_Operand2_R_ASR_I, |
kMode_Operand2_R_ASR_R>(selector, opcode_return, node, |
value_return, shift_return); |
@@ -137,8 +137,8 @@ bool TryMatchASR(InstructionSelector* selector, InstructionCode* opcode_return, |
bool TryMatchLSL(InstructionSelector* selector, InstructionCode* opcode_return, |
- Node* node, InstructionOperand** value_return, |
- InstructionOperand** shift_return) { |
+ Node* node, InstructionOperand* value_return, |
+ InstructionOperand* shift_return) { |
return TryMatchShift<IrOpcode::kWord32Shl, 0, 31, kMode_Operand2_R_LSL_I, |
kMode_Operand2_R_LSL_R>(selector, opcode_return, node, |
value_return, shift_return); |
@@ -146,8 +146,8 @@ bool TryMatchLSL(InstructionSelector* selector, InstructionCode* opcode_return, |
bool TryMatchLSR(InstructionSelector* selector, InstructionCode* opcode_return, |
- Node* node, InstructionOperand** value_return, |
- InstructionOperand** shift_return) { |
+ Node* node, InstructionOperand* value_return, |
+ InstructionOperand* shift_return) { |
return TryMatchShift<IrOpcode::kWord32Shr, 1, 32, kMode_Operand2_R_LSR_I, |
kMode_Operand2_R_LSR_R>(selector, opcode_return, node, |
value_return, shift_return); |
@@ -156,8 +156,8 @@ bool TryMatchLSR(InstructionSelector* selector, InstructionCode* opcode_return, |
bool TryMatchShift(InstructionSelector* selector, |
InstructionCode* opcode_return, Node* node, |
- InstructionOperand** value_return, |
- InstructionOperand** shift_return) { |
+ InstructionOperand* value_return, |
+ InstructionOperand* shift_return) { |
return ( |
TryMatchASR(selector, opcode_return, node, value_return, shift_return) || |
TryMatchLSL(selector, opcode_return, node, value_return, shift_return) || |
@@ -169,7 +169,7 @@ bool TryMatchShift(InstructionSelector* selector, |
bool TryMatchImmediateOrShift(InstructionSelector* selector, |
InstructionCode* opcode_return, Node* node, |
size_t* input_count_return, |
- InstructionOperand** inputs) { |
+ InstructionOperand* inputs) { |
ArmOperandGenerator g(selector); |
if (g.CanBeImmediate(node, *opcode_return)) { |
*opcode_return |= AddressingModeField::encode(kMode_Operand2_I); |
@@ -190,9 +190,9 @@ void VisitBinop(InstructionSelector* selector, Node* node, |
FlagsContinuation* cont) { |
ArmOperandGenerator g(selector); |
Int32BinopMatcher m(node); |
- InstructionOperand* inputs[5]; |
+ InstructionOperand inputs[5]; |
size_t input_count = 0; |
- InstructionOperand* outputs[2]; |
+ InstructionOperand outputs[2]; |
size_t output_count = 0; |
if (m.left().node() == m.right().node()) { |
@@ -203,7 +203,7 @@ void VisitBinop(InstructionSelector* selector, Node* node, |
// mov r0, r1, asr #16 |
// adds r0, r0, r1, asr #16 |
// bvs label |
- InstructionOperand* const input = g.UseRegister(m.left().node()); |
+ InstructionOperand const input = g.UseRegister(m.left().node()); |
opcode |= AddressingModeField::encode(kMode_Operand2_R); |
inputs[input_count++] = input; |
inputs[input_count++] = input; |
@@ -309,10 +309,9 @@ void InstructionSelector::VisitStore(Node* node) { |
// TODO(dcarney): refactor RecordWrite function to take temp registers |
// and pass them here instead of using fixed regs |
// TODO(dcarney): handle immediate indices. |
- InstructionOperand* temps[] = {g.TempRegister(r5), g.TempRegister(r6)}; |
- Emit(kArmStoreWriteBarrier, NULL, g.UseFixed(base, r4), |
- g.UseFixed(index, r5), g.UseFixed(value, r6), arraysize(temps), |
- temps); |
+ InstructionOperand temps[] = {g.TempRegister(r5), g.TempRegister(r6)}; |
+ Emit(kArmStoreWriteBarrier, g.NoOutput(), g.UseFixed(base, r4), |
+ g.UseFixed(index, r5), g.UseFixed(value, r6), arraysize(temps), temps); |
return; |
} |
DCHECK_EQ(kNoWriteBarrier, store_rep.write_barrier_kind()); |
@@ -342,10 +341,10 @@ void InstructionSelector::VisitStore(Node* node) { |
} |
if (g.CanBeImmediate(index, opcode)) { |
- Emit(opcode | AddressingModeField::encode(kMode_Offset_RI), NULL, |
+ Emit(opcode | AddressingModeField::encode(kMode_Offset_RI), g.NoOutput(), |
g.UseRegister(base), g.UseImmediate(index), g.UseRegister(value)); |
} else { |
- Emit(opcode | AddressingModeField::encode(kMode_Offset_RR), NULL, |
+ Emit(opcode | AddressingModeField::encode(kMode_Offset_RR), g.NoOutput(), |
g.UseRegister(base), g.UseRegister(index), g.UseRegister(value)); |
} |
} |
@@ -379,10 +378,10 @@ void InstructionSelector::VisitCheckedLoad(Node* node) { |
UNREACHABLE(); |
return; |
} |
- InstructionOperand* offset_operand = g.UseRegister(offset); |
- InstructionOperand* length_operand = g.CanBeImmediate(length, kArmCmp) |
- ? g.UseImmediate(length) |
- : g.UseRegister(length); |
+ InstructionOperand offset_operand = g.UseRegister(offset); |
+ InstructionOperand length_operand = g.CanBeImmediate(length, kArmCmp) |
+ ? g.UseImmediate(length) |
+ : g.UseRegister(length); |
Emit(opcode | AddressingModeField::encode(kMode_Offset_RR), |
g.DefineAsRegister(node), offset_operand, length_operand, |
g.UseRegister(buffer), offset_operand); |
@@ -417,11 +416,11 @@ void InstructionSelector::VisitCheckedStore(Node* node) { |
UNREACHABLE(); |
return; |
} |
- InstructionOperand* offset_operand = g.UseRegister(offset); |
- InstructionOperand* length_operand = g.CanBeImmediate(length, kArmCmp) |
- ? g.UseImmediate(length) |
- : g.UseRegister(length); |
- Emit(opcode | AddressingModeField::encode(kMode_Offset_RR), nullptr, |
+ InstructionOperand offset_operand = g.UseRegister(offset); |
+ InstructionOperand length_operand = g.CanBeImmediate(length, kArmCmp) |
+ ? g.UseImmediate(length) |
+ : g.UseRegister(length); |
+ Emit(opcode | AddressingModeField::encode(kMode_Offset_RR), g.NoOutput(), |
offset_operand, length_operand, g.UseRegister(value), |
g.UseRegister(buffer), offset_operand); |
} |
@@ -433,8 +432,8 @@ void EmitBic(InstructionSelector* selector, Node* node, Node* left, |
Node* right) { |
ArmOperandGenerator g(selector); |
InstructionCode opcode = kArmBic; |
- InstructionOperand* value_operand; |
- InstructionOperand* shift_operand; |
+ InstructionOperand value_operand; |
+ InstructionOperand shift_operand; |
if (TryMatchShift(selector, &opcode, right, &value_operand, &shift_operand)) { |
selector->Emit(opcode, g.DefineAsRegister(node), g.UseRegister(left), |
value_operand, shift_operand); |
@@ -535,8 +534,8 @@ void InstructionSelector::VisitWord32Xor(Node* node) { |
Int32BinopMatcher m(node); |
if (m.right().Is(-1)) { |
InstructionCode opcode = kArmMvn; |
- InstructionOperand* value_operand; |
- InstructionOperand* shift_operand; |
+ InstructionOperand value_operand; |
+ InstructionOperand shift_operand; |
if (TryMatchShift(this, &opcode, m.left().node(), &value_operand, |
&shift_operand)) { |
Emit(opcode, g.DefineAsRegister(node), value_operand, shift_operand); |
@@ -557,9 +556,9 @@ void VisitShift(InstructionSelector* selector, Node* node, |
TryMatchShift try_match_shift, FlagsContinuation* cont) { |
ArmOperandGenerator g(selector); |
InstructionCode opcode = kArmMov; |
- InstructionOperand* inputs[4]; |
+ InstructionOperand inputs[4]; |
size_t input_count = 2; |
- InstructionOperand* outputs[2]; |
+ InstructionOperand outputs[2]; |
size_t output_count = 0; |
CHECK(try_match_shift(selector, &opcode, node, &inputs[0], &inputs[1])); |
@@ -809,26 +808,26 @@ void InstructionSelector::VisitInt32MulHigh(Node* node) { |
void InstructionSelector::VisitUint32MulHigh(Node* node) { |
ArmOperandGenerator g(this); |
- InstructionOperand* outputs[] = {g.TempRegister(), g.DefineAsRegister(node)}; |
- InstructionOperand* inputs[] = {g.UseRegister(node->InputAt(0)), |
- g.UseRegister(node->InputAt(1))}; |
+ InstructionOperand outputs[] = {g.TempRegister(), g.DefineAsRegister(node)}; |
+ InstructionOperand inputs[] = {g.UseRegister(node->InputAt(0)), |
+ g.UseRegister(node->InputAt(1))}; |
Emit(kArmUmull, arraysize(outputs), outputs, arraysize(inputs), inputs); |
} |
static void EmitDiv(InstructionSelector* selector, ArchOpcode div_opcode, |
ArchOpcode f64i32_opcode, ArchOpcode i32f64_opcode, |
- InstructionOperand* result_operand, |
- InstructionOperand* left_operand, |
- InstructionOperand* right_operand) { |
+ InstructionOperand result_operand, |
+ InstructionOperand left_operand, |
+ InstructionOperand right_operand) { |
ArmOperandGenerator g(selector); |
if (selector->IsSupported(SUDIV)) { |
selector->Emit(div_opcode, result_operand, left_operand, right_operand); |
return; |
} |
- InstructionOperand* left_double_operand = g.TempDoubleRegister(); |
- InstructionOperand* right_double_operand = g.TempDoubleRegister(); |
- InstructionOperand* result_double_operand = g.TempDoubleRegister(); |
+ InstructionOperand left_double_operand = g.TempDoubleRegister(); |
+ InstructionOperand right_double_operand = g.TempDoubleRegister(); |
+ InstructionOperand result_double_operand = g.TempDoubleRegister(); |
selector->Emit(f64i32_opcode, left_double_operand, left_operand); |
selector->Emit(f64i32_opcode, right_double_operand, right_operand); |
selector->Emit(kArmVdivF64, result_double_operand, left_double_operand, |
@@ -863,10 +862,10 @@ static void VisitMod(InstructionSelector* selector, Node* node, |
ArchOpcode i32f64_opcode) { |
ArmOperandGenerator g(selector); |
Int32BinopMatcher m(node); |
- InstructionOperand* div_operand = g.TempRegister(); |
- InstructionOperand* result_operand = g.DefineAsRegister(node); |
- InstructionOperand* left_operand = g.UseRegister(m.left().node()); |
- InstructionOperand* right_operand = g.UseRegister(m.right().node()); |
+ InstructionOperand div_operand = g.TempRegister(); |
+ InstructionOperand result_operand = g.DefineAsRegister(node); |
+ InstructionOperand left_operand = g.UseRegister(m.left().node()); |
+ InstructionOperand right_operand = g.UseRegister(m.right().node()); |
EmitDiv(selector, div_opcode, f64i32_opcode, i32f64_opcode, div_operand, |
left_operand, right_operand); |
if (selector->IsSupported(MLS)) { |
@@ -874,7 +873,7 @@ static void VisitMod(InstructionSelector* selector, Node* node, |
left_operand); |
return; |
} |
- InstructionOperand* mul_operand = g.TempRegister(); |
+ InstructionOperand mul_operand = g.TempRegister(); |
selector->Emit(kArmMul, mul_operand, div_operand, right_operand); |
selector->Emit(kArmSub, result_operand, left_operand, mul_operand); |
} |
@@ -1041,7 +1040,7 @@ void InstructionSelector::VisitCall(Node* node) { |
// Push any stack arguments. |
for (auto i = buffer.pushed_nodes.rbegin(); i != buffer.pushed_nodes.rend(); |
++i) { |
- Emit(kArmPush, nullptr, g.UseRegister(*i)); |
+ Emit(kArmPush, g.NoOutput(), g.UseRegister(*i)); |
} |
// Select the appropriate opcode based on the call type. |
@@ -1061,7 +1060,7 @@ void InstructionSelector::VisitCall(Node* node) { |
opcode |= MiscField::encode(descriptor->flags()); |
// Emit the call instruction. |
- InstructionOperand** first_output = |
+ InstructionOperand* first_output = |
buffer.outputs.size() > 0 ? &buffer.outputs.front() : NULL; |
Instruction* call_instr = |
Emit(opcode, buffer.outputs.size(), first_output, |
@@ -1077,10 +1076,10 @@ void VisitFloat64Compare(InstructionSelector* selector, Node* node, |
FlagsContinuation* cont) { |
ArmOperandGenerator g(selector); |
Float64BinopMatcher m(node); |
- InstructionOperand* rhs = m.right().Is(0.0) ? g.UseImmediate(m.right().node()) |
- : g.UseRegister(m.right().node()); |
+ InstructionOperand rhs = m.right().Is(0.0) ? g.UseImmediate(m.right().node()) |
+ : g.UseRegister(m.right().node()); |
if (cont->IsBranch()) { |
- selector->Emit(cont->Encode(kArmVcmpF64), nullptr, |
+ selector->Emit(cont->Encode(kArmVcmpF64), g.NoOutput(), |
g.UseRegister(m.left().node()), rhs, |
g.Label(cont->true_block()), |
g.Label(cont->false_block()))->MarkAsControl(); |
@@ -1098,9 +1097,9 @@ void VisitWordCompare(InstructionSelector* selector, Node* node, |
InstructionCode opcode, FlagsContinuation* cont) { |
ArmOperandGenerator g(selector); |
Int32BinopMatcher m(node); |
- InstructionOperand* inputs[5]; |
+ InstructionOperand inputs[5]; |
size_t input_count = 0; |
- InstructionOperand* outputs[1]; |
+ InstructionOperand outputs[1]; |
size_t output_count = 0; |
if (TryMatchImmediateOrShift(selector, &opcode, m.right().node(), |
@@ -1234,9 +1233,9 @@ void VisitWordCompareZero(InstructionSelector* selector, Node* user, |
ArmOperandGenerator g(selector); |
InstructionCode const opcode = |
cont->Encode(kArmTst) | AddressingModeField::encode(kMode_Operand2_R); |
- InstructionOperand* const value_operand = g.UseRegister(value); |
+ InstructionOperand const value_operand = g.UseRegister(value); |
if (cont->IsBranch()) { |
- selector->Emit(opcode, nullptr, value_operand, value_operand, |
+ selector->Emit(opcode, g.NoOutput(), value_operand, value_operand, |
g.Label(cont->true_block()), |
g.Label(cont->false_block()))->MarkAsControl(); |
} else { |