Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/code-stub-assembler.h" | 5 #include "src/compiler/code-stub-assembler.h" |
| 6 | 6 |
| 7 #include <ostream> | 7 #include <ostream> |
| 8 | 8 |
| 9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
| 10 #include "src/compiler/graph.h" | 10 #include "src/compiler/graph.h" |
| 11 #include "src/compiler/instruction-selector.h" | 11 #include "src/compiler/instruction-selector.h" |
| 12 #include "src/compiler/linkage.h" | 12 #include "src/compiler/linkage.h" |
| 13 #include "src/compiler/pipeline.h" | 13 #include "src/compiler/pipeline.h" |
| 14 #include "src/compiler/raw-machine-assembler.h" | 14 #include "src/compiler/raw-machine-assembler.h" |
| 15 #include "src/compiler/schedule.h" | 15 #include "src/compiler/schedule.h" |
| 16 #include "src/frames.h" | 16 #include "src/frames.h" |
| 17 #include "src/interface-descriptors.h" | 17 #include "src/interface-descriptors.h" |
| 18 #include "src/interpreter/bytecodes.h" | 18 #include "src/interpreter/bytecodes.h" |
| 19 #include "src/machine-type.h" | 19 #include "src/machine-type.h" |
| 20 #include "src/macro-assembler.h" | 20 #include "src/macro-assembler.h" |
| 21 #include "src/zone.h" | 21 #include "src/zone.h" |
| 22 | 22 |
| 23 namespace v8 { | 23 namespace v8 { |
| 24 namespace internal { | 24 namespace internal { |
| 25 namespace compiler { | 25 namespace compiler { |
| 26 | 26 |
| 27 | |
| 28 CodeStubAssembler::CodeStubAssembler(Isolate* isolate, Zone* zone, | 27 CodeStubAssembler::CodeStubAssembler(Isolate* isolate, Zone* zone, |
| 29 const CallInterfaceDescriptor& descriptor, | 28 const CallInterfaceDescriptor& descriptor, |
| 30 Code::Flags flags, const char* name) | 29 Code::Flags flags, const char* name) |
| 31 : raw_assembler_(new RawMachineAssembler( | 30 : raw_assembler_(new RawMachineAssembler( |
| 32 isolate, new (zone) Graph(zone), | 31 isolate, new (zone) Graph(zone), |
| 33 Linkage::GetStubCallDescriptor(isolate, zone, descriptor, 0, | 32 Linkage::GetStubCallDescriptor(isolate, zone, descriptor, 0, |
| 34 CallDescriptor::kNoFlags))), | 33 CallDescriptor::kNoFlags))), |
| 35 flags_(flags), | 34 flags_(flags), |
| 36 name_(name), | 35 name_(name), |
| 37 code_generated_(false) {} | 36 code_generated_(false), |
| 37 linkage_type_(LinkageDescriptorType::kStubCall), | |
| 38 parameter_count_(descriptor.GetParameterCount()) {} | |
| 38 | 39 |
| 39 | 40 |
| 40 CodeStubAssembler::~CodeStubAssembler() {} | 41 CodeStubAssembler::CodeStubAssembler(Isolate* isolate, Zone* zone, |
| 42 int parameter_count, Code::Flags flags, | |
| 43 const char* name) | |
| 44 : raw_assembler_(new RawMachineAssembler( | |
| 45 isolate, new (zone) Graph(zone), | |
| 46 Linkage::GetJSCallDescriptor(zone, false, parameter_count, | |
| 47 CallDescriptor::kNoFlags))), | |
| 48 flags_(flags), | |
| 49 name_(name), | |
| 50 code_generated_(false), | |
| 51 linkage_type_(LinkageDescriptorType::kJSCall), | |
| 52 parameter_count_(parameter_count) {} | |
| 53 | |
| 54 | |
| 55 CodeStubAssembler::~CodeStubAssembler() { | |
| 56 for (auto label : labels_) { | |
| 57 delete label; | |
|
Jarin
2016/02/08 10:25:04
We don't normally do new/delete dances and use zon
| |
| 58 } | |
| 59 } | |
| 41 | 60 |
| 42 | 61 |
| 43 Handle<Code> CodeStubAssembler::GenerateCode() { | 62 Handle<Code> CodeStubAssembler::GenerateCode() { |
| 44 DCHECK(!code_generated_); | 63 DCHECK(!code_generated_); |
| 45 | 64 |
| 46 Schedule* schedule = raw_assembler_->Export(); | 65 Schedule* schedule = raw_assembler_->Export(); |
| 47 Handle<Code> code = Pipeline::GenerateCodeForCodeStub( | 66 Handle<Code> code = Pipeline::GenerateCodeForCodeStub( |
| 48 isolate(), raw_assembler_->call_descriptor(), graph(), schedule, flags_, | 67 isolate(), raw_assembler_->call_descriptor(), graph(), schedule, flags_, |
| 49 name_); | 68 name_); |
| 50 | 69 |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 66 Node* CodeStubAssembler::NumberConstant(double value) { | 85 Node* CodeStubAssembler::NumberConstant(double value) { |
| 67 return raw_assembler_->NumberConstant(value); | 86 return raw_assembler_->NumberConstant(value); |
| 68 } | 87 } |
| 69 | 88 |
| 70 | 89 |
| 71 Node* CodeStubAssembler::HeapConstant(Handle<HeapObject> object) { | 90 Node* CodeStubAssembler::HeapConstant(Handle<HeapObject> object) { |
| 72 return raw_assembler_->HeapConstant(object); | 91 return raw_assembler_->HeapConstant(object); |
| 73 } | 92 } |
| 74 | 93 |
| 75 | 94 |
| 95 Node* CodeStubAssembler::UndefinedConstant() { | |
| 96 return raw_assembler_->UndefinedConstant(); | |
| 97 } | |
| 98 | |
| 99 | |
| 76 Node* CodeStubAssembler::BooleanConstant(bool value) { | 100 Node* CodeStubAssembler::BooleanConstant(bool value) { |
| 77 return raw_assembler_->BooleanConstant(value); | 101 return raw_assembler_->BooleanConstant(value); |
| 78 } | 102 } |
| 79 | 103 |
| 80 | 104 |
| 105 Node* CodeStubAssembler::Load(MachineType type, Node* base) { | |
| 106 return raw_assembler_->Load(type, base); | |
| 107 } | |
| 108 | |
| 109 | |
| 110 Node* CodeStubAssembler::Load(MachineType type, Node* base, Node* index) { | |
| 111 return raw_assembler_->Load(type, base, index); | |
| 112 } | |
| 113 | |
| 114 | |
| 81 Node* CodeStubAssembler::Parameter(int value) { | 115 Node* CodeStubAssembler::Parameter(int value) { |
| 82 return raw_assembler_->Parameter(value); | 116 return raw_assembler_->Parameter(value); |
| 83 } | 117 } |
| 84 | 118 |
| 85 | 119 |
| 86 void CodeStubAssembler::Return(Node* value) { | |
| 87 return raw_assembler_->Return(value); | |
| 88 } | |
| 89 | |
| 90 | |
| 91 Node* CodeStubAssembler::SmiShiftBitsConstant() { | 120 Node* CodeStubAssembler::SmiShiftBitsConstant() { |
| 92 return Int32Constant(kSmiShiftSize + kSmiTagSize); | 121 return Int32Constant(kSmiShiftSize + kSmiTagSize); |
| 93 } | 122 } |
| 94 | 123 |
| 95 | 124 |
| 96 Node* CodeStubAssembler::SmiTag(Node* value) { | 125 Node* CodeStubAssembler::SmiTag(Node* value) { |
| 97 return raw_assembler_->WordShl(value, SmiShiftBitsConstant()); | 126 return raw_assembler_->WordShl(value, SmiShiftBitsConstant()); |
| 98 } | 127 } |
| 99 | 128 |
| 100 | 129 |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 111 Node* CodeStubAssembler::IntPtrSub(Node* a, Node* b) { | 140 Node* CodeStubAssembler::IntPtrSub(Node* a, Node* b) { |
| 112 return raw_assembler_->IntPtrSub(a, b); | 141 return raw_assembler_->IntPtrSub(a, b); |
| 113 } | 142 } |
| 114 | 143 |
| 115 | 144 |
| 116 Node* CodeStubAssembler::WordShl(Node* value, int shift) { | 145 Node* CodeStubAssembler::WordShl(Node* value, int shift) { |
| 117 return raw_assembler_->WordShl(value, Int32Constant(shift)); | 146 return raw_assembler_->WordShl(value, Int32Constant(shift)); |
| 118 } | 147 } |
| 119 | 148 |
| 120 | 149 |
| 150 Node* CodeStubAssembler::WordEqual(Node* a, Node* b) { | |
| 151 return raw_assembler_->WordEqual(a, b); | |
| 152 } | |
| 153 | |
| 154 | |
| 155 Node* CodeStubAssembler::WordOr(Node* a, Node* b) { | |
| 156 return raw_assembler_->WordOr(a, b); | |
| 157 } | |
| 158 | |
| 159 | |
| 160 Node* CodeStubAssembler::WordAnd(Node* a, Node* b) { | |
| 161 return raw_assembler_->WordAnd(a, b); | |
| 162 } | |
| 163 | |
| 164 | |
| 165 Node* CodeStubAssembler::Int32GreaterThanOrEqual(Node* a, Node* b) { | |
| 166 return raw_assembler_->Int32GreaterThanOrEqual(a, b); | |
| 167 } | |
| 168 | |
| 169 | |
| 170 Node* CodeStubAssembler::Int32LessThan(Node* a, Node* b) { | |
| 171 return raw_assembler_->Int32LessThan(a, b); | |
| 172 } | |
| 173 | |
| 174 | |
| 121 Node* CodeStubAssembler::LoadObjectField(Node* object, int offset) { | 175 Node* CodeStubAssembler::LoadObjectField(Node* object, int offset) { |
| 122 return raw_assembler_->Load(MachineType::AnyTagged(), object, | 176 return raw_assembler_->Load(MachineType::AnyTagged(), object, |
| 123 IntPtrConstant(offset - kHeapObjectTag)); | 177 IntPtrConstant(offset - kHeapObjectTag)); |
| 124 } | 178 } |
| 125 | 179 |
| 126 | 180 |
| 181 Node* CodeStubAssembler::IsHeapObject(Node* object) { | |
| 182 RawMachineAssembler* rma = raw_assembler_.get(); | |
| 183 return rma->WordEqual( | |
| 184 rma->WordAnd(object, rma->IntPtrConstant(kHeapObjectTagMask)), | |
| 185 rma->IntPtrConstant(kHeapObjectTag)); | |
| 186 } | |
| 187 | |
| 188 | |
| 189 Node* CodeStubAssembler::InstanceType(Node* object) { | |
| 190 return raw_assembler_->WordAnd( | |
| 191 LoadObjectField(LoadObjectField(object, HeapObject::kMapOffset), | |
| 192 Map::kInstanceTypeOffset), | |
| 193 raw_assembler_->Int32Constant(255)); | |
| 194 } | |
| 195 | |
| 196 | |
| 197 Node* CodeStubAssembler::BitFieldValue(Node* word32, uint32_t shift, | |
| 198 uint32_t mask) { | |
| 199 return raw_assembler_->Word32Shr( | |
| 200 raw_assembler_->Word32And(word32, raw_assembler_->Int32Constant(mask)), | |
| 201 raw_assembler_->Int32Constant(shift)); | |
| 202 } | |
| 203 | |
| 204 | |
| 205 Node* CodeStubAssembler::Context() { | |
| 206 switch (linkage_type_) { | |
| 207 case LinkageDescriptorType::kStubCall: | |
| 208 return Parameter(Linkage::GetStubCallContextParamIndex(parameter_count_)); | |
| 209 | |
| 210 case LinkageDescriptorType::kJSCall: | |
| 211 return Parameter(Linkage::GetJSCallContextParamIndex(parameter_count_)); | |
| 212 } | |
| 213 } | |
| 214 | |
| 215 | |
| 127 Node* CodeStubAssembler::CallN(CallDescriptor* descriptor, Node* code_target, | 216 Node* CodeStubAssembler::CallN(CallDescriptor* descriptor, Node* code_target, |
| 128 Node** args) { | 217 Node** args) { |
| 129 return raw_assembler_->CallN(descriptor, code_target, args); | 218 return raw_assembler_->CallN(descriptor, code_target, args); |
| 130 } | 219 } |
| 131 | 220 |
| 132 | 221 |
| 133 Node* CodeStubAssembler::TailCallN(CallDescriptor* descriptor, | 222 Node* CodeStubAssembler::TailCallN(CallDescriptor* descriptor, |
| 134 Node* code_target, Node** args) { | 223 Node* code_target, Node** args) { |
| 135 return raw_assembler_->TailCallN(descriptor, code_target, args); | 224 return raw_assembler_->TailCallN(descriptor, code_target, args); |
| 136 } | 225 } |
| 137 | 226 |
| 138 | 227 |
| 139 Node* CodeStubAssembler::CallRuntime(Runtime::FunctionId function_id, | 228 Node* CodeStubAssembler::CallRuntime(Runtime::FunctionId function_id, |
| 140 Node* context, Node* arg1) { | 229 Node* arg1) { |
| 141 return raw_assembler_->CallRuntime1(function_id, arg1, context); | 230 return raw_assembler_->CallRuntime1(function_id, arg1, Context()); |
| 142 } | 231 } |
| 143 | 232 |
| 144 | 233 |
| 145 Node* CodeStubAssembler::CallRuntime(Runtime::FunctionId function_id, | 234 Node* CodeStubAssembler::CallRuntime(Runtime::FunctionId function_id, |
| 146 Node* context, Node* arg1, Node* arg2) { | 235 Node* arg1, Node* arg2) { |
| 147 return raw_assembler_->CallRuntime2(function_id, arg1, arg2, context); | 236 return raw_assembler_->CallRuntime2(function_id, arg1, arg2, Context()); |
| 148 } | 237 } |
| 149 | 238 |
| 150 | 239 |
| 151 Node* CodeStubAssembler::TailCallRuntime(Runtime::FunctionId function_id, | 240 Node* CodeStubAssembler::TailCallRuntime(Runtime::FunctionId function_id, |
| 152 Node* context, Node* arg1) { | 241 Node* arg1) { |
| 153 return raw_assembler_->TailCallRuntime1(function_id, arg1, context); | 242 return raw_assembler_->TailCallRuntime1(function_id, arg1, Context()); |
| 154 } | 243 } |
| 155 | 244 |
| 156 | 245 |
| 157 Node* CodeStubAssembler::TailCallRuntime(Runtime::FunctionId function_id, | 246 Node* CodeStubAssembler::TailCallRuntime(Runtime::FunctionId function_id, |
| 158 Node* context, Node* arg1, | 247 Node* arg1, Node* arg2) { |
| 159 Node* arg2) { | 248 return raw_assembler_->TailCallRuntime2(function_id, arg1, arg2, Context()); |
| 160 return raw_assembler_->TailCallRuntime2(function_id, arg1, arg2, context); | |
| 161 } | 249 } |
| 162 | 250 |
| 163 | 251 |
| 252 RawMachineLabel* CodeStubAssembler::GetOrCreateRawMachineLabel(Label* label) { | |
| 253 if (!label->raw_label_) { | |
| 254 RawMachineLabel* result = new RawMachineLabel(); | |
|
Jarin
2016/02/08 10:25:04
As noted above, we do not normally allocate on the
| |
| 255 label->raw_label_ = result; | |
| 256 labels_.push_back(result); | |
| 257 return result; | |
| 258 } | |
| 259 | |
| 260 return label->raw_label_; | |
| 261 } | |
| 262 | |
| 263 | |
| 264 void CodeStubAssembler::Goto(Label* label) { | |
| 265 raw_assembler_->Goto(GetOrCreateRawMachineLabel(label)); | |
| 266 } | |
| 267 | |
| 268 void CodeStubAssembler::Branch(Node* cond, Label* true_label, | |
| 269 Label* false_label) { | |
| 270 raw_assembler_->Branch(cond, GetOrCreateRawMachineLabel(true_label), | |
| 271 GetOrCreateRawMachineLabel(false_label)); | |
| 272 } | |
| 273 | |
| 274 | |
| 275 void CodeStubAssembler::Bind(Label* label) { | |
| 276 raw_assembler_->Bind(GetOrCreateRawMachineLabel(label)); | |
| 277 } | |
| 278 | |
| 279 | |
| 280 void CodeStubAssembler::Return(Node* value) { | |
| 281 return raw_assembler_->Return(value); | |
| 282 } | |
| 283 | |
| 284 | |
| 285 Node* CodeStubAssembler::Phi(MachineRepresentation rep, Node* n1, Node* n2) { | |
| 286 return raw_assembler_->Phi(rep, n1, n2); | |
| 287 } | |
| 288 | |
| 289 | |
| 164 // RawMachineAssembler delegate helpers: | 290 // RawMachineAssembler delegate helpers: |
| 165 Isolate* CodeStubAssembler::isolate() { return raw_assembler_->isolate(); } | 291 Isolate* CodeStubAssembler::isolate() { return raw_assembler_->isolate(); } |
| 166 | 292 |
| 167 | 293 |
| 168 Graph* CodeStubAssembler::graph() { return raw_assembler_->graph(); } | 294 Graph* CodeStubAssembler::graph() { return raw_assembler_->graph(); } |
| 169 | 295 |
| 170 | 296 |
| 171 Zone* CodeStubAssembler::zone() { return raw_assembler_->zone(); } | 297 Zone* CodeStubAssembler::zone() { return raw_assembler_->zone(); } |
| 172 | 298 |
| 173 | |
| 174 } // namespace compiler | 299 } // namespace compiler |
| 175 } // namespace internal | 300 } // namespace internal |
| 176 } // namespace v8 | 301 } // namespace v8 |
| OLD | NEW |