| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/raw-machine-assembler.h" | 5 #include "src/compiler/raw-machine-assembler.h" |
| 6 | 6 |
| 7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
| 8 #include "src/compiler/pipeline.h" | 8 #include "src/compiler/pipeline.h" |
| 9 #include "src/compiler/scheduler.h" | 9 #include "src/compiler/scheduler.h" |
| 10 | 10 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 parameters_(nullptr), | 25 parameters_(nullptr), |
| 26 current_block_(schedule()->start()) { | 26 current_block_(schedule()->start()) { |
| 27 int param_count = static_cast<int>(parameter_count()); | 27 int param_count = static_cast<int>(parameter_count()); |
| 28 // Add an extra input node for the JSFunction parameter to the start node. | 28 // Add an extra input node for the JSFunction parameter to the start node. |
| 29 Node* s = graph->NewNode(common_.Start(param_count + 1)); | 29 Node* s = graph->NewNode(common_.Start(param_count + 1)); |
| 30 graph->SetStart(s); | 30 graph->SetStart(s); |
| 31 if (parameter_count() == 0) return; | 31 if (parameter_count() == 0) return; |
| 32 parameters_ = zone()->NewArray<Node*>(param_count); | 32 parameters_ = zone()->NewArray<Node*>(param_count); |
| 33 for (size_t i = 0; i < parameter_count(); ++i) { | 33 for (size_t i = 0; i < parameter_count(); ++i) { |
| 34 parameters_[i] = | 34 parameters_[i] = |
| 35 NewNode(common()->Parameter(static_cast<int>(i)), graph->start()); | 35 AddNode(common()->Parameter(static_cast<int>(i)), graph->start()); |
| 36 } | 36 } |
| 37 } | 37 } |
| 38 | 38 |
| 39 | 39 |
| 40 Schedule* RawMachineAssembler::Export() { | 40 Schedule* RawMachineAssembler::Export() { |
| 41 // Compute the correct codegen order. | 41 // Compute the correct codegen order. |
| 42 DCHECK(schedule_->rpo_order()->empty()); | 42 DCHECK(schedule_->rpo_order()->empty()); |
| 43 Scheduler::ComputeSpecialRPO(zone(), schedule_); | 43 Scheduler::ComputeSpecialRPO(zone(), schedule_); |
| 44 // Invalidate RawMachineAssembler. | 44 // Invalidate RawMachineAssembler. |
| 45 Schedule* schedule = schedule_; | 45 Schedule* schedule = schedule_; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 57 void RawMachineAssembler::Goto(Label* label) { | 57 void RawMachineAssembler::Goto(Label* label) { |
| 58 DCHECK(current_block_ != schedule()->end()); | 58 DCHECK(current_block_ != schedule()->end()); |
| 59 schedule()->AddGoto(CurrentBlock(), Use(label)); | 59 schedule()->AddGoto(CurrentBlock(), Use(label)); |
| 60 current_block_ = nullptr; | 60 current_block_ = nullptr; |
| 61 } | 61 } |
| 62 | 62 |
| 63 | 63 |
| 64 void RawMachineAssembler::Branch(Node* condition, Label* true_val, | 64 void RawMachineAssembler::Branch(Node* condition, Label* true_val, |
| 65 Label* false_val) { | 65 Label* false_val) { |
| 66 DCHECK(current_block_ != schedule()->end()); | 66 DCHECK(current_block_ != schedule()->end()); |
| 67 Node* branch = NewNode(common()->Branch(), condition); | 67 Node* branch = AddNode(common()->Branch(), condition); |
| 68 schedule()->AddBranch(CurrentBlock(), branch, Use(true_val), Use(false_val)); | 68 schedule()->AddBranch(CurrentBlock(), branch, Use(true_val), Use(false_val)); |
| 69 current_block_ = nullptr; | 69 current_block_ = nullptr; |
| 70 } | 70 } |
| 71 | 71 |
| 72 | 72 |
| 73 void RawMachineAssembler::Switch(Node* index, Label* default_label, | 73 void RawMachineAssembler::Switch(Node* index, Label* default_label, |
| 74 int32_t* case_values, Label** case_labels, | 74 int32_t* case_values, Label** case_labels, |
| 75 size_t case_count) { | 75 size_t case_count) { |
| 76 DCHECK_NE(schedule()->end(), current_block_); | 76 DCHECK_NE(schedule()->end(), current_block_); |
| 77 size_t succ_count = case_count + 1; | 77 size_t succ_count = case_count + 1; |
| 78 Node* switch_node = NewNode(common()->Switch(succ_count), index); | 78 Node* switch_node = AddNode(common()->Switch(succ_count), index); |
| 79 BasicBlock** succ_blocks = zone()->NewArray<BasicBlock*>(succ_count); | 79 BasicBlock** succ_blocks = zone()->NewArray<BasicBlock*>(succ_count); |
| 80 for (size_t index = 0; index < case_count; ++index) { | 80 for (size_t index = 0; index < case_count; ++index) { |
| 81 int32_t case_value = case_values[index]; | 81 int32_t case_value = case_values[index]; |
| 82 BasicBlock* case_block = Use(case_labels[index]); | 82 BasicBlock* case_block = Use(case_labels[index]); |
| 83 Node* case_node = | 83 Node* case_node = |
| 84 graph()->NewNode(common()->IfValue(case_value), switch_node); | 84 graph()->NewNode(common()->IfValue(case_value), switch_node); |
| 85 schedule()->AddNode(case_block, case_node); | 85 schedule()->AddNode(case_block, case_node); |
| 86 succ_blocks[index] = case_block; | 86 succ_blocks[index] = case_block; |
| 87 } | 87 } |
| 88 BasicBlock* default_block = Use(default_label); | 88 BasicBlock* default_block = Use(default_label); |
| 89 Node* default_node = graph()->NewNode(common()->IfDefault(), switch_node); | 89 Node* default_node = graph()->NewNode(common()->IfDefault(), switch_node); |
| 90 schedule()->AddNode(default_block, default_node); | 90 schedule()->AddNode(default_block, default_node); |
| 91 succ_blocks[case_count] = default_block; | 91 succ_blocks[case_count] = default_block; |
| 92 schedule()->AddSwitch(CurrentBlock(), switch_node, succ_blocks, succ_count); | 92 schedule()->AddSwitch(CurrentBlock(), switch_node, succ_blocks, succ_count); |
| 93 current_block_ = nullptr; | 93 current_block_ = nullptr; |
| 94 } | 94 } |
| 95 | 95 |
| 96 | 96 |
| 97 void RawMachineAssembler::Return(Node* value) { | 97 void RawMachineAssembler::Return(Node* value) { |
| 98 Node* ret = graph()->NewNode(common()->Return(), value); | 98 Node* ret = MakeNode(common()->Return(), 1, &value); |
| 99 schedule()->AddReturn(CurrentBlock(), ret); | 99 schedule()->AddReturn(CurrentBlock(), ret); |
| 100 current_block_ = nullptr; | 100 current_block_ = nullptr; |
| 101 } | 101 } |
| 102 | 102 |
| 103 | 103 |
| 104 Node* RawMachineAssembler::CallN(CallDescriptor* desc, Node* function, | 104 Node* RawMachineAssembler::CallN(CallDescriptor* desc, Node* function, |
| 105 Node** args) { | 105 Node** args) { |
| 106 int param_count = | 106 int param_count = |
| 107 static_cast<int>(desc->GetMachineSignature()->parameter_count()); | 107 static_cast<int>(desc->GetMachineSignature()->parameter_count()); |
| 108 int input_count = param_count + 3; | 108 int input_count = param_count + 3; |
| 109 Node** buffer = zone()->NewArray<Node*>(input_count); | 109 Node** buffer = zone()->NewArray<Node*>(input_count); |
| 110 int index = 0; | 110 int index = 0; |
| 111 buffer[index++] = function; | 111 buffer[index++] = function; |
| 112 for (int i = 0; i < param_count; i++) { | 112 for (int i = 0; i < param_count; i++) { |
| 113 buffer[index++] = args[i]; | 113 buffer[index++] = args[i]; |
| 114 } | 114 } |
| 115 buffer[index++] = graph()->start(); | 115 buffer[index++] = graph()->start(); |
| 116 buffer[index++] = graph()->start(); | 116 buffer[index++] = graph()->start(); |
| 117 Node* call = graph()->NewNode(common()->Call(desc), input_count, buffer); | 117 return AddNode(common()->Call(desc), input_count, buffer); |
| 118 schedule()->AddNode(CurrentBlock(), call); | |
| 119 return call; | |
| 120 } | 118 } |
| 121 | 119 |
| 122 | 120 |
| 123 Node* RawMachineAssembler::CallNWithFrameState(CallDescriptor* desc, | 121 Node* RawMachineAssembler::CallNWithFrameState(CallDescriptor* desc, |
| 124 Node* function, Node** args, | 122 Node* function, Node** args, |
| 125 Node* frame_state) { | 123 Node* frame_state) { |
| 126 DCHECK(desc->NeedsFrameState()); | 124 DCHECK(desc->NeedsFrameState()); |
| 127 int param_count = | 125 int param_count = |
| 128 static_cast<int>(desc->GetMachineSignature()->parameter_count()); | 126 static_cast<int>(desc->GetMachineSignature()->parameter_count()); |
| 129 int input_count = param_count + 4; | 127 int input_count = param_count + 4; |
| 130 Node** buffer = zone()->NewArray<Node*>(input_count); | 128 Node** buffer = zone()->NewArray<Node*>(input_count); |
| 131 int index = 0; | 129 int index = 0; |
| 132 buffer[index++] = function; | 130 buffer[index++] = function; |
| 133 for (int i = 0; i < param_count; i++) { | 131 for (int i = 0; i < param_count; i++) { |
| 134 buffer[index++] = args[i]; | 132 buffer[index++] = args[i]; |
| 135 } | 133 } |
| 136 buffer[index++] = frame_state; | 134 buffer[index++] = frame_state; |
| 137 buffer[index++] = graph()->start(); | 135 buffer[index++] = graph()->start(); |
| 138 buffer[index++] = graph()->start(); | 136 buffer[index++] = graph()->start(); |
| 139 Node* call = graph()->NewNode(common()->Call(desc), input_count, buffer); | 137 return AddNode(common()->Call(desc), input_count, buffer); |
| 140 schedule()->AddNode(CurrentBlock(), call); | |
| 141 return call; | |
| 142 } | 138 } |
| 143 | 139 |
| 144 | 140 |
| 145 Node* RawMachineAssembler::TailCallN(CallDescriptor* desc, Node* function, | 141 Node* RawMachineAssembler::TailCallN(CallDescriptor* desc, Node* function, |
| 146 Node** args) { | 142 Node** args) { |
| 147 int param_count = | 143 int param_count = |
| 148 static_cast<int>(desc->GetMachineSignature()->parameter_count()); | 144 static_cast<int>(desc->GetMachineSignature()->parameter_count()); |
| 149 int input_count = param_count + 3; | 145 int input_count = param_count + 3; |
| 150 Node** buffer = zone()->NewArray<Node*>(input_count); | 146 Node** buffer = zone()->NewArray<Node*>(input_count); |
| 151 int index = 0; | 147 int index = 0; |
| 152 buffer[index++] = function; | 148 buffer[index++] = function; |
| 153 for (int i = 0; i < param_count; i++) { | 149 for (int i = 0; i < param_count; i++) { |
| 154 buffer[index++] = args[i]; | 150 buffer[index++] = args[i]; |
| 155 } | 151 } |
| 156 buffer[index++] = graph()->start(); | 152 buffer[index++] = graph()->start(); |
| 157 buffer[index++] = graph()->start(); | 153 buffer[index++] = graph()->start(); |
| 158 Node* tail_call = | 154 Node* tail_call = MakeNode(common()->TailCall(desc), input_count, buffer); |
| 159 graph()->NewNode(common()->TailCall(desc), input_count, buffer); | |
| 160 schedule()->AddTailCall(CurrentBlock(), tail_call); | 155 schedule()->AddTailCall(CurrentBlock(), tail_call); |
| 161 return tail_call; | 156 return tail_call; |
| 162 } | 157 } |
| 163 | 158 |
| 164 | 159 |
| 165 Node* RawMachineAssembler::CallFunctionStub0(Node* function, Node* receiver, | 160 Node* RawMachineAssembler::CallFunctionStub0(Node* function, Node* receiver, |
| 166 Node* context, Node* frame_state, | 161 Node* context, Node* frame_state, |
| 167 CallFunctionFlags flags) { | 162 CallFunctionFlags flags) { |
| 168 Callable callable = CodeFactory::CallFunction(isolate(), 0, flags); | 163 Callable callable = CodeFactory::CallFunction(isolate(), 0, flags); |
| 169 CallDescriptor* desc = Linkage::GetStubCallDescriptor( | 164 CallDescriptor* desc = Linkage::GetStubCallDescriptor( |
| 170 isolate(), zone(), callable.descriptor(), 1, | 165 isolate(), zone(), callable.descriptor(), 1, |
| 171 CallDescriptor::kNeedsFrameState, Operator::kNoProperties); | 166 CallDescriptor::kNeedsFrameState, Operator::kNoProperties); |
| 172 Node* stub_code = HeapConstant(callable.code()); | 167 Node* stub_code = HeapConstant(callable.code()); |
| 173 Node* call = graph()->NewNode(common()->Call(desc), stub_code, function, | 168 return AddNode(common()->Call(desc), stub_code, function, receiver, context, |
| 174 receiver, context, frame_state, | 169 frame_state, graph()->start(), graph()->start()); |
| 175 graph()->start(), graph()->start()); | |
| 176 schedule()->AddNode(CurrentBlock(), call); | |
| 177 return call; | |
| 178 } | 170 } |
| 179 | 171 |
| 180 | 172 |
| 181 Node* RawMachineAssembler::CallRuntime1(Runtime::FunctionId function, | 173 Node* RawMachineAssembler::CallRuntime1(Runtime::FunctionId function, |
| 182 Node* arg1, Node* context) { | 174 Node* arg1, Node* context) { |
| 183 CallDescriptor* descriptor = Linkage::GetRuntimeCallDescriptor( | 175 CallDescriptor* descriptor = Linkage::GetRuntimeCallDescriptor( |
| 184 zone(), function, 1, Operator::kNoProperties, false); | 176 zone(), function, 1, Operator::kNoProperties, false); |
| 185 | 177 |
| 186 Node* centry = HeapConstant(CEntryStub(isolate(), 1).GetCode()); | 178 Node* centry = HeapConstant(CEntryStub(isolate(), 1).GetCode()); |
| 187 Node* ref = NewNode( | 179 Node* ref = AddNode( |
| 188 common()->ExternalConstant(ExternalReference(function, isolate()))); | 180 common()->ExternalConstant(ExternalReference(function, isolate()))); |
| 189 Node* arity = Int32Constant(1); | 181 Node* arity = Int32Constant(1); |
| 190 | 182 |
| 191 Node* call = | 183 return AddNode(common()->Call(descriptor), centry, arg1, ref, arity, context, |
| 192 graph()->NewNode(common()->Call(descriptor), centry, arg1, ref, arity, | 184 graph()->start(), graph()->start()); |
| 193 context, graph()->start(), graph()->start()); | |
| 194 schedule()->AddNode(CurrentBlock(), call); | |
| 195 return call; | |
| 196 } | 185 } |
| 197 | 186 |
| 198 | 187 |
| 199 Node* RawMachineAssembler::CallRuntime2(Runtime::FunctionId function, | 188 Node* RawMachineAssembler::CallRuntime2(Runtime::FunctionId function, |
| 200 Node* arg1, Node* arg2, Node* context) { | 189 Node* arg1, Node* arg2, Node* context) { |
| 201 CallDescriptor* descriptor = Linkage::GetRuntimeCallDescriptor( | 190 CallDescriptor* descriptor = Linkage::GetRuntimeCallDescriptor( |
| 202 zone(), function, 2, Operator::kNoProperties, false); | 191 zone(), function, 2, Operator::kNoProperties, false); |
| 203 | 192 |
| 204 Node* centry = HeapConstant(CEntryStub(isolate(), 1).GetCode()); | 193 Node* centry = HeapConstant(CEntryStub(isolate(), 1).GetCode()); |
| 205 Node* ref = NewNode( | 194 Node* ref = AddNode( |
| 206 common()->ExternalConstant(ExternalReference(function, isolate()))); | 195 common()->ExternalConstant(ExternalReference(function, isolate()))); |
| 207 Node* arity = Int32Constant(2); | 196 Node* arity = Int32Constant(2); |
| 208 | 197 |
| 209 Node* call = | 198 return AddNode(common()->Call(descriptor), centry, arg1, arg2, ref, arity, |
| 210 graph()->NewNode(common()->Call(descriptor), centry, arg1, arg2, ref, | 199 context, graph()->start(), graph()->start()); |
| 211 arity, context, graph()->start(), graph()->start()); | |
| 212 schedule()->AddNode(CurrentBlock(), call); | |
| 213 return call; | |
| 214 } | 200 } |
| 215 | 201 |
| 216 | 202 |
| 217 Node* RawMachineAssembler::CallCFunction0(MachineType return_type, | 203 Node* RawMachineAssembler::CallCFunction0(MachineType return_type, |
| 218 Node* function) { | 204 Node* function) { |
| 219 MachineSignature::Builder builder(zone(), 1, 0); | 205 MachineSignature::Builder builder(zone(), 1, 0); |
| 220 builder.AddReturn(return_type); | 206 builder.AddReturn(return_type); |
| 221 const CallDescriptor* descriptor = | 207 const CallDescriptor* descriptor = |
| 222 Linkage::GetSimplifiedCDescriptor(zone(), builder.Build()); | 208 Linkage::GetSimplifiedCDescriptor(zone(), builder.Build()); |
| 223 | 209 |
| 224 Node* call = graph()->NewNode(common()->Call(descriptor), function, | 210 return AddNode(common()->Call(descriptor), function, graph()->start(), |
| 225 graph()->start(), graph()->start()); | 211 graph()->start()); |
| 226 schedule()->AddNode(CurrentBlock(), call); | |
| 227 return call; | |
| 228 } | 212 } |
| 229 | 213 |
| 230 | 214 |
| 231 Node* RawMachineAssembler::CallCFunction1(MachineType return_type, | 215 Node* RawMachineAssembler::CallCFunction1(MachineType return_type, |
| 232 MachineType arg0_type, Node* function, | 216 MachineType arg0_type, Node* function, |
| 233 Node* arg0) { | 217 Node* arg0) { |
| 234 MachineSignature::Builder builder(zone(), 1, 1); | 218 MachineSignature::Builder builder(zone(), 1, 1); |
| 235 builder.AddReturn(return_type); | 219 builder.AddReturn(return_type); |
| 236 builder.AddParam(arg0_type); | 220 builder.AddParam(arg0_type); |
| 237 const CallDescriptor* descriptor = | 221 const CallDescriptor* descriptor = |
| 238 Linkage::GetSimplifiedCDescriptor(zone(), builder.Build()); | 222 Linkage::GetSimplifiedCDescriptor(zone(), builder.Build()); |
| 239 | 223 |
| 240 Node* call = graph()->NewNode(common()->Call(descriptor), function, arg0, | 224 return AddNode(common()->Call(descriptor), function, arg0, graph()->start(), |
| 241 graph()->start(), graph()->start()); | 225 graph()->start()); |
| 242 schedule()->AddNode(CurrentBlock(), call); | |
| 243 return call; | |
| 244 } | 226 } |
| 245 | 227 |
| 246 | 228 |
| 247 Node* RawMachineAssembler::CallCFunction2(MachineType return_type, | 229 Node* RawMachineAssembler::CallCFunction2(MachineType return_type, |
| 248 MachineType arg0_type, | 230 MachineType arg0_type, |
| 249 MachineType arg1_type, Node* function, | 231 MachineType arg1_type, Node* function, |
| 250 Node* arg0, Node* arg1) { | 232 Node* arg0, Node* arg1) { |
| 251 MachineSignature::Builder builder(zone(), 1, 2); | 233 MachineSignature::Builder builder(zone(), 1, 2); |
| 252 builder.AddReturn(return_type); | 234 builder.AddReturn(return_type); |
| 253 builder.AddParam(arg0_type); | 235 builder.AddParam(arg0_type); |
| 254 builder.AddParam(arg1_type); | 236 builder.AddParam(arg1_type); |
| 255 const CallDescriptor* descriptor = | 237 const CallDescriptor* descriptor = |
| 256 Linkage::GetSimplifiedCDescriptor(zone(), builder.Build()); | 238 Linkage::GetSimplifiedCDescriptor(zone(), builder.Build()); |
| 257 | 239 |
| 258 Node* call = graph()->NewNode(common()->Call(descriptor), function, arg0, | 240 return AddNode(common()->Call(descriptor), function, arg0, arg1, |
| 259 arg1, graph()->start(), graph()->start()); | 241 graph()->start(), graph()->start()); |
| 260 schedule()->AddNode(CurrentBlock(), call); | |
| 261 return call; | |
| 262 } | 242 } |
| 263 | 243 |
| 264 | 244 |
| 265 Node* RawMachineAssembler::CallCFunction8( | 245 Node* RawMachineAssembler::CallCFunction8( |
| 266 MachineType return_type, MachineType arg0_type, MachineType arg1_type, | 246 MachineType return_type, MachineType arg0_type, MachineType arg1_type, |
| 267 MachineType arg2_type, MachineType arg3_type, MachineType arg4_type, | 247 MachineType arg2_type, MachineType arg3_type, MachineType arg4_type, |
| 268 MachineType arg5_type, MachineType arg6_type, MachineType arg7_type, | 248 MachineType arg5_type, MachineType arg6_type, MachineType arg7_type, |
| 269 Node* function, Node* arg0, Node* arg1, Node* arg2, Node* arg3, Node* arg4, | 249 Node* function, Node* arg0, Node* arg1, Node* arg2, Node* arg3, Node* arg4, |
| 270 Node* arg5, Node* arg6, Node* arg7) { | 250 Node* arg5, Node* arg6, Node* arg7) { |
| 271 MachineSignature::Builder builder(zone(), 1, 8); | 251 MachineSignature::Builder builder(zone(), 1, 8); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 284 arg2, | 264 arg2, |
| 285 arg3, | 265 arg3, |
| 286 arg4, | 266 arg4, |
| 287 arg5, | 267 arg5, |
| 288 arg6, | 268 arg6, |
| 289 arg7, | 269 arg7, |
| 290 graph()->start(), | 270 graph()->start(), |
| 291 graph()->start()}; | 271 graph()->start()}; |
| 292 const CallDescriptor* descriptor = | 272 const CallDescriptor* descriptor = |
| 293 Linkage::GetSimplifiedCDescriptor(zone(), builder.Build()); | 273 Linkage::GetSimplifiedCDescriptor(zone(), builder.Build()); |
| 294 Node* call = | 274 return AddNode(common()->Call(descriptor), arraysize(args), args); |
| 295 graph()->NewNode(common()->Call(descriptor), arraysize(args), args); | |
| 296 schedule()->AddNode(CurrentBlock(), call); | |
| 297 return call; | |
| 298 } | 275 } |
| 299 | 276 |
| 300 | 277 |
| 301 void RawMachineAssembler::Bind(Label* label) { | 278 void RawMachineAssembler::Bind(Label* label) { |
| 302 DCHECK(current_block_ == nullptr); | 279 DCHECK(current_block_ == nullptr); |
| 303 DCHECK(!label->bound_); | 280 DCHECK(!label->bound_); |
| 304 label->bound_ = true; | 281 label->bound_ = true; |
| 305 current_block_ = EnsureBlock(label); | 282 current_block_ = EnsureBlock(label); |
| 306 } | 283 } |
| 307 | 284 |
| 308 | 285 |
| 309 BasicBlock* RawMachineAssembler::Use(Label* label) { | 286 BasicBlock* RawMachineAssembler::Use(Label* label) { |
| 310 label->used_ = true; | 287 label->used_ = true; |
| 311 return EnsureBlock(label); | 288 return EnsureBlock(label); |
| 312 } | 289 } |
| 313 | 290 |
| 314 | 291 |
| 315 BasicBlock* RawMachineAssembler::EnsureBlock(Label* label) { | 292 BasicBlock* RawMachineAssembler::EnsureBlock(Label* label) { |
| 316 if (label->block_ == nullptr) label->block_ = schedule()->NewBasicBlock(); | 293 if (label->block_ == nullptr) label->block_ = schedule()->NewBasicBlock(); |
| 317 return label->block_; | 294 return label->block_; |
| 318 } | 295 } |
| 319 | 296 |
| 320 | 297 |
| 321 BasicBlock* RawMachineAssembler::CurrentBlock() { | 298 BasicBlock* RawMachineAssembler::CurrentBlock() { |
| 322 DCHECK(current_block_); | 299 DCHECK(current_block_); |
| 323 return current_block_; | 300 return current_block_; |
| 324 } | 301 } |
| 325 | 302 |
| 326 | 303 |
| 304 Node* RawMachineAssembler::AddNode(const Operator* op, int input_count, |
| 305 Node** inputs) { |
| 306 DCHECK_NOT_NULL(schedule_); |
| 307 DCHECK(current_block_ != nullptr); |
| 308 Node* node = MakeNode(op, input_count, inputs); |
| 309 schedule()->AddNode(CurrentBlock(), node); |
| 310 return node; |
| 311 } |
| 312 |
| 313 |
| 327 Node* RawMachineAssembler::MakeNode(const Operator* op, int input_count, | 314 Node* RawMachineAssembler::MakeNode(const Operator* op, int input_count, |
| 328 Node** inputs) { | 315 Node** inputs) { |
| 329 DCHECK_NOT_NULL(schedule_); | 316 // The raw machine assembler nodes do not have effect and control inputs, |
| 330 DCHECK(current_block_ != nullptr); | 317 // so we disable checking input counts here. |
| 331 Node* node = graph()->NewNode(op, input_count, inputs); | 318 return graph()->NewNodeUnchecked(op, input_count, inputs); |
| 332 schedule()->AddNode(CurrentBlock(), node); | |
| 333 return node; | |
| 334 } | 319 } |
| 335 | 320 |
| 336 } // namespace compiler | 321 } // namespace compiler |
| 337 } // namespace internal | 322 } // namespace internal |
| 338 } // namespace v8 | 323 } // namespace v8 |
| OLD | NEW |