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/simplified-lowering.h" | 5 #include "src/compiler/simplified-lowering.h" |
6 | 6 |
7 #include "src/compiler/graph-inl.h" | 7 #include "src/compiler/graph-inl.h" |
8 #include "src/compiler/node-properties-inl.h" | 8 #include "src/compiler/node-properties-inl.h" |
9 #include "src/objects.h" | 9 #include "src/objects.h" |
10 | 10 |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 Node* merge = graph()->NewNode(common()->Merge(2), tbranch, fbranch); | 186 Node* merge = graph()->NewNode(common()->Merge(2), tbranch, fbranch); |
187 Node* phi = graph()->NewNode(common()->Phi(2), jsgraph()->TrueConstant(), | 187 Node* phi = graph()->NewNode(common()->Phi(2), jsgraph()->TrueConstant(), |
188 jsgraph()->FalseConstant(), merge); | 188 jsgraph()->FalseConstant(), merge); |
189 UpdateControlSuccessors(control, merge); | 189 UpdateControlSuccessors(control, merge); |
190 branch->ReplaceInput(1, control); | 190 branch->ReplaceInput(1, control); |
191 node->ReplaceUses(phi); | 191 node->ReplaceUses(phi); |
192 } | 192 } |
193 | 193 |
194 | 194 |
195 static WriteBarrierKind ComputeWriteBarrierKind( | 195 static WriteBarrierKind ComputeWriteBarrierKind( |
196 MachineRepresentation representation, Type* type) { | 196 BaseTaggedness base_is_tagged, MachineRepresentation representation, |
| 197 Type* type) { |
197 // TODO(turbofan): skip write barriers for Smis, etc. | 198 // TODO(turbofan): skip write barriers for Smis, etc. |
198 if (representation == kMachineTagged) { | 199 if (base_is_tagged == kTaggedBase && representation == kMachineTagged) { |
| 200 // Write barriers are only for writes into heap objects (i.e. tagged base). |
199 return kFullWriteBarrier; | 201 return kFullWriteBarrier; |
200 } | 202 } |
201 return kNoWriteBarrier; | 203 return kNoWriteBarrier; |
202 } | 204 } |
203 | 205 |
204 | 206 |
205 void SimplifiedLowering::DoLoadField(Node* node, Node* effect, Node* control) { | 207 void SimplifiedLowering::DoLoadField(Node* node, Node* effect, Node* control) { |
206 const FieldAccess& access = FieldAccessOf(node->op()); | 208 const FieldAccess& access = FieldAccessOf(node->op()); |
207 node->set_op(machine_.Load(access.representation)); | 209 node->set_op(machine_.Load(access.representation)); |
208 Node* offset = | 210 Node* offset = jsgraph()->Int32Constant(access.offset - access.tag()); |
209 graph()->NewNode(common()->Int32Constant(access.offset - kHeapObjectTag)); | |
210 node->InsertInput(zone(), 1, offset); | 211 node->InsertInput(zone(), 1, offset); |
211 } | 212 } |
212 | 213 |
213 | 214 |
214 void SimplifiedLowering::DoStoreField(Node* node, Node* effect, Node* control) { | 215 void SimplifiedLowering::DoStoreField(Node* node, Node* effect, Node* control) { |
215 const FieldAccess& access = FieldAccessOf(node->op()); | 216 const FieldAccess& access = FieldAccessOf(node->op()); |
216 WriteBarrierKind kind = | 217 WriteBarrierKind kind = ComputeWriteBarrierKind( |
217 ComputeWriteBarrierKind(access.representation, access.type); | 218 access.base_is_tagged, access.representation, access.type); |
218 node->set_op(machine_.Store(access.representation, kind)); | 219 node->set_op(machine_.Store(access.representation, kind)); |
219 Node* offset = | 220 Node* offset = jsgraph()->Int32Constant(access.offset - access.tag()); |
220 graph()->NewNode(common()->Int32Constant(access.offset - kHeapObjectTag)); | |
221 node->InsertInput(zone(), 1, offset); | 221 node->InsertInput(zone(), 1, offset); |
222 } | 222 } |
223 | 223 |
224 | 224 |
225 Node* SimplifiedLowering::ComputeIndex(const ElementAccess& access, | 225 Node* SimplifiedLowering::ComputeIndex(const ElementAccess& access, |
226 Node* index) { | 226 Node* index) { |
227 int element_size = 0; | 227 int element_size = 0; |
228 switch (access.representation) { | 228 switch (access.representation) { |
229 case kMachineTagged: | 229 case kMachineTagged: |
230 element_size = kPointerSize; | 230 element_size = kPointerSize; |
231 break; | 231 break; |
232 case kMachineWord8: | 232 case kMachineWord8: |
233 element_size = 1; | 233 element_size = 1; |
234 break; | 234 break; |
235 case kMachineWord16: | 235 case kMachineWord16: |
236 element_size = 2; | 236 element_size = 2; |
237 break; | 237 break; |
238 case kMachineWord32: | 238 case kMachineWord32: |
239 element_size = 4; | 239 element_size = 4; |
240 break; | 240 break; |
241 case kMachineWord64: | 241 case kMachineWord64: |
242 case kMachineFloat64: | 242 case kMachineFloat64: |
243 element_size = 8; | 243 element_size = 8; |
244 break; | 244 break; |
245 case kMachineLast: | 245 case kMachineLast: |
246 UNREACHABLE(); | 246 UNREACHABLE(); |
247 break; | 247 break; |
248 } | 248 } |
249 if (element_size != 1) { | 249 if (element_size != 1) { |
250 index = graph()->NewNode( | 250 index = graph()->NewNode(machine()->Int32Mul(), |
251 machine()->Int32Mul(), | 251 jsgraph()->Int32Constant(element_size), index); |
252 graph()->NewNode(common()->Int32Constant(element_size)), index); | |
253 } | 252 } |
254 int fixed_offset = access.header_size - kHeapObjectTag; | 253 int fixed_offset = access.header_size - access.tag(); |
255 if (fixed_offset == 0) return index; | 254 if (fixed_offset == 0) return index; |
256 return graph()->NewNode( | 255 return graph()->NewNode(machine()->Int32Add(), |
257 machine()->Int32Add(), | 256 jsgraph()->Int32Constant(fixed_offset), index); |
258 graph()->NewNode(common()->Int32Constant(fixed_offset)), index); | |
259 } | 257 } |
260 | 258 |
261 | 259 |
262 void SimplifiedLowering::DoLoadElement(Node* node, Node* effect, | 260 void SimplifiedLowering::DoLoadElement(Node* node, Node* effect, |
263 Node* control) { | 261 Node* control) { |
264 const ElementAccess& access = ElementAccessOf(node->op()); | 262 const ElementAccess& access = ElementAccessOf(node->op()); |
265 node->set_op(machine_.Load(access.representation)); | 263 node->set_op(machine_.Load(access.representation)); |
266 node->ReplaceInput(1, ComputeIndex(access, node->InputAt(1))); | 264 node->ReplaceInput(1, ComputeIndex(access, node->InputAt(1))); |
267 } | 265 } |
268 | 266 |
269 | 267 |
270 void SimplifiedLowering::DoStoreElement(Node* node, Node* effect, | 268 void SimplifiedLowering::DoStoreElement(Node* node, Node* effect, |
271 Node* control) { | 269 Node* control) { |
272 const ElementAccess& access = ElementAccessOf(node->op()); | 270 const ElementAccess& access = ElementAccessOf(node->op()); |
273 WriteBarrierKind kind = | 271 WriteBarrierKind kind = ComputeWriteBarrierKind( |
274 ComputeWriteBarrierKind(access.representation, access.type); | 272 access.base_is_tagged, access.representation, access.type); |
275 node->set_op(machine_.Store(access.representation, kind)); | 273 node->set_op(machine_.Store(access.representation, kind)); |
276 node->ReplaceInput(1, ComputeIndex(access, node->InputAt(1))); | 274 node->ReplaceInput(1, ComputeIndex(access, node->InputAt(1))); |
277 } | 275 } |
278 | 276 |
279 | 277 |
280 void SimplifiedLowering::Lower(Node* node) { | 278 void SimplifiedLowering::Lower(Node* node) { |
281 Node* start = graph()->start(); | 279 Node* start = graph()->start(); |
282 switch (node->opcode()) { | 280 switch (node->opcode()) { |
283 case IrOpcode::kBooleanNot: | 281 case IrOpcode::kBooleanNot: |
284 case IrOpcode::kNumberEqual: | 282 case IrOpcode::kNumberEqual: |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
334 DoStoreElement(node, start, start); | 332 DoStoreElement(node, start, start); |
335 break; | 333 break; |
336 default: | 334 default: |
337 break; | 335 break; |
338 } | 336 } |
339 } | 337 } |
340 | 338 |
341 } // namespace compiler | 339 } // namespace compiler |
342 } // namespace internal | 340 } // namespace internal |
343 } // namespace v8 | 341 } // namespace v8 |
OLD | NEW |