OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_X64. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_X64. |
6 #if defined(TARGET_ARCH_X64) | 6 #if defined(TARGET_ARCH_X64) |
7 | 7 |
8 #include "vm/intermediate_language.h" | 8 #include "vm/intermediate_language.h" |
9 | 9 |
10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
(...skipping 10 matching lines...) Expand all Loading... |
21 namespace dart { | 21 namespace dart { |
22 | 22 |
23 DECLARE_FLAG(int, optimization_counter_threshold); | 23 DECLARE_FLAG(int, optimization_counter_threshold); |
24 DECLARE_FLAG(bool, propagate_ic_data); | 24 DECLARE_FLAG(bool, propagate_ic_data); |
25 DECLARE_FLAG(bool, throw_on_javascript_int_overflow); | 25 DECLARE_FLAG(bool, throw_on_javascript_int_overflow); |
26 DECLARE_FLAG(bool, use_osr); | 26 DECLARE_FLAG(bool, use_osr); |
27 | 27 |
28 // Generic summary for call instructions that have all arguments pushed | 28 // Generic summary for call instructions that have all arguments pushed |
29 // on the stack and return the result in a fixed register RAX. | 29 // on the stack and return the result in a fixed register RAX. |
30 LocationSummary* Instruction::MakeCallSummary() { | 30 LocationSummary* Instruction::MakeCallSummary() { |
31 LocationSummary* result = new LocationSummary(0, 0, LocationSummary::kCall); | 31 LocationSummary* result = new LocationSummary( |
| 32 Isolate::Current(), 0, 0, LocationSummary::kCall); |
32 result->set_out(0, Location::RegisterLocation(RAX)); | 33 result->set_out(0, Location::RegisterLocation(RAX)); |
33 return result; | 34 return result; |
34 } | 35 } |
35 | 36 |
36 | 37 |
37 LocationSummary* PushArgumentInstr::MakeLocationSummary(bool opt) const { | 38 LocationSummary* PushArgumentInstr::MakeLocationSummary(Isolate* isolate, |
| 39 bool opt) const { |
38 const intptr_t kNumInputs = 1; | 40 const intptr_t kNumInputs = 1; |
39 const intptr_t kNumTemps= 0; | 41 const intptr_t kNumTemps= 0; |
40 LocationSummary* locs = | 42 LocationSummary* locs = new(isolate) LocationSummary( |
41 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 43 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
42 locs->set_in(0, Location::AnyOrConstant(value())); | 44 locs->set_in(0, Location::AnyOrConstant(value())); |
43 return locs; | 45 return locs; |
44 } | 46 } |
45 | 47 |
46 | 48 |
47 void PushArgumentInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 49 void PushArgumentInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
48 // In SSA mode, we need an explicit push. Nothing to do in non-SSA mode | 50 // In SSA mode, we need an explicit push. Nothing to do in non-SSA mode |
49 // where PushArgument is handled by BindInstr::EmitNativeCode. | 51 // where PushArgument is handled by BindInstr::EmitNativeCode. |
50 if (compiler->is_optimizing()) { | 52 if (compiler->is_optimizing()) { |
51 Location value = locs()->in(0); | 53 Location value = locs()->in(0); |
52 if (value.IsRegister()) { | 54 if (value.IsRegister()) { |
53 __ pushq(value.reg()); | 55 __ pushq(value.reg()); |
54 } else if (value.IsConstant()) { | 56 } else if (value.IsConstant()) { |
55 __ PushObject(value.constant(), PP); | 57 __ PushObject(value.constant(), PP); |
56 } else { | 58 } else { |
57 ASSERT(value.IsStackSlot()); | 59 ASSERT(value.IsStackSlot()); |
58 __ pushq(value.ToStackSlotAddress()); | 60 __ pushq(value.ToStackSlotAddress()); |
59 } | 61 } |
60 } | 62 } |
61 } | 63 } |
62 | 64 |
63 | 65 |
64 LocationSummary* ReturnInstr::MakeLocationSummary(bool opt) const { | 66 LocationSummary* ReturnInstr::MakeLocationSummary(Isolate* isolate, |
| 67 bool opt) const { |
65 const intptr_t kNumInputs = 1; | 68 const intptr_t kNumInputs = 1; |
66 const intptr_t kNumTemps = 0; | 69 const intptr_t kNumTemps = 0; |
67 LocationSummary* locs = | 70 LocationSummary* locs = new(isolate) LocationSummary( |
68 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 71 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
69 locs->set_in(0, Location::RegisterLocation(RAX)); | 72 locs->set_in(0, Location::RegisterLocation(RAX)); |
70 return locs; | 73 return locs; |
71 } | 74 } |
72 | 75 |
73 | 76 |
74 // Attempt optimized compilation at return instruction instead of at the entry. | 77 // Attempt optimized compilation at return instruction instead of at the entry. |
75 // The entry needs to be patchable, no inlined objects are allowed in the area | 78 // The entry needs to be patchable, no inlined objects are allowed in the area |
76 // that will be overwritten by the patch instruction: a jump). | 79 // that will be overwritten by the patch instruction: a jump). |
77 void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 80 void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
78 Register result = locs()->in(0).reg(); | 81 Register result = locs()->in(0).reg(); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 } | 117 } |
115 | 118 |
116 | 119 |
117 // Detect pattern when one value is zero and another is a power of 2. | 120 // Detect pattern when one value is zero and another is a power of 2. |
118 static bool IsPowerOfTwoKind(intptr_t v1, intptr_t v2) { | 121 static bool IsPowerOfTwoKind(intptr_t v1, intptr_t v2) { |
119 return (Utils::IsPowerOfTwo(v1) && (v2 == 0)) || | 122 return (Utils::IsPowerOfTwo(v1) && (v2 == 0)) || |
120 (Utils::IsPowerOfTwo(v2) && (v1 == 0)); | 123 (Utils::IsPowerOfTwo(v2) && (v1 == 0)); |
121 } | 124 } |
122 | 125 |
123 | 126 |
124 LocationSummary* IfThenElseInstr::MakeLocationSummary(bool opt) const { | 127 LocationSummary* IfThenElseInstr::MakeLocationSummary(Isolate* isolate, |
125 comparison()->InitializeLocationSummary(opt); | 128 bool opt) const { |
| 129 comparison()->InitializeLocationSummary(isolate, opt); |
126 // TODO(vegorov): support byte register constraints in the register allocator. | 130 // TODO(vegorov): support byte register constraints in the register allocator. |
127 comparison()->locs()->set_out(0, Location::RegisterLocation(RDX)); | 131 comparison()->locs()->set_out(0, Location::RegisterLocation(RDX)); |
128 return comparison()->locs(); | 132 return comparison()->locs(); |
129 } | 133 } |
130 | 134 |
131 | 135 |
132 void IfThenElseInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 136 void IfThenElseInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
133 ASSERT(locs()->out(0).reg() == RDX); | 137 ASSERT(locs()->out(0).reg() == RDX); |
134 | 138 |
135 // Clear upper part of the out register. We are going to use setcc on it | 139 // Clear upper part of the out register. We are going to use setcc on it |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 __ decq(RDX); | 175 __ decq(RDX); |
172 __ AndImmediate(RDX, | 176 __ AndImmediate(RDX, |
173 Immediate(Smi::RawValue(true_value) - Smi::RawValue(false_value)), PP); | 177 Immediate(Smi::RawValue(true_value) - Smi::RawValue(false_value)), PP); |
174 if (false_value != 0) { | 178 if (false_value != 0) { |
175 __ AddImmediate(RDX, Immediate(Smi::RawValue(false_value)), PP); | 179 __ AddImmediate(RDX, Immediate(Smi::RawValue(false_value)), PP); |
176 } | 180 } |
177 } | 181 } |
178 } | 182 } |
179 | 183 |
180 | 184 |
181 LocationSummary* LoadLocalInstr::MakeLocationSummary(bool opt) const { | 185 LocationSummary* LoadLocalInstr::MakeLocationSummary(Isolate* isolate, |
| 186 bool opt) const { |
182 const intptr_t kNumInputs = 0; | 187 const intptr_t kNumInputs = 0; |
183 const intptr_t stack_index = (local().index() < 0) | 188 const intptr_t stack_index = (local().index() < 0) |
184 ? kFirstLocalSlotFromFp - local().index() | 189 ? kFirstLocalSlotFromFp - local().index() |
185 : kParamEndSlotFromFp - local().index(); | 190 : kParamEndSlotFromFp - local().index(); |
186 return LocationSummary::Make(kNumInputs, | 191 return LocationSummary::Make(kNumInputs, |
187 Location::StackSlot(stack_index), | 192 Location::StackSlot(stack_index), |
188 LocationSummary::kNoCall); | 193 LocationSummary::kNoCall); |
189 } | 194 } |
190 | 195 |
191 | 196 |
192 void LoadLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 197 void LoadLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
193 ASSERT(!compiler->is_optimizing()); | 198 ASSERT(!compiler->is_optimizing()); |
194 // Nothing to do. | 199 // Nothing to do. |
195 } | 200 } |
196 | 201 |
197 | 202 |
198 LocationSummary* StoreLocalInstr::MakeLocationSummary(bool opt) const { | 203 LocationSummary* StoreLocalInstr::MakeLocationSummary(Isolate* isolate, |
| 204 bool opt) const { |
199 const intptr_t kNumInputs = 1; | 205 const intptr_t kNumInputs = 1; |
200 return LocationSummary::Make(kNumInputs, | 206 return LocationSummary::Make(kNumInputs, |
201 Location::SameAsFirstInput(), | 207 Location::SameAsFirstInput(), |
202 LocationSummary::kNoCall); | 208 LocationSummary::kNoCall); |
203 } | 209 } |
204 | 210 |
205 | 211 |
206 void StoreLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 212 void StoreLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
207 Register value = locs()->in(0).reg(); | 213 Register value = locs()->in(0).reg(); |
208 Register result = locs()->out(0).reg(); | 214 Register result = locs()->out(0).reg(); |
209 ASSERT(result == value); // Assert that register assignment is correct. | 215 ASSERT(result == value); // Assert that register assignment is correct. |
210 __ movq(Address(RBP, local().index() * kWordSize), value); | 216 __ movq(Address(RBP, local().index() * kWordSize), value); |
211 } | 217 } |
212 | 218 |
213 | 219 |
214 LocationSummary* ConstantInstr::MakeLocationSummary(bool opt) const { | 220 LocationSummary* ConstantInstr::MakeLocationSummary(Isolate* isolate, |
| 221 bool opt) const { |
215 const intptr_t kNumInputs = 0; | 222 const intptr_t kNumInputs = 0; |
216 return LocationSummary::Make(kNumInputs, | 223 return LocationSummary::Make(kNumInputs, |
217 Location::RequiresRegister(), | 224 Location::RequiresRegister(), |
218 LocationSummary::kNoCall); | 225 LocationSummary::kNoCall); |
219 } | 226 } |
220 | 227 |
221 | 228 |
222 void ConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 229 void ConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
223 // The register allocator drops constant definitions that have no uses. | 230 // The register allocator drops constant definitions that have no uses. |
224 if (!locs()->out(0).IsInvalid()) { | 231 if (!locs()->out(0).IsInvalid()) { |
225 Register result = locs()->out(0).reg(); | 232 Register result = locs()->out(0).reg(); |
226 __ LoadObject(result, value(), PP); | 233 __ LoadObject(result, value(), PP); |
227 } | 234 } |
228 } | 235 } |
229 | 236 |
230 | 237 |
231 LocationSummary* UnboxedConstantInstr::MakeLocationSummary(bool opt) const { | 238 LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Isolate* isolate, |
| 239 bool opt) const { |
232 const intptr_t kNumInputs = 0; | 240 const intptr_t kNumInputs = 0; |
233 const intptr_t kNumTemps = 0; | 241 const intptr_t kNumTemps = 0; |
234 LocationSummary* locs = | 242 LocationSummary* locs = new(isolate) LocationSummary( |
235 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 243 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
236 locs->set_out(0, Location::RequiresFpuRegister()); | 244 locs->set_out(0, Location::RequiresFpuRegister()); |
237 return locs; | 245 return locs; |
238 } | 246 } |
239 | 247 |
240 | 248 |
241 void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 249 void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
242 // The register allocator drops constant definitions that have no uses. | 250 // The register allocator drops constant definitions that have no uses. |
243 if (!locs()->out(0).IsInvalid()) { | 251 if (!locs()->out(0).IsInvalid()) { |
244 XmmRegister result = locs()->out(0).fpu_reg(); | 252 XmmRegister result = locs()->out(0).fpu_reg(); |
245 if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0)) { | 253 if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0)) { |
246 __ xorps(result, result); | 254 __ xorps(result, result); |
247 } else { | 255 } else { |
248 __ LoadObject(TMP, value(), PP); | 256 __ LoadObject(TMP, value(), PP); |
249 __ movsd(result, FieldAddress(TMP, Double::value_offset())); | 257 __ movsd(result, FieldAddress(TMP, Double::value_offset())); |
250 } | 258 } |
251 } | 259 } |
252 } | 260 } |
253 | 261 |
254 | 262 |
255 LocationSummary* AssertAssignableInstr::MakeLocationSummary(bool opt) const { | 263 LocationSummary* AssertAssignableInstr::MakeLocationSummary(Isolate* isolate, |
| 264 bool opt) const { |
256 const intptr_t kNumInputs = 3; | 265 const intptr_t kNumInputs = 3; |
257 const intptr_t kNumTemps = 0; | 266 const intptr_t kNumTemps = 0; |
258 LocationSummary* summary = | 267 LocationSummary* summary = new(isolate) LocationSummary( |
259 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 268 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
260 summary->set_in(0, Location::RegisterLocation(RAX)); // Value. | 269 summary->set_in(0, Location::RegisterLocation(RAX)); // Value. |
261 summary->set_in(1, Location::RegisterLocation(RCX)); // Instantiator. | 270 summary->set_in(1, Location::RegisterLocation(RCX)); // Instantiator. |
262 summary->set_in(2, Location::RegisterLocation(RDX)); // Type arguments. | 271 summary->set_in(2, Location::RegisterLocation(RDX)); // Type arguments. |
263 summary->set_out(0, Location::RegisterLocation(RAX)); | 272 summary->set_out(0, Location::RegisterLocation(RAX)); |
264 return summary; | 273 return summary; |
265 } | 274 } |
266 | 275 |
267 | 276 |
268 LocationSummary* AssertBooleanInstr::MakeLocationSummary(bool opt) const { | 277 LocationSummary* AssertBooleanInstr::MakeLocationSummary(Isolate* isolate, |
| 278 bool opt) const { |
269 const intptr_t kNumInputs = 1; | 279 const intptr_t kNumInputs = 1; |
270 const intptr_t kNumTemps = 0; | 280 const intptr_t kNumTemps = 0; |
271 LocationSummary* locs = | 281 LocationSummary* locs = new(isolate) LocationSummary( |
272 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 282 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
273 locs->set_in(0, Location::RegisterLocation(RAX)); | 283 locs->set_in(0, Location::RegisterLocation(RAX)); |
274 locs->set_out(0, Location::RegisterLocation(RAX)); | 284 locs->set_out(0, Location::RegisterLocation(RAX)); |
275 return locs; | 285 return locs; |
276 } | 286 } |
277 | 287 |
278 | 288 |
279 static void EmitAssertBoolean(Register reg, | 289 static void EmitAssertBoolean(Register reg, |
280 intptr_t token_pos, | 290 intptr_t token_pos, |
281 intptr_t deopt_id, | 291 intptr_t deopt_id, |
282 LocationSummary* locs, | 292 LocationSummary* locs, |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 case Token::kGT: return GREATER; | 329 case Token::kGT: return GREATER; |
320 case Token::kLTE: return LESS_EQUAL; | 330 case Token::kLTE: return LESS_EQUAL; |
321 case Token::kGTE: return GREATER_EQUAL; | 331 case Token::kGTE: return GREATER_EQUAL; |
322 default: | 332 default: |
323 UNREACHABLE(); | 333 UNREACHABLE(); |
324 return OVERFLOW; | 334 return OVERFLOW; |
325 } | 335 } |
326 } | 336 } |
327 | 337 |
328 | 338 |
329 LocationSummary* EqualityCompareInstr::MakeLocationSummary(bool opt) const { | 339 LocationSummary* EqualityCompareInstr::MakeLocationSummary(Isolate* isolate, |
| 340 bool opt) const { |
330 const intptr_t kNumInputs = 2; | 341 const intptr_t kNumInputs = 2; |
331 if (operation_cid() == kDoubleCid) { | 342 if (operation_cid() == kDoubleCid) { |
332 const intptr_t kNumTemps = 0; | 343 const intptr_t kNumTemps = 0; |
333 LocationSummary* locs = | 344 LocationSummary* locs = new(isolate) LocationSummary( |
334 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 345 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
335 locs->set_in(0, Location::RequiresFpuRegister()); | 346 locs->set_in(0, Location::RequiresFpuRegister()); |
336 locs->set_in(1, Location::RequiresFpuRegister()); | 347 locs->set_in(1, Location::RequiresFpuRegister()); |
337 locs->set_out(0, Location::RequiresRegister()); | 348 locs->set_out(0, Location::RequiresRegister()); |
338 return locs; | 349 return locs; |
339 } | 350 } |
340 if (operation_cid() == kSmiCid) { | 351 if (operation_cid() == kSmiCid) { |
341 const intptr_t kNumTemps = 0; | 352 const intptr_t kNumTemps = 0; |
342 LocationSummary* locs = | 353 LocationSummary* locs = new(isolate) LocationSummary( |
343 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 354 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
344 locs->set_in(0, Location::RegisterOrConstant(left())); | 355 locs->set_in(0, Location::RegisterOrConstant(left())); |
345 // Only one input can be a constant operand. The case of two constant | 356 // Only one input can be a constant operand. The case of two constant |
346 // operands should be handled by constant propagation. | 357 // operands should be handled by constant propagation. |
347 // Only right can be a stack slot. | 358 // Only right can be a stack slot. |
348 locs->set_in(1, locs->in(0).IsConstant() | 359 locs->set_in(1, locs->in(0).IsConstant() |
349 ? Location::RequiresRegister() | 360 ? Location::RequiresRegister() |
350 : Location::RegisterOrConstant(right())); | 361 : Location::RegisterOrConstant(right())); |
351 locs->set_out(0, Location::RequiresRegister()); | 362 locs->set_out(0, Location::RequiresRegister()); |
352 return locs; | 363 return locs; |
353 } | 364 } |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
502 void EqualityCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler, | 513 void EqualityCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
503 BranchInstr* branch) { | 514 BranchInstr* branch) { |
504 ASSERT((kind() == Token::kNE) || (kind() == Token::kEQ)); | 515 ASSERT((kind() == Token::kNE) || (kind() == Token::kEQ)); |
505 | 516 |
506 BranchLabels labels = compiler->CreateBranchLabels(branch); | 517 BranchLabels labels = compiler->CreateBranchLabels(branch); |
507 Condition true_condition = EmitComparisonCode(compiler, labels); | 518 Condition true_condition = EmitComparisonCode(compiler, labels); |
508 EmitBranchOnCondition(compiler, true_condition, labels); | 519 EmitBranchOnCondition(compiler, true_condition, labels); |
509 } | 520 } |
510 | 521 |
511 | 522 |
512 LocationSummary* TestSmiInstr::MakeLocationSummary(bool opt) const { | 523 LocationSummary* TestSmiInstr::MakeLocationSummary(Isolate* isolate, |
| 524 bool opt) const { |
513 const intptr_t kNumInputs = 2; | 525 const intptr_t kNumInputs = 2; |
514 const intptr_t kNumTemps = 0; | 526 const intptr_t kNumTemps = 0; |
515 LocationSummary* locs = | 527 LocationSummary* locs = new(isolate) LocationSummary( |
516 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 528 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
517 locs->set_in(0, Location::RequiresRegister()); | 529 locs->set_in(0, Location::RequiresRegister()); |
518 // Only one input can be a constant operand. The case of two constant | 530 // Only one input can be a constant operand. The case of two constant |
519 // operands should be handled by constant propagation. | 531 // operands should be handled by constant propagation. |
520 locs->set_in(1, Location::RegisterOrConstant(right())); | 532 locs->set_in(1, Location::RegisterOrConstant(right())); |
521 return locs; | 533 return locs; |
522 } | 534 } |
523 | 535 |
524 | 536 |
525 Condition TestSmiInstr::EmitComparisonCode(FlowGraphCompiler* compiler, | 537 Condition TestSmiInstr::EmitComparisonCode(FlowGraphCompiler* compiler, |
526 BranchLabels labels) { | 538 BranchLabels labels) { |
(...skipping 20 matching lines...) Expand all Loading... |
547 | 559 |
548 void TestSmiInstr::EmitBranchCode(FlowGraphCompiler* compiler, | 560 void TestSmiInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
549 BranchInstr* branch) { | 561 BranchInstr* branch) { |
550 BranchLabels labels = compiler->CreateBranchLabels(branch); | 562 BranchLabels labels = compiler->CreateBranchLabels(branch); |
551 Condition true_condition = EmitComparisonCode(compiler, labels); | 563 Condition true_condition = EmitComparisonCode(compiler, labels); |
552 EmitBranchOnCondition(compiler, true_condition, labels); | 564 EmitBranchOnCondition(compiler, true_condition, labels); |
553 } | 565 } |
554 | 566 |
555 | 567 |
556 | 568 |
557 LocationSummary* TestCidsInstr::MakeLocationSummary(bool opt) const { | 569 LocationSummary* TestCidsInstr::MakeLocationSummary(Isolate* isolate, |
| 570 bool opt) const { |
558 const intptr_t kNumInputs = 1; | 571 const intptr_t kNumInputs = 1; |
559 const intptr_t kNumTemps = 1; | 572 const intptr_t kNumTemps = 1; |
560 LocationSummary* locs = | 573 LocationSummary* locs = new(isolate) LocationSummary( |
561 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 574 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
562 locs->set_in(0, Location::RequiresRegister()); | 575 locs->set_in(0, Location::RequiresRegister()); |
563 locs->set_temp(0, Location::RequiresRegister()); | 576 locs->set_temp(0, Location::RequiresRegister()); |
564 locs->set_out(0, Location::RequiresRegister()); | 577 locs->set_out(0, Location::RequiresRegister()); |
565 return locs; | 578 return locs; |
566 } | 579 } |
567 | 580 |
568 | 581 |
569 Condition TestCidsInstr::EmitComparisonCode(FlowGraphCompiler* compiler, | 582 Condition TestCidsInstr::EmitComparisonCode(FlowGraphCompiler* compiler, |
570 BranchLabels labels) { | 583 BranchLabels labels) { |
571 ASSERT((kind() == Token::kIS) || (kind() == Token::kISNOT)); | 584 ASSERT((kind() == Token::kIS) || (kind() == Token::kISNOT)); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
618 EmitComparisonCode(compiler, labels); | 631 EmitComparisonCode(compiler, labels); |
619 __ Bind(&is_false); | 632 __ Bind(&is_false); |
620 __ LoadObject(result_reg, Bool::False(), PP); | 633 __ LoadObject(result_reg, Bool::False(), PP); |
621 __ jmp(&done, Assembler::kNearJump); | 634 __ jmp(&done, Assembler::kNearJump); |
622 __ Bind(&is_true); | 635 __ Bind(&is_true); |
623 __ LoadObject(result_reg, Bool::True(), PP); | 636 __ LoadObject(result_reg, Bool::True(), PP); |
624 __ Bind(&done); | 637 __ Bind(&done); |
625 } | 638 } |
626 | 639 |
627 | 640 |
628 LocationSummary* RelationalOpInstr::MakeLocationSummary(bool opt) const { | 641 LocationSummary* RelationalOpInstr::MakeLocationSummary(Isolate* isolate, |
| 642 bool opt) const { |
629 const intptr_t kNumInputs = 2; | 643 const intptr_t kNumInputs = 2; |
630 const intptr_t kNumTemps = 0; | 644 const intptr_t kNumTemps = 0; |
631 if (operation_cid() == kDoubleCid) { | 645 if (operation_cid() == kDoubleCid) { |
632 LocationSummary* summary = | 646 LocationSummary* summary = new(isolate) LocationSummary( |
633 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 647 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
634 summary->set_in(0, Location::RequiresFpuRegister()); | 648 summary->set_in(0, Location::RequiresFpuRegister()); |
635 summary->set_in(1, Location::RequiresFpuRegister()); | 649 summary->set_in(1, Location::RequiresFpuRegister()); |
636 summary->set_out(0, Location::RequiresRegister()); | 650 summary->set_out(0, Location::RequiresRegister()); |
637 return summary; | 651 return summary; |
638 } | 652 } |
639 ASSERT(operation_cid() == kSmiCid); | 653 ASSERT(operation_cid() == kSmiCid); |
640 LocationSummary* summary = | 654 LocationSummary* summary = new(isolate) LocationSummary( |
641 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 655 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
642 summary->set_in(0, Location::RegisterOrConstant(left())); | 656 summary->set_in(0, Location::RegisterOrConstant(left())); |
643 // Only one input can be a constant operand. The case of two constant | 657 // Only one input can be a constant operand. The case of two constant |
644 // operands should be handled by constant propagation. | 658 // operands should be handled by constant propagation. |
645 summary->set_in(1, summary->in(0).IsConstant() | 659 summary->set_in(1, summary->in(0).IsConstant() |
646 ? Location::RequiresRegister() | 660 ? Location::RequiresRegister() |
647 : Location::RegisterOrConstant(right())); | 661 : Location::RegisterOrConstant(right())); |
648 summary->set_out(0, Location::RequiresRegister()); | 662 summary->set_out(0, Location::RequiresRegister()); |
649 return summary; | 663 return summary; |
650 } | 664 } |
651 | 665 |
(...skipping 27 matching lines...) Expand all Loading... |
679 | 693 |
680 | 694 |
681 void RelationalOpInstr::EmitBranchCode(FlowGraphCompiler* compiler, | 695 void RelationalOpInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
682 BranchInstr* branch) { | 696 BranchInstr* branch) { |
683 BranchLabels labels = compiler->CreateBranchLabels(branch); | 697 BranchLabels labels = compiler->CreateBranchLabels(branch); |
684 Condition true_condition = EmitComparisonCode(compiler, labels); | 698 Condition true_condition = EmitComparisonCode(compiler, labels); |
685 EmitBranchOnCondition(compiler, true_condition, labels); | 699 EmitBranchOnCondition(compiler, true_condition, labels); |
686 } | 700 } |
687 | 701 |
688 | 702 |
689 LocationSummary* NativeCallInstr::MakeLocationSummary(bool opt) const { | 703 LocationSummary* NativeCallInstr::MakeLocationSummary(Isolate* isolate, |
| 704 bool opt) const { |
690 const intptr_t kNumInputs = 0; | 705 const intptr_t kNumInputs = 0; |
691 const intptr_t kNumTemps = 3; | 706 const intptr_t kNumTemps = 3; |
692 LocationSummary* locs = | 707 LocationSummary* locs = new(isolate) LocationSummary( |
693 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 708 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
694 locs->set_temp(0, Location::RegisterLocation(RAX)); | 709 locs->set_temp(0, Location::RegisterLocation(RAX)); |
695 locs->set_temp(1, Location::RegisterLocation(RBX)); | 710 locs->set_temp(1, Location::RegisterLocation(RBX)); |
696 locs->set_temp(2, Location::RegisterLocation(R10)); | 711 locs->set_temp(2, Location::RegisterLocation(R10)); |
697 locs->set_out(0, Location::RegisterLocation(RAX)); | 712 locs->set_out(0, Location::RegisterLocation(RAX)); |
698 return locs; | 713 return locs; |
699 } | 714 } |
700 | 715 |
701 | 716 |
702 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 717 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
703 ASSERT(locs()->temp(0).reg() == RAX); | 718 ASSERT(locs()->temp(0).reg() == RAX); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
735 const Object& constant = index->definition()->AsConstant()->value(); | 750 const Object& constant = index->definition()->AsConstant()->value(); |
736 if (!constant.IsSmi()) return false; | 751 if (!constant.IsSmi()) return false; |
737 const Smi& smi_const = Smi::Cast(constant); | 752 const Smi& smi_const = Smi::Cast(constant); |
738 const intptr_t scale = FlowGraphCompiler::ElementSizeFor(cid); | 753 const intptr_t scale = FlowGraphCompiler::ElementSizeFor(cid); |
739 const intptr_t data_offset = FlowGraphCompiler::DataOffsetFor(cid); | 754 const intptr_t data_offset = FlowGraphCompiler::DataOffsetFor(cid); |
740 const int64_t disp = smi_const.AsInt64Value() * scale + data_offset; | 755 const int64_t disp = smi_const.AsInt64Value() * scale + data_offset; |
741 return Utils::IsInt(32, disp); | 756 return Utils::IsInt(32, disp); |
742 } | 757 } |
743 | 758 |
744 | 759 |
745 LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(bool opt) const { | 760 LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Isolate* isolate, |
| 761 bool opt) const { |
746 const intptr_t kNumInputs = 1; | 762 const intptr_t kNumInputs = 1; |
747 // TODO(fschneider): Allow immediate operands for the char code. | 763 // TODO(fschneider): Allow immediate operands for the char code. |
748 return LocationSummary::Make(kNumInputs, | 764 return LocationSummary::Make(kNumInputs, |
749 Location::RequiresRegister(), | 765 Location::RequiresRegister(), |
750 LocationSummary::kNoCall); | 766 LocationSummary::kNoCall); |
751 } | 767 } |
752 | 768 |
753 | 769 |
754 void StringFromCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 770 void StringFromCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
755 Register char_code = locs()->in(0).reg(); | 771 Register char_code = locs()->in(0).reg(); |
756 Register result = locs()->out(0).reg(); | 772 Register result = locs()->out(0).reg(); |
757 __ LoadImmediate(result, | 773 __ LoadImmediate(result, |
758 Immediate(reinterpret_cast<uword>(Symbols::PredefinedAddress())), PP); | 774 Immediate(reinterpret_cast<uword>(Symbols::PredefinedAddress())), PP); |
759 __ movq(result, Address(result, | 775 __ movq(result, Address(result, |
760 char_code, | 776 char_code, |
761 TIMES_HALF_WORD_SIZE, // Char code is a smi. | 777 TIMES_HALF_WORD_SIZE, // Char code is a smi. |
762 Symbols::kNullCharCodeSymbolOffset * kWordSize)); | 778 Symbols::kNullCharCodeSymbolOffset * kWordSize)); |
763 } | 779 } |
764 | 780 |
765 | 781 |
766 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(bool opt) const { | 782 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Isolate* isolate, |
| 783 bool opt) const { |
767 const intptr_t kNumInputs = 1; | 784 const intptr_t kNumInputs = 1; |
768 return LocationSummary::Make(kNumInputs, | 785 return LocationSummary::Make(kNumInputs, |
769 Location::RequiresRegister(), | 786 Location::RequiresRegister(), |
770 LocationSummary::kNoCall); | 787 LocationSummary::kNoCall); |
771 } | 788 } |
772 | 789 |
773 | 790 |
774 void StringToCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 791 void StringToCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
775 ASSERT(cid_ == kOneByteStringCid); | 792 ASSERT(cid_ == kOneByteStringCid); |
776 Register str = locs()->in(0).reg(); | 793 Register str = locs()->in(0).reg(); |
777 Register result = locs()->out(0).reg(); | 794 Register result = locs()->out(0).reg(); |
778 Label is_one, done; | 795 Label is_one, done; |
779 __ movq(result, FieldAddress(str, String::length_offset())); | 796 __ movq(result, FieldAddress(str, String::length_offset())); |
780 __ cmpq(result, Immediate(Smi::RawValue(1))); | 797 __ cmpq(result, Immediate(Smi::RawValue(1))); |
781 __ j(EQUAL, &is_one, Assembler::kNearJump); | 798 __ j(EQUAL, &is_one, Assembler::kNearJump); |
782 __ movq(result, Immediate(Smi::RawValue(-1))); | 799 __ movq(result, Immediate(Smi::RawValue(-1))); |
783 __ jmp(&done); | 800 __ jmp(&done); |
784 __ Bind(&is_one); | 801 __ Bind(&is_one); |
785 __ movzxb(result, FieldAddress(str, OneByteString::data_offset())); | 802 __ movzxb(result, FieldAddress(str, OneByteString::data_offset())); |
786 __ SmiTag(result); | 803 __ SmiTag(result); |
787 __ Bind(&done); | 804 __ Bind(&done); |
788 } | 805 } |
789 | 806 |
790 | 807 |
791 LocationSummary* StringInterpolateInstr::MakeLocationSummary(bool opt) const { | 808 LocationSummary* StringInterpolateInstr::MakeLocationSummary(Isolate* isolate, |
| 809 bool opt) const { |
792 const intptr_t kNumInputs = 1; | 810 const intptr_t kNumInputs = 1; |
793 const intptr_t kNumTemps = 0; | 811 const intptr_t kNumTemps = 0; |
794 LocationSummary* summary = | 812 LocationSummary* summary = new(isolate) LocationSummary( |
795 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 813 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
796 summary->set_in(0, Location::RegisterLocation(RAX)); | 814 summary->set_in(0, Location::RegisterLocation(RAX)); |
797 summary->set_out(0, Location::RegisterLocation(RAX)); | 815 summary->set_out(0, Location::RegisterLocation(RAX)); |
798 return summary; | 816 return summary; |
799 } | 817 } |
800 | 818 |
801 | 819 |
802 void StringInterpolateInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 820 void StringInterpolateInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
803 Register array = locs()->in(0).reg(); | 821 Register array = locs()->in(0).reg(); |
804 __ pushq(array); | 822 __ pushq(array); |
805 const int kNumberOfArguments = 1; | 823 const int kNumberOfArguments = 1; |
806 const Array& kNoArgumentNames = Object::null_array(); | 824 const Array& kNoArgumentNames = Object::null_array(); |
807 compiler->GenerateStaticCall(deopt_id(), | 825 compiler->GenerateStaticCall(deopt_id(), |
808 token_pos(), | 826 token_pos(), |
809 CallFunction(), | 827 CallFunction(), |
810 kNumberOfArguments, | 828 kNumberOfArguments, |
811 kNoArgumentNames, | 829 kNoArgumentNames, |
812 locs()); | 830 locs()); |
813 ASSERT(locs()->out(0).reg() == RAX); | 831 ASSERT(locs()->out(0).reg() == RAX); |
814 } | 832 } |
815 | 833 |
816 | 834 |
817 LocationSummary* LoadUntaggedInstr::MakeLocationSummary(bool opt) const { | 835 LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Isolate* isolate, |
| 836 bool opt) const { |
818 const intptr_t kNumInputs = 1; | 837 const intptr_t kNumInputs = 1; |
819 return LocationSummary::Make(kNumInputs, | 838 return LocationSummary::Make(kNumInputs, |
820 Location::RequiresRegister(), | 839 Location::RequiresRegister(), |
821 LocationSummary::kNoCall); | 840 LocationSummary::kNoCall); |
822 } | 841 } |
823 | 842 |
824 | 843 |
825 void LoadUntaggedInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 844 void LoadUntaggedInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
826 Register object = locs()->in(0).reg(); | 845 Register object = locs()->in(0).reg(); |
827 Register result = locs()->out(0).reg(); | 846 Register result = locs()->out(0).reg(); |
828 __ movq(result, FieldAddress(object, offset())); | 847 __ movq(result, FieldAddress(object, offset())); |
829 } | 848 } |
830 | 849 |
831 | 850 |
832 LocationSummary* LoadClassIdInstr::MakeLocationSummary(bool opt) const { | 851 LocationSummary* LoadClassIdInstr::MakeLocationSummary(Isolate* isolate, |
| 852 bool opt) const { |
833 const intptr_t kNumInputs = 1; | 853 const intptr_t kNumInputs = 1; |
834 return LocationSummary::Make(kNumInputs, | 854 return LocationSummary::Make(kNumInputs, |
835 Location::RequiresRegister(), | 855 Location::RequiresRegister(), |
836 LocationSummary::kNoCall); | 856 LocationSummary::kNoCall); |
837 } | 857 } |
838 | 858 |
839 | 859 |
840 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 860 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
841 Register object = locs()->in(0).reg(); | 861 Register object = locs()->in(0).reg(); |
842 Register result = locs()->out(0).reg(); | 862 Register result = locs()->out(0).reg(); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
913 return kUnboxedFloat32x4; | 933 return kUnboxedFloat32x4; |
914 case kTypedDataFloat64x2ArrayCid: | 934 case kTypedDataFloat64x2ArrayCid: |
915 return kUnboxedFloat64x2; | 935 return kUnboxedFloat64x2; |
916 default: | 936 default: |
917 UNIMPLEMENTED(); | 937 UNIMPLEMENTED(); |
918 return kTagged; | 938 return kTagged; |
919 } | 939 } |
920 } | 940 } |
921 | 941 |
922 | 942 |
923 LocationSummary* LoadIndexedInstr::MakeLocationSummary(bool opt) const { | 943 LocationSummary* LoadIndexedInstr::MakeLocationSummary(Isolate* isolate, |
| 944 bool opt) const { |
924 const intptr_t kNumInputs = 2; | 945 const intptr_t kNumInputs = 2; |
925 const intptr_t kNumTemps = 0; | 946 const intptr_t kNumTemps = 0; |
926 LocationSummary* locs = | 947 LocationSummary* locs = new(isolate) LocationSummary( |
927 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 948 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
928 locs->set_in(0, Location::RequiresRegister()); | 949 locs->set_in(0, Location::RequiresRegister()); |
929 // The smi index is either untagged (element size == 1), or it is left smi | 950 // The smi index is either untagged (element size == 1), or it is left smi |
930 // tagged (for all element sizes > 1). | 951 // tagged (for all element sizes > 1). |
931 if (index_scale() == 1) { | 952 if (index_scale() == 1) { |
932 locs->set_in(1, CanBeImmediateIndex(index(), class_id()) | 953 locs->set_in(1, CanBeImmediateIndex(index(), class_id()) |
933 ? Location::Constant( | 954 ? Location::Constant( |
934 index()->definition()->AsConstant()->value()) | 955 index()->definition()->AsConstant()->value()) |
935 : Location::WritableRegister()); | 956 : Location::WritableRegister()); |
936 } else { | 957 } else { |
937 locs->set_in(1, CanBeImmediateIndex(index(), class_id()) | 958 locs->set_in(1, CanBeImmediateIndex(index(), class_id()) |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1067 return kUnboxedInt32x4; | 1088 return kUnboxedInt32x4; |
1068 case kTypedDataFloat64x2ArrayCid: | 1089 case kTypedDataFloat64x2ArrayCid: |
1069 return kUnboxedFloat64x2; | 1090 return kUnboxedFloat64x2; |
1070 default: | 1091 default: |
1071 UNIMPLEMENTED(); | 1092 UNIMPLEMENTED(); |
1072 return kTagged; | 1093 return kTagged; |
1073 } | 1094 } |
1074 } | 1095 } |
1075 | 1096 |
1076 | 1097 |
1077 LocationSummary* StoreIndexedInstr::MakeLocationSummary(bool opt) const { | 1098 LocationSummary* StoreIndexedInstr::MakeLocationSummary(Isolate* isolate, |
| 1099 bool opt) const { |
1078 const intptr_t kNumInputs = 3; | 1100 const intptr_t kNumInputs = 3; |
1079 const intptr_t kNumTemps = 0; | 1101 const intptr_t kNumTemps = 0; |
1080 LocationSummary* locs = | 1102 LocationSummary* locs = new(isolate) LocationSummary( |
1081 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 1103 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
1082 locs->set_in(0, Location::RequiresRegister()); | 1104 locs->set_in(0, Location::RequiresRegister()); |
1083 // The smi index is either untagged (element size == 1), or it is left smi | 1105 // The smi index is either untagged (element size == 1), or it is left smi |
1084 // tagged (for all element sizes > 1). | 1106 // tagged (for all element sizes > 1). |
1085 if (index_scale() == 1) { | 1107 if (index_scale() == 1) { |
1086 locs->set_in(1, CanBeImmediateIndex(index(), class_id()) | 1108 locs->set_in(1, CanBeImmediateIndex(index(), class_id()) |
1087 ? Location::Constant( | 1109 ? Location::Constant( |
1088 index()->definition()->AsConstant()->value()) | 1110 index()->definition()->AsConstant()->value()) |
1089 : Location::WritableRegister()); | 1111 : Location::WritableRegister()); |
1090 } else { | 1112 } else { |
1091 locs->set_in(1, CanBeImmediateIndex(index(), class_id()) | 1113 locs->set_in(1, CanBeImmediateIndex(index(), class_id()) |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1241 case kTypedDataFloat64x2ArrayCid: | 1263 case kTypedDataFloat64x2ArrayCid: |
1242 case kTypedDataFloat32x4ArrayCid: | 1264 case kTypedDataFloat32x4ArrayCid: |
1243 __ movups(element_address, locs()->in(2).fpu_reg()); | 1265 __ movups(element_address, locs()->in(2).fpu_reg()); |
1244 break; | 1266 break; |
1245 default: | 1267 default: |
1246 UNREACHABLE(); | 1268 UNREACHABLE(); |
1247 } | 1269 } |
1248 } | 1270 } |
1249 | 1271 |
1250 | 1272 |
1251 LocationSummary* GuardFieldInstr::MakeLocationSummary(bool opt) const { | 1273 LocationSummary* GuardFieldInstr::MakeLocationSummary(Isolate* isolate, |
| 1274 bool opt) const { |
1252 const intptr_t kNumInputs = 1; | 1275 const intptr_t kNumInputs = 1; |
1253 LocationSummary* summary = | 1276 LocationSummary* summary = new(isolate) LocationSummary( |
1254 new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall); | 1277 isolate, kNumInputs, 0, LocationSummary::kNoCall); |
1255 summary->set_in(0, Location::RequiresRegister()); | 1278 summary->set_in(0, Location::RequiresRegister()); |
1256 const bool field_has_length = field().needs_length_check(); | 1279 const bool field_has_length = field().needs_length_check(); |
1257 const bool need_value_temp_reg = | 1280 const bool need_value_temp_reg = |
1258 (field_has_length || ((value()->Type()->ToCid() == kDynamicCid) && | 1281 (field_has_length || ((value()->Type()->ToCid() == kDynamicCid) && |
1259 (field().guarded_cid() != kSmiCid))); | 1282 (field().guarded_cid() != kSmiCid))); |
1260 if (need_value_temp_reg) { | 1283 if (need_value_temp_reg) { |
1261 summary->AddTemp(Location::RequiresRegister()); | 1284 summary->AddTemp(Location::RequiresRegister()); |
1262 } | 1285 } |
1263 const bool need_field_temp_reg = | 1286 const bool need_field_temp_reg = |
1264 field_has_length || (field().guarded_cid() == kIllegalCid); | 1287 field_has_length || (field().guarded_cid() == kIllegalCid); |
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1615 | 1638 |
1616 __ jmp(exit_label()); | 1639 __ jmp(exit_label()); |
1617 } | 1640 } |
1618 | 1641 |
1619 private: | 1642 private: |
1620 StoreInstanceFieldInstr* instruction_; | 1643 StoreInstanceFieldInstr* instruction_; |
1621 const Class& cls_; | 1644 const Class& cls_; |
1622 }; | 1645 }; |
1623 | 1646 |
1624 | 1647 |
1625 LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(bool opt) const { | 1648 LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(Isolate* isolate, |
| 1649 bool opt) const { |
1626 const intptr_t kNumInputs = 2; | 1650 const intptr_t kNumInputs = 2; |
1627 const intptr_t kNumTemps = 0; | 1651 const intptr_t kNumTemps = 0; |
1628 LocationSummary* summary = | 1652 LocationSummary* summary = new(isolate) LocationSummary( |
1629 new LocationSummary(kNumInputs, kNumTemps, | 1653 isolate, kNumInputs, kNumTemps, |
1630 !field().IsNull() && | 1654 !field().IsNull() && |
1631 ((field().guarded_cid() == kIllegalCid) || is_initialization_) | 1655 ((field().guarded_cid() == kIllegalCid) || is_initialization_) |
1632 ? LocationSummary::kCallOnSlowPath | 1656 ? LocationSummary::kCallOnSlowPath |
1633 : LocationSummary::kNoCall); | 1657 : LocationSummary::kNoCall); |
1634 | 1658 |
1635 summary->set_in(0, Location::RequiresRegister()); | 1659 summary->set_in(0, Location::RequiresRegister()); |
1636 if (IsUnboxedStore() && opt) { | 1660 if (IsUnboxedStore() && opt) { |
1637 summary->set_in(1, Location::RequiresFpuRegister()); | 1661 summary->set_in(1, Location::RequiresFpuRegister()); |
1638 summary->AddTemp(Location::RequiresRegister()); | 1662 summary->AddTemp(Location::RequiresRegister()); |
1639 summary->AddTemp(Location::RequiresRegister()); | 1663 summary->AddTemp(Location::RequiresRegister()); |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1859 } else { | 1883 } else { |
1860 Register value_reg = locs()->in(1).reg(); | 1884 Register value_reg = locs()->in(1).reg(); |
1861 __ StoreIntoObjectNoBarrier(instance_reg, | 1885 __ StoreIntoObjectNoBarrier(instance_reg, |
1862 FieldAddress(instance_reg, offset_in_bytes_), value_reg); | 1886 FieldAddress(instance_reg, offset_in_bytes_), value_reg); |
1863 } | 1887 } |
1864 } | 1888 } |
1865 __ Bind(&skip_store); | 1889 __ Bind(&skip_store); |
1866 } | 1890 } |
1867 | 1891 |
1868 | 1892 |
1869 LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(bool opt) const { | 1893 LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Isolate* isolate, |
| 1894 bool opt) const { |
1870 const intptr_t kNumInputs = 1; | 1895 const intptr_t kNumInputs = 1; |
1871 const intptr_t kNumTemps = 0; | 1896 const intptr_t kNumTemps = 0; |
1872 LocationSummary* summary = | 1897 LocationSummary* summary = new(isolate) LocationSummary( |
1873 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 1898 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
1874 summary->set_in(0, Location::RequiresRegister()); | 1899 summary->set_in(0, Location::RequiresRegister()); |
1875 summary->set_out(0, Location::RequiresRegister()); | 1900 summary->set_out(0, Location::RequiresRegister()); |
1876 return summary; | 1901 return summary; |
1877 } | 1902 } |
1878 | 1903 |
1879 | 1904 |
1880 // When the parser is building an implicit static getter for optimization, | 1905 // When the parser is building an implicit static getter for optimization, |
1881 // it can generate a function body where deoptimization ids do not line up | 1906 // it can generate a function body where deoptimization ids do not line up |
1882 // with the unoptimized code. | 1907 // with the unoptimized code. |
1883 // | 1908 // |
1884 // This is safe only so long as LoadStaticFieldInstr cannot deoptimize. | 1909 // This is safe only so long as LoadStaticFieldInstr cannot deoptimize. |
1885 void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 1910 void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
1886 Register field = locs()->in(0).reg(); | 1911 Register field = locs()->in(0).reg(); |
1887 Register result = locs()->out(0).reg(); | 1912 Register result = locs()->out(0).reg(); |
1888 __ movq(result, FieldAddress(field, Field::value_offset())); | 1913 __ movq(result, FieldAddress(field, Field::value_offset())); |
1889 } | 1914 } |
1890 | 1915 |
1891 | 1916 |
1892 LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(bool opt) const { | 1917 LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Isolate* isolate, |
1893 LocationSummary* locs = new LocationSummary(1, 1, LocationSummary::kNoCall); | 1918 bool opt) const { |
| 1919 LocationSummary* locs = new(isolate) LocationSummary( |
| 1920 isolate, 1, 1, LocationSummary::kNoCall); |
1894 locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister() | 1921 locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister() |
1895 : Location::RequiresRegister()); | 1922 : Location::RequiresRegister()); |
1896 locs->set_temp(0, Location::RequiresRegister()); | 1923 locs->set_temp(0, Location::RequiresRegister()); |
1897 return locs; | 1924 return locs; |
1898 } | 1925 } |
1899 | 1926 |
1900 | 1927 |
1901 void StoreStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 1928 void StoreStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
1902 Register value = locs()->in(0).reg(); | 1929 Register value = locs()->in(0).reg(); |
1903 Register temp = locs()->temp(0).reg(); | 1930 Register temp = locs()->temp(0).reg(); |
1904 | 1931 |
1905 __ LoadObject(temp, field(), PP); | 1932 __ LoadObject(temp, field(), PP); |
1906 if (this->value()->NeedsStoreBuffer()) { | 1933 if (this->value()->NeedsStoreBuffer()) { |
1907 __ StoreIntoObject(temp, | 1934 __ StoreIntoObject(temp, |
1908 FieldAddress(temp, Field::value_offset()), value, CanValueBeSmi()); | 1935 FieldAddress(temp, Field::value_offset()), value, CanValueBeSmi()); |
1909 } else { | 1936 } else { |
1910 __ StoreIntoObjectNoBarrier( | 1937 __ StoreIntoObjectNoBarrier( |
1911 temp, FieldAddress(temp, Field::value_offset()), value); | 1938 temp, FieldAddress(temp, Field::value_offset()), value); |
1912 } | 1939 } |
1913 } | 1940 } |
1914 | 1941 |
1915 | 1942 |
1916 LocationSummary* InstanceOfInstr::MakeLocationSummary(bool opt) const { | 1943 LocationSummary* InstanceOfInstr::MakeLocationSummary(Isolate* isolate, |
| 1944 bool opt) const { |
1917 const intptr_t kNumInputs = 3; | 1945 const intptr_t kNumInputs = 3; |
1918 const intptr_t kNumTemps = 0; | 1946 const intptr_t kNumTemps = 0; |
1919 LocationSummary* summary = | 1947 LocationSummary* summary = new(isolate) LocationSummary( |
1920 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 1948 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
1921 summary->set_in(0, Location::RegisterLocation(RAX)); | 1949 summary->set_in(0, Location::RegisterLocation(RAX)); |
1922 summary->set_in(1, Location::RegisterLocation(RCX)); | 1950 summary->set_in(1, Location::RegisterLocation(RCX)); |
1923 summary->set_in(2, Location::RegisterLocation(RDX)); | 1951 summary->set_in(2, Location::RegisterLocation(RDX)); |
1924 summary->set_out(0, Location::RegisterLocation(RAX)); | 1952 summary->set_out(0, Location::RegisterLocation(RAX)); |
1925 return summary; | 1953 return summary; |
1926 } | 1954 } |
1927 | 1955 |
1928 | 1956 |
1929 void InstanceOfInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 1957 void InstanceOfInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
1930 ASSERT(locs()->in(0).reg() == RAX); // Value. | 1958 ASSERT(locs()->in(0).reg() == RAX); // Value. |
1931 ASSERT(locs()->in(1).reg() == RCX); // Instantiator. | 1959 ASSERT(locs()->in(1).reg() == RCX); // Instantiator. |
1932 ASSERT(locs()->in(2).reg() == RDX); // Instantiator type arguments. | 1960 ASSERT(locs()->in(2).reg() == RDX); // Instantiator type arguments. |
1933 | 1961 |
1934 compiler->GenerateInstanceOf(token_pos(), | 1962 compiler->GenerateInstanceOf(token_pos(), |
1935 deopt_id(), | 1963 deopt_id(), |
1936 type(), | 1964 type(), |
1937 negate_result(), | 1965 negate_result(), |
1938 locs()); | 1966 locs()); |
1939 ASSERT(locs()->out(0).reg() == RAX); | 1967 ASSERT(locs()->out(0).reg() == RAX); |
1940 } | 1968 } |
1941 | 1969 |
1942 | 1970 |
1943 // TODO(srdjan): In case of constant inputs make CreateArray kNoCall and | 1971 // TODO(srdjan): In case of constant inputs make CreateArray kNoCall and |
1944 // use slow path stub. | 1972 // use slow path stub. |
1945 LocationSummary* CreateArrayInstr::MakeLocationSummary(bool opt) const { | 1973 LocationSummary* CreateArrayInstr::MakeLocationSummary(Isolate* isolate, |
| 1974 bool opt) const { |
1946 const intptr_t kNumInputs = 2; | 1975 const intptr_t kNumInputs = 2; |
1947 const intptr_t kNumTemps = 0; | 1976 const intptr_t kNumTemps = 0; |
1948 LocationSummary* locs = | 1977 LocationSummary* locs = new(isolate) LocationSummary( |
1949 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 1978 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
1950 locs->set_in(0, Location::RegisterLocation(RBX)); | 1979 locs->set_in(0, Location::RegisterLocation(RBX)); |
1951 locs->set_in(1, Location::RegisterLocation(R10)); | 1980 locs->set_in(1, Location::RegisterLocation(R10)); |
1952 locs->set_out(0, Location::RegisterLocation(RAX)); | 1981 locs->set_out(0, Location::RegisterLocation(RAX)); |
1953 return locs; | 1982 return locs; |
1954 } | 1983 } |
1955 | 1984 |
1956 | 1985 |
1957 // Inlines array allocation for known constant values. | 1986 // Inlines array allocation for known constant values. |
1958 static void InlineArrayAllocation(FlowGraphCompiler* compiler, | 1987 static void InlineArrayAllocation(FlowGraphCompiler* compiler, |
1959 intptr_t num_elements, | 1988 intptr_t num_elements, |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2155 compiler->RestoreLiveRegisters(locs); | 2184 compiler->RestoreLiveRegisters(locs); |
2156 | 2185 |
2157 __ jmp(exit_label()); | 2186 __ jmp(exit_label()); |
2158 } | 2187 } |
2159 | 2188 |
2160 private: | 2189 private: |
2161 Instruction* instruction_; | 2190 Instruction* instruction_; |
2162 }; | 2191 }; |
2163 | 2192 |
2164 | 2193 |
2165 LocationSummary* LoadFieldInstr::MakeLocationSummary(bool opt) const { | 2194 LocationSummary* LoadFieldInstr::MakeLocationSummary(Isolate* isolate, |
| 2195 bool opt) const { |
2166 const intptr_t kNumInputs = 1; | 2196 const intptr_t kNumInputs = 1; |
2167 const intptr_t kNumTemps = 0; | 2197 const intptr_t kNumTemps = 0; |
2168 LocationSummary* locs = | 2198 LocationSummary* locs = new(isolate) LocationSummary( |
2169 new LocationSummary( | 2199 isolate, kNumInputs, kNumTemps, |
2170 kNumInputs, kNumTemps, | |
2171 (opt && !IsPotentialUnboxedLoad()) | 2200 (opt && !IsPotentialUnboxedLoad()) |
2172 ? LocationSummary::kNoCall | 2201 ? LocationSummary::kNoCall |
2173 : LocationSummary::kCallOnSlowPath); | 2202 : LocationSummary::kCallOnSlowPath); |
2174 | 2203 |
2175 locs->set_in(0, Location::RequiresRegister()); | 2204 locs->set_in(0, Location::RequiresRegister()); |
2176 | 2205 |
2177 if (IsUnboxedLoad() && opt) { | 2206 if (IsUnboxedLoad() && opt) { |
2178 locs->AddTemp(Location::RequiresRegister()); | 2207 locs->AddTemp(Location::RequiresRegister()); |
2179 } else if (IsPotentialUnboxedLoad()) { | 2208 } else if (IsPotentialUnboxedLoad()) { |
2180 locs->AddTemp(opt ? Location::RequiresFpuRegister() | 2209 locs->AddTemp(opt ? Location::RequiresFpuRegister() |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2299 __ jmp(&done); | 2328 __ jmp(&done); |
2300 } | 2329 } |
2301 | 2330 |
2302 __ Bind(&load_pointer); | 2331 __ Bind(&load_pointer); |
2303 } | 2332 } |
2304 __ movq(result, FieldAddress(instance_reg, offset_in_bytes())); | 2333 __ movq(result, FieldAddress(instance_reg, offset_in_bytes())); |
2305 __ Bind(&done); | 2334 __ Bind(&done); |
2306 } | 2335 } |
2307 | 2336 |
2308 | 2337 |
2309 LocationSummary* InstantiateTypeInstr::MakeLocationSummary(bool opt) const { | 2338 LocationSummary* InstantiateTypeInstr::MakeLocationSummary(Isolate* isolate, |
| 2339 bool opt) const { |
2310 const intptr_t kNumInputs = 1; | 2340 const intptr_t kNumInputs = 1; |
2311 const intptr_t kNumTemps = 0; | 2341 const intptr_t kNumTemps = 0; |
2312 LocationSummary* locs = | 2342 LocationSummary* locs = new(isolate) LocationSummary( |
2313 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 2343 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
2314 locs->set_in(0, Location::RegisterLocation(RAX)); | 2344 locs->set_in(0, Location::RegisterLocation(RAX)); |
2315 locs->set_out(0, Location::RegisterLocation(RAX)); | 2345 locs->set_out(0, Location::RegisterLocation(RAX)); |
2316 return locs; | 2346 return locs; |
2317 } | 2347 } |
2318 | 2348 |
2319 | 2349 |
2320 void InstantiateTypeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2350 void InstantiateTypeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2321 Register instantiator_reg = locs()->in(0).reg(); | 2351 Register instantiator_reg = locs()->in(0).reg(); |
2322 Register result_reg = locs()->out(0).reg(); | 2352 Register result_reg = locs()->out(0).reg(); |
2323 | 2353 |
2324 // 'instantiator_reg' is the instantiator TypeArguments object (or null). | 2354 // 'instantiator_reg' is the instantiator TypeArguments object (or null). |
2325 // A runtime call to instantiate the type is required. | 2355 // A runtime call to instantiate the type is required. |
2326 __ PushObject(Object::ZoneHandle(), PP); // Make room for the result. | 2356 __ PushObject(Object::ZoneHandle(), PP); // Make room for the result. |
2327 __ PushObject(type(), PP); | 2357 __ PushObject(type(), PP); |
2328 __ pushq(instantiator_reg); // Push instantiator type arguments. | 2358 __ pushq(instantiator_reg); // Push instantiator type arguments. |
2329 compiler->GenerateRuntimeCall(token_pos(), | 2359 compiler->GenerateRuntimeCall(token_pos(), |
2330 deopt_id(), | 2360 deopt_id(), |
2331 kInstantiateTypeRuntimeEntry, | 2361 kInstantiateTypeRuntimeEntry, |
2332 2, | 2362 2, |
2333 locs()); | 2363 locs()); |
2334 __ Drop(2); // Drop instantiator and uninstantiated type. | 2364 __ Drop(2); // Drop instantiator and uninstantiated type. |
2335 __ popq(result_reg); // Pop instantiated type. | 2365 __ popq(result_reg); // Pop instantiated type. |
2336 ASSERT(instantiator_reg == result_reg); | 2366 ASSERT(instantiator_reg == result_reg); |
2337 } | 2367 } |
2338 | 2368 |
2339 | 2369 |
2340 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary( | 2370 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary( |
2341 bool opt) const { | 2371 Isolate* isolate, bool opt) const { |
2342 const intptr_t kNumInputs = 1; | 2372 const intptr_t kNumInputs = 1; |
2343 const intptr_t kNumTemps = 0; | 2373 const intptr_t kNumTemps = 0; |
2344 LocationSummary* locs = | 2374 LocationSummary* locs = new(isolate) LocationSummary( |
2345 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 2375 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
2346 locs->set_in(0, Location::RegisterLocation(RAX)); | 2376 locs->set_in(0, Location::RegisterLocation(RAX)); |
2347 locs->set_out(0, Location::RegisterLocation(RAX)); | 2377 locs->set_out(0, Location::RegisterLocation(RAX)); |
2348 return locs; | 2378 return locs; |
2349 } | 2379 } |
2350 | 2380 |
2351 | 2381 |
2352 void InstantiateTypeArgumentsInstr::EmitNativeCode( | 2382 void InstantiateTypeArgumentsInstr::EmitNativeCode( |
2353 FlowGraphCompiler* compiler) { | 2383 FlowGraphCompiler* compiler) { |
2354 Register instantiator_reg = locs()->in(0).reg(); | 2384 Register instantiator_reg = locs()->in(0).reg(); |
2355 Register result_reg = locs()->out(0).reg(); | 2385 Register result_reg = locs()->out(0).reg(); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2402 kInstantiateTypeArgumentsRuntimeEntry, | 2432 kInstantiateTypeArgumentsRuntimeEntry, |
2403 2, | 2433 2, |
2404 locs()); | 2434 locs()); |
2405 __ Drop(2); // Drop instantiator and uninstantiated type arguments. | 2435 __ Drop(2); // Drop instantiator and uninstantiated type arguments. |
2406 __ popq(result_reg); // Pop instantiated type arguments. | 2436 __ popq(result_reg); // Pop instantiated type arguments. |
2407 __ Bind(&type_arguments_instantiated); | 2437 __ Bind(&type_arguments_instantiated); |
2408 ASSERT(instantiator_reg == result_reg); | 2438 ASSERT(instantiator_reg == result_reg); |
2409 } | 2439 } |
2410 | 2440 |
2411 | 2441 |
2412 LocationSummary* AllocateContextInstr::MakeLocationSummary(bool opt) const { | 2442 LocationSummary* AllocateContextInstr::MakeLocationSummary(Isolate* isolate, |
| 2443 bool opt) const { |
2413 const intptr_t kNumInputs = 0; | 2444 const intptr_t kNumInputs = 0; |
2414 const intptr_t kNumTemps = 1; | 2445 const intptr_t kNumTemps = 1; |
2415 LocationSummary* locs = | 2446 LocationSummary* locs = new(isolate) LocationSummary( |
2416 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 2447 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
2417 locs->set_temp(0, Location::RegisterLocation(R10)); | 2448 locs->set_temp(0, Location::RegisterLocation(R10)); |
2418 locs->set_out(0, Location::RegisterLocation(RAX)); | 2449 locs->set_out(0, Location::RegisterLocation(RAX)); |
2419 return locs; | 2450 return locs; |
2420 } | 2451 } |
2421 | 2452 |
2422 | 2453 |
2423 void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2454 void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2424 ASSERT(locs()->temp(0).reg() == R10); | 2455 ASSERT(locs()->temp(0).reg() == R10); |
2425 ASSERT(locs()->out(0).reg() == RAX); | 2456 ASSERT(locs()->out(0).reg() == RAX); |
2426 | 2457 |
2427 __ LoadImmediate(R10, Immediate(num_context_variables()), PP); | 2458 __ LoadImmediate(R10, Immediate(num_context_variables()), PP); |
2428 const ExternalLabel label("alloc_context", | 2459 const ExternalLabel label("alloc_context", |
2429 StubCode::AllocateContextEntryPoint()); | 2460 StubCode::AllocateContextEntryPoint()); |
2430 compiler->GenerateCall(token_pos(), | 2461 compiler->GenerateCall(token_pos(), |
2431 &label, | 2462 &label, |
2432 PcDescriptors::kOther, | 2463 PcDescriptors::kOther, |
2433 locs()); | 2464 locs()); |
2434 } | 2465 } |
2435 | 2466 |
2436 | 2467 |
2437 LocationSummary* CloneContextInstr::MakeLocationSummary(bool opt) const { | 2468 LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate, |
| 2469 bool opt) const { |
2438 const intptr_t kNumInputs = 1; | 2470 const intptr_t kNumInputs = 1; |
2439 const intptr_t kNumTemps = 0; | 2471 const intptr_t kNumTemps = 0; |
2440 LocationSummary* locs = | 2472 LocationSummary* locs = new(isolate) LocationSummary( |
2441 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 2473 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
2442 locs->set_in(0, Location::RegisterLocation(RAX)); | 2474 locs->set_in(0, Location::RegisterLocation(RAX)); |
2443 locs->set_out(0, Location::RegisterLocation(RAX)); | 2475 locs->set_out(0, Location::RegisterLocation(RAX)); |
2444 return locs; | 2476 return locs; |
2445 } | 2477 } |
2446 | 2478 |
2447 | 2479 |
2448 void CloneContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2480 void CloneContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2449 Register context_value = locs()->in(0).reg(); | 2481 Register context_value = locs()->in(0).reg(); |
2450 Register result = locs()->out(0).reg(); | 2482 Register result = locs()->out(0).reg(); |
2451 | 2483 |
2452 __ PushObject(Object::ZoneHandle(), PP); // Make room for the result. | 2484 __ PushObject(Object::ZoneHandle(), PP); // Make room for the result. |
2453 __ pushq(context_value); | 2485 __ pushq(context_value); |
2454 compiler->GenerateRuntimeCall(token_pos(), | 2486 compiler->GenerateRuntimeCall(token_pos(), |
2455 deopt_id(), | 2487 deopt_id(), |
2456 kCloneContextRuntimeEntry, | 2488 kCloneContextRuntimeEntry, |
2457 1, | 2489 1, |
2458 locs()); | 2490 locs()); |
2459 __ popq(result); // Remove argument. | 2491 __ popq(result); // Remove argument. |
2460 __ popq(result); // Get result (cloned context). | 2492 __ popq(result); // Get result (cloned context). |
2461 } | 2493 } |
2462 | 2494 |
2463 | 2495 |
2464 LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(bool opt) const { | 2496 LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Isolate* isolate, |
| 2497 bool opt) const { |
2465 UNREACHABLE(); | 2498 UNREACHABLE(); |
2466 return NULL; | 2499 return NULL; |
2467 } | 2500 } |
2468 | 2501 |
2469 | 2502 |
2470 void CatchBlockEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2503 void CatchBlockEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2471 __ Bind(compiler->GetJumpLabel(this)); | 2504 __ Bind(compiler->GetJumpLabel(this)); |
2472 compiler->AddExceptionHandler(catch_try_index(), | 2505 compiler->AddExceptionHandler(catch_try_index(), |
2473 try_index(), | 2506 try_index(), |
2474 compiler->assembler()->CodeSize(), | 2507 compiler->assembler()->CodeSize(), |
(...skipping 16 matching lines...) Expand all Loading... |
2491 | 2524 |
2492 // Restore stack and initialize the two exception variables: | 2525 // Restore stack and initialize the two exception variables: |
2493 // exception and stack trace variables. | 2526 // exception and stack trace variables. |
2494 __ movq(Address(RBP, exception_var().index() * kWordSize), | 2527 __ movq(Address(RBP, exception_var().index() * kWordSize), |
2495 kExceptionObjectReg); | 2528 kExceptionObjectReg); |
2496 __ movq(Address(RBP, stacktrace_var().index() * kWordSize), | 2529 __ movq(Address(RBP, stacktrace_var().index() * kWordSize), |
2497 kStackTraceObjectReg); | 2530 kStackTraceObjectReg); |
2498 } | 2531 } |
2499 | 2532 |
2500 | 2533 |
2501 LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(bool opt) const { | 2534 LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(Isolate* isolate, |
| 2535 bool opt) const { |
2502 const intptr_t kNumInputs = 0; | 2536 const intptr_t kNumInputs = 0; |
2503 const intptr_t kNumTemps = 1; | 2537 const intptr_t kNumTemps = 1; |
2504 LocationSummary* summary = | 2538 LocationSummary* summary = new(isolate) LocationSummary( |
2505 new LocationSummary(kNumInputs, | 2539 isolate, kNumInputs, |
2506 kNumTemps, | 2540 kNumTemps, |
2507 LocationSummary::kCallOnSlowPath); | 2541 LocationSummary::kCallOnSlowPath); |
2508 summary->set_temp(0, Location::RequiresRegister()); | 2542 summary->set_temp(0, Location::RequiresRegister()); |
2509 return summary; | 2543 return summary; |
2510 } | 2544 } |
2511 | 2545 |
2512 | 2546 |
2513 class CheckStackOverflowSlowPath : public SlowPathCode { | 2547 class CheckStackOverflowSlowPath : public SlowPathCode { |
2514 public: | 2548 public: |
2515 explicit CheckStackOverflowSlowPath(CheckStackOverflowInstr* instruction) | 2549 explicit CheckStackOverflowSlowPath(CheckStackOverflowInstr* instruction) |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2735 } | 2769 } |
2736 } | 2770 } |
2737 | 2771 |
2738 | 2772 |
2739 static bool CanBeImmediate(const Object& constant) { | 2773 static bool CanBeImmediate(const Object& constant) { |
2740 return constant.IsSmi() && | 2774 return constant.IsSmi() && |
2741 Immediate(reinterpret_cast<int64_t>(constant.raw())).is_int32(); | 2775 Immediate(reinterpret_cast<int64_t>(constant.raw())).is_int32(); |
2742 } | 2776 } |
2743 | 2777 |
2744 | 2778 |
2745 LocationSummary* BinarySmiOpInstr::MakeLocationSummary(bool opt) const { | 2779 LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Isolate* isolate, |
| 2780 bool opt) const { |
2746 const intptr_t kNumInputs = 2; | 2781 const intptr_t kNumInputs = 2; |
2747 | 2782 |
2748 ConstantInstr* right_constant = right()->definition()->AsConstant(); | 2783 ConstantInstr* right_constant = right()->definition()->AsConstant(); |
2749 if ((right_constant != NULL) && | 2784 if ((right_constant != NULL) && |
2750 (op_kind() != Token::kTRUNCDIV) && | 2785 (op_kind() != Token::kTRUNCDIV) && |
2751 (op_kind() != Token::kSHL) && | 2786 (op_kind() != Token::kSHL) && |
2752 (op_kind() != Token::kMUL) && | 2787 (op_kind() != Token::kMUL) && |
2753 (op_kind() != Token::kMOD) && | 2788 (op_kind() != Token::kMOD) && |
2754 CanBeImmediate(right_constant->value())) { | 2789 CanBeImmediate(right_constant->value())) { |
2755 const intptr_t kNumTemps = 0; | 2790 const intptr_t kNumTemps = 0; |
2756 LocationSummary* summary = | 2791 LocationSummary* summary = new(isolate) LocationSummary( |
2757 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 2792 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
2758 summary->set_in(0, Location::RequiresRegister()); | 2793 summary->set_in(0, Location::RequiresRegister()); |
2759 summary->set_in(1, Location::Constant(right_constant->value())); | 2794 summary->set_in(1, Location::Constant(right_constant->value())); |
2760 summary->set_out(0, Location::SameAsFirstInput()); | 2795 summary->set_out(0, Location::SameAsFirstInput()); |
2761 return summary; | 2796 return summary; |
2762 } | 2797 } |
2763 | 2798 |
2764 if (op_kind() == Token::kTRUNCDIV) { | 2799 if (op_kind() == Token::kTRUNCDIV) { |
2765 const intptr_t kNumTemps = 1; | 2800 const intptr_t kNumTemps = 1; |
2766 LocationSummary* summary = | 2801 LocationSummary* summary = new(isolate) LocationSummary( |
2767 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 2802 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
2768 if (RightIsPowerOfTwoConstant()) { | 2803 if (RightIsPowerOfTwoConstant()) { |
2769 summary->set_in(0, Location::RequiresRegister()); | 2804 summary->set_in(0, Location::RequiresRegister()); |
2770 ConstantInstr* right_constant = right()->definition()->AsConstant(); | 2805 ConstantInstr* right_constant = right()->definition()->AsConstant(); |
2771 summary->set_in(1, Location::Constant(right_constant->value())); | 2806 summary->set_in(1, Location::Constant(right_constant->value())); |
2772 summary->set_temp(0, Location::RequiresRegister()); | 2807 summary->set_temp(0, Location::RequiresRegister()); |
2773 summary->set_out(0, Location::SameAsFirstInput()); | 2808 summary->set_out(0, Location::SameAsFirstInput()); |
2774 } else { | 2809 } else { |
2775 // Both inputs must be writable because they will be untagged. | 2810 // Both inputs must be writable because they will be untagged. |
2776 summary->set_in(0, Location::RegisterLocation(RAX)); | 2811 summary->set_in(0, Location::RegisterLocation(RAX)); |
2777 summary->set_in(1, Location::WritableRegister()); | 2812 summary->set_in(1, Location::WritableRegister()); |
2778 summary->set_out(0, Location::SameAsFirstInput()); | 2813 summary->set_out(0, Location::SameAsFirstInput()); |
2779 // Will be used for sign extension and division. | 2814 // Will be used for sign extension and division. |
2780 summary->set_temp(0, Location::RegisterLocation(RDX)); | 2815 summary->set_temp(0, Location::RegisterLocation(RDX)); |
2781 } | 2816 } |
2782 return summary; | 2817 return summary; |
2783 } else if (op_kind() == Token::kMOD) { | 2818 } else if (op_kind() == Token::kMOD) { |
2784 const intptr_t kNumTemps = 1; | 2819 const intptr_t kNumTemps = 1; |
2785 LocationSummary* summary = | 2820 LocationSummary* summary = new(isolate) LocationSummary( |
2786 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 2821 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
2787 // Both inputs must be writable because they will be untagged. | 2822 // Both inputs must be writable because they will be untagged. |
2788 summary->set_in(0, Location::RegisterLocation(RDX)); | 2823 summary->set_in(0, Location::RegisterLocation(RDX)); |
2789 summary->set_in(1, Location::WritableRegister()); | 2824 summary->set_in(1, Location::WritableRegister()); |
2790 summary->set_out(0, Location::SameAsFirstInput()); | 2825 summary->set_out(0, Location::SameAsFirstInput()); |
2791 // Will be used for sign extension and division. | 2826 // Will be used for sign extension and division. |
2792 summary->set_temp(0, Location::RegisterLocation(RAX)); | 2827 summary->set_temp(0, Location::RegisterLocation(RAX)); |
2793 return summary; | 2828 return summary; |
2794 } else if (op_kind() == Token::kSHR) { | 2829 } else if (op_kind() == Token::kSHR) { |
2795 const intptr_t kNumTemps = 0; | 2830 const intptr_t kNumTemps = 0; |
2796 LocationSummary* summary = | 2831 LocationSummary* summary = new(isolate) LocationSummary( |
2797 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 2832 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
2798 summary->set_in(0, Location::RequiresRegister()); | 2833 summary->set_in(0, Location::RequiresRegister()); |
2799 summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX)); | 2834 summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX)); |
2800 summary->set_out(0, Location::SameAsFirstInput()); | 2835 summary->set_out(0, Location::SameAsFirstInput()); |
2801 return summary; | 2836 return summary; |
2802 } else if (op_kind() == Token::kSHL) { | 2837 } else if (op_kind() == Token::kSHL) { |
2803 const intptr_t kNumTemps = 0; | 2838 const intptr_t kNumTemps = 0; |
2804 LocationSummary* summary = | 2839 LocationSummary* summary = new(isolate) LocationSummary( |
2805 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 2840 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
2806 summary->set_in(0, Location::RequiresRegister()); | 2841 summary->set_in(0, Location::RequiresRegister()); |
2807 summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX)); | 2842 summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX)); |
2808 if (!is_truncating()) { | 2843 if (!is_truncating()) { |
2809 summary->AddTemp(Location::RequiresRegister()); | 2844 summary->AddTemp(Location::RequiresRegister()); |
2810 } | 2845 } |
2811 summary->set_out(0, Location::SameAsFirstInput()); | 2846 summary->set_out(0, Location::SameAsFirstInput()); |
2812 return summary; | 2847 return summary; |
2813 } else { | 2848 } else { |
2814 const intptr_t kNumTemps = 0; | 2849 const intptr_t kNumTemps = 0; |
2815 LocationSummary* summary = | 2850 LocationSummary* summary = new(isolate) LocationSummary( |
2816 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 2851 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
2817 summary->set_in(0, Location::RequiresRegister()); | 2852 summary->set_in(0, Location::RequiresRegister()); |
2818 ConstantInstr* constant = right()->definition()->AsConstant(); | 2853 ConstantInstr* constant = right()->definition()->AsConstant(); |
2819 if (constant != NULL) { | 2854 if (constant != NULL) { |
2820 summary->set_in(1, Location::RegisterOrSmiConstant(right())); | 2855 summary->set_in(1, Location::RegisterOrSmiConstant(right())); |
2821 } else { | 2856 } else { |
2822 summary->set_in(1, Location::PrefersRegister()); | 2857 summary->set_in(1, Location::PrefersRegister()); |
2823 } | 2858 } |
2824 summary->set_out(0, Location::SameAsFirstInput()); | 2859 summary->set_out(0, Location::SameAsFirstInput()); |
2825 return summary; | 2860 return summary; |
2826 } | 2861 } |
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3190 default: | 3225 default: |
3191 UNREACHABLE(); | 3226 UNREACHABLE(); |
3192 break; | 3227 break; |
3193 } | 3228 } |
3194 if (FLAG_throw_on_javascript_int_overflow) { | 3229 if (FLAG_throw_on_javascript_int_overflow) { |
3195 EmitJavascriptOverflowCheck(compiler, range(), deopt, result); | 3230 EmitJavascriptOverflowCheck(compiler, range(), deopt, result); |
3196 } | 3231 } |
3197 } | 3232 } |
3198 | 3233 |
3199 | 3234 |
3200 LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(bool opt) const { | 3235 LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Isolate* isolate, |
| 3236 bool opt) const { |
3201 intptr_t left_cid = left()->Type()->ToCid(); | 3237 intptr_t left_cid = left()->Type()->ToCid(); |
3202 intptr_t right_cid = right()->Type()->ToCid(); | 3238 intptr_t right_cid = right()->Type()->ToCid(); |
3203 ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid)); | 3239 ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid)); |
3204 const intptr_t kNumInputs = 2; | 3240 const intptr_t kNumInputs = 2; |
3205 const bool need_temp = (left()->definition() != right()->definition()) | 3241 const bool need_temp = (left()->definition() != right()->definition()) |
3206 && (left_cid != kSmiCid) | 3242 && (left_cid != kSmiCid) |
3207 && (right_cid != kSmiCid); | 3243 && (right_cid != kSmiCid); |
3208 const intptr_t kNumTemps = need_temp ? 1 : 0; | 3244 const intptr_t kNumTemps = need_temp ? 1 : 0; |
3209 LocationSummary* summary = | 3245 LocationSummary* summary = new(isolate) LocationSummary( |
3210 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3246 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3211 summary->set_in(0, Location::RequiresRegister()); | 3247 summary->set_in(0, Location::RequiresRegister()); |
3212 summary->set_in(1, Location::RequiresRegister()); | 3248 summary->set_in(1, Location::RequiresRegister()); |
3213 if (need_temp) summary->set_temp(0, Location::RequiresRegister()); | 3249 if (need_temp) summary->set_temp(0, Location::RequiresRegister()); |
3214 return summary; | 3250 return summary; |
3215 } | 3251 } |
3216 | 3252 |
3217 | 3253 |
3218 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3254 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3219 Label* deopt = compiler->AddDeoptStub(deopt_id(), | 3255 Label* deopt = compiler->AddDeoptStub(deopt_id(), |
3220 ICData::kDeoptBinaryDoubleOp); | 3256 ICData::kDeoptBinaryDoubleOp); |
(...skipping 10 matching lines...) Expand all Loading... |
3231 } else { | 3267 } else { |
3232 Register temp = locs()->temp(0).reg(); | 3268 Register temp = locs()->temp(0).reg(); |
3233 __ movq(temp, left); | 3269 __ movq(temp, left); |
3234 __ orq(temp, right); | 3270 __ orq(temp, right); |
3235 __ testq(temp, Immediate(kSmiTagMask)); | 3271 __ testq(temp, Immediate(kSmiTagMask)); |
3236 } | 3272 } |
3237 __ j(ZERO, deopt); | 3273 __ j(ZERO, deopt); |
3238 } | 3274 } |
3239 | 3275 |
3240 | 3276 |
3241 LocationSummary* BoxDoubleInstr::MakeLocationSummary(bool opt) const { | 3277 LocationSummary* BoxDoubleInstr::MakeLocationSummary(Isolate* isolate, |
| 3278 bool opt) const { |
3242 const intptr_t kNumInputs = 1; | 3279 const intptr_t kNumInputs = 1; |
3243 const intptr_t kNumTemps = 0; | 3280 const intptr_t kNumTemps = 0; |
3244 LocationSummary* summary = | 3281 LocationSummary* summary = new(isolate) LocationSummary( |
3245 new LocationSummary(kNumInputs, | 3282 isolate, kNumInputs, |
3246 kNumTemps, | 3283 kNumTemps, |
3247 LocationSummary::kCallOnSlowPath); | 3284 LocationSummary::kCallOnSlowPath); |
3248 summary->set_in(0, Location::RequiresFpuRegister()); | 3285 summary->set_in(0, Location::RequiresFpuRegister()); |
3249 summary->set_out(0, Location::RequiresRegister()); | 3286 summary->set_out(0, Location::RequiresRegister()); |
3250 return summary; | 3287 return summary; |
3251 } | 3288 } |
3252 | 3289 |
3253 | 3290 |
3254 void BoxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3291 void BoxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3255 BoxDoubleSlowPath* slow_path = new BoxDoubleSlowPath(this); | 3292 BoxDoubleSlowPath* slow_path = new BoxDoubleSlowPath(this); |
3256 compiler->AddSlowPathCode(slow_path); | 3293 compiler->AddSlowPathCode(slow_path); |
3257 | 3294 |
3258 Register out_reg = locs()->out(0).reg(); | 3295 Register out_reg = locs()->out(0).reg(); |
3259 XmmRegister value = locs()->in(0).fpu_reg(); | 3296 XmmRegister value = locs()->in(0).fpu_reg(); |
3260 | 3297 |
3261 __ TryAllocate(compiler->double_class(), | 3298 __ TryAllocate(compiler->double_class(), |
3262 slow_path->entry_label(), | 3299 slow_path->entry_label(), |
3263 Assembler::kFarJump, | 3300 Assembler::kFarJump, |
3264 out_reg, | 3301 out_reg, |
3265 PP); | 3302 PP); |
3266 __ Bind(slow_path->exit_label()); | 3303 __ Bind(slow_path->exit_label()); |
3267 __ movsd(FieldAddress(out_reg, Double::value_offset()), value); | 3304 __ movsd(FieldAddress(out_reg, Double::value_offset()), value); |
3268 } | 3305 } |
3269 | 3306 |
3270 | 3307 |
3271 LocationSummary* UnboxDoubleInstr::MakeLocationSummary(bool opt) const { | 3308 LocationSummary* UnboxDoubleInstr::MakeLocationSummary(Isolate* isolate, |
| 3309 bool opt) const { |
3272 const intptr_t kNumInputs = 1; | 3310 const intptr_t kNumInputs = 1; |
3273 const intptr_t kNumTemps = 0; | 3311 const intptr_t kNumTemps = 0; |
3274 LocationSummary* summary = | 3312 LocationSummary* summary = new(isolate) LocationSummary( |
3275 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3313 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3276 const bool needs_writable_input = (value()->Type()->ToCid() != kDoubleCid); | 3314 const bool needs_writable_input = (value()->Type()->ToCid() != kDoubleCid); |
3277 summary->set_in(0, needs_writable_input | 3315 summary->set_in(0, needs_writable_input |
3278 ? Location::WritableRegister() | 3316 ? Location::WritableRegister() |
3279 : Location::RequiresRegister()); | 3317 : Location::RequiresRegister()); |
3280 summary->set_out(0, Location::RequiresFpuRegister()); | 3318 summary->set_out(0, Location::RequiresFpuRegister()); |
3281 return summary; | 3319 return summary; |
3282 } | 3320 } |
3283 | 3321 |
3284 | 3322 |
3285 void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3323 void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
(...skipping 28 matching lines...) Expand all Loading... |
3314 __ jmp(&done); | 3352 __ jmp(&done); |
3315 __ Bind(&is_smi); | 3353 __ Bind(&is_smi); |
3316 __ SmiUntag(value); | 3354 __ SmiUntag(value); |
3317 __ cvtsi2sd(result, value); | 3355 __ cvtsi2sd(result, value); |
3318 __ Bind(&done); | 3356 __ Bind(&done); |
3319 } | 3357 } |
3320 } | 3358 } |
3321 } | 3359 } |
3322 | 3360 |
3323 | 3361 |
3324 LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(bool opt) const { | 3362 LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(Isolate* isolate, |
| 3363 bool opt) const { |
3325 const intptr_t kNumInputs = 1; | 3364 const intptr_t kNumInputs = 1; |
3326 const intptr_t kNumTemps = 0; | 3365 const intptr_t kNumTemps = 0; |
3327 LocationSummary* summary = | 3366 LocationSummary* summary = new(isolate) LocationSummary( |
3328 new LocationSummary(kNumInputs, | 3367 isolate, kNumInputs, |
3329 kNumTemps, | 3368 kNumTemps, |
3330 LocationSummary::kCallOnSlowPath); | 3369 LocationSummary::kCallOnSlowPath); |
3331 summary->set_in(0, Location::RequiresFpuRegister()); | 3370 summary->set_in(0, Location::RequiresFpuRegister()); |
3332 summary->set_out(0, Location::RequiresRegister()); | 3371 summary->set_out(0, Location::RequiresRegister()); |
3333 return summary; | 3372 return summary; |
3334 } | 3373 } |
3335 | 3374 |
3336 | 3375 |
3337 void BoxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3376 void BoxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3338 BoxFloat32x4SlowPath* slow_path = new BoxFloat32x4SlowPath(this); | 3377 BoxFloat32x4SlowPath* slow_path = new BoxFloat32x4SlowPath(this); |
3339 compiler->AddSlowPathCode(slow_path); | 3378 compiler->AddSlowPathCode(slow_path); |
3340 | 3379 |
3341 Register out_reg = locs()->out(0).reg(); | 3380 Register out_reg = locs()->out(0).reg(); |
3342 XmmRegister value = locs()->in(0).fpu_reg(); | 3381 XmmRegister value = locs()->in(0).fpu_reg(); |
3343 | 3382 |
3344 __ TryAllocate(compiler->float32x4_class(), | 3383 __ TryAllocate(compiler->float32x4_class(), |
3345 slow_path->entry_label(), | 3384 slow_path->entry_label(), |
3346 Assembler::kFarJump, | 3385 Assembler::kFarJump, |
3347 out_reg, | 3386 out_reg, |
3348 PP); | 3387 PP); |
3349 __ Bind(slow_path->exit_label()); | 3388 __ Bind(slow_path->exit_label()); |
3350 __ movups(FieldAddress(out_reg, Float32x4::value_offset()), value); | 3389 __ movups(FieldAddress(out_reg, Float32x4::value_offset()), value); |
3351 } | 3390 } |
3352 | 3391 |
3353 | 3392 |
3354 LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary(bool opt) const { | 3393 LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary(Isolate* isolate, |
| 3394 bool opt) const { |
3355 const intptr_t kNumInputs = 1; | 3395 const intptr_t kNumInputs = 1; |
3356 return LocationSummary::Make(kNumInputs, | 3396 return LocationSummary::Make(kNumInputs, |
3357 Location::RequiresFpuRegister(), | 3397 Location::RequiresFpuRegister(), |
3358 LocationSummary::kNoCall); | 3398 LocationSummary::kNoCall); |
3359 } | 3399 } |
3360 | 3400 |
3361 | 3401 |
3362 void UnboxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3402 void UnboxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3363 const intptr_t value_cid = value()->Type()->ToCid(); | 3403 const intptr_t value_cid = value()->Type()->ToCid(); |
3364 const Register value = locs()->in(0).reg(); | 3404 const Register value = locs()->in(0).reg(); |
3365 const XmmRegister result = locs()->out(0).fpu_reg(); | 3405 const XmmRegister result = locs()->out(0).fpu_reg(); |
3366 | 3406 |
3367 if (value_cid != kFloat32x4Cid) { | 3407 if (value_cid != kFloat32x4Cid) { |
3368 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass); | 3408 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass); |
3369 __ testq(value, Immediate(kSmiTagMask)); | 3409 __ testq(value, Immediate(kSmiTagMask)); |
3370 __ j(ZERO, deopt); | 3410 __ j(ZERO, deopt); |
3371 __ CompareClassId(value, kFloat32x4Cid); | 3411 __ CompareClassId(value, kFloat32x4Cid); |
3372 __ j(NOT_EQUAL, deopt); | 3412 __ j(NOT_EQUAL, deopt); |
3373 } | 3413 } |
3374 __ movups(result, FieldAddress(value, Float32x4::value_offset())); | 3414 __ movups(result, FieldAddress(value, Float32x4::value_offset())); |
3375 } | 3415 } |
3376 | 3416 |
3377 | 3417 |
3378 LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(bool opt) const { | 3418 LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(Isolate* isolate, |
| 3419 bool opt) const { |
3379 const intptr_t kNumInputs = 1; | 3420 const intptr_t kNumInputs = 1; |
3380 const intptr_t kNumTemps = 0; | 3421 const intptr_t kNumTemps = 0; |
3381 LocationSummary* summary = | 3422 LocationSummary* summary = new(isolate) LocationSummary( |
3382 new LocationSummary(kNumInputs, | 3423 isolate, kNumInputs, |
3383 kNumTemps, | 3424 kNumTemps, |
3384 LocationSummary::kCallOnSlowPath); | 3425 LocationSummary::kCallOnSlowPath); |
3385 summary->set_in(0, Location::RequiresFpuRegister()); | 3426 summary->set_in(0, Location::RequiresFpuRegister()); |
3386 summary->set_out(0, Location::RequiresRegister()); | 3427 summary->set_out(0, Location::RequiresRegister()); |
3387 return summary; | 3428 return summary; |
3388 } | 3429 } |
3389 | 3430 |
3390 | 3431 |
3391 void BoxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3432 void BoxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3392 BoxFloat64x2SlowPath* slow_path = new BoxFloat64x2SlowPath(this); | 3433 BoxFloat64x2SlowPath* slow_path = new BoxFloat64x2SlowPath(this); |
3393 compiler->AddSlowPathCode(slow_path); | 3434 compiler->AddSlowPathCode(slow_path); |
3394 | 3435 |
3395 Register out_reg = locs()->out(0).reg(); | 3436 Register out_reg = locs()->out(0).reg(); |
3396 XmmRegister value = locs()->in(0).fpu_reg(); | 3437 XmmRegister value = locs()->in(0).fpu_reg(); |
3397 | 3438 |
3398 __ TryAllocate(compiler->float64x2_class(), | 3439 __ TryAllocate(compiler->float64x2_class(), |
3399 slow_path->entry_label(), | 3440 slow_path->entry_label(), |
3400 Assembler::kFarJump, | 3441 Assembler::kFarJump, |
3401 out_reg, | 3442 out_reg, |
3402 kNoRegister); | 3443 kNoRegister); |
3403 __ Bind(slow_path->exit_label()); | 3444 __ Bind(slow_path->exit_label()); |
3404 __ movups(FieldAddress(out_reg, Float64x2::value_offset()), value); | 3445 __ movups(FieldAddress(out_reg, Float64x2::value_offset()), value); |
3405 } | 3446 } |
3406 | 3447 |
3407 | 3448 |
3408 LocationSummary* UnboxFloat64x2Instr::MakeLocationSummary(bool opt) const { | 3449 LocationSummary* UnboxFloat64x2Instr::MakeLocationSummary(Isolate* isolate, |
| 3450 bool opt) const { |
3409 const intptr_t value_cid = value()->Type()->ToCid(); | 3451 const intptr_t value_cid = value()->Type()->ToCid(); |
3410 const intptr_t kNumInputs = 1; | 3452 const intptr_t kNumInputs = 1; |
3411 const intptr_t kNumTemps = value_cid == kFloat64x2Cid ? 0 : 1; | 3453 const intptr_t kNumTemps = value_cid == kFloat64x2Cid ? 0 : 1; |
3412 LocationSummary* summary = | 3454 LocationSummary* summary = new(isolate) LocationSummary( |
3413 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3455 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3414 summary->set_in(0, Location::RequiresRegister()); | 3456 summary->set_in(0, Location::RequiresRegister()); |
3415 summary->set_out(0, Location::RequiresFpuRegister()); | 3457 summary->set_out(0, Location::RequiresFpuRegister()); |
3416 return summary; | 3458 return summary; |
3417 } | 3459 } |
3418 | 3460 |
3419 | 3461 |
3420 void UnboxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3462 void UnboxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3421 const intptr_t value_cid = value()->Type()->ToCid(); | 3463 const intptr_t value_cid = value()->Type()->ToCid(); |
3422 const Register value = locs()->in(0).reg(); | 3464 const Register value = locs()->in(0).reg(); |
3423 const XmmRegister result = locs()->out(0).fpu_reg(); | 3465 const XmmRegister result = locs()->out(0).fpu_reg(); |
3424 | 3466 |
3425 if (value_cid != kFloat64x2Cid) { | 3467 if (value_cid != kFloat64x2Cid) { |
3426 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass); | 3468 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass); |
3427 __ testq(value, Immediate(kSmiTagMask)); | 3469 __ testq(value, Immediate(kSmiTagMask)); |
3428 __ j(ZERO, deopt); | 3470 __ j(ZERO, deopt); |
3429 __ CompareClassId(value, kFloat64x2Cid); | 3471 __ CompareClassId(value, kFloat64x2Cid); |
3430 __ j(NOT_EQUAL, deopt); | 3472 __ j(NOT_EQUAL, deopt); |
3431 } | 3473 } |
3432 __ movups(result, FieldAddress(value, Float64x2::value_offset())); | 3474 __ movups(result, FieldAddress(value, Float64x2::value_offset())); |
3433 } | 3475 } |
3434 | 3476 |
3435 | 3477 |
3436 LocationSummary* BoxInt32x4Instr::MakeLocationSummary(bool opt) const { | 3478 LocationSummary* BoxInt32x4Instr::MakeLocationSummary(Isolate* isolate, |
| 3479 bool opt) const { |
3437 const intptr_t kNumInputs = 1; | 3480 const intptr_t kNumInputs = 1; |
3438 const intptr_t kNumTemps = 0; | 3481 const intptr_t kNumTemps = 0; |
3439 LocationSummary* summary = | 3482 LocationSummary* summary = new(isolate) LocationSummary( |
3440 new LocationSummary(kNumInputs, | 3483 isolate, kNumInputs, |
3441 kNumTemps, | 3484 kNumTemps, |
3442 LocationSummary::kCallOnSlowPath); | 3485 LocationSummary::kCallOnSlowPath); |
3443 summary->set_in(0, Location::RequiresFpuRegister()); | 3486 summary->set_in(0, Location::RequiresFpuRegister()); |
3444 summary->set_out(0, Location::RequiresRegister()); | 3487 summary->set_out(0, Location::RequiresRegister()); |
3445 return summary; | 3488 return summary; |
3446 } | 3489 } |
3447 | 3490 |
3448 | 3491 |
3449 class BoxInt32x4SlowPath : public SlowPathCode { | 3492 class BoxInt32x4SlowPath : public SlowPathCode { |
3450 public: | 3493 public: |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3488 __ TryAllocate(compiler->int32x4_class(), | 3531 __ TryAllocate(compiler->int32x4_class(), |
3489 slow_path->entry_label(), | 3532 slow_path->entry_label(), |
3490 Assembler::kFarJump, | 3533 Assembler::kFarJump, |
3491 out_reg, | 3534 out_reg, |
3492 PP); | 3535 PP); |
3493 __ Bind(slow_path->exit_label()); | 3536 __ Bind(slow_path->exit_label()); |
3494 __ movups(FieldAddress(out_reg, Int32x4::value_offset()), value); | 3537 __ movups(FieldAddress(out_reg, Int32x4::value_offset()), value); |
3495 } | 3538 } |
3496 | 3539 |
3497 | 3540 |
3498 LocationSummary* UnboxInt32x4Instr::MakeLocationSummary(bool opt) const { | 3541 LocationSummary* UnboxInt32x4Instr::MakeLocationSummary(Isolate* isolate, |
| 3542 bool opt) const { |
3499 const intptr_t kNumInputs = 1; | 3543 const intptr_t kNumInputs = 1; |
3500 const intptr_t kNumTemps = 0; | 3544 const intptr_t kNumTemps = 0; |
3501 LocationSummary* summary = | 3545 LocationSummary* summary = new(isolate) LocationSummary( |
3502 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3546 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3503 summary->set_in(0, Location::RequiresRegister()); | 3547 summary->set_in(0, Location::RequiresRegister()); |
3504 summary->set_out(0, Location::RequiresFpuRegister()); | 3548 summary->set_out(0, Location::RequiresFpuRegister()); |
3505 return summary; | 3549 return summary; |
3506 } | 3550 } |
3507 | 3551 |
3508 | 3552 |
3509 void UnboxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3553 void UnboxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3510 const intptr_t value_cid = value()->Type()->ToCid(); | 3554 const intptr_t value_cid = value()->Type()->ToCid(); |
3511 const Register value = locs()->in(0).reg(); | 3555 const Register value = locs()->in(0).reg(); |
3512 const XmmRegister result = locs()->out(0).fpu_reg(); | 3556 const XmmRegister result = locs()->out(0).fpu_reg(); |
3513 | 3557 |
3514 if (value_cid != kInt32x4Cid) { | 3558 if (value_cid != kInt32x4Cid) { |
3515 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass); | 3559 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass); |
3516 __ testq(value, Immediate(kSmiTagMask)); | 3560 __ testq(value, Immediate(kSmiTagMask)); |
3517 __ j(ZERO, deopt); | 3561 __ j(ZERO, deopt); |
3518 __ CompareClassId(value, kInt32x4Cid); | 3562 __ CompareClassId(value, kInt32x4Cid); |
3519 __ j(NOT_EQUAL, deopt); | 3563 __ j(NOT_EQUAL, deopt); |
3520 } | 3564 } |
3521 __ movups(result, FieldAddress(value, Int32x4::value_offset())); | 3565 __ movups(result, FieldAddress(value, Int32x4::value_offset())); |
3522 } | 3566 } |
3523 | 3567 |
3524 | 3568 |
3525 LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(bool opt) const { | 3569 LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate, |
| 3570 bool opt) const { |
3526 const intptr_t kNumInputs = 2; | 3571 const intptr_t kNumInputs = 2; |
3527 const intptr_t kNumTemps = 0; | 3572 const intptr_t kNumTemps = 0; |
3528 LocationSummary* summary = | 3573 LocationSummary* summary = new(isolate) LocationSummary( |
3529 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3574 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3530 summary->set_in(0, Location::RequiresFpuRegister()); | 3575 summary->set_in(0, Location::RequiresFpuRegister()); |
3531 summary->set_in(1, Location::RequiresFpuRegister()); | 3576 summary->set_in(1, Location::RequiresFpuRegister()); |
3532 summary->set_out(0, Location::SameAsFirstInput()); | 3577 summary->set_out(0, Location::SameAsFirstInput()); |
3533 return summary; | 3578 return summary; |
3534 } | 3579 } |
3535 | 3580 |
3536 | 3581 |
3537 void BinaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3582 void BinaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3538 XmmRegister left = locs()->in(0).fpu_reg(); | 3583 XmmRegister left = locs()->in(0).fpu_reg(); |
3539 XmmRegister right = locs()->in(1).fpu_reg(); | 3584 XmmRegister right = locs()->in(1).fpu_reg(); |
3540 | 3585 |
3541 ASSERT(locs()->out(0).fpu_reg() == left); | 3586 ASSERT(locs()->out(0).fpu_reg() == left); |
3542 | 3587 |
3543 switch (op_kind()) { | 3588 switch (op_kind()) { |
3544 case Token::kADD: __ addsd(left, right); break; | 3589 case Token::kADD: __ addsd(left, right); break; |
3545 case Token::kSUB: __ subsd(left, right); break; | 3590 case Token::kSUB: __ subsd(left, right); break; |
3546 case Token::kMUL: __ mulsd(left, right); break; | 3591 case Token::kMUL: __ mulsd(left, right); break; |
3547 case Token::kDIV: __ divsd(left, right); break; | 3592 case Token::kDIV: __ divsd(left, right); break; |
3548 default: UNREACHABLE(); | 3593 default: UNREACHABLE(); |
3549 } | 3594 } |
3550 } | 3595 } |
3551 | 3596 |
3552 | 3597 |
3553 LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(bool opt) const { | 3598 LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Isolate* isolate, |
| 3599 bool opt) const { |
3554 const intptr_t kNumInputs = 2; | 3600 const intptr_t kNumInputs = 2; |
3555 const intptr_t kNumTemps = 0; | 3601 const intptr_t kNumTemps = 0; |
3556 LocationSummary* summary = | 3602 LocationSummary* summary = new(isolate) LocationSummary( |
3557 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3603 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3558 summary->set_in(0, Location::RequiresFpuRegister()); | 3604 summary->set_in(0, Location::RequiresFpuRegister()); |
3559 summary->set_in(1, Location::RequiresFpuRegister()); | 3605 summary->set_in(1, Location::RequiresFpuRegister()); |
3560 summary->set_out(0, Location::SameAsFirstInput()); | 3606 summary->set_out(0, Location::SameAsFirstInput()); |
3561 return summary; | 3607 return summary; |
3562 } | 3608 } |
3563 | 3609 |
3564 | 3610 |
3565 void BinaryFloat32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3611 void BinaryFloat32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3566 XmmRegister left = locs()->in(0).fpu_reg(); | 3612 XmmRegister left = locs()->in(0).fpu_reg(); |
3567 XmmRegister right = locs()->in(1).fpu_reg(); | 3613 XmmRegister right = locs()->in(1).fpu_reg(); |
3568 | 3614 |
3569 ASSERT(locs()->out(0).fpu_reg() == left); | 3615 ASSERT(locs()->out(0).fpu_reg() == left); |
3570 | 3616 |
3571 switch (op_kind()) { | 3617 switch (op_kind()) { |
3572 case Token::kADD: __ addps(left, right); break; | 3618 case Token::kADD: __ addps(left, right); break; |
3573 case Token::kSUB: __ subps(left, right); break; | 3619 case Token::kSUB: __ subps(left, right); break; |
3574 case Token::kMUL: __ mulps(left, right); break; | 3620 case Token::kMUL: __ mulps(left, right); break; |
3575 case Token::kDIV: __ divps(left, right); break; | 3621 case Token::kDIV: __ divps(left, right); break; |
3576 default: UNREACHABLE(); | 3622 default: UNREACHABLE(); |
3577 } | 3623 } |
3578 } | 3624 } |
3579 | 3625 |
3580 | 3626 |
3581 LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(bool opt) const { | 3627 LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(Isolate* isolate, |
| 3628 bool opt) const { |
3582 const intptr_t kNumInputs = 2; | 3629 const intptr_t kNumInputs = 2; |
3583 const intptr_t kNumTemps = 0; | 3630 const intptr_t kNumTemps = 0; |
3584 LocationSummary* summary = | 3631 LocationSummary* summary = new(isolate) LocationSummary( |
3585 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3632 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3586 summary->set_in(0, Location::RequiresFpuRegister()); | 3633 summary->set_in(0, Location::RequiresFpuRegister()); |
3587 summary->set_in(1, Location::RequiresFpuRegister()); | 3634 summary->set_in(1, Location::RequiresFpuRegister()); |
3588 summary->set_out(0, Location::SameAsFirstInput()); | 3635 summary->set_out(0, Location::SameAsFirstInput()); |
3589 return summary; | 3636 return summary; |
3590 } | 3637 } |
3591 | 3638 |
3592 | 3639 |
3593 void BinaryFloat64x2OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3640 void BinaryFloat64x2OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3594 XmmRegister left = locs()->in(0).fpu_reg(); | 3641 XmmRegister left = locs()->in(0).fpu_reg(); |
3595 XmmRegister right = locs()->in(1).fpu_reg(); | 3642 XmmRegister right = locs()->in(1).fpu_reg(); |
3596 | 3643 |
3597 ASSERT(locs()->out(0).fpu_reg() == left); | 3644 ASSERT(locs()->out(0).fpu_reg() == left); |
3598 | 3645 |
3599 switch (op_kind()) { | 3646 switch (op_kind()) { |
3600 case Token::kADD: __ addpd(left, right); break; | 3647 case Token::kADD: __ addpd(left, right); break; |
3601 case Token::kSUB: __ subpd(left, right); break; | 3648 case Token::kSUB: __ subpd(left, right); break; |
3602 case Token::kMUL: __ mulpd(left, right); break; | 3649 case Token::kMUL: __ mulpd(left, right); break; |
3603 case Token::kDIV: __ divpd(left, right); break; | 3650 case Token::kDIV: __ divpd(left, right); break; |
3604 default: UNREACHABLE(); | 3651 default: UNREACHABLE(); |
3605 } | 3652 } |
3606 } | 3653 } |
3607 | 3654 |
3608 | 3655 |
3609 LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(bool opt) const { | 3656 LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(Isolate* isolate, |
| 3657 bool opt) const { |
3610 const intptr_t kNumInputs = 1; | 3658 const intptr_t kNumInputs = 1; |
3611 const intptr_t kNumTemps = 0; | 3659 const intptr_t kNumTemps = 0; |
3612 LocationSummary* summary = | 3660 LocationSummary* summary = new(isolate) LocationSummary( |
3613 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3661 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3614 summary->set_in(0, Location::RequiresFpuRegister()); | 3662 summary->set_in(0, Location::RequiresFpuRegister()); |
3615 summary->set_out(0, Location::SameAsFirstInput()); | 3663 summary->set_out(0, Location::SameAsFirstInput()); |
3616 return summary; | 3664 return summary; |
3617 } | 3665 } |
3618 | 3666 |
3619 | 3667 |
3620 void Simd32x4ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3668 void Simd32x4ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3621 XmmRegister value = locs()->in(0).fpu_reg(); | 3669 XmmRegister value = locs()->in(0).fpu_reg(); |
3622 | 3670 |
3623 ASSERT(locs()->out(0).fpu_reg() == value); | 3671 ASSERT(locs()->out(0).fpu_reg() == value); |
(...skipping 17 matching lines...) Expand all Loading... |
3641 break; | 3689 break; |
3642 case MethodRecognizer::kFloat32x4Shuffle: | 3690 case MethodRecognizer::kFloat32x4Shuffle: |
3643 case MethodRecognizer::kInt32x4Shuffle: | 3691 case MethodRecognizer::kInt32x4Shuffle: |
3644 __ shufps(value, value, Immediate(mask_)); | 3692 __ shufps(value, value, Immediate(mask_)); |
3645 break; | 3693 break; |
3646 default: UNREACHABLE(); | 3694 default: UNREACHABLE(); |
3647 } | 3695 } |
3648 } | 3696 } |
3649 | 3697 |
3650 | 3698 |
3651 LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(bool opt) const { | 3699 LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(Isolate* isolate, |
| 3700 bool opt) const { |
3652 const intptr_t kNumInputs = 2; | 3701 const intptr_t kNumInputs = 2; |
3653 const intptr_t kNumTemps = 0; | 3702 const intptr_t kNumTemps = 0; |
3654 LocationSummary* summary = | 3703 LocationSummary* summary = new(isolate) LocationSummary( |
3655 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3704 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3656 summary->set_in(0, Location::RequiresFpuRegister()); | 3705 summary->set_in(0, Location::RequiresFpuRegister()); |
3657 summary->set_in(1, Location::RequiresFpuRegister()); | 3706 summary->set_in(1, Location::RequiresFpuRegister()); |
3658 summary->set_out(0, Location::SameAsFirstInput()); | 3707 summary->set_out(0, Location::SameAsFirstInput()); |
3659 return summary; | 3708 return summary; |
3660 } | 3709 } |
3661 | 3710 |
3662 | 3711 |
3663 void Simd32x4ShuffleMixInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3712 void Simd32x4ShuffleMixInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3664 XmmRegister left = locs()->in(0).fpu_reg(); | 3713 XmmRegister left = locs()->in(0).fpu_reg(); |
3665 XmmRegister right = locs()->in(1).fpu_reg(); | 3714 XmmRegister right = locs()->in(1).fpu_reg(); |
3666 | 3715 |
3667 ASSERT(locs()->out(0).fpu_reg() == left); | 3716 ASSERT(locs()->out(0).fpu_reg() == left); |
3668 switch (op_kind()) { | 3717 switch (op_kind()) { |
3669 case MethodRecognizer::kFloat32x4ShuffleMix: | 3718 case MethodRecognizer::kFloat32x4ShuffleMix: |
3670 case MethodRecognizer::kInt32x4ShuffleMix: | 3719 case MethodRecognizer::kInt32x4ShuffleMix: |
3671 __ shufps(left, right, Immediate(mask_)); | 3720 __ shufps(left, right, Immediate(mask_)); |
3672 break; | 3721 break; |
3673 default: UNREACHABLE(); | 3722 default: UNREACHABLE(); |
3674 } | 3723 } |
3675 } | 3724 } |
3676 | 3725 |
3677 | 3726 |
3678 LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(bool opt) const { | 3727 LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(Isolate* isolate, |
| 3728 bool opt) const { |
3679 const intptr_t kNumInputs = 1; | 3729 const intptr_t kNumInputs = 1; |
3680 const intptr_t kNumTemps = 0; | 3730 const intptr_t kNumTemps = 0; |
3681 LocationSummary* summary = | 3731 LocationSummary* summary = new(isolate) LocationSummary( |
3682 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3732 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3683 summary->set_in(0, Location::RequiresFpuRegister()); | 3733 summary->set_in(0, Location::RequiresFpuRegister()); |
3684 summary->set_out(0, Location::RequiresRegister()); | 3734 summary->set_out(0, Location::RequiresRegister()); |
3685 return summary; | 3735 return summary; |
3686 } | 3736 } |
3687 | 3737 |
3688 | 3738 |
3689 void Simd32x4GetSignMaskInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3739 void Simd32x4GetSignMaskInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3690 XmmRegister value = locs()->in(0).fpu_reg(); | 3740 XmmRegister value = locs()->in(0).fpu_reg(); |
3691 Register out = locs()->out(0).reg(); | 3741 Register out = locs()->out(0).reg(); |
3692 | 3742 |
3693 __ movmskps(out, value); | 3743 __ movmskps(out, value); |
3694 __ SmiTag(out); | 3744 __ SmiTag(out); |
3695 } | 3745 } |
3696 | 3746 |
3697 | 3747 |
3698 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary( | 3748 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary( |
3699 bool opt) const { | 3749 Isolate* isolate, bool opt) const { |
3700 const intptr_t kNumInputs = 4; | 3750 const intptr_t kNumInputs = 4; |
3701 const intptr_t kNumTemps = 0; | 3751 const intptr_t kNumTemps = 0; |
3702 LocationSummary* summary = | 3752 LocationSummary* summary = new(isolate) LocationSummary( |
3703 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3753 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3704 summary->set_in(0, Location::RequiresFpuRegister()); | 3754 summary->set_in(0, Location::RequiresFpuRegister()); |
3705 summary->set_in(1, Location::RequiresFpuRegister()); | 3755 summary->set_in(1, Location::RequiresFpuRegister()); |
3706 summary->set_in(2, Location::RequiresFpuRegister()); | 3756 summary->set_in(2, Location::RequiresFpuRegister()); |
3707 summary->set_in(3, Location::RequiresFpuRegister()); | 3757 summary->set_in(3, Location::RequiresFpuRegister()); |
3708 summary->set_out(0, Location::SameAsFirstInput()); | 3758 summary->set_out(0, Location::SameAsFirstInput()); |
3709 return summary; | 3759 return summary; |
3710 } | 3760 } |
3711 | 3761 |
3712 | 3762 |
3713 void Float32x4ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3763 void Float32x4ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
(...skipping 12 matching lines...) Expand all Loading... |
3726 __ cvtsd2ss(v0, v0); | 3776 __ cvtsd2ss(v0, v0); |
3727 __ movss(Address(RSP, 8), v0); | 3777 __ movss(Address(RSP, 8), v0); |
3728 __ movsd(v0, v3); | 3778 __ movsd(v0, v3); |
3729 __ cvtsd2ss(v0, v0); | 3779 __ cvtsd2ss(v0, v0); |
3730 __ movss(Address(RSP, 12), v0); | 3780 __ movss(Address(RSP, 12), v0); |
3731 __ movups(v0, Address(RSP, 0)); | 3781 __ movups(v0, Address(RSP, 0)); |
3732 __ AddImmediate(RSP, Immediate(16), PP); | 3782 __ AddImmediate(RSP, Immediate(16), PP); |
3733 } | 3783 } |
3734 | 3784 |
3735 | 3785 |
3736 LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(bool opt) const { | 3786 LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(Isolate* isolate, |
| 3787 bool opt) const { |
3737 const intptr_t kNumInputs = 0; | 3788 const intptr_t kNumInputs = 0; |
3738 const intptr_t kNumTemps = 0; | 3789 const intptr_t kNumTemps = 0; |
3739 LocationSummary* summary = | 3790 LocationSummary* summary = new(isolate) LocationSummary( |
3740 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3791 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3741 summary->set_out(0, Location::RequiresFpuRegister()); | 3792 summary->set_out(0, Location::RequiresFpuRegister()); |
3742 return summary; | 3793 return summary; |
3743 } | 3794 } |
3744 | 3795 |
3745 | 3796 |
3746 void Float32x4ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3797 void Float32x4ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3747 XmmRegister value = locs()->out(0).fpu_reg(); | 3798 XmmRegister value = locs()->out(0).fpu_reg(); |
3748 __ xorps(value, value); | 3799 __ xorps(value, value); |
3749 } | 3800 } |
3750 | 3801 |
3751 | 3802 |
3752 LocationSummary* Float32x4SplatInstr::MakeLocationSummary(bool opt) const { | 3803 LocationSummary* Float32x4SplatInstr::MakeLocationSummary(Isolate* isolate, |
| 3804 bool opt) const { |
3753 const intptr_t kNumInputs = 1; | 3805 const intptr_t kNumInputs = 1; |
3754 const intptr_t kNumTemps = 0; | 3806 const intptr_t kNumTemps = 0; |
3755 LocationSummary* summary = | 3807 LocationSummary* summary = new(isolate) LocationSummary( |
3756 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3808 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3757 summary->set_in(0, Location::RequiresFpuRegister()); | 3809 summary->set_in(0, Location::RequiresFpuRegister()); |
3758 summary->set_out(0, Location::SameAsFirstInput()); | 3810 summary->set_out(0, Location::SameAsFirstInput()); |
3759 return summary; | 3811 return summary; |
3760 } | 3812 } |
3761 | 3813 |
3762 | 3814 |
3763 void Float32x4SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3815 void Float32x4SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3764 XmmRegister value = locs()->out(0).fpu_reg(); | 3816 XmmRegister value = locs()->out(0).fpu_reg(); |
3765 ASSERT(locs()->in(0).fpu_reg() == locs()->out(0).fpu_reg()); | 3817 ASSERT(locs()->in(0).fpu_reg() == locs()->out(0).fpu_reg()); |
3766 // Convert to Float32. | 3818 // Convert to Float32. |
3767 __ cvtsd2ss(value, value); | 3819 __ cvtsd2ss(value, value); |
3768 // Splat across all lanes. | 3820 // Splat across all lanes. |
3769 __ shufps(value, value, Immediate(0x00)); | 3821 __ shufps(value, value, Immediate(0x00)); |
3770 } | 3822 } |
3771 | 3823 |
3772 | 3824 |
3773 LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(bool opt) const { | 3825 LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(Isolate* isolate, |
| 3826 bool opt) const { |
3774 const intptr_t kNumInputs = 2; | 3827 const intptr_t kNumInputs = 2; |
3775 const intptr_t kNumTemps = 0; | 3828 const intptr_t kNumTemps = 0; |
3776 LocationSummary* summary = | 3829 LocationSummary* summary = new(isolate) LocationSummary( |
3777 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3830 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3778 summary->set_in(0, Location::RequiresFpuRegister()); | 3831 summary->set_in(0, Location::RequiresFpuRegister()); |
3779 summary->set_in(1, Location::RequiresFpuRegister()); | 3832 summary->set_in(1, Location::RequiresFpuRegister()); |
3780 summary->set_out(0, Location::SameAsFirstInput()); | 3833 summary->set_out(0, Location::SameAsFirstInput()); |
3781 return summary; | 3834 return summary; |
3782 } | 3835 } |
3783 | 3836 |
3784 | 3837 |
3785 void Float32x4ComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3838 void Float32x4ComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3786 XmmRegister left = locs()->in(0).fpu_reg(); | 3839 XmmRegister left = locs()->in(0).fpu_reg(); |
3787 XmmRegister right = locs()->in(1).fpu_reg(); | 3840 XmmRegister right = locs()->in(1).fpu_reg(); |
(...skipping 18 matching lines...) Expand all Loading... |
3806 break; | 3859 break; |
3807 case MethodRecognizer::kFloat32x4LessThanOrEqual: | 3860 case MethodRecognizer::kFloat32x4LessThanOrEqual: |
3808 __ cmppsle(left, right); | 3861 __ cmppsle(left, right); |
3809 break; | 3862 break; |
3810 | 3863 |
3811 default: UNREACHABLE(); | 3864 default: UNREACHABLE(); |
3812 } | 3865 } |
3813 } | 3866 } |
3814 | 3867 |
3815 | 3868 |
3816 LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(bool opt) const { | 3869 LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(Isolate* isolate, |
| 3870 bool opt) const { |
3817 const intptr_t kNumInputs = 2; | 3871 const intptr_t kNumInputs = 2; |
3818 const intptr_t kNumTemps = 0; | 3872 const intptr_t kNumTemps = 0; |
3819 LocationSummary* summary = | 3873 LocationSummary* summary = new(isolate) LocationSummary( |
3820 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3874 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3821 summary->set_in(0, Location::RequiresFpuRegister()); | 3875 summary->set_in(0, Location::RequiresFpuRegister()); |
3822 summary->set_in(1, Location::RequiresFpuRegister()); | 3876 summary->set_in(1, Location::RequiresFpuRegister()); |
3823 summary->set_out(0, Location::SameAsFirstInput()); | 3877 summary->set_out(0, Location::SameAsFirstInput()); |
3824 return summary; | 3878 return summary; |
3825 } | 3879 } |
3826 | 3880 |
3827 | 3881 |
3828 void Float32x4MinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3882 void Float32x4MinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3829 XmmRegister left = locs()->in(0).fpu_reg(); | 3883 XmmRegister left = locs()->in(0).fpu_reg(); |
3830 XmmRegister right = locs()->in(1).fpu_reg(); | 3884 XmmRegister right = locs()->in(1).fpu_reg(); |
3831 | 3885 |
3832 ASSERT(locs()->out(0).fpu_reg() == left); | 3886 ASSERT(locs()->out(0).fpu_reg() == left); |
3833 | 3887 |
3834 switch (op_kind()) { | 3888 switch (op_kind()) { |
3835 case MethodRecognizer::kFloat32x4Min: | 3889 case MethodRecognizer::kFloat32x4Min: |
3836 __ minps(left, right); | 3890 __ minps(left, right); |
3837 break; | 3891 break; |
3838 case MethodRecognizer::kFloat32x4Max: | 3892 case MethodRecognizer::kFloat32x4Max: |
3839 __ maxps(left, right); | 3893 __ maxps(left, right); |
3840 break; | 3894 break; |
3841 default: UNREACHABLE(); | 3895 default: UNREACHABLE(); |
3842 } | 3896 } |
3843 } | 3897 } |
3844 | 3898 |
3845 | 3899 |
3846 LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(bool opt) const { | 3900 LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(Isolate* isolate, |
| 3901 bool opt) const { |
3847 const intptr_t kNumInputs = 2; | 3902 const intptr_t kNumInputs = 2; |
3848 const intptr_t kNumTemps = 0; | 3903 const intptr_t kNumTemps = 0; |
3849 LocationSummary* summary = | 3904 LocationSummary* summary = new(isolate) LocationSummary( |
3850 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3905 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3851 summary->set_in(0, Location::RequiresFpuRegister()); | 3906 summary->set_in(0, Location::RequiresFpuRegister()); |
3852 summary->set_in(1, Location::RequiresFpuRegister()); | 3907 summary->set_in(1, Location::RequiresFpuRegister()); |
3853 summary->set_out(0, Location::SameAsFirstInput()); | 3908 summary->set_out(0, Location::SameAsFirstInput()); |
3854 return summary; | 3909 return summary; |
3855 } | 3910 } |
3856 | 3911 |
3857 | 3912 |
3858 void Float32x4ScaleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3913 void Float32x4ScaleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3859 XmmRegister left = locs()->in(0).fpu_reg(); | 3914 XmmRegister left = locs()->in(0).fpu_reg(); |
3860 XmmRegister right = locs()->in(1).fpu_reg(); | 3915 XmmRegister right = locs()->in(1).fpu_reg(); |
3861 | 3916 |
3862 ASSERT(locs()->out(0).fpu_reg() == left); | 3917 ASSERT(locs()->out(0).fpu_reg() == left); |
3863 | 3918 |
3864 switch (op_kind()) { | 3919 switch (op_kind()) { |
3865 case MethodRecognizer::kFloat32x4Scale: | 3920 case MethodRecognizer::kFloat32x4Scale: |
3866 __ cvtsd2ss(left, left); | 3921 __ cvtsd2ss(left, left); |
3867 __ shufps(left, left, Immediate(0x00)); | 3922 __ shufps(left, left, Immediate(0x00)); |
3868 __ mulps(left, right); | 3923 __ mulps(left, right); |
3869 break; | 3924 break; |
3870 default: UNREACHABLE(); | 3925 default: UNREACHABLE(); |
3871 } | 3926 } |
3872 } | 3927 } |
3873 | 3928 |
3874 | 3929 |
3875 LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(bool opt) const { | 3930 LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(Isolate* isolate, |
| 3931 bool opt) const { |
3876 const intptr_t kNumInputs = 1; | 3932 const intptr_t kNumInputs = 1; |
3877 const intptr_t kNumTemps = 0; | 3933 const intptr_t kNumTemps = 0; |
3878 LocationSummary* summary = | 3934 LocationSummary* summary = new(isolate) LocationSummary( |
3879 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3935 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3880 summary->set_in(0, Location::RequiresFpuRegister()); | 3936 summary->set_in(0, Location::RequiresFpuRegister()); |
3881 summary->set_out(0, Location::SameAsFirstInput()); | 3937 summary->set_out(0, Location::SameAsFirstInput()); |
3882 return summary; | 3938 return summary; |
3883 } | 3939 } |
3884 | 3940 |
3885 | 3941 |
3886 void Float32x4SqrtInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3942 void Float32x4SqrtInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3887 XmmRegister left = locs()->in(0).fpu_reg(); | 3943 XmmRegister left = locs()->in(0).fpu_reg(); |
3888 | 3944 |
3889 ASSERT(locs()->out(0).fpu_reg() == left); | 3945 ASSERT(locs()->out(0).fpu_reg() == left); |
3890 | 3946 |
3891 switch (op_kind()) { | 3947 switch (op_kind()) { |
3892 case MethodRecognizer::kFloat32x4Sqrt: | 3948 case MethodRecognizer::kFloat32x4Sqrt: |
3893 __ sqrtps(left); | 3949 __ sqrtps(left); |
3894 break; | 3950 break; |
3895 case MethodRecognizer::kFloat32x4Reciprocal: | 3951 case MethodRecognizer::kFloat32x4Reciprocal: |
3896 __ reciprocalps(left); | 3952 __ reciprocalps(left); |
3897 break; | 3953 break; |
3898 case MethodRecognizer::kFloat32x4ReciprocalSqrt: | 3954 case MethodRecognizer::kFloat32x4ReciprocalSqrt: |
3899 __ rsqrtps(left); | 3955 __ rsqrtps(left); |
3900 break; | 3956 break; |
3901 default: UNREACHABLE(); | 3957 default: UNREACHABLE(); |
3902 } | 3958 } |
3903 } | 3959 } |
3904 | 3960 |
3905 | 3961 |
3906 LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(bool opt) const { | 3962 LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(Isolate* isolate, |
| 3963 bool opt) const { |
3907 const intptr_t kNumInputs = 1; | 3964 const intptr_t kNumInputs = 1; |
3908 const intptr_t kNumTemps = 0; | 3965 const intptr_t kNumTemps = 0; |
3909 LocationSummary* summary = | 3966 LocationSummary* summary = new(isolate) LocationSummary( |
3910 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3967 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3911 summary->set_in(0, Location::RequiresFpuRegister()); | 3968 summary->set_in(0, Location::RequiresFpuRegister()); |
3912 summary->set_out(0, Location::SameAsFirstInput()); | 3969 summary->set_out(0, Location::SameAsFirstInput()); |
3913 return summary; | 3970 return summary; |
3914 } | 3971 } |
3915 | 3972 |
3916 | 3973 |
3917 void Float32x4ZeroArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3974 void Float32x4ZeroArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3918 XmmRegister left = locs()->in(0).fpu_reg(); | 3975 XmmRegister left = locs()->in(0).fpu_reg(); |
3919 | 3976 |
3920 ASSERT(locs()->out(0).fpu_reg() == left); | 3977 ASSERT(locs()->out(0).fpu_reg() == left); |
3921 switch (op_kind()) { | 3978 switch (op_kind()) { |
3922 case MethodRecognizer::kFloat32x4Negate: | 3979 case MethodRecognizer::kFloat32x4Negate: |
3923 __ negateps(left); | 3980 __ negateps(left); |
3924 break; | 3981 break; |
3925 case MethodRecognizer::kFloat32x4Absolute: | 3982 case MethodRecognizer::kFloat32x4Absolute: |
3926 __ absps(left); | 3983 __ absps(left); |
3927 break; | 3984 break; |
3928 default: UNREACHABLE(); | 3985 default: UNREACHABLE(); |
3929 } | 3986 } |
3930 } | 3987 } |
3931 | 3988 |
3932 | 3989 |
3933 LocationSummary* Float32x4ClampInstr::MakeLocationSummary(bool opt) const { | 3990 LocationSummary* Float32x4ClampInstr::MakeLocationSummary(Isolate* isolate, |
| 3991 bool opt) const { |
3934 const intptr_t kNumInputs = 3; | 3992 const intptr_t kNumInputs = 3; |
3935 const intptr_t kNumTemps = 0; | 3993 const intptr_t kNumTemps = 0; |
3936 LocationSummary* summary = | 3994 LocationSummary* summary = new(isolate) LocationSummary( |
3937 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3995 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3938 summary->set_in(0, Location::RequiresFpuRegister()); | 3996 summary->set_in(0, Location::RequiresFpuRegister()); |
3939 summary->set_in(1, Location::RequiresFpuRegister()); | 3997 summary->set_in(1, Location::RequiresFpuRegister()); |
3940 summary->set_in(2, Location::RequiresFpuRegister()); | 3998 summary->set_in(2, Location::RequiresFpuRegister()); |
3941 summary->set_out(0, Location::SameAsFirstInput()); | 3999 summary->set_out(0, Location::SameAsFirstInput()); |
3942 return summary; | 4000 return summary; |
3943 } | 4001 } |
3944 | 4002 |
3945 | 4003 |
3946 void Float32x4ClampInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4004 void Float32x4ClampInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3947 XmmRegister left = locs()->in(0).fpu_reg(); | 4005 XmmRegister left = locs()->in(0).fpu_reg(); |
3948 XmmRegister lower = locs()->in(1).fpu_reg(); | 4006 XmmRegister lower = locs()->in(1).fpu_reg(); |
3949 XmmRegister upper = locs()->in(2).fpu_reg(); | 4007 XmmRegister upper = locs()->in(2).fpu_reg(); |
3950 ASSERT(locs()->out(0).fpu_reg() == left); | 4008 ASSERT(locs()->out(0).fpu_reg() == left); |
3951 __ minps(left, upper); | 4009 __ minps(left, upper); |
3952 __ maxps(left, lower); | 4010 __ maxps(left, lower); |
3953 } | 4011 } |
3954 | 4012 |
3955 | 4013 |
3956 LocationSummary* Float32x4WithInstr::MakeLocationSummary(bool opt) const { | 4014 LocationSummary* Float32x4WithInstr::MakeLocationSummary(Isolate* isolate, |
| 4015 bool opt) const { |
3957 const intptr_t kNumInputs = 2; | 4016 const intptr_t kNumInputs = 2; |
3958 const intptr_t kNumTemps = 0; | 4017 const intptr_t kNumTemps = 0; |
3959 LocationSummary* summary = | 4018 LocationSummary* summary = new(isolate) LocationSummary( |
3960 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4019 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3961 summary->set_in(0, Location::RequiresFpuRegister()); | 4020 summary->set_in(0, Location::RequiresFpuRegister()); |
3962 summary->set_in(1, Location::RequiresFpuRegister()); | 4021 summary->set_in(1, Location::RequiresFpuRegister()); |
3963 summary->set_out(0, Location::SameAsFirstInput()); | 4022 summary->set_out(0, Location::SameAsFirstInput()); |
3964 return summary; | 4023 return summary; |
3965 } | 4024 } |
3966 | 4025 |
3967 | 4026 |
3968 void Float32x4WithInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4027 void Float32x4WithInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3969 XmmRegister replacement = locs()->in(0).fpu_reg(); | 4028 XmmRegister replacement = locs()->in(0).fpu_reg(); |
3970 XmmRegister value = locs()->in(1).fpu_reg(); | 4029 XmmRegister value = locs()->in(1).fpu_reg(); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4014 __ movss(Address(RSP, 12), replacement); | 4073 __ movss(Address(RSP, 12), replacement); |
4015 // Move updated value into output register. | 4074 // Move updated value into output register. |
4016 __ movups(replacement, Address(RSP, 0)); | 4075 __ movups(replacement, Address(RSP, 0)); |
4017 __ AddImmediate(RSP, Immediate(16), PP); | 4076 __ AddImmediate(RSP, Immediate(16), PP); |
4018 break; | 4077 break; |
4019 default: UNREACHABLE(); | 4078 default: UNREACHABLE(); |
4020 } | 4079 } |
4021 } | 4080 } |
4022 | 4081 |
4023 | 4082 |
4024 LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(bool opt) const { | 4083 LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(Isolate* isolate, |
| 4084 bool opt) const { |
4025 const intptr_t kNumInputs = 1; | 4085 const intptr_t kNumInputs = 1; |
4026 const intptr_t kNumTemps = 0; | 4086 const intptr_t kNumTemps = 0; |
4027 LocationSummary* summary = | 4087 LocationSummary* summary = new(isolate) LocationSummary( |
4028 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4088 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4029 summary->set_in(0, Location::RequiresFpuRegister()); | 4089 summary->set_in(0, Location::RequiresFpuRegister()); |
4030 summary->set_out(0, Location::SameAsFirstInput()); | 4090 summary->set_out(0, Location::SameAsFirstInput()); |
4031 return summary; | 4091 return summary; |
4032 } | 4092 } |
4033 | 4093 |
4034 | 4094 |
4035 void Float32x4ToInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4095 void Float32x4ToInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4036 // NOP. | 4096 // NOP. |
4037 } | 4097 } |
4038 | 4098 |
4039 | 4099 |
4040 LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(bool opt) const { | 4100 LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(Isolate* isolate, |
| 4101 bool opt) const { |
4041 const intptr_t kNumInputs = 1; | 4102 const intptr_t kNumInputs = 1; |
4042 const intptr_t kNumTemps = 0; | 4103 const intptr_t kNumTemps = 0; |
4043 LocationSummary* summary = | 4104 LocationSummary* summary = new(isolate) LocationSummary( |
4044 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4105 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4045 summary->set_in(0, Location::RequiresFpuRegister()); | 4106 summary->set_in(0, Location::RequiresFpuRegister()); |
4046 summary->set_out(0, Location::SameAsFirstInput()); | 4107 summary->set_out(0, Location::SameAsFirstInput()); |
4047 return summary; | 4108 return summary; |
4048 } | 4109 } |
4049 | 4110 |
4050 | 4111 |
4051 void Simd64x2ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4112 void Simd64x2ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4052 XmmRegister value = locs()->in(0).fpu_reg(); | 4113 XmmRegister value = locs()->in(0).fpu_reg(); |
4053 | 4114 |
4054 ASSERT(locs()->out(0).fpu_reg() == value); | 4115 ASSERT(locs()->out(0).fpu_reg() == value); |
4055 switch (op_kind()) { | 4116 switch (op_kind()) { |
4056 case MethodRecognizer::kFloat64x2GetX: | 4117 case MethodRecognizer::kFloat64x2GetX: |
4057 // nop. | 4118 // nop. |
4058 break; | 4119 break; |
4059 case MethodRecognizer::kFloat64x2GetY: | 4120 case MethodRecognizer::kFloat64x2GetY: |
4060 __ shufpd(value, value, Immediate(0x33)); | 4121 __ shufpd(value, value, Immediate(0x33)); |
4061 break; | 4122 break; |
4062 default: UNREACHABLE(); | 4123 default: UNREACHABLE(); |
4063 } | 4124 } |
4064 } | 4125 } |
4065 | 4126 |
4066 | 4127 |
4067 LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(bool opt) const { | 4128 LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(Isolate* isolate, |
| 4129 bool opt) const { |
4068 const intptr_t kNumInputs = 0; | 4130 const intptr_t kNumInputs = 0; |
4069 const intptr_t kNumTemps = 0; | 4131 const intptr_t kNumTemps = 0; |
4070 LocationSummary* summary = | 4132 LocationSummary* summary = new(isolate) LocationSummary( |
4071 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4133 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4072 summary->set_out(0, Location::RequiresFpuRegister()); | 4134 summary->set_out(0, Location::RequiresFpuRegister()); |
4073 return summary; | 4135 return summary; |
4074 } | 4136 } |
4075 | 4137 |
4076 | 4138 |
4077 void Float64x2ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4139 void Float64x2ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4078 XmmRegister value = locs()->out(0).fpu_reg(); | 4140 XmmRegister value = locs()->out(0).fpu_reg(); |
4079 __ xorpd(value, value); | 4141 __ xorpd(value, value); |
4080 } | 4142 } |
4081 | 4143 |
4082 | 4144 |
4083 LocationSummary* Float64x2SplatInstr::MakeLocationSummary(bool opt) const { | 4145 LocationSummary* Float64x2SplatInstr::MakeLocationSummary(Isolate* isolate, |
| 4146 bool opt) const { |
4084 const intptr_t kNumInputs = 1; | 4147 const intptr_t kNumInputs = 1; |
4085 const intptr_t kNumTemps = 0; | 4148 const intptr_t kNumTemps = 0; |
4086 LocationSummary* summary = | 4149 LocationSummary* summary = new(isolate) LocationSummary( |
4087 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4150 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4088 summary->set_in(0, Location::RequiresFpuRegister()); | 4151 summary->set_in(0, Location::RequiresFpuRegister()); |
4089 summary->set_out(0, Location::SameAsFirstInput()); | 4152 summary->set_out(0, Location::SameAsFirstInput()); |
4090 return summary; | 4153 return summary; |
4091 } | 4154 } |
4092 | 4155 |
4093 | 4156 |
4094 void Float64x2SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4157 void Float64x2SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4095 XmmRegister value = locs()->out(0).fpu_reg(); | 4158 XmmRegister value = locs()->out(0).fpu_reg(); |
4096 __ shufpd(value, value, Immediate(0x0)); | 4159 __ shufpd(value, value, Immediate(0x0)); |
4097 } | 4160 } |
4098 | 4161 |
4099 | 4162 |
4100 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary( | 4163 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary( |
4101 bool opt) const { | 4164 Isolate* isolate, bool opt) const { |
4102 const intptr_t kNumInputs = 2; | 4165 const intptr_t kNumInputs = 2; |
4103 const intptr_t kNumTemps = 0; | 4166 const intptr_t kNumTemps = 0; |
4104 LocationSummary* summary = | 4167 LocationSummary* summary = new(isolate) LocationSummary( |
4105 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4168 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4106 summary->set_in(0, Location::RequiresFpuRegister()); | 4169 summary->set_in(0, Location::RequiresFpuRegister()); |
4107 summary->set_in(1, Location::RequiresFpuRegister()); | 4170 summary->set_in(1, Location::RequiresFpuRegister()); |
4108 summary->set_out(0, Location::SameAsFirstInput()); | 4171 summary->set_out(0, Location::SameAsFirstInput()); |
4109 return summary; | 4172 return summary; |
4110 } | 4173 } |
4111 | 4174 |
4112 | 4175 |
4113 void Float64x2ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4176 void Float64x2ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4114 XmmRegister v0 = locs()->in(0).fpu_reg(); | 4177 XmmRegister v0 = locs()->in(0).fpu_reg(); |
4115 XmmRegister v1 = locs()->in(1).fpu_reg(); | 4178 XmmRegister v1 = locs()->in(1).fpu_reg(); |
4116 ASSERT(v0 == locs()->out(0).fpu_reg()); | 4179 ASSERT(v0 == locs()->out(0).fpu_reg()); |
4117 __ AddImmediate(RSP, Immediate(-16), PP); | 4180 __ AddImmediate(RSP, Immediate(-16), PP); |
4118 __ movsd(Address(RSP, 0), v0); | 4181 __ movsd(Address(RSP, 0), v0); |
4119 __ movsd(Address(RSP, 8), v1); | 4182 __ movsd(Address(RSP, 8), v1); |
4120 __ movups(v0, Address(RSP, 0)); | 4183 __ movups(v0, Address(RSP, 0)); |
4121 __ AddImmediate(RSP, Immediate(16), PP); | 4184 __ AddImmediate(RSP, Immediate(16), PP); |
4122 } | 4185 } |
4123 | 4186 |
4124 | 4187 |
4125 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary( | 4188 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary( |
4126 bool opt) const { | 4189 Isolate* isolate, bool opt) const { |
4127 const intptr_t kNumInputs = 1; | 4190 const intptr_t kNumInputs = 1; |
4128 const intptr_t kNumTemps = 0; | 4191 const intptr_t kNumTemps = 0; |
4129 LocationSummary* summary = | 4192 LocationSummary* summary = new(isolate) LocationSummary( |
4130 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4193 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4131 summary->set_in(0, Location::RequiresFpuRegister()); | 4194 summary->set_in(0, Location::RequiresFpuRegister()); |
4132 summary->set_out(0, Location::SameAsFirstInput()); | 4195 summary->set_out(0, Location::SameAsFirstInput()); |
4133 return summary; | 4196 return summary; |
4134 } | 4197 } |
4135 | 4198 |
4136 | 4199 |
4137 void Float64x2ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4200 void Float64x2ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4138 XmmRegister value = locs()->out(0).fpu_reg(); | 4201 XmmRegister value = locs()->out(0).fpu_reg(); |
4139 __ cvtpd2ps(value, value); | 4202 __ cvtpd2ps(value, value); |
4140 } | 4203 } |
4141 | 4204 |
4142 | 4205 |
4143 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary( | 4206 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary( |
4144 bool opt) const { | 4207 Isolate* isolate, bool opt) const { |
4145 const intptr_t kNumInputs = 1; | 4208 const intptr_t kNumInputs = 1; |
4146 const intptr_t kNumTemps = 0; | 4209 const intptr_t kNumTemps = 0; |
4147 LocationSummary* summary = | 4210 LocationSummary* summary = new(isolate) LocationSummary( |
4148 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4211 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4149 summary->set_in(0, Location::RequiresFpuRegister()); | 4212 summary->set_in(0, Location::RequiresFpuRegister()); |
4150 summary->set_out(0, Location::SameAsFirstInput()); | 4213 summary->set_out(0, Location::SameAsFirstInput()); |
4151 return summary; | 4214 return summary; |
4152 } | 4215 } |
4153 | 4216 |
4154 | 4217 |
4155 void Float32x4ToFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4218 void Float32x4ToFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4156 XmmRegister value = locs()->out(0).fpu_reg(); | 4219 XmmRegister value = locs()->out(0).fpu_reg(); |
4157 __ cvtps2pd(value, value); | 4220 __ cvtps2pd(value, value); |
4158 } | 4221 } |
4159 | 4222 |
4160 | 4223 |
4161 LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(bool opt) const { | 4224 LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(Isolate* isolate, |
| 4225 bool opt) const { |
4162 const intptr_t kNumInputs = 1; | 4226 const intptr_t kNumInputs = 1; |
4163 const intptr_t kNumTemps = 0; | 4227 const intptr_t kNumTemps = 0; |
4164 LocationSummary* summary = | 4228 LocationSummary* summary = new(isolate) LocationSummary( |
4165 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4229 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4166 summary->set_in(0, Location::RequiresFpuRegister()); | 4230 summary->set_in(0, Location::RequiresFpuRegister()); |
4167 if (representation() == kTagged) { | 4231 if (representation() == kTagged) { |
4168 ASSERT(op_kind() == MethodRecognizer::kFloat64x2GetSignMask); | 4232 ASSERT(op_kind() == MethodRecognizer::kFloat64x2GetSignMask); |
4169 summary->set_out(0, Location::RequiresRegister()); | 4233 summary->set_out(0, Location::RequiresRegister()); |
4170 } else { | 4234 } else { |
4171 ASSERT(representation() == kUnboxedFloat64x2); | 4235 ASSERT(representation() == kUnboxedFloat64x2); |
4172 summary->set_out(0, Location::SameAsFirstInput()); | 4236 summary->set_out(0, Location::SameAsFirstInput()); |
4173 } | 4237 } |
4174 return summary; | 4238 return summary; |
4175 } | 4239 } |
(...skipping 17 matching lines...) Expand all Loading... |
4193 break; | 4257 break; |
4194 case MethodRecognizer::kFloat64x2GetSignMask: | 4258 case MethodRecognizer::kFloat64x2GetSignMask: |
4195 __ movmskpd(locs()->out(0).reg(), left); | 4259 __ movmskpd(locs()->out(0).reg(), left); |
4196 __ SmiTag(locs()->out(0).reg()); | 4260 __ SmiTag(locs()->out(0).reg()); |
4197 break; | 4261 break; |
4198 default: UNREACHABLE(); | 4262 default: UNREACHABLE(); |
4199 } | 4263 } |
4200 } | 4264 } |
4201 | 4265 |
4202 | 4266 |
4203 LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(bool opt) const { | 4267 LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(Isolate* isolate, |
| 4268 bool opt) const { |
4204 const intptr_t kNumInputs = 2; | 4269 const intptr_t kNumInputs = 2; |
4205 const intptr_t kNumTemps = 0; | 4270 const intptr_t kNumTemps = 0; |
4206 LocationSummary* summary = | 4271 LocationSummary* summary = new(isolate) LocationSummary( |
4207 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4272 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4208 summary->set_in(0, Location::RequiresFpuRegister()); | 4273 summary->set_in(0, Location::RequiresFpuRegister()); |
4209 summary->set_in(1, Location::RequiresFpuRegister()); | 4274 summary->set_in(1, Location::RequiresFpuRegister()); |
4210 summary->set_out(0, Location::SameAsFirstInput()); | 4275 summary->set_out(0, Location::SameAsFirstInput()); |
4211 return summary; | 4276 return summary; |
4212 } | 4277 } |
4213 | 4278 |
4214 | 4279 |
4215 void Float64x2OneArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4280 void Float64x2OneArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4216 XmmRegister left = locs()->in(0).fpu_reg(); | 4281 XmmRegister left = locs()->in(0).fpu_reg(); |
4217 XmmRegister right = locs()->in(1).fpu_reg(); | 4282 XmmRegister right = locs()->in(1).fpu_reg(); |
(...skipping 29 matching lines...) Expand all Loading... |
4247 break; | 4312 break; |
4248 case MethodRecognizer::kFloat64x2Max: | 4313 case MethodRecognizer::kFloat64x2Max: |
4249 __ maxpd(left, right); | 4314 __ maxpd(left, right); |
4250 break; | 4315 break; |
4251 default: UNREACHABLE(); | 4316 default: UNREACHABLE(); |
4252 } | 4317 } |
4253 } | 4318 } |
4254 | 4319 |
4255 | 4320 |
4256 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary( | 4321 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary( |
4257 bool opt) const { | 4322 Isolate* isolate, bool opt) const { |
4258 const intptr_t kNumInputs = 4; | 4323 const intptr_t kNumInputs = 4; |
4259 const intptr_t kNumTemps = 1; | 4324 const intptr_t kNumTemps = 1; |
4260 LocationSummary* summary = | 4325 LocationSummary* summary = new(isolate) LocationSummary( |
4261 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4326 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4262 summary->set_in(0, Location::RequiresRegister()); | 4327 summary->set_in(0, Location::RequiresRegister()); |
4263 summary->set_in(1, Location::RequiresRegister()); | 4328 summary->set_in(1, Location::RequiresRegister()); |
4264 summary->set_in(2, Location::RequiresRegister()); | 4329 summary->set_in(2, Location::RequiresRegister()); |
4265 summary->set_in(3, Location::RequiresRegister()); | 4330 summary->set_in(3, Location::RequiresRegister()); |
4266 summary->set_temp(0, Location::RequiresRegister()); | 4331 summary->set_temp(0, Location::RequiresRegister()); |
4267 summary->set_out(0, Location::RequiresFpuRegister()); | 4332 summary->set_out(0, Location::RequiresFpuRegister()); |
4268 return summary; | 4333 return summary; |
4269 } | 4334 } |
4270 | 4335 |
4271 | 4336 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4316 __ Bind(&w_false); | 4381 __ Bind(&w_false); |
4317 __ LoadImmediate(temp, Immediate(0x0), PP); | 4382 __ LoadImmediate(temp, Immediate(0x0), PP); |
4318 __ Bind(&w_done); | 4383 __ Bind(&w_done); |
4319 __ movl(Address(RSP, 12), temp); | 4384 __ movl(Address(RSP, 12), temp); |
4320 | 4385 |
4321 __ movups(result, Address(RSP, 0)); | 4386 __ movups(result, Address(RSP, 0)); |
4322 __ AddImmediate(RSP, Immediate(16), PP); | 4387 __ AddImmediate(RSP, Immediate(16), PP); |
4323 } | 4388 } |
4324 | 4389 |
4325 | 4390 |
4326 LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(bool opt) const { | 4391 LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(Isolate* isolate, |
| 4392 bool opt) const { |
4327 const intptr_t kNumInputs = 1; | 4393 const intptr_t kNumInputs = 1; |
4328 const intptr_t kNumTemps = 0; | 4394 const intptr_t kNumTemps = 0; |
4329 LocationSummary* summary = | 4395 LocationSummary* summary = new(isolate) LocationSummary( |
4330 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4396 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4331 summary->set_in(0, Location::RequiresFpuRegister()); | 4397 summary->set_in(0, Location::RequiresFpuRegister()); |
4332 summary->set_out(0, Location::RequiresRegister()); | 4398 summary->set_out(0, Location::RequiresRegister()); |
4333 return summary; | 4399 return summary; |
4334 } | 4400 } |
4335 | 4401 |
4336 | 4402 |
4337 void Int32x4GetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4403 void Int32x4GetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4338 XmmRegister value = locs()->in(0).fpu_reg(); | 4404 XmmRegister value = locs()->in(0).fpu_reg(); |
4339 Register result = locs()->out(0).reg(); | 4405 Register result = locs()->out(0).reg(); |
4340 Label done; | 4406 Label done; |
(...skipping 20 matching lines...) Expand all Loading... |
4361 __ testl(result, result); | 4427 __ testl(result, result); |
4362 __ j(NOT_ZERO, &non_zero, Assembler::kNearJump); | 4428 __ j(NOT_ZERO, &non_zero, Assembler::kNearJump); |
4363 __ LoadObject(result, Bool::False(), PP); | 4429 __ LoadObject(result, Bool::False(), PP); |
4364 __ jmp(&done); | 4430 __ jmp(&done); |
4365 __ Bind(&non_zero); | 4431 __ Bind(&non_zero); |
4366 __ LoadObject(result, Bool::True(), PP); | 4432 __ LoadObject(result, Bool::True(), PP); |
4367 __ Bind(&done); | 4433 __ Bind(&done); |
4368 } | 4434 } |
4369 | 4435 |
4370 | 4436 |
4371 LocationSummary* Int32x4SelectInstr::MakeLocationSummary(bool opt) const { | 4437 LocationSummary* Int32x4SelectInstr::MakeLocationSummary(Isolate* isolate, |
| 4438 bool opt) const { |
4372 const intptr_t kNumInputs = 3; | 4439 const intptr_t kNumInputs = 3; |
4373 const intptr_t kNumTemps = 1; | 4440 const intptr_t kNumTemps = 1; |
4374 LocationSummary* summary = | 4441 LocationSummary* summary = new(isolate) LocationSummary( |
4375 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4442 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4376 summary->set_in(0, Location::RequiresFpuRegister()); | 4443 summary->set_in(0, Location::RequiresFpuRegister()); |
4377 summary->set_in(1, Location::RequiresFpuRegister()); | 4444 summary->set_in(1, Location::RequiresFpuRegister()); |
4378 summary->set_in(2, Location::RequiresFpuRegister()); | 4445 summary->set_in(2, Location::RequiresFpuRegister()); |
4379 summary->set_temp(0, Location::RequiresFpuRegister()); | 4446 summary->set_temp(0, Location::RequiresFpuRegister()); |
4380 summary->set_out(0, Location::SameAsFirstInput()); | 4447 summary->set_out(0, Location::SameAsFirstInput()); |
4381 return summary; | 4448 return summary; |
4382 } | 4449 } |
4383 | 4450 |
4384 | 4451 |
4385 void Int32x4SelectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4452 void Int32x4SelectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4386 XmmRegister mask = locs()->in(0).fpu_reg(); | 4453 XmmRegister mask = locs()->in(0).fpu_reg(); |
4387 XmmRegister trueValue = locs()->in(1).fpu_reg(); | 4454 XmmRegister trueValue = locs()->in(1).fpu_reg(); |
4388 XmmRegister falseValue = locs()->in(2).fpu_reg(); | 4455 XmmRegister falseValue = locs()->in(2).fpu_reg(); |
4389 XmmRegister out = locs()->out(0).fpu_reg(); | 4456 XmmRegister out = locs()->out(0).fpu_reg(); |
4390 XmmRegister temp = locs()->temp(0).fpu_reg(); | 4457 XmmRegister temp = locs()->temp(0).fpu_reg(); |
4391 ASSERT(out == mask); | 4458 ASSERT(out == mask); |
4392 // Copy mask. | 4459 // Copy mask. |
4393 __ movaps(temp, mask); | 4460 __ movaps(temp, mask); |
4394 // Invert it. | 4461 // Invert it. |
4395 __ notps(temp); | 4462 __ notps(temp); |
4396 // mask = mask & trueValue. | 4463 // mask = mask & trueValue. |
4397 __ andps(mask, trueValue); | 4464 __ andps(mask, trueValue); |
4398 // temp = temp & falseValue. | 4465 // temp = temp & falseValue. |
4399 __ andps(temp, falseValue); | 4466 __ andps(temp, falseValue); |
4400 // out = mask | temp. | 4467 // out = mask | temp. |
4401 __ orps(mask, temp); | 4468 __ orps(mask, temp); |
4402 } | 4469 } |
4403 | 4470 |
4404 | 4471 |
4405 LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(bool opt) const { | 4472 LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(Isolate* isolate, |
| 4473 bool opt) const { |
4406 const intptr_t kNumInputs = 2; | 4474 const intptr_t kNumInputs = 2; |
4407 const intptr_t kNumTemps = 1; | 4475 const intptr_t kNumTemps = 1; |
4408 LocationSummary* summary = | 4476 LocationSummary* summary = new(isolate) LocationSummary( |
4409 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4477 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4410 summary->set_in(0, Location::RequiresFpuRegister()); | 4478 summary->set_in(0, Location::RequiresFpuRegister()); |
4411 summary->set_in(1, Location::RequiresRegister()); | 4479 summary->set_in(1, Location::RequiresRegister()); |
4412 summary->set_temp(0, Location::RequiresRegister()); | 4480 summary->set_temp(0, Location::RequiresRegister()); |
4413 summary->set_out(0, Location::SameAsFirstInput()); | 4481 summary->set_out(0, Location::SameAsFirstInput()); |
4414 return summary; | 4482 return summary; |
4415 } | 4483 } |
4416 | 4484 |
4417 | 4485 |
4418 void Int32x4SetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4486 void Int32x4SetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4419 XmmRegister mask = locs()->in(0).fpu_reg(); | 4487 XmmRegister mask = locs()->in(0).fpu_reg(); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4461 break; | 4529 break; |
4462 default: UNREACHABLE(); | 4530 default: UNREACHABLE(); |
4463 } | 4531 } |
4464 __ Bind(&exitPath); | 4532 __ Bind(&exitPath); |
4465 // Copy mask back to register. | 4533 // Copy mask back to register. |
4466 __ movups(mask, Address(RSP, 0)); | 4534 __ movups(mask, Address(RSP, 0)); |
4467 __ AddImmediate(RSP, Immediate(16), PP); | 4535 __ AddImmediate(RSP, Immediate(16), PP); |
4468 } | 4536 } |
4469 | 4537 |
4470 | 4538 |
4471 LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(bool opt) const { | 4539 LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(Isolate* isolate, |
| 4540 bool opt) const { |
4472 const intptr_t kNumInputs = 1; | 4541 const intptr_t kNumInputs = 1; |
4473 const intptr_t kNumTemps = 0; | 4542 const intptr_t kNumTemps = 0; |
4474 LocationSummary* summary = | 4543 LocationSummary* summary = new(isolate) LocationSummary( |
4475 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4544 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4476 summary->set_in(0, Location::RequiresFpuRegister()); | 4545 summary->set_in(0, Location::RequiresFpuRegister()); |
4477 summary->set_out(0, Location::SameAsFirstInput()); | 4546 summary->set_out(0, Location::SameAsFirstInput()); |
4478 return summary; | 4547 return summary; |
4479 } | 4548 } |
4480 | 4549 |
4481 | 4550 |
4482 void Int32x4ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4551 void Int32x4ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4483 // NOP. | 4552 // NOP. |
4484 } | 4553 } |
4485 | 4554 |
4486 | 4555 |
4487 LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(bool opt) const { | 4556 LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(Isolate* isolate, |
| 4557 bool opt) const { |
4488 const intptr_t kNumInputs = 2; | 4558 const intptr_t kNumInputs = 2; |
4489 const intptr_t kNumTemps = 0; | 4559 const intptr_t kNumTemps = 0; |
4490 LocationSummary* summary = | 4560 LocationSummary* summary = new(isolate) LocationSummary( |
4491 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4561 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4492 summary->set_in(0, Location::RequiresFpuRegister()); | 4562 summary->set_in(0, Location::RequiresFpuRegister()); |
4493 summary->set_in(1, Location::RequiresFpuRegister()); | 4563 summary->set_in(1, Location::RequiresFpuRegister()); |
4494 summary->set_out(0, Location::SameAsFirstInput()); | 4564 summary->set_out(0, Location::SameAsFirstInput()); |
4495 return summary; | 4565 return summary; |
4496 } | 4566 } |
4497 | 4567 |
4498 | 4568 |
4499 void BinaryInt32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4569 void BinaryInt32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4500 XmmRegister left = locs()->in(0).fpu_reg(); | 4570 XmmRegister left = locs()->in(0).fpu_reg(); |
4501 XmmRegister right = locs()->in(1).fpu_reg(); | 4571 XmmRegister right = locs()->in(1).fpu_reg(); |
(...skipping 15 matching lines...) Expand all Loading... |
4517 __ addpl(left, right); | 4587 __ addpl(left, right); |
4518 break; | 4588 break; |
4519 case Token::kSUB: | 4589 case Token::kSUB: |
4520 __ subpl(left, right); | 4590 __ subpl(left, right); |
4521 break; | 4591 break; |
4522 default: UNREACHABLE(); | 4592 default: UNREACHABLE(); |
4523 } | 4593 } |
4524 } | 4594 } |
4525 | 4595 |
4526 | 4596 |
4527 LocationSummary* MathUnaryInstr::MakeLocationSummary(bool opt) const { | 4597 LocationSummary* MathUnaryInstr::MakeLocationSummary(Isolate* isolate, |
| 4598 bool opt) const { |
4528 if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) { | 4599 if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) { |
4529 // Calling convention on x64 uses XMM0 and XMM1 to pass the first two | 4600 // Calling convention on x64 uses XMM0 and XMM1 to pass the first two |
4530 // double arguments and XMM0 to return the result. Unfortunately | 4601 // double arguments and XMM0 to return the result. Unfortunately |
4531 // currently we can't specify these registers because ParallelMoveResolver | 4602 // currently we can't specify these registers because ParallelMoveResolver |
4532 // assumes that XMM0 is free at all times. | 4603 // assumes that XMM0 is free at all times. |
4533 // TODO(vegorov): allow XMM0 to be used. | 4604 // TODO(vegorov): allow XMM0 to be used. |
4534 const intptr_t kNumTemps = 1; | 4605 const intptr_t kNumTemps = 1; |
4535 LocationSummary* summary = | 4606 LocationSummary* summary = new(isolate) LocationSummary( |
4536 new LocationSummary(InputCount(), kNumTemps, LocationSummary::kCall); | 4607 isolate, InputCount(), kNumTemps, LocationSummary::kCall); |
4537 summary->set_in(0, Location::FpuRegisterLocation(XMM1)); | 4608 summary->set_in(0, Location::FpuRegisterLocation(XMM1)); |
4538 // R13 is chosen because it is callee saved so we do not need to back it | 4609 // R13 is chosen because it is callee saved so we do not need to back it |
4539 // up before calling into the runtime. | 4610 // up before calling into the runtime. |
4540 summary->set_temp(0, Location::RegisterLocation(R13)); | 4611 summary->set_temp(0, Location::RegisterLocation(R13)); |
4541 summary->set_out(0, Location::FpuRegisterLocation(XMM1)); | 4612 summary->set_out(0, Location::FpuRegisterLocation(XMM1)); |
4542 return summary; | 4613 return summary; |
4543 } | 4614 } |
4544 ASSERT((kind() == MathUnaryInstr::kSqrt) || | 4615 ASSERT((kind() == MathUnaryInstr::kSqrt) || |
4545 (kind() == MathUnaryInstr::kDoubleSquare)); | 4616 (kind() == MathUnaryInstr::kDoubleSquare)); |
4546 const intptr_t kNumInputs = 1; | 4617 const intptr_t kNumInputs = 1; |
4547 const intptr_t kNumTemps = 0; | 4618 const intptr_t kNumTemps = 0; |
4548 LocationSummary* summary = | 4619 LocationSummary* summary = new(isolate) LocationSummary( |
4549 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4620 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4550 summary->set_in(0, Location::RequiresFpuRegister()); | 4621 summary->set_in(0, Location::RequiresFpuRegister()); |
4551 if (kind() == MathUnaryInstr::kDoubleSquare) { | 4622 if (kind() == MathUnaryInstr::kDoubleSquare) { |
4552 summary->set_out(0, Location::SameAsFirstInput()); | 4623 summary->set_out(0, Location::SameAsFirstInput()); |
4553 } else { | 4624 } else { |
4554 summary->set_out(0, Location::RequiresFpuRegister()); | 4625 summary->set_out(0, Location::RequiresFpuRegister()); |
4555 } | 4626 } |
4556 return summary; | 4627 return summary; |
4557 } | 4628 } |
4558 | 4629 |
4559 | 4630 |
(...skipping 12 matching lines...) Expand all Loading... |
4572 __ ReserveAlignedFrameSpace(0); | 4643 __ ReserveAlignedFrameSpace(0); |
4573 __ movaps(XMM0, locs()->in(0).fpu_reg()); | 4644 __ movaps(XMM0, locs()->in(0).fpu_reg()); |
4574 __ CallRuntime(TargetFunction(), InputCount()); | 4645 __ CallRuntime(TargetFunction(), InputCount()); |
4575 __ movaps(locs()->out(0).fpu_reg(), XMM0); | 4646 __ movaps(locs()->out(0).fpu_reg(), XMM0); |
4576 // Restore RSP. | 4647 // Restore RSP. |
4577 __ movq(RSP, locs()->temp(0).reg()); | 4648 __ movq(RSP, locs()->temp(0).reg()); |
4578 } | 4649 } |
4579 } | 4650 } |
4580 | 4651 |
4581 | 4652 |
4582 LocationSummary* UnarySmiOpInstr::MakeLocationSummary(bool opt) const { | 4653 LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Isolate* isolate, |
| 4654 bool opt) const { |
4583 const intptr_t kNumInputs = 1; | 4655 const intptr_t kNumInputs = 1; |
4584 return LocationSummary::Make(kNumInputs, | 4656 return LocationSummary::Make(kNumInputs, |
4585 Location::SameAsFirstInput(), | 4657 Location::SameAsFirstInput(), |
4586 LocationSummary::kNoCall); | 4658 LocationSummary::kNoCall); |
4587 } | 4659 } |
4588 | 4660 |
4589 | 4661 |
4590 void UnarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4662 void UnarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4591 Register value = locs()->in(0).reg(); | 4663 Register value = locs()->in(0).reg(); |
4592 ASSERT(value == locs()->out(0).reg()); | 4664 ASSERT(value == locs()->out(0).reg()); |
(...skipping 11 matching lines...) Expand all Loading... |
4604 __ notq(value); | 4676 __ notq(value); |
4605 // Remove inverted smi-tag. | 4677 // Remove inverted smi-tag. |
4606 __ AndImmediate(value, Immediate(~kSmiTagMask), PP); | 4678 __ AndImmediate(value, Immediate(~kSmiTagMask), PP); |
4607 break; | 4679 break; |
4608 default: | 4680 default: |
4609 UNREACHABLE(); | 4681 UNREACHABLE(); |
4610 } | 4682 } |
4611 } | 4683 } |
4612 | 4684 |
4613 | 4685 |
4614 LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(bool opt) const { | 4686 LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate, |
| 4687 bool opt) const { |
4615 const intptr_t kNumInputs = 1; | 4688 const intptr_t kNumInputs = 1; |
4616 const intptr_t kNumTemps = 0; | 4689 const intptr_t kNumTemps = 0; |
4617 LocationSummary* summary = | 4690 LocationSummary* summary = new(isolate) LocationSummary( |
4618 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4691 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4619 summary->set_in(0, Location::RequiresFpuRegister()); | 4692 summary->set_in(0, Location::RequiresFpuRegister()); |
4620 summary->set_out(0, Location::SameAsFirstInput()); | 4693 summary->set_out(0, Location::SameAsFirstInput()); |
4621 return summary; | 4694 return summary; |
4622 } | 4695 } |
4623 | 4696 |
4624 | 4697 |
4625 void UnaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4698 void UnaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4626 XmmRegister value = locs()->in(0).fpu_reg(); | 4699 XmmRegister value = locs()->in(0).fpu_reg(); |
4627 ASSERT(locs()->out(0).fpu_reg() == value); | 4700 ASSERT(locs()->out(0).fpu_reg() == value); |
4628 __ DoubleNegate(value); | 4701 __ DoubleNegate(value); |
4629 } | 4702 } |
4630 | 4703 |
4631 | 4704 |
4632 LocationSummary* MathMinMaxInstr::MakeLocationSummary(bool opt) const { | 4705 LocationSummary* MathMinMaxInstr::MakeLocationSummary(Isolate* isolate, |
| 4706 bool opt) const { |
4633 if (result_cid() == kDoubleCid) { | 4707 if (result_cid() == kDoubleCid) { |
4634 const intptr_t kNumInputs = 2; | 4708 const intptr_t kNumInputs = 2; |
4635 const intptr_t kNumTemps = 1; | 4709 const intptr_t kNumTemps = 1; |
4636 LocationSummary* summary = | 4710 LocationSummary* summary = new(isolate) LocationSummary( |
4637 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4711 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4638 summary->set_in(0, Location::RequiresFpuRegister()); | 4712 summary->set_in(0, Location::RequiresFpuRegister()); |
4639 summary->set_in(1, Location::RequiresFpuRegister()); | 4713 summary->set_in(1, Location::RequiresFpuRegister()); |
4640 // Reuse the left register so that code can be made shorter. | 4714 // Reuse the left register so that code can be made shorter. |
4641 summary->set_out(0, Location::SameAsFirstInput()); | 4715 summary->set_out(0, Location::SameAsFirstInput()); |
4642 summary->set_temp(0, Location::RequiresRegister()); | 4716 summary->set_temp(0, Location::RequiresRegister()); |
4643 return summary; | 4717 return summary; |
4644 } | 4718 } |
4645 ASSERT(result_cid() == kSmiCid); | 4719 ASSERT(result_cid() == kSmiCid); |
4646 const intptr_t kNumInputs = 2; | 4720 const intptr_t kNumInputs = 2; |
4647 const intptr_t kNumTemps = 0; | 4721 const intptr_t kNumTemps = 0; |
4648 LocationSummary* summary = | 4722 LocationSummary* summary = new(isolate) LocationSummary( |
4649 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4723 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4650 summary->set_in(0, Location::RequiresRegister()); | 4724 summary->set_in(0, Location::RequiresRegister()); |
4651 summary->set_in(1, Location::RequiresRegister()); | 4725 summary->set_in(1, Location::RequiresRegister()); |
4652 // Reuse the left register so that code can be made shorter. | 4726 // Reuse the left register so that code can be made shorter. |
4653 summary->set_out(0, Location::SameAsFirstInput()); | 4727 summary->set_out(0, Location::SameAsFirstInput()); |
4654 return summary; | 4728 return summary; |
4655 } | 4729 } |
4656 | 4730 |
4657 | 4731 |
4658 void MathMinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4732 void MathMinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4659 ASSERT((op_kind() == MethodRecognizer::kMathMin) || | 4733 ASSERT((op_kind() == MethodRecognizer::kMathMin) || |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4711 __ cmpq(left, right); | 4785 __ cmpq(left, right); |
4712 ASSERT(result == left); | 4786 ASSERT(result == left); |
4713 if (is_min) { | 4787 if (is_min) { |
4714 __ cmovgeq(result, right); | 4788 __ cmovgeq(result, right); |
4715 } else { | 4789 } else { |
4716 __ cmovlessq(result, right); | 4790 __ cmovlessq(result, right); |
4717 } | 4791 } |
4718 } | 4792 } |
4719 | 4793 |
4720 | 4794 |
4721 LocationSummary* SmiToDoubleInstr::MakeLocationSummary(bool opt) const { | 4795 LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Isolate* isolate, |
| 4796 bool opt) const { |
4722 const intptr_t kNumInputs = 1; | 4797 const intptr_t kNumInputs = 1; |
4723 const intptr_t kNumTemps = 0; | 4798 const intptr_t kNumTemps = 0; |
4724 LocationSummary* result = | 4799 LocationSummary* result = new(isolate) LocationSummary( |
4725 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4800 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4726 result->set_in(0, Location::WritableRegister()); | 4801 result->set_in(0, Location::WritableRegister()); |
4727 result->set_out(0, Location::RequiresFpuRegister()); | 4802 result->set_out(0, Location::RequiresFpuRegister()); |
4728 return result; | 4803 return result; |
4729 } | 4804 } |
4730 | 4805 |
4731 | 4806 |
4732 void SmiToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4807 void SmiToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4733 Register value = locs()->in(0).reg(); | 4808 Register value = locs()->in(0).reg(); |
4734 FpuRegister result = locs()->out(0).fpu_reg(); | 4809 FpuRegister result = locs()->out(0).fpu_reg(); |
4735 __ SmiUntag(value); | 4810 __ SmiUntag(value); |
4736 __ cvtsi2sd(result, value); | 4811 __ cvtsi2sd(result, value); |
4737 } | 4812 } |
4738 | 4813 |
4739 | 4814 |
4740 LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(bool opt) const { | 4815 LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Isolate* isolate, |
| 4816 bool opt) const { |
4741 const intptr_t kNumInputs = 1; | 4817 const intptr_t kNumInputs = 1; |
4742 const intptr_t kNumTemps = 1; | 4818 const intptr_t kNumTemps = 1; |
4743 LocationSummary* result = | 4819 LocationSummary* result = new(isolate) LocationSummary( |
4744 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 4820 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
4745 result->set_in(0, Location::RegisterLocation(RCX)); | 4821 result->set_in(0, Location::RegisterLocation(RCX)); |
4746 result->set_out(0, Location::RegisterLocation(RAX)); | 4822 result->set_out(0, Location::RegisterLocation(RAX)); |
4747 result->set_temp(0, Location::RegisterLocation(RBX)); | 4823 result->set_temp(0, Location::RegisterLocation(RBX)); |
4748 return result; | 4824 return result; |
4749 } | 4825 } |
4750 | 4826 |
4751 | 4827 |
4752 void DoubleToIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4828 void DoubleToIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4753 Register result = locs()->out(0).reg(); | 4829 Register result = locs()->out(0).reg(); |
4754 Register value_obj = locs()->in(0).reg(); | 4830 Register value_obj = locs()->in(0).reg(); |
(...skipping 26 matching lines...) Expand all Loading... |
4781 compiler->GenerateStaticCall(deopt_id(), | 4857 compiler->GenerateStaticCall(deopt_id(), |
4782 instance_call()->token_pos(), | 4858 instance_call()->token_pos(), |
4783 target, | 4859 target, |
4784 kNumberOfArguments, | 4860 kNumberOfArguments, |
4785 Object::null_array(), // No argument names. | 4861 Object::null_array(), // No argument names. |
4786 locs()); | 4862 locs()); |
4787 __ Bind(&done); | 4863 __ Bind(&done); |
4788 } | 4864 } |
4789 | 4865 |
4790 | 4866 |
4791 LocationSummary* DoubleToSmiInstr::MakeLocationSummary(bool opt) const { | 4867 LocationSummary* DoubleToSmiInstr::MakeLocationSummary(Isolate* isolate, |
| 4868 bool opt) const { |
4792 const intptr_t kNumInputs = 1; | 4869 const intptr_t kNumInputs = 1; |
4793 const intptr_t kNumTemps = 1; | 4870 const intptr_t kNumTemps = 1; |
4794 LocationSummary* result = new LocationSummary( | 4871 LocationSummary* result = new(isolate) LocationSummary( |
4795 kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4872 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4796 result->set_in(0, Location::RequiresFpuRegister()); | 4873 result->set_in(0, Location::RequiresFpuRegister()); |
4797 result->set_out(0, Location:: Location::RequiresRegister()); | 4874 result->set_out(0, Location:: Location::RequiresRegister()); |
4798 result->set_temp(0, Location::RequiresRegister()); | 4875 result->set_temp(0, Location::RequiresRegister()); |
4799 return result; | 4876 return result; |
4800 } | 4877 } |
4801 | 4878 |
4802 | 4879 |
4803 void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4880 void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4804 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi); | 4881 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi); |
4805 Register result = locs()->out(0).reg(); | 4882 Register result = locs()->out(0).reg(); |
4806 XmmRegister value = locs()->in(0).fpu_reg(); | 4883 XmmRegister value = locs()->in(0).fpu_reg(); |
4807 Register temp = locs()->temp(0).reg(); | 4884 Register temp = locs()->temp(0).reg(); |
4808 | 4885 |
4809 __ cvttsd2siq(result, value); | 4886 __ cvttsd2siq(result, value); |
4810 // Overflow is signalled with minint. | 4887 // Overflow is signalled with minint. |
4811 Label do_call, done; | 4888 Label do_call, done; |
4812 // Check for overflow and that it fits into Smi. | 4889 // Check for overflow and that it fits into Smi. |
4813 __ movq(temp, result); | 4890 __ movq(temp, result); |
4814 __ shlq(temp, Immediate(1)); | 4891 __ shlq(temp, Immediate(1)); |
4815 __ j(OVERFLOW, deopt); | 4892 __ j(OVERFLOW, deopt); |
4816 __ SmiTag(result); | 4893 __ SmiTag(result); |
4817 if (FLAG_throw_on_javascript_int_overflow) { | 4894 if (FLAG_throw_on_javascript_int_overflow) { |
4818 EmitJavascriptOverflowCheck(compiler, range(), deopt, result); | 4895 EmitJavascriptOverflowCheck(compiler, range(), deopt, result); |
4819 } | 4896 } |
4820 } | 4897 } |
4821 | 4898 |
4822 | 4899 |
4823 LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(bool opt) const { | 4900 LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(Isolate* isolate, |
| 4901 bool opt) const { |
4824 const intptr_t kNumInputs = 1; | 4902 const intptr_t kNumInputs = 1; |
4825 const intptr_t kNumTemps = 0; | 4903 const intptr_t kNumTemps = 0; |
4826 LocationSummary* result = | 4904 LocationSummary* result = new(isolate) LocationSummary( |
4827 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4905 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4828 result->set_in(0, Location::RequiresFpuRegister()); | 4906 result->set_in(0, Location::RequiresFpuRegister()); |
4829 result->set_out(0, Location::RequiresFpuRegister()); | 4907 result->set_out(0, Location::RequiresFpuRegister()); |
4830 return result; | 4908 return result; |
4831 } | 4909 } |
4832 | 4910 |
4833 | 4911 |
4834 void DoubleToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4912 void DoubleToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4835 XmmRegister value = locs()->in(0).fpu_reg(); | 4913 XmmRegister value = locs()->in(0).fpu_reg(); |
4836 XmmRegister result = locs()->out(0).fpu_reg(); | 4914 XmmRegister result = locs()->out(0).fpu_reg(); |
4837 switch (recognized_kind()) { | 4915 switch (recognized_kind()) { |
4838 case MethodRecognizer::kDoubleTruncate: | 4916 case MethodRecognizer::kDoubleTruncate: |
4839 __ roundsd(result, value, Assembler::kRoundToZero); | 4917 __ roundsd(result, value, Assembler::kRoundToZero); |
4840 break; | 4918 break; |
4841 case MethodRecognizer::kDoubleFloor: | 4919 case MethodRecognizer::kDoubleFloor: |
4842 __ roundsd(result, value, Assembler::kRoundDown); | 4920 __ roundsd(result, value, Assembler::kRoundDown); |
4843 break; | 4921 break; |
4844 case MethodRecognizer::kDoubleCeil: | 4922 case MethodRecognizer::kDoubleCeil: |
4845 __ roundsd(result, value, Assembler::kRoundUp); | 4923 __ roundsd(result, value, Assembler::kRoundUp); |
4846 break; | 4924 break; |
4847 default: | 4925 default: |
4848 UNREACHABLE(); | 4926 UNREACHABLE(); |
4849 } | 4927 } |
4850 } | 4928 } |
4851 | 4929 |
4852 | 4930 |
4853 LocationSummary* DoubleToFloatInstr::MakeLocationSummary(bool opt) const { | 4931 LocationSummary* DoubleToFloatInstr::MakeLocationSummary(Isolate* isolate, |
| 4932 bool opt) const { |
4854 const intptr_t kNumInputs = 1; | 4933 const intptr_t kNumInputs = 1; |
4855 const intptr_t kNumTemps = 0; | 4934 const intptr_t kNumTemps = 0; |
4856 LocationSummary* result = | 4935 LocationSummary* result = new(isolate) LocationSummary( |
4857 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4936 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4858 result->set_in(0, Location::RequiresFpuRegister()); | 4937 result->set_in(0, Location::RequiresFpuRegister()); |
4859 result->set_out(0, Location::SameAsFirstInput()); | 4938 result->set_out(0, Location::SameAsFirstInput()); |
4860 return result; | 4939 return result; |
4861 } | 4940 } |
4862 | 4941 |
4863 | 4942 |
4864 void DoubleToFloatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4943 void DoubleToFloatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4865 __ cvtsd2ss(locs()->out(0).fpu_reg(), locs()->in(0).fpu_reg()); | 4944 __ cvtsd2ss(locs()->out(0).fpu_reg(), locs()->in(0).fpu_reg()); |
4866 } | 4945 } |
4867 | 4946 |
4868 | 4947 |
4869 LocationSummary* FloatToDoubleInstr::MakeLocationSummary(bool opt) const { | 4948 LocationSummary* FloatToDoubleInstr::MakeLocationSummary(Isolate* isolate, |
| 4949 bool opt) const { |
4870 const intptr_t kNumInputs = 1; | 4950 const intptr_t kNumInputs = 1; |
4871 const intptr_t kNumTemps = 0; | 4951 const intptr_t kNumTemps = 0; |
4872 LocationSummary* result = | 4952 LocationSummary* result = new(isolate) LocationSummary( |
4873 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4953 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4874 result->set_in(0, Location::RequiresFpuRegister()); | 4954 result->set_in(0, Location::RequiresFpuRegister()); |
4875 result->set_out(0, Location::SameAsFirstInput()); | 4955 result->set_out(0, Location::SameAsFirstInput()); |
4876 return result; | 4956 return result; |
4877 } | 4957 } |
4878 | 4958 |
4879 | 4959 |
4880 void FloatToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4960 void FloatToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4881 __ cvtss2sd(locs()->out(0).fpu_reg(), locs()->in(0).fpu_reg()); | 4961 __ cvtss2sd(locs()->out(0).fpu_reg(), locs()->in(0).fpu_reg()); |
4882 } | 4962 } |
4883 | 4963 |
4884 | 4964 |
4885 LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(bool opt) const { | 4965 LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(Isolate* isolate, |
| 4966 bool opt) const { |
4886 // Calling convention on x64 uses XMM0 and XMM1 to pass the first two | 4967 // Calling convention on x64 uses XMM0 and XMM1 to pass the first two |
4887 // double arguments and XMM0 to return the result. Unfortunately | 4968 // double arguments and XMM0 to return the result. Unfortunately |
4888 // currently we can't specify these registers because ParallelMoveResolver | 4969 // currently we can't specify these registers because ParallelMoveResolver |
4889 // assumes that XMM0 is free at all times. | 4970 // assumes that XMM0 is free at all times. |
4890 // TODO(vegorov): allow XMM0 to be used. | 4971 // TODO(vegorov): allow XMM0 to be used. |
4891 ASSERT((InputCount() == 1) || (InputCount() == 2)); | 4972 ASSERT((InputCount() == 1) || (InputCount() == 2)); |
4892 const intptr_t kNumTemps = 1; | 4973 const intptr_t kNumTemps = 1; |
4893 LocationSummary* result = | 4974 LocationSummary* result = new(isolate) LocationSummary( |
4894 new LocationSummary(InputCount(), kNumTemps, LocationSummary::kCall); | 4975 isolate, InputCount(), kNumTemps, LocationSummary::kCall); |
4895 result->set_temp(0, Location::RegisterLocation(R13)); | 4976 result->set_temp(0, Location::RegisterLocation(R13)); |
4896 result->set_in(0, Location::FpuRegisterLocation(XMM2)); | 4977 result->set_in(0, Location::FpuRegisterLocation(XMM2)); |
4897 if (InputCount() == 2) { | 4978 if (InputCount() == 2) { |
4898 result->set_in(1, Location::FpuRegisterLocation(XMM1)); | 4979 result->set_in(1, Location::FpuRegisterLocation(XMM1)); |
4899 } | 4980 } |
4900 if (recognized_kind() == MethodRecognizer::kMathDoublePow) { | 4981 if (recognized_kind() == MethodRecognizer::kMathDoublePow) { |
4901 // Temp index 1. | 4982 // Temp index 1. |
4902 result->AddTemp(Location::RegisterLocation(RAX)); | 4983 result->AddTemp(Location::RegisterLocation(RAX)); |
4903 // Temp index 2. | 4984 // Temp index 2. |
4904 result->AddTemp(Location::FpuRegisterLocation(XMM4)); | 4985 result->AddTemp(Location::FpuRegisterLocation(XMM4)); |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5056 ASSERT(locs()->in(1).fpu_reg() == XMM1); | 5137 ASSERT(locs()->in(1).fpu_reg() == XMM1); |
5057 } | 5138 } |
5058 | 5139 |
5059 __ CallRuntime(TargetFunction(), InputCount()); | 5140 __ CallRuntime(TargetFunction(), InputCount()); |
5060 __ movaps(locs()->out(0).fpu_reg(), XMM0); | 5141 __ movaps(locs()->out(0).fpu_reg(), XMM0); |
5061 // Restore RSP. | 5142 // Restore RSP. |
5062 __ movq(RSP, locs()->temp(kSavedSpTempIndex).reg()); | 5143 __ movq(RSP, locs()->temp(kSavedSpTempIndex).reg()); |
5063 } | 5144 } |
5064 | 5145 |
5065 | 5146 |
5066 LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(bool opt) const { | 5147 LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(Isolate* isolate, |
| 5148 bool opt) const { |
5067 // Only use this instruction in optimized code. | 5149 // Only use this instruction in optimized code. |
5068 ASSERT(opt); | 5150 ASSERT(opt); |
5069 const intptr_t kNumInputs = 1; | 5151 const intptr_t kNumInputs = 1; |
5070 LocationSummary* summary = | 5152 LocationSummary* summary = new(isolate) LocationSummary( |
5071 new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall); | 5153 isolate, kNumInputs, 0, LocationSummary::kNoCall); |
5072 if (representation() == kUnboxedDouble) { | 5154 if (representation() == kUnboxedDouble) { |
5073 if (index() == 0) { | 5155 if (index() == 0) { |
5074 summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(), | 5156 summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(), |
5075 Location::Any())); | 5157 Location::Any())); |
5076 } else { | 5158 } else { |
5077 ASSERT(index() == 1); | 5159 ASSERT(index() == 1); |
5078 summary->set_in(0, Location::Pair(Location::Any(), | 5160 summary->set_in(0, Location::Pair(Location::Any(), |
5079 Location::RequiresFpuRegister())); | 5161 Location::RequiresFpuRegister())); |
5080 } | 5162 } |
5081 summary->set_out(0, Location::RequiresFpuRegister()); | 5163 summary->set_out(0, Location::RequiresFpuRegister()); |
(...skipping 23 matching lines...) Expand all Loading... |
5105 __ movaps(out, in); | 5187 __ movaps(out, in); |
5106 } else { | 5188 } else { |
5107 ASSERT(representation() == kTagged); | 5189 ASSERT(representation() == kTagged); |
5108 Register out = locs()->out(0).reg(); | 5190 Register out = locs()->out(0).reg(); |
5109 Register in = in_loc.reg(); | 5191 Register in = in_loc.reg(); |
5110 __ movq(out, in); | 5192 __ movq(out, in); |
5111 } | 5193 } |
5112 } | 5194 } |
5113 | 5195 |
5114 | 5196 |
5115 LocationSummary* MergedMathInstr::MakeLocationSummary(bool opt) const { | 5197 LocationSummary* MergedMathInstr::MakeLocationSummary(Isolate* isolate, |
| 5198 bool opt) const { |
5116 if (kind() == MergedMathInstr::kTruncDivMod) { | 5199 if (kind() == MergedMathInstr::kTruncDivMod) { |
5117 const intptr_t kNumInputs = 2; | 5200 const intptr_t kNumInputs = 2; |
5118 const intptr_t kNumTemps = 0; | 5201 const intptr_t kNumTemps = 0; |
5119 LocationSummary* summary = | 5202 LocationSummary* summary = new(isolate) LocationSummary( |
5120 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 5203 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
5121 // Both inputs must be writable because they will be untagged. | 5204 // Both inputs must be writable because they will be untagged. |
5122 summary->set_in(0, Location::RegisterLocation(RAX)); | 5205 summary->set_in(0, Location::RegisterLocation(RAX)); |
5123 summary->set_in(1, Location::WritableRegister()); | 5206 summary->set_in(1, Location::WritableRegister()); |
5124 summary->set_out(0, Location::Pair(Location::RegisterLocation(RAX), | 5207 summary->set_out(0, Location::Pair(Location::RegisterLocation(RAX), |
5125 Location::RegisterLocation(RDX))); | 5208 Location::RegisterLocation(RDX))); |
5126 return summary; | 5209 return summary; |
5127 } | 5210 } |
5128 if (kind() == MergedMathInstr::kSinCos) { | 5211 if (kind() == MergedMathInstr::kSinCos) { |
5129 const intptr_t kNumInputs = 1; | 5212 const intptr_t kNumInputs = 1; |
5130 const intptr_t kNumTemps = 1; | 5213 const intptr_t kNumTemps = 1; |
5131 LocationSummary* summary = | 5214 LocationSummary* summary = new(isolate) LocationSummary( |
5132 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 5215 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
5133 // Because we always call into the runtime (LocationSummary::kCall) we | 5216 // Because we always call into the runtime (LocationSummary::kCall) we |
5134 // must specify each input, temp, and output register explicitly. | 5217 // must specify each input, temp, and output register explicitly. |
5135 summary->set_in(0, Location::FpuRegisterLocation(XMM1)); | 5218 summary->set_in(0, Location::FpuRegisterLocation(XMM1)); |
5136 // R13 is chosen because it is callee saved so we do not need to back it | 5219 // R13 is chosen because it is callee saved so we do not need to back it |
5137 // up before calling into the runtime. | 5220 // up before calling into the runtime. |
5138 summary->set_temp(0, Location::RegisterLocation(R13)); | 5221 summary->set_temp(0, Location::RegisterLocation(R13)); |
5139 summary->set_out(0, Location::Pair(Location::FpuRegisterLocation(XMM2), | 5222 summary->set_out(0, Location::Pair(Location::FpuRegisterLocation(XMM2), |
5140 Location::FpuRegisterLocation(XMM3))); | 5223 Location::FpuRegisterLocation(XMM3))); |
5141 return summary; | 5224 return summary; |
5142 } | 5225 } |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5280 // Restore RSP. | 5363 // Restore RSP. |
5281 __ movq(RSP, locs()->temp(0).reg()); | 5364 __ movq(RSP, locs()->temp(0).reg()); |
5282 | 5365 |
5283 return; | 5366 return; |
5284 } | 5367 } |
5285 UNIMPLEMENTED(); | 5368 UNIMPLEMENTED(); |
5286 } | 5369 } |
5287 | 5370 |
5288 | 5371 |
5289 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary( | 5372 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary( |
5290 bool opt) const { | 5373 Isolate* isolate, bool opt) const { |
5291 return MakeCallSummary(); | 5374 return MakeCallSummary(); |
5292 } | 5375 } |
5293 | 5376 |
5294 | 5377 |
5295 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5378 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5296 Label* deopt = compiler->AddDeoptStub( | 5379 Label* deopt = compiler->AddDeoptStub( |
5297 deopt_id(), ICData::kDeoptPolymorphicInstanceCallTestFail); | 5380 deopt_id(), ICData::kDeoptPolymorphicInstanceCallTestFail); |
5298 if (ic_data().NumberOfChecks() == 0) { | 5381 if (ic_data().NumberOfChecks() == 0) { |
5299 __ jmp(deopt); | 5382 __ jmp(deopt); |
5300 return; | 5383 return; |
(...skipping 20 matching lines...) Expand all Loading... |
5321 RDI, // Class id register. | 5404 RDI, // Class id register. |
5322 instance_call()->ArgumentCount(), | 5405 instance_call()->ArgumentCount(), |
5323 instance_call()->argument_names(), | 5406 instance_call()->argument_names(), |
5324 deopt, | 5407 deopt, |
5325 deopt_id(), | 5408 deopt_id(), |
5326 instance_call()->token_pos(), | 5409 instance_call()->token_pos(), |
5327 locs()); | 5410 locs()); |
5328 } | 5411 } |
5329 | 5412 |
5330 | 5413 |
5331 LocationSummary* BranchInstr::MakeLocationSummary(bool opt) const { | 5414 LocationSummary* BranchInstr::MakeLocationSummary(Isolate* isolate, |
5332 comparison()->InitializeLocationSummary(opt); | 5415 bool opt) const { |
| 5416 comparison()->InitializeLocationSummary(isolate, opt); |
5333 // Branches don't produce a result. | 5417 // Branches don't produce a result. |
5334 comparison()->locs()->set_out(0, Location::NoLocation()); | 5418 comparison()->locs()->set_out(0, Location::NoLocation()); |
5335 return comparison()->locs(); | 5419 return comparison()->locs(); |
5336 } | 5420 } |
5337 | 5421 |
5338 | 5422 |
5339 void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5423 void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5340 comparison()->EmitBranchCode(compiler, this); | 5424 comparison()->EmitBranchCode(compiler, this); |
5341 } | 5425 } |
5342 | 5426 |
5343 | 5427 |
5344 LocationSummary* CheckClassInstr::MakeLocationSummary(bool opt) const { | 5428 LocationSummary* CheckClassInstr::MakeLocationSummary(Isolate* isolate, |
| 5429 bool opt) const { |
5345 const intptr_t kNumInputs = 1; | 5430 const intptr_t kNumInputs = 1; |
5346 const intptr_t kNumTemps = 0; | 5431 const intptr_t kNumTemps = 0; |
5347 LocationSummary* summary = | 5432 LocationSummary* summary = new(isolate) LocationSummary( |
5348 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 5433 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
5349 summary->set_in(0, Location::RequiresRegister()); | 5434 summary->set_in(0, Location::RequiresRegister()); |
5350 if (!IsNullCheck()) { | 5435 if (!IsNullCheck()) { |
5351 summary->AddTemp(Location::RequiresRegister()); | 5436 summary->AddTemp(Location::RequiresRegister()); |
5352 } | 5437 } |
5353 return summary; | 5438 return summary; |
5354 } | 5439 } |
5355 | 5440 |
5356 | 5441 |
5357 void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5442 void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5358 const ICData::DeoptReasonId deopt_reason = licm_hoisted_ ? | 5443 const ICData::DeoptReasonId deopt_reason = licm_hoisted_ ? |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5393 __ j(EQUAL, &is_ok, Assembler::kNearJump); | 5478 __ j(EQUAL, &is_ok, Assembler::kNearJump); |
5394 } else { | 5479 } else { |
5395 __ j(EQUAL, &is_ok); | 5480 __ j(EQUAL, &is_ok); |
5396 } | 5481 } |
5397 } | 5482 } |
5398 } | 5483 } |
5399 __ Bind(&is_ok); | 5484 __ Bind(&is_ok); |
5400 } | 5485 } |
5401 | 5486 |
5402 | 5487 |
5403 LocationSummary* CheckSmiInstr::MakeLocationSummary(bool opt) const { | 5488 LocationSummary* CheckSmiInstr::MakeLocationSummary(Isolate* isolate, |
| 5489 bool opt) const { |
5404 const intptr_t kNumInputs = 1; | 5490 const intptr_t kNumInputs = 1; |
5405 const intptr_t kNumTemps = 0; | 5491 const intptr_t kNumTemps = 0; |
5406 LocationSummary* summary = | 5492 LocationSummary* summary = new(isolate) LocationSummary( |
5407 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 5493 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
5408 summary->set_in(0, Location::RequiresRegister()); | 5494 summary->set_in(0, Location::RequiresRegister()); |
5409 return summary; | 5495 return summary; |
5410 } | 5496 } |
5411 | 5497 |
5412 | 5498 |
5413 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5499 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5414 Register value = locs()->in(0).reg(); | 5500 Register value = locs()->in(0).reg(); |
5415 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi); | 5501 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi); |
5416 __ testq(value, Immediate(kSmiTagMask)); | 5502 __ testq(value, Immediate(kSmiTagMask)); |
5417 __ j(NOT_ZERO, deopt); | 5503 __ j(NOT_ZERO, deopt); |
5418 } | 5504 } |
5419 | 5505 |
5420 | 5506 |
5421 LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(bool opt) const { | 5507 LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Isolate* isolate, |
| 5508 bool opt) const { |
5422 const intptr_t kNumInputs = 2; | 5509 const intptr_t kNumInputs = 2; |
5423 const intptr_t kNumTemps = 0; | 5510 const intptr_t kNumTemps = 0; |
5424 LocationSummary* locs = | 5511 LocationSummary* locs = new(isolate) LocationSummary( |
5425 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 5512 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
5426 locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length())); | 5513 locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length())); |
5427 locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index())); | 5514 locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index())); |
5428 return locs; | 5515 return locs; |
5429 } | 5516 } |
5430 | 5517 |
5431 | 5518 |
5432 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5519 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5433 Label* deopt = compiler->AddDeoptStub(deopt_id(), | 5520 Label* deopt = compiler->AddDeoptStub(deopt_id(), |
5434 ICData::kDeoptCheckArrayBound); | 5521 ICData::kDeoptCheckArrayBound); |
5435 | 5522 |
(...skipping 24 matching lines...) Expand all Loading... |
5460 __ j(ABOVE_EQUAL, deopt); | 5547 __ j(ABOVE_EQUAL, deopt); |
5461 } else { | 5548 } else { |
5462 Register length = length_loc.reg(); | 5549 Register length = length_loc.reg(); |
5463 Register index = index_loc.reg(); | 5550 Register index = index_loc.reg(); |
5464 __ cmpq(index, length); | 5551 __ cmpq(index, length); |
5465 __ j(ABOVE_EQUAL, deopt); | 5552 __ j(ABOVE_EQUAL, deopt); |
5466 } | 5553 } |
5467 } | 5554 } |
5468 | 5555 |
5469 | 5556 |
5470 LocationSummary* UnboxIntegerInstr::MakeLocationSummary(bool opt) const { | 5557 LocationSummary* UnboxIntegerInstr::MakeLocationSummary(Isolate* isolate, |
| 5558 bool opt) const { |
5471 UNIMPLEMENTED(); | 5559 UNIMPLEMENTED(); |
5472 return NULL; | 5560 return NULL; |
5473 } | 5561 } |
5474 | 5562 |
5475 | 5563 |
5476 void UnboxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5564 void UnboxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5477 UNIMPLEMENTED(); | 5565 UNIMPLEMENTED(); |
5478 } | 5566 } |
5479 | 5567 |
5480 | 5568 |
5481 LocationSummary* BoxIntegerInstr::MakeLocationSummary(bool opt) const { | 5569 LocationSummary* BoxIntegerInstr::MakeLocationSummary(Isolate* isolate, |
| 5570 bool opt) const { |
5482 UNIMPLEMENTED(); | 5571 UNIMPLEMENTED(); |
5483 return NULL; | 5572 return NULL; |
5484 } | 5573 } |
5485 | 5574 |
5486 | 5575 |
5487 void BoxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5576 void BoxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5488 UNIMPLEMENTED(); | 5577 UNIMPLEMENTED(); |
5489 } | 5578 } |
5490 | 5579 |
5491 | 5580 |
5492 LocationSummary* BinaryMintOpInstr::MakeLocationSummary(bool opt) const { | 5581 LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Isolate* isolate, |
| 5582 bool opt) const { |
5493 UNIMPLEMENTED(); | 5583 UNIMPLEMENTED(); |
5494 return NULL; | 5584 return NULL; |
5495 } | 5585 } |
5496 | 5586 |
5497 | 5587 |
5498 void BinaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5588 void BinaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5499 UNIMPLEMENTED(); | 5589 UNIMPLEMENTED(); |
5500 } | 5590 } |
5501 | 5591 |
5502 | 5592 |
5503 LocationSummary* UnaryMintOpInstr::MakeLocationSummary(bool opt) const { | 5593 LocationSummary* UnaryMintOpInstr::MakeLocationSummary(Isolate* isolate, |
| 5594 bool opt) const { |
5504 UNIMPLEMENTED(); | 5595 UNIMPLEMENTED(); |
5505 return NULL; | 5596 return NULL; |
5506 } | 5597 } |
5507 | 5598 |
5508 | 5599 |
5509 void UnaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5600 void UnaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5510 UNIMPLEMENTED(); | 5601 UNIMPLEMENTED(); |
5511 } | 5602 } |
5512 | 5603 |
5513 | 5604 |
5514 LocationSummary* ShiftMintOpInstr::MakeLocationSummary(bool opt) const { | 5605 LocationSummary* ShiftMintOpInstr::MakeLocationSummary(Isolate* isolate, |
| 5606 bool opt) const { |
5515 UNIMPLEMENTED(); | 5607 UNIMPLEMENTED(); |
5516 return NULL; | 5608 return NULL; |
5517 } | 5609 } |
5518 | 5610 |
5519 | 5611 |
5520 void ShiftMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5612 void ShiftMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5521 UNIMPLEMENTED(); | 5613 UNIMPLEMENTED(); |
5522 } | 5614 } |
5523 | 5615 |
5524 | 5616 |
5525 LocationSummary* ThrowInstr::MakeLocationSummary(bool opt) const { | 5617 LocationSummary* ThrowInstr::MakeLocationSummary(Isolate* isolate, |
5526 return new LocationSummary(0, 0, LocationSummary::kCall); | 5618 bool opt) const { |
| 5619 return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall); |
5527 } | 5620 } |
5528 | 5621 |
5529 | 5622 |
5530 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5623 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5531 compiler->GenerateRuntimeCall(token_pos(), | 5624 compiler->GenerateRuntimeCall(token_pos(), |
5532 deopt_id(), | 5625 deopt_id(), |
5533 kThrowRuntimeEntry, | 5626 kThrowRuntimeEntry, |
5534 1, | 5627 1, |
5535 locs()); | 5628 locs()); |
5536 __ int3(); | 5629 __ int3(); |
5537 } | 5630 } |
5538 | 5631 |
5539 | 5632 |
5540 LocationSummary* ReThrowInstr::MakeLocationSummary(bool opt) const { | 5633 LocationSummary* ReThrowInstr::MakeLocationSummary(Isolate* isolate, |
5541 return new LocationSummary(0, 0, LocationSummary::kCall); | 5634 bool opt) const { |
| 5635 return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall); |
5542 } | 5636 } |
5543 | 5637 |
5544 | 5638 |
5545 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5639 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5546 compiler->SetNeedsStacktrace(catch_try_index()); | 5640 compiler->SetNeedsStacktrace(catch_try_index()); |
5547 compiler->GenerateRuntimeCall(token_pos(), | 5641 compiler->GenerateRuntimeCall(token_pos(), |
5548 deopt_id(), | 5642 deopt_id(), |
5549 kReThrowRuntimeEntry, | 5643 kReThrowRuntimeEntry, |
5550 2, | 5644 2, |
5551 locs()); | 5645 locs()); |
(...skipping 18 matching lines...) Expand all Loading... |
5570 compiler->AddCurrentDescriptor(PcDescriptors::kDeopt, | 5664 compiler->AddCurrentDescriptor(PcDescriptors::kDeopt, |
5571 deopt_id_, | 5665 deopt_id_, |
5572 Scanner::kNoSourcePos); | 5666 Scanner::kNoSourcePos); |
5573 } | 5667 } |
5574 if (HasParallelMove()) { | 5668 if (HasParallelMove()) { |
5575 compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); | 5669 compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); |
5576 } | 5670 } |
5577 } | 5671 } |
5578 | 5672 |
5579 | 5673 |
5580 LocationSummary* GotoInstr::MakeLocationSummary(bool opt) const { | 5674 LocationSummary* GotoInstr::MakeLocationSummary(Isolate* isolate, |
5581 return new LocationSummary(0, 0, LocationSummary::kNoCall); | 5675 bool opt) const { |
| 5676 return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall); |
5582 } | 5677 } |
5583 | 5678 |
5584 | 5679 |
5585 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5680 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5586 if (!compiler->is_optimizing()) { | 5681 if (!compiler->is_optimizing()) { |
5587 compiler->EmitEdgeCounter(); | 5682 compiler->EmitEdgeCounter(); |
5588 // Add a deoptimization descriptor for deoptimizing instructions that | 5683 // Add a deoptimization descriptor for deoptimizing instructions that |
5589 // may be inserted before this instruction. This descriptor points | 5684 // may be inserted before this instruction. This descriptor points |
5590 // after the edge counter for uniformity with ARM and MIPS, where we can | 5685 // after the edge counter for uniformity with ARM and MIPS, where we can |
5591 // reuse pattern matching that matches backwards from the end of the | 5686 // reuse pattern matching that matches backwards from the end of the |
5592 // pattern. | 5687 // pattern. |
5593 compiler->AddCurrentDescriptor(PcDescriptors::kDeopt, | 5688 compiler->AddCurrentDescriptor(PcDescriptors::kDeopt, |
5594 GetDeoptId(), | 5689 GetDeoptId(), |
5595 Scanner::kNoSourcePos); | 5690 Scanner::kNoSourcePos); |
5596 } | 5691 } |
5597 if (HasParallelMove()) { | 5692 if (HasParallelMove()) { |
5598 compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); | 5693 compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); |
5599 } | 5694 } |
5600 | 5695 |
5601 // We can fall through if the successor is the next block in the list. | 5696 // We can fall through if the successor is the next block in the list. |
5602 // Otherwise, we need a jump. | 5697 // Otherwise, we need a jump. |
5603 if (!compiler->CanFallThroughTo(successor())) { | 5698 if (!compiler->CanFallThroughTo(successor())) { |
5604 __ jmp(compiler->GetJumpLabel(successor())); | 5699 __ jmp(compiler->GetJumpLabel(successor())); |
5605 } | 5700 } |
5606 } | 5701 } |
5607 | 5702 |
5608 | 5703 |
5609 LocationSummary* CurrentContextInstr::MakeLocationSummary(bool opt) const { | 5704 LocationSummary* CurrentContextInstr::MakeLocationSummary(Isolate* isolate, |
| 5705 bool opt) const { |
5610 return LocationSummary::Make(0, | 5706 return LocationSummary::Make(0, |
5611 Location::RequiresRegister(), | 5707 Location::RequiresRegister(), |
5612 LocationSummary::kNoCall); | 5708 LocationSummary::kNoCall); |
5613 } | 5709 } |
5614 | 5710 |
5615 | 5711 |
5616 void CurrentContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5712 void CurrentContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5617 __ MoveRegister(locs()->out(0).reg(), CTX); | 5713 __ MoveRegister(locs()->out(0).reg(), CTX); |
5618 } | 5714 } |
5619 | 5715 |
5620 | 5716 |
5621 LocationSummary* StrictCompareInstr::MakeLocationSummary(bool opt) const { | 5717 LocationSummary* StrictCompareInstr::MakeLocationSummary(Isolate* isolate, |
| 5718 bool opt) const { |
5622 const intptr_t kNumInputs = 2; | 5719 const intptr_t kNumInputs = 2; |
5623 const intptr_t kNumTemps = 0; | 5720 const intptr_t kNumTemps = 0; |
5624 if (needs_number_check()) { | 5721 if (needs_number_check()) { |
5625 LocationSummary* locs = | 5722 LocationSummary* locs = new(isolate) LocationSummary( |
5626 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 5723 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
5627 locs->set_in(0, Location::RegisterLocation(RAX)); | 5724 locs->set_in(0, Location::RegisterLocation(RAX)); |
5628 locs->set_in(1, Location::RegisterLocation(RCX)); | 5725 locs->set_in(1, Location::RegisterLocation(RCX)); |
5629 locs->set_out(0, Location::RegisterLocation(RAX)); | 5726 locs->set_out(0, Location::RegisterLocation(RAX)); |
5630 return locs; | 5727 return locs; |
5631 } | 5728 } |
5632 LocationSummary* locs = | 5729 LocationSummary* locs = new(isolate) LocationSummary( |
5633 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 5730 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
5634 locs->set_in(0, Location::RegisterOrConstant(left())); | 5731 locs->set_in(0, Location::RegisterOrConstant(left())); |
5635 // Only one of the inputs can be a constant. Choose register if the first one | 5732 // Only one of the inputs can be a constant. Choose register if the first one |
5636 // is a constant. | 5733 // is a constant. |
5637 locs->set_in(1, locs->in(0).IsConstant() | 5734 locs->set_in(1, locs->in(0).IsConstant() |
5638 ? Location::RequiresRegister() | 5735 ? Location::RequiresRegister() |
5639 : Location::RegisterOrConstant(right())); | 5736 : Location::RegisterOrConstant(right())); |
5640 locs->set_out(0, Location::RequiresRegister()); | 5737 locs->set_out(0, Location::RequiresRegister()); |
5641 return locs; | 5738 return locs; |
5642 } | 5739 } |
5643 | 5740 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5692 void StrictCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler, | 5789 void StrictCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
5693 BranchInstr* branch) { | 5790 BranchInstr* branch) { |
5694 ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT); | 5791 ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT); |
5695 | 5792 |
5696 BranchLabels labels = compiler->CreateBranchLabels(branch); | 5793 BranchLabels labels = compiler->CreateBranchLabels(branch); |
5697 Condition true_condition = EmitComparisonCode(compiler, labels); | 5794 Condition true_condition = EmitComparisonCode(compiler, labels); |
5698 EmitBranchOnCondition(compiler, true_condition, labels); | 5795 EmitBranchOnCondition(compiler, true_condition, labels); |
5699 } | 5796 } |
5700 | 5797 |
5701 | 5798 |
5702 LocationSummary* ClosureCallInstr::MakeLocationSummary(bool opt) const { | 5799 LocationSummary* ClosureCallInstr::MakeLocationSummary(Isolate* isolate, |
| 5800 bool opt) const { |
5703 const intptr_t kNumInputs = 1; | 5801 const intptr_t kNumInputs = 1; |
5704 const intptr_t kNumTemps = 0; | 5802 const intptr_t kNumTemps = 0; |
5705 LocationSummary* summary = | 5803 LocationSummary* summary = new(isolate) LocationSummary( |
5706 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 5804 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
5707 summary->set_in(0, Location::RegisterLocation(RAX)); // Function. | 5805 summary->set_in(0, Location::RegisterLocation(RAX)); // Function. |
5708 summary->set_out(0, Location::RegisterLocation(RAX)); | 5806 summary->set_out(0, Location::RegisterLocation(RAX)); |
5709 return summary; | 5807 return summary; |
5710 } | 5808 } |
5711 | 5809 |
5712 | 5810 |
5713 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5811 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5714 // Arguments descriptor is expected in R10. | 5812 // Arguments descriptor is expected in R10. |
5715 intptr_t argument_count = ArgumentCount(); | 5813 intptr_t argument_count = ArgumentCount(); |
5716 const Array& arguments_descriptor = | 5814 const Array& arguments_descriptor = |
(...skipping 25 matching lines...) Expand all Loading... |
5742 // Add deoptimization continuation point after the call and before the | 5840 // Add deoptimization continuation point after the call and before the |
5743 // arguments are removed. | 5841 // arguments are removed. |
5744 compiler->AddCurrentDescriptor(PcDescriptors::kDeopt, | 5842 compiler->AddCurrentDescriptor(PcDescriptors::kDeopt, |
5745 deopt_id_after, | 5843 deopt_id_after, |
5746 token_pos()); | 5844 token_pos()); |
5747 } | 5845 } |
5748 __ Drop(argument_count); | 5846 __ Drop(argument_count); |
5749 } | 5847 } |
5750 | 5848 |
5751 | 5849 |
5752 LocationSummary* BooleanNegateInstr::MakeLocationSummary(bool opt) const { | 5850 LocationSummary* BooleanNegateInstr::MakeLocationSummary(Isolate* isolate, |
| 5851 bool opt) const { |
5753 return LocationSummary::Make(1, | 5852 return LocationSummary::Make(1, |
5754 Location::RequiresRegister(), | 5853 Location::RequiresRegister(), |
5755 LocationSummary::kNoCall); | 5854 LocationSummary::kNoCall); |
5756 } | 5855 } |
5757 | 5856 |
5758 | 5857 |
5759 void BooleanNegateInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5858 void BooleanNegateInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5760 Register value = locs()->in(0).reg(); | 5859 Register value = locs()->in(0).reg(); |
5761 Register result = locs()->out(0).reg(); | 5860 Register result = locs()->out(0).reg(); |
5762 | 5861 |
5763 Label done; | 5862 Label done; |
5764 __ LoadObject(result, Bool::True(), PP); | 5863 __ LoadObject(result, Bool::True(), PP); |
5765 __ CompareRegisters(result, value); | 5864 __ CompareRegisters(result, value); |
5766 __ j(NOT_EQUAL, &done, Assembler::kNearJump); | 5865 __ j(NOT_EQUAL, &done, Assembler::kNearJump); |
5767 __ LoadObject(result, Bool::False(), PP); | 5866 __ LoadObject(result, Bool::False(), PP); |
5768 __ Bind(&done); | 5867 __ Bind(&done); |
5769 } | 5868 } |
5770 | 5869 |
5771 | 5870 |
5772 LocationSummary* AllocateObjectInstr::MakeLocationSummary(bool opt) const { | 5871 LocationSummary* AllocateObjectInstr::MakeLocationSummary(Isolate* isolate, |
| 5872 bool opt) const { |
5773 return MakeCallSummary(); | 5873 return MakeCallSummary(); |
5774 } | 5874 } |
5775 | 5875 |
5776 | 5876 |
5777 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5877 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5778 const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls())); | 5878 const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls())); |
5779 const ExternalLabel label(cls().ToCString(), stub.EntryPoint()); | 5879 const ExternalLabel label(cls().ToCString(), stub.EntryPoint()); |
5780 compiler->GenerateCall(token_pos(), | 5880 compiler->GenerateCall(token_pos(), |
5781 &label, | 5881 &label, |
5782 PcDescriptors::kOther, | 5882 PcDescriptors::kOther, |
5783 locs()); | 5883 locs()); |
5784 __ Drop(ArgumentCount()); // Discard arguments. | 5884 __ Drop(ArgumentCount()); // Discard arguments. |
5785 } | 5885 } |
5786 | 5886 |
5787 } // namespace dart | 5887 } // namespace dart |
5788 | 5888 |
5789 #undef __ | 5889 #undef __ |
5790 | 5890 |
5791 #endif // defined TARGET_ARCH_X64 | 5891 #endif // defined TARGET_ARCH_X64 |
OLD | NEW |