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 14 matching lines...) Expand all Loading... |
25 DECLARE_FLAG(bool, emit_edge_counters); | 25 DECLARE_FLAG(bool, emit_edge_counters); |
26 DECLARE_FLAG(bool, enable_asserts); | 26 DECLARE_FLAG(bool, enable_asserts); |
27 DECLARE_FLAG(bool, enable_type_checks); | 27 DECLARE_FLAG(bool, enable_type_checks); |
28 DECLARE_FLAG(int, optimization_counter_threshold); | 28 DECLARE_FLAG(int, optimization_counter_threshold); |
29 DECLARE_FLAG(bool, propagate_ic_data); | 29 DECLARE_FLAG(bool, propagate_ic_data); |
30 DECLARE_FLAG(bool, throw_on_javascript_int_overflow); | 30 DECLARE_FLAG(bool, throw_on_javascript_int_overflow); |
31 DECLARE_FLAG(bool, use_osr); | 31 DECLARE_FLAG(bool, use_osr); |
32 | 32 |
33 // Generic summary for call instructions that have all arguments pushed | 33 // Generic summary for call instructions that have all arguments pushed |
34 // on the stack and return the result in a fixed register RAX. | 34 // on the stack and return the result in a fixed register RAX. |
35 LocationSummary* Instruction::MakeCallSummary(Isolate* isolate) { | 35 LocationSummary* Instruction::MakeCallSummary(Zone* zone) { |
36 LocationSummary* result = new(isolate) LocationSummary( | 36 LocationSummary* result = new(zone) LocationSummary( |
37 Isolate::Current(), 0, 0, LocationSummary::kCall); | 37 zone, 0, 0, LocationSummary::kCall); |
38 result->set_out(0, Location::RegisterLocation(RAX)); | 38 result->set_out(0, Location::RegisterLocation(RAX)); |
39 return result; | 39 return result; |
40 } | 40 } |
41 | 41 |
42 | 42 |
43 LocationSummary* PushArgumentInstr::MakeLocationSummary(Isolate* isolate, | 43 LocationSummary* PushArgumentInstr::MakeLocationSummary(Zone* zone, |
44 bool opt) const { | 44 bool opt) const { |
45 const intptr_t kNumInputs = 1; | 45 const intptr_t kNumInputs = 1; |
46 const intptr_t kNumTemps = 0; | 46 const intptr_t kNumTemps = 0; |
47 LocationSummary* locs = new(isolate) LocationSummary( | 47 LocationSummary* locs = new(zone) LocationSummary( |
48 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 48 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
49 locs->set_in(0, Location::AnyOrConstant(value())); | 49 locs->set_in(0, Location::AnyOrConstant(value())); |
50 return locs; | 50 return locs; |
51 } | 51 } |
52 | 52 |
53 | 53 |
54 void PushArgumentInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 54 void PushArgumentInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
55 // In SSA mode, we need an explicit push. Nothing to do in non-SSA mode | 55 // In SSA mode, we need an explicit push. Nothing to do in non-SSA mode |
56 // where PushArgument is handled by BindInstr::EmitNativeCode. | 56 // where PushArgument is handled by BindInstr::EmitNativeCode. |
57 if (compiler->is_optimizing()) { | 57 if (compiler->is_optimizing()) { |
58 Location value = locs()->in(0); | 58 Location value = locs()->in(0); |
59 if (value.IsRegister()) { | 59 if (value.IsRegister()) { |
60 __ pushq(value.reg()); | 60 __ pushq(value.reg()); |
61 } else if (value.IsConstant()) { | 61 } else if (value.IsConstant()) { |
62 __ PushObject(value.constant(), PP); | 62 __ PushObject(value.constant(), PP); |
63 } else { | 63 } else { |
64 ASSERT(value.IsStackSlot()); | 64 ASSERT(value.IsStackSlot()); |
65 __ pushq(value.ToStackSlotAddress()); | 65 __ pushq(value.ToStackSlotAddress()); |
66 } | 66 } |
67 } | 67 } |
68 } | 68 } |
69 | 69 |
70 | 70 |
71 LocationSummary* ReturnInstr::MakeLocationSummary(Isolate* isolate, | 71 LocationSummary* ReturnInstr::MakeLocationSummary(Zone* zone, |
72 bool opt) const { | 72 bool opt) const { |
73 const intptr_t kNumInputs = 1; | 73 const intptr_t kNumInputs = 1; |
74 const intptr_t kNumTemps = 0; | 74 const intptr_t kNumTemps = 0; |
75 LocationSummary* locs = new(isolate) LocationSummary( | 75 LocationSummary* locs = new(zone) LocationSummary( |
76 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 76 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
77 locs->set_in(0, Location::RegisterLocation(RAX)); | 77 locs->set_in(0, Location::RegisterLocation(RAX)); |
78 return locs; | 78 return locs; |
79 } | 79 } |
80 | 80 |
81 | 81 |
82 // Attempt optimized compilation at return instruction instead of at the entry. | 82 // Attempt optimized compilation at return instruction instead of at the entry. |
83 // The entry needs to be patchable, no inlined objects are allowed in the area | 83 // The entry needs to be patchable, no inlined objects are allowed in the area |
84 // that will be overwritten by the patch instruction: a jump). | 84 // that will be overwritten by the patch instruction: a jump). |
85 void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 85 void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
86 Register result = locs()->in(0).reg(); | 86 Register result = locs()->in(0).reg(); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 } | 129 } |
130 | 130 |
131 | 131 |
132 // Detect pattern when one value is zero and another is a power of 2. | 132 // Detect pattern when one value is zero and another is a power of 2. |
133 static bool IsPowerOfTwoKind(intptr_t v1, intptr_t v2) { | 133 static bool IsPowerOfTwoKind(intptr_t v1, intptr_t v2) { |
134 return (Utils::IsPowerOfTwo(v1) && (v2 == 0)) || | 134 return (Utils::IsPowerOfTwo(v1) && (v2 == 0)) || |
135 (Utils::IsPowerOfTwo(v2) && (v1 == 0)); | 135 (Utils::IsPowerOfTwo(v2) && (v1 == 0)); |
136 } | 136 } |
137 | 137 |
138 | 138 |
139 LocationSummary* IfThenElseInstr::MakeLocationSummary(Isolate* isolate, | 139 LocationSummary* IfThenElseInstr::MakeLocationSummary(Zone* zone, |
140 bool opt) const { | 140 bool opt) const { |
141 comparison()->InitializeLocationSummary(isolate, opt); | 141 comparison()->InitializeLocationSummary(zone, opt); |
142 // TODO(vegorov): support byte register constraints in the register allocator. | 142 // TODO(vegorov): support byte register constraints in the register allocator. |
143 comparison()->locs()->set_out(0, Location::RegisterLocation(RDX)); | 143 comparison()->locs()->set_out(0, Location::RegisterLocation(RDX)); |
144 return comparison()->locs(); | 144 return comparison()->locs(); |
145 } | 145 } |
146 | 146 |
147 | 147 |
148 void IfThenElseInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 148 void IfThenElseInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
149 ASSERT(locs()->out(0).reg() == RDX); | 149 ASSERT(locs()->out(0).reg() == RDX); |
150 | 150 |
151 // Clear upper part of the out register. We are going to use setcc on it | 151 // 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... |
187 __ decq(RDX); | 187 __ decq(RDX); |
188 __ AndImmediate(RDX, | 188 __ AndImmediate(RDX, |
189 Immediate(Smi::RawValue(true_value) - Smi::RawValue(false_value)), PP); | 189 Immediate(Smi::RawValue(true_value) - Smi::RawValue(false_value)), PP); |
190 if (false_value != 0) { | 190 if (false_value != 0) { |
191 __ AddImmediate(RDX, Immediate(Smi::RawValue(false_value)), PP); | 191 __ AddImmediate(RDX, Immediate(Smi::RawValue(false_value)), PP); |
192 } | 192 } |
193 } | 193 } |
194 } | 194 } |
195 | 195 |
196 | 196 |
197 LocationSummary* LoadLocalInstr::MakeLocationSummary(Isolate* isolate, | 197 LocationSummary* LoadLocalInstr::MakeLocationSummary(Zone* zone, |
198 bool opt) const { | 198 bool opt) const { |
199 const intptr_t kNumInputs = 0; | 199 const intptr_t kNumInputs = 0; |
200 const intptr_t stack_index = (local().index() < 0) | 200 const intptr_t stack_index = (local().index() < 0) |
201 ? kFirstLocalSlotFromFp - local().index() | 201 ? kFirstLocalSlotFromFp - local().index() |
202 : kParamEndSlotFromFp - local().index(); | 202 : kParamEndSlotFromFp - local().index(); |
203 return LocationSummary::Make(isolate, | 203 return LocationSummary::Make(zone, |
204 kNumInputs, | 204 kNumInputs, |
205 Location::StackSlot(stack_index), | 205 Location::StackSlot(stack_index), |
206 LocationSummary::kNoCall); | 206 LocationSummary::kNoCall); |
207 } | 207 } |
208 | 208 |
209 | 209 |
210 void LoadLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 210 void LoadLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
211 ASSERT(!compiler->is_optimizing()); | 211 ASSERT(!compiler->is_optimizing()); |
212 // Nothing to do. | 212 // Nothing to do. |
213 } | 213 } |
214 | 214 |
215 | 215 |
216 LocationSummary* StoreLocalInstr::MakeLocationSummary(Isolate* isolate, | 216 LocationSummary* StoreLocalInstr::MakeLocationSummary(Zone* zone, |
217 bool opt) const { | 217 bool opt) const { |
218 const intptr_t kNumInputs = 1; | 218 const intptr_t kNumInputs = 1; |
219 return LocationSummary::Make(isolate, | 219 return LocationSummary::Make(zone, |
220 kNumInputs, | 220 kNumInputs, |
221 Location::SameAsFirstInput(), | 221 Location::SameAsFirstInput(), |
222 LocationSummary::kNoCall); | 222 LocationSummary::kNoCall); |
223 } | 223 } |
224 | 224 |
225 | 225 |
226 void StoreLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 226 void StoreLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
227 Register value = locs()->in(0).reg(); | 227 Register value = locs()->in(0).reg(); |
228 Register result = locs()->out(0).reg(); | 228 Register result = locs()->out(0).reg(); |
229 ASSERT(result == value); // Assert that register assignment is correct. | 229 ASSERT(result == value); // Assert that register assignment is correct. |
230 __ movq(Address(RBP, local().index() * kWordSize), value); | 230 __ movq(Address(RBP, local().index() * kWordSize), value); |
231 } | 231 } |
232 | 232 |
233 | 233 |
234 LocationSummary* ConstantInstr::MakeLocationSummary(Isolate* isolate, | 234 LocationSummary* ConstantInstr::MakeLocationSummary(Zone* zone, |
235 bool opt) const { | 235 bool opt) const { |
236 const intptr_t kNumInputs = 0; | 236 const intptr_t kNumInputs = 0; |
237 return LocationSummary::Make(isolate, | 237 return LocationSummary::Make(zone, |
238 kNumInputs, | 238 kNumInputs, |
239 Location::RequiresRegister(), | 239 Location::RequiresRegister(), |
240 LocationSummary::kNoCall); | 240 LocationSummary::kNoCall); |
241 } | 241 } |
242 | 242 |
243 | 243 |
244 void ConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 244 void ConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
245 // The register allocator drops constant definitions that have no uses. | 245 // The register allocator drops constant definitions that have no uses. |
246 if (!locs()->out(0).IsInvalid()) { | 246 if (!locs()->out(0).IsInvalid()) { |
247 Register result = locs()->out(0).reg(); | 247 Register result = locs()->out(0).reg(); |
248 __ LoadObject(result, value(), PP); | 248 __ LoadObject(result, value(), PP); |
249 } | 249 } |
250 } | 250 } |
251 | 251 |
252 | 252 |
253 LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Isolate* isolate, | 253 LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Zone* zone, |
254 bool opt) const { | 254 bool opt) const { |
255 const intptr_t kNumInputs = 0; | 255 const intptr_t kNumInputs = 0; |
256 const intptr_t kNumTemps = 0; | 256 const intptr_t kNumTemps = 0; |
257 LocationSummary* locs = new(isolate) LocationSummary( | 257 LocationSummary* locs = new(zone) LocationSummary( |
258 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 258 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
259 switch (representation()) { | 259 switch (representation()) { |
260 case kUnboxedDouble: | 260 case kUnboxedDouble: |
261 locs->set_out(0, Location::RequiresFpuRegister()); | 261 locs->set_out(0, Location::RequiresFpuRegister()); |
262 break; | 262 break; |
263 case kUnboxedInt32: | 263 case kUnboxedInt32: |
264 locs->set_out(0, Location::RequiresRegister()); | 264 locs->set_out(0, Location::RequiresRegister()); |
265 break; | 265 break; |
266 default: | 266 default: |
267 UNREACHABLE(); | 267 UNREACHABLE(); |
268 break; | 268 break; |
(...skipping 20 matching lines...) Expand all Loading... |
289 __ movl(locs()->out(0).reg(), | 289 __ movl(locs()->out(0).reg(), |
290 Immediate(static_cast<int32_t>(Smi::Cast(value()).Value()))); | 290 Immediate(static_cast<int32_t>(Smi::Cast(value()).Value()))); |
291 break; | 291 break; |
292 default: | 292 default: |
293 UNREACHABLE(); | 293 UNREACHABLE(); |
294 } | 294 } |
295 } | 295 } |
296 } | 296 } |
297 | 297 |
298 | 298 |
299 LocationSummary* AssertAssignableInstr::MakeLocationSummary(Isolate* isolate, | 299 LocationSummary* AssertAssignableInstr::MakeLocationSummary(Zone* zone, |
300 bool opt) const { | 300 bool opt) const { |
301 const intptr_t kNumInputs = 3; | 301 const intptr_t kNumInputs = 3; |
302 const intptr_t kNumTemps = 0; | 302 const intptr_t kNumTemps = 0; |
303 LocationSummary* summary = new(isolate) LocationSummary( | 303 LocationSummary* summary = new(zone) LocationSummary( |
304 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); | 304 zone, kNumInputs, kNumTemps, LocationSummary::kCall); |
305 summary->set_in(0, Location::RegisterLocation(RAX)); // Value. | 305 summary->set_in(0, Location::RegisterLocation(RAX)); // Value. |
306 summary->set_in(1, Location::RegisterLocation(RCX)); // Instantiator. | 306 summary->set_in(1, Location::RegisterLocation(RCX)); // Instantiator. |
307 summary->set_in(2, Location::RegisterLocation(RDX)); // Type arguments. | 307 summary->set_in(2, Location::RegisterLocation(RDX)); // Type arguments. |
308 summary->set_out(0, Location::RegisterLocation(RAX)); | 308 summary->set_out(0, Location::RegisterLocation(RAX)); |
309 return summary; | 309 return summary; |
310 } | 310 } |
311 | 311 |
312 | 312 |
313 LocationSummary* AssertBooleanInstr::MakeLocationSummary(Isolate* isolate, | 313 LocationSummary* AssertBooleanInstr::MakeLocationSummary(Zone* zone, |
314 bool opt) const { | 314 bool opt) const { |
315 const intptr_t kNumInputs = 1; | 315 const intptr_t kNumInputs = 1; |
316 const intptr_t kNumTemps = 0; | 316 const intptr_t kNumTemps = 0; |
317 LocationSummary* locs = new(isolate) LocationSummary( | 317 LocationSummary* locs = new(zone) LocationSummary( |
318 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); | 318 zone, kNumInputs, kNumTemps, LocationSummary::kCall); |
319 locs->set_in(0, Location::RegisterLocation(RAX)); | 319 locs->set_in(0, Location::RegisterLocation(RAX)); |
320 locs->set_out(0, Location::RegisterLocation(RAX)); | 320 locs->set_out(0, Location::RegisterLocation(RAX)); |
321 return locs; | 321 return locs; |
322 } | 322 } |
323 | 323 |
324 | 324 |
325 static void EmitAssertBoolean(Register reg, | 325 static void EmitAssertBoolean(Register reg, |
326 intptr_t token_pos, | 326 intptr_t token_pos, |
327 intptr_t deopt_id, | 327 intptr_t deopt_id, |
328 LocationSummary* locs, | 328 LocationSummary* locs, |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
372 case Token::kGT: return GREATER; | 372 case Token::kGT: return GREATER; |
373 case Token::kLTE: return LESS_EQUAL; | 373 case Token::kLTE: return LESS_EQUAL; |
374 case Token::kGTE: return GREATER_EQUAL; | 374 case Token::kGTE: return GREATER_EQUAL; |
375 default: | 375 default: |
376 UNREACHABLE(); | 376 UNREACHABLE(); |
377 return OVERFLOW; | 377 return OVERFLOW; |
378 } | 378 } |
379 } | 379 } |
380 | 380 |
381 | 381 |
382 LocationSummary* EqualityCompareInstr::MakeLocationSummary(Isolate* isolate, | 382 LocationSummary* EqualityCompareInstr::MakeLocationSummary(Zone* zone, |
383 bool opt) const { | 383 bool opt) const { |
384 const intptr_t kNumInputs = 2; | 384 const intptr_t kNumInputs = 2; |
385 if (operation_cid() == kMintCid) { | 385 if (operation_cid() == kMintCid) { |
386 const intptr_t kNumTemps = 0; | 386 const intptr_t kNumTemps = 0; |
387 LocationSummary* locs = new(isolate) LocationSummary( | 387 LocationSummary* locs = new(zone) LocationSummary( |
388 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 388 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
389 locs->set_in(0, Location::RequiresRegister()); | 389 locs->set_in(0, Location::RequiresRegister()); |
390 locs->set_in(1, Location::RequiresRegister()); | 390 locs->set_in(1, Location::RequiresRegister()); |
391 locs->set_out(0, Location::RequiresRegister()); | 391 locs->set_out(0, Location::RequiresRegister()); |
392 return locs; | 392 return locs; |
393 } | 393 } |
394 if (operation_cid() == kDoubleCid) { | 394 if (operation_cid() == kDoubleCid) { |
395 const intptr_t kNumTemps = 0; | 395 const intptr_t kNumTemps = 0; |
396 LocationSummary* locs = new(isolate) LocationSummary( | 396 LocationSummary* locs = new(zone) LocationSummary( |
397 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 397 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
398 locs->set_in(0, Location::RequiresFpuRegister()); | 398 locs->set_in(0, Location::RequiresFpuRegister()); |
399 locs->set_in(1, Location::RequiresFpuRegister()); | 399 locs->set_in(1, Location::RequiresFpuRegister()); |
400 locs->set_out(0, Location::RequiresRegister()); | 400 locs->set_out(0, Location::RequiresRegister()); |
401 return locs; | 401 return locs; |
402 } | 402 } |
403 if (operation_cid() == kSmiCid) { | 403 if (operation_cid() == kSmiCid) { |
404 const intptr_t kNumTemps = 0; | 404 const intptr_t kNumTemps = 0; |
405 LocationSummary* locs = new(isolate) LocationSummary( | 405 LocationSummary* locs = new(zone) LocationSummary( |
406 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 406 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
407 locs->set_in(0, Location::RegisterOrConstant(left())); | 407 locs->set_in(0, Location::RegisterOrConstant(left())); |
408 // Only one input can be a constant operand. The case of two constant | 408 // Only one input can be a constant operand. The case of two constant |
409 // operands should be handled by constant propagation. | 409 // operands should be handled by constant propagation. |
410 // Only right can be a stack slot. | 410 // Only right can be a stack slot. |
411 locs->set_in(1, locs->in(0).IsConstant() | 411 locs->set_in(1, locs->in(0).IsConstant() |
412 ? Location::RequiresRegister() | 412 ? Location::RequiresRegister() |
413 : Location::RegisterOrConstant(right())); | 413 : Location::RegisterOrConstant(right())); |
414 locs->set_out(0, Location::RequiresRegister()); | 414 locs->set_out(0, Location::RequiresRegister()); |
415 return locs; | 415 return locs; |
416 } | 416 } |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
565 void EqualityCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler, | 565 void EqualityCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
566 BranchInstr* branch) { | 566 BranchInstr* branch) { |
567 ASSERT((kind() == Token::kNE) || (kind() == Token::kEQ)); | 567 ASSERT((kind() == Token::kNE) || (kind() == Token::kEQ)); |
568 | 568 |
569 BranchLabels labels = compiler->CreateBranchLabels(branch); | 569 BranchLabels labels = compiler->CreateBranchLabels(branch); |
570 Condition true_condition = EmitComparisonCode(compiler, labels); | 570 Condition true_condition = EmitComparisonCode(compiler, labels); |
571 EmitBranchOnCondition(compiler, true_condition, labels); | 571 EmitBranchOnCondition(compiler, true_condition, labels); |
572 } | 572 } |
573 | 573 |
574 | 574 |
575 LocationSummary* TestSmiInstr::MakeLocationSummary(Isolate* isolate, | 575 LocationSummary* TestSmiInstr::MakeLocationSummary(Zone* zone, |
576 bool opt) const { | 576 bool opt) const { |
577 const intptr_t kNumInputs = 2; | 577 const intptr_t kNumInputs = 2; |
578 const intptr_t kNumTemps = 0; | 578 const intptr_t kNumTemps = 0; |
579 LocationSummary* locs = new(isolate) LocationSummary( | 579 LocationSummary* locs = new(zone) LocationSummary( |
580 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 580 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
581 locs->set_in(0, Location::RequiresRegister()); | 581 locs->set_in(0, Location::RequiresRegister()); |
582 // Only one input can be a constant operand. The case of two constant | 582 // Only one input can be a constant operand. The case of two constant |
583 // operands should be handled by constant propagation. | 583 // operands should be handled by constant propagation. |
584 locs->set_in(1, Location::RegisterOrConstant(right())); | 584 locs->set_in(1, Location::RegisterOrConstant(right())); |
585 return locs; | 585 return locs; |
586 } | 586 } |
587 | 587 |
588 | 588 |
589 Condition TestSmiInstr::EmitComparisonCode(FlowGraphCompiler* compiler, | 589 Condition TestSmiInstr::EmitComparisonCode(FlowGraphCompiler* compiler, |
590 BranchLabels labels) { | 590 BranchLabels labels) { |
(...skipping 20 matching lines...) Expand all Loading... |
611 | 611 |
612 void TestSmiInstr::EmitBranchCode(FlowGraphCompiler* compiler, | 612 void TestSmiInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
613 BranchInstr* branch) { | 613 BranchInstr* branch) { |
614 BranchLabels labels = compiler->CreateBranchLabels(branch); | 614 BranchLabels labels = compiler->CreateBranchLabels(branch); |
615 Condition true_condition = EmitComparisonCode(compiler, labels); | 615 Condition true_condition = EmitComparisonCode(compiler, labels); |
616 EmitBranchOnCondition(compiler, true_condition, labels); | 616 EmitBranchOnCondition(compiler, true_condition, labels); |
617 } | 617 } |
618 | 618 |
619 | 619 |
620 | 620 |
621 LocationSummary* TestCidsInstr::MakeLocationSummary(Isolate* isolate, | 621 LocationSummary* TestCidsInstr::MakeLocationSummary(Zone* zone, |
622 bool opt) const { | 622 bool opt) const { |
623 const intptr_t kNumInputs = 1; | 623 const intptr_t kNumInputs = 1; |
624 const intptr_t kNumTemps = 1; | 624 const intptr_t kNumTemps = 1; |
625 LocationSummary* locs = new(isolate) LocationSummary( | 625 LocationSummary* locs = new(zone) LocationSummary( |
626 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 626 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
627 locs->set_in(0, Location::RequiresRegister()); | 627 locs->set_in(0, Location::RequiresRegister()); |
628 locs->set_temp(0, Location::RequiresRegister()); | 628 locs->set_temp(0, Location::RequiresRegister()); |
629 locs->set_out(0, Location::RequiresRegister()); | 629 locs->set_out(0, Location::RequiresRegister()); |
630 return locs; | 630 return locs; |
631 } | 631 } |
632 | 632 |
633 | 633 |
634 Condition TestCidsInstr::EmitComparisonCode(FlowGraphCompiler* compiler, | 634 Condition TestCidsInstr::EmitComparisonCode(FlowGraphCompiler* compiler, |
635 BranchLabels labels) { | 635 BranchLabels labels) { |
636 ASSERT((kind() == Token::kIS) || (kind() == Token::kISNOT)); | 636 ASSERT((kind() == Token::kIS) || (kind() == Token::kISNOT)); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
683 EmitComparisonCode(compiler, labels); | 683 EmitComparisonCode(compiler, labels); |
684 __ Bind(&is_false); | 684 __ Bind(&is_false); |
685 __ LoadObject(result_reg, Bool::False(), PP); | 685 __ LoadObject(result_reg, Bool::False(), PP); |
686 __ jmp(&done, Assembler::kNearJump); | 686 __ jmp(&done, Assembler::kNearJump); |
687 __ Bind(&is_true); | 687 __ Bind(&is_true); |
688 __ LoadObject(result_reg, Bool::True(), PP); | 688 __ LoadObject(result_reg, Bool::True(), PP); |
689 __ Bind(&done); | 689 __ Bind(&done); |
690 } | 690 } |
691 | 691 |
692 | 692 |
693 LocationSummary* RelationalOpInstr::MakeLocationSummary(Isolate* isolate, | 693 LocationSummary* RelationalOpInstr::MakeLocationSummary(Zone* zone, |
694 bool opt) const { | 694 bool opt) const { |
695 const intptr_t kNumInputs = 2; | 695 const intptr_t kNumInputs = 2; |
696 const intptr_t kNumTemps = 0; | 696 const intptr_t kNumTemps = 0; |
697 if (operation_cid() == kDoubleCid) { | 697 if (operation_cid() == kDoubleCid) { |
698 LocationSummary* summary = new(isolate) LocationSummary( | 698 LocationSummary* summary = new(zone) LocationSummary( |
699 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 699 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
700 summary->set_in(0, Location::RequiresFpuRegister()); | 700 summary->set_in(0, Location::RequiresFpuRegister()); |
701 summary->set_in(1, Location::RequiresFpuRegister()); | 701 summary->set_in(1, Location::RequiresFpuRegister()); |
702 summary->set_out(0, Location::RequiresRegister()); | 702 summary->set_out(0, Location::RequiresRegister()); |
703 return summary; | 703 return summary; |
704 } else if (operation_cid() == kMintCid) { | 704 } else if (operation_cid() == kMintCid) { |
705 LocationSummary* summary = new(isolate) LocationSummary( | 705 LocationSummary* summary = new(zone) LocationSummary( |
706 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 706 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
707 summary->set_in(0, Location::RequiresRegister()); | 707 summary->set_in(0, Location::RequiresRegister()); |
708 summary->set_in(1, Location::RequiresRegister()); | 708 summary->set_in(1, Location::RequiresRegister()); |
709 summary->set_out(0, Location::RequiresRegister()); | 709 summary->set_out(0, Location::RequiresRegister()); |
710 return summary; | 710 return summary; |
711 } | 711 } |
712 ASSERT(operation_cid() == kSmiCid); | 712 ASSERT(operation_cid() == kSmiCid); |
713 LocationSummary* summary = new(isolate) LocationSummary( | 713 LocationSummary* summary = new(zone) LocationSummary( |
714 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 714 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
715 summary->set_in(0, Location::RegisterOrConstant(left())); | 715 summary->set_in(0, Location::RegisterOrConstant(left())); |
716 // Only one input can be a constant operand. The case of two constant | 716 // Only one input can be a constant operand. The case of two constant |
717 // operands should be handled by constant propagation. | 717 // operands should be handled by constant propagation. |
718 summary->set_in(1, summary->in(0).IsConstant() | 718 summary->set_in(1, summary->in(0).IsConstant() |
719 ? Location::RequiresRegister() | 719 ? Location::RequiresRegister() |
720 : Location::RegisterOrConstant(right())); | 720 : Location::RegisterOrConstant(right())); |
721 summary->set_out(0, Location::RequiresRegister()); | 721 summary->set_out(0, Location::RequiresRegister()); |
722 return summary; | 722 return summary; |
723 } | 723 } |
724 | 724 |
(...skipping 27 matching lines...) Expand all Loading... |
752 | 752 |
753 | 753 |
754 void RelationalOpInstr::EmitBranchCode(FlowGraphCompiler* compiler, | 754 void RelationalOpInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
755 BranchInstr* branch) { | 755 BranchInstr* branch) { |
756 BranchLabels labels = compiler->CreateBranchLabels(branch); | 756 BranchLabels labels = compiler->CreateBranchLabels(branch); |
757 Condition true_condition = EmitComparisonCode(compiler, labels); | 757 Condition true_condition = EmitComparisonCode(compiler, labels); |
758 EmitBranchOnCondition(compiler, true_condition, labels); | 758 EmitBranchOnCondition(compiler, true_condition, labels); |
759 } | 759 } |
760 | 760 |
761 | 761 |
762 LocationSummary* NativeCallInstr::MakeLocationSummary(Isolate* isolate, | 762 LocationSummary* NativeCallInstr::MakeLocationSummary(Zone* zone, |
763 bool opt) const { | 763 bool opt) const { |
764 return MakeCallSummary(isolate); | 764 return MakeCallSummary(zone); |
765 } | 765 } |
766 | 766 |
767 | 767 |
768 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 768 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
769 Register result = locs()->out(0).reg(); | 769 Register result = locs()->out(0).reg(); |
770 const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function()); | 770 const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function()); |
771 const bool is_leaf_call = | 771 const bool is_leaf_call = |
772 (argc_tag & NativeArguments::AutoSetupScopeMask()) == 0; | 772 (argc_tag & NativeArguments::AutoSetupScopeMask()) == 0; |
773 StubCode* stub_code = compiler->isolate()->stub_code(); | 773 StubCode* stub_code = compiler->isolate()->stub_code(); |
774 | 774 |
(...skipping 27 matching lines...) Expand all Loading... |
802 const Object& constant = index->definition()->AsConstant()->value(); | 802 const Object& constant = index->definition()->AsConstant()->value(); |
803 if (!constant.IsSmi()) return false; | 803 if (!constant.IsSmi()) return false; |
804 const Smi& smi_const = Smi::Cast(constant); | 804 const Smi& smi_const = Smi::Cast(constant); |
805 const intptr_t scale = Instance::ElementSizeFor(cid); | 805 const intptr_t scale = Instance::ElementSizeFor(cid); |
806 const intptr_t data_offset = Instance::DataOffsetFor(cid); | 806 const intptr_t data_offset = Instance::DataOffsetFor(cid); |
807 const int64_t disp = smi_const.AsInt64Value() * scale + data_offset; | 807 const int64_t disp = smi_const.AsInt64Value() * scale + data_offset; |
808 return Utils::IsInt(32, disp); | 808 return Utils::IsInt(32, disp); |
809 } | 809 } |
810 | 810 |
811 | 811 |
812 LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Isolate* isolate, | 812 LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Zone* zone, |
813 bool opt) const { | 813 bool opt) const { |
814 const intptr_t kNumInputs = 1; | 814 const intptr_t kNumInputs = 1; |
815 // TODO(fschneider): Allow immediate operands for the char code. | 815 // TODO(fschneider): Allow immediate operands for the char code. |
816 return LocationSummary::Make(isolate, | 816 return LocationSummary::Make(zone, |
817 kNumInputs, | 817 kNumInputs, |
818 Location::RequiresRegister(), | 818 Location::RequiresRegister(), |
819 LocationSummary::kNoCall); | 819 LocationSummary::kNoCall); |
820 } | 820 } |
821 | 821 |
822 | 822 |
823 void StringFromCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 823 void StringFromCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
824 Register char_code = locs()->in(0).reg(); | 824 Register char_code = locs()->in(0).reg(); |
825 Register result = locs()->out(0).reg(); | 825 Register result = locs()->out(0).reg(); |
826 __ LoadImmediate(result, | 826 __ LoadImmediate(result, |
827 Immediate(reinterpret_cast<uword>(Symbols::PredefinedAddress())), PP); | 827 Immediate(reinterpret_cast<uword>(Symbols::PredefinedAddress())), PP); |
828 __ movq(result, Address(result, | 828 __ movq(result, Address(result, |
829 char_code, | 829 char_code, |
830 TIMES_HALF_WORD_SIZE, // Char code is a smi. | 830 TIMES_HALF_WORD_SIZE, // Char code is a smi. |
831 Symbols::kNullCharCodeSymbolOffset * kWordSize)); | 831 Symbols::kNullCharCodeSymbolOffset * kWordSize)); |
832 } | 832 } |
833 | 833 |
834 | 834 |
835 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Isolate* isolate, | 835 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Zone* zone, |
836 bool opt) const { | 836 bool opt) const { |
837 const intptr_t kNumInputs = 1; | 837 const intptr_t kNumInputs = 1; |
838 return LocationSummary::Make(isolate, | 838 return LocationSummary::Make(zone, |
839 kNumInputs, | 839 kNumInputs, |
840 Location::RequiresRegister(), | 840 Location::RequiresRegister(), |
841 LocationSummary::kNoCall); | 841 LocationSummary::kNoCall); |
842 } | 842 } |
843 | 843 |
844 | 844 |
845 void StringToCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 845 void StringToCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
846 ASSERT(cid_ == kOneByteStringCid); | 846 ASSERT(cid_ == kOneByteStringCid); |
847 Register str = locs()->in(0).reg(); | 847 Register str = locs()->in(0).reg(); |
848 Register result = locs()->out(0).reg(); | 848 Register result = locs()->out(0).reg(); |
849 Label is_one, done; | 849 Label is_one, done; |
850 __ movq(result, FieldAddress(str, String::length_offset())); | 850 __ movq(result, FieldAddress(str, String::length_offset())); |
851 __ cmpq(result, Immediate(Smi::RawValue(1))); | 851 __ cmpq(result, Immediate(Smi::RawValue(1))); |
852 __ j(EQUAL, &is_one, Assembler::kNearJump); | 852 __ j(EQUAL, &is_one, Assembler::kNearJump); |
853 __ movq(result, Immediate(Smi::RawValue(-1))); | 853 __ movq(result, Immediate(Smi::RawValue(-1))); |
854 __ jmp(&done); | 854 __ jmp(&done); |
855 __ Bind(&is_one); | 855 __ Bind(&is_one); |
856 __ movzxb(result, FieldAddress(str, OneByteString::data_offset())); | 856 __ movzxb(result, FieldAddress(str, OneByteString::data_offset())); |
857 __ SmiTag(result); | 857 __ SmiTag(result); |
858 __ Bind(&done); | 858 __ Bind(&done); |
859 } | 859 } |
860 | 860 |
861 | 861 |
862 LocationSummary* StringInterpolateInstr::MakeLocationSummary(Isolate* isolate, | 862 LocationSummary* StringInterpolateInstr::MakeLocationSummary(Zone* zone, |
863 bool opt) const { | 863 bool opt) const { |
864 const intptr_t kNumInputs = 1; | 864 const intptr_t kNumInputs = 1; |
865 const intptr_t kNumTemps = 0; | 865 const intptr_t kNumTemps = 0; |
866 LocationSummary* summary = new(isolate) LocationSummary( | 866 LocationSummary* summary = new(zone) LocationSummary( |
867 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); | 867 zone, kNumInputs, kNumTemps, LocationSummary::kCall); |
868 summary->set_in(0, Location::RegisterLocation(RAX)); | 868 summary->set_in(0, Location::RegisterLocation(RAX)); |
869 summary->set_out(0, Location::RegisterLocation(RAX)); | 869 summary->set_out(0, Location::RegisterLocation(RAX)); |
870 return summary; | 870 return summary; |
871 } | 871 } |
872 | 872 |
873 | 873 |
874 void StringInterpolateInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 874 void StringInterpolateInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
875 Register array = locs()->in(0).reg(); | 875 Register array = locs()->in(0).reg(); |
876 __ pushq(array); | 876 __ pushq(array); |
877 const int kNumberOfArguments = 1; | 877 const int kNumberOfArguments = 1; |
878 const Array& kNoArgumentNames = Object::null_array(); | 878 const Array& kNoArgumentNames = Object::null_array(); |
879 compiler->GenerateStaticCall(deopt_id(), | 879 compiler->GenerateStaticCall(deopt_id(), |
880 token_pos(), | 880 token_pos(), |
881 CallFunction(), | 881 CallFunction(), |
882 kNumberOfArguments, | 882 kNumberOfArguments, |
883 kNoArgumentNames, | 883 kNoArgumentNames, |
884 locs(), | 884 locs(), |
885 ICData::Handle()); | 885 ICData::Handle()); |
886 ASSERT(locs()->out(0).reg() == RAX); | 886 ASSERT(locs()->out(0).reg() == RAX); |
887 } | 887 } |
888 | 888 |
889 | 889 |
890 LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Isolate* isolate, | 890 LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Zone* zone, |
891 bool opt) const { | 891 bool opt) const { |
892 const intptr_t kNumInputs = 1; | 892 const intptr_t kNumInputs = 1; |
893 return LocationSummary::Make(isolate, | 893 return LocationSummary::Make(zone, |
894 kNumInputs, | 894 kNumInputs, |
895 Location::RequiresRegister(), | 895 Location::RequiresRegister(), |
896 LocationSummary::kNoCall); | 896 LocationSummary::kNoCall); |
897 } | 897 } |
898 | 898 |
899 | 899 |
900 void LoadUntaggedInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 900 void LoadUntaggedInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
901 Register obj = locs()->in(0).reg(); | 901 Register obj = locs()->in(0).reg(); |
902 Register result = locs()->out(0).reg(); | 902 Register result = locs()->out(0).reg(); |
903 if (object()->definition()->representation() == kUntagged) { | 903 if (object()->definition()->representation() == kUntagged) { |
904 __ movq(result, Address(obj, offset())); | 904 __ movq(result, Address(obj, offset())); |
905 } else { | 905 } else { |
906 ASSERT(object()->definition()->representation() == kTagged); | 906 ASSERT(object()->definition()->representation() == kTagged); |
907 __ movq(result, FieldAddress(obj, offset())); | 907 __ movq(result, FieldAddress(obj, offset())); |
908 } | 908 } |
909 } | 909 } |
910 | 910 |
911 | 911 |
912 LocationSummary* LoadClassIdInstr::MakeLocationSummary(Isolate* isolate, | 912 LocationSummary* LoadClassIdInstr::MakeLocationSummary(Zone* zone, |
913 bool opt) const { | 913 bool opt) const { |
914 const intptr_t kNumInputs = 1; | 914 const intptr_t kNumInputs = 1; |
915 return LocationSummary::Make(isolate, | 915 return LocationSummary::Make(zone, |
916 kNumInputs, | 916 kNumInputs, |
917 Location::RequiresRegister(), | 917 Location::RequiresRegister(), |
918 LocationSummary::kNoCall); | 918 LocationSummary::kNoCall); |
919 } | 919 } |
920 | 920 |
921 | 921 |
922 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 922 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
923 const Register object = locs()->in(0).reg(); | 923 const Register object = locs()->in(0).reg(); |
924 const Register result = locs()->out(0).reg(); | 924 const Register result = locs()->out(0).reg(); |
925 Label load, done; | 925 Label load, done; |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1006 return kUnboxedFloat32x4; | 1006 return kUnboxedFloat32x4; |
1007 case kTypedDataFloat64x2ArrayCid: | 1007 case kTypedDataFloat64x2ArrayCid: |
1008 return kUnboxedFloat64x2; | 1008 return kUnboxedFloat64x2; |
1009 default: | 1009 default: |
1010 UNIMPLEMENTED(); | 1010 UNIMPLEMENTED(); |
1011 return kTagged; | 1011 return kTagged; |
1012 } | 1012 } |
1013 } | 1013 } |
1014 | 1014 |
1015 | 1015 |
1016 LocationSummary* LoadIndexedInstr::MakeLocationSummary(Isolate* isolate, | 1016 LocationSummary* LoadIndexedInstr::MakeLocationSummary(Zone* zone, |
1017 bool opt) const { | 1017 bool opt) const { |
1018 const intptr_t kNumInputs = 2; | 1018 const intptr_t kNumInputs = 2; |
1019 const intptr_t kNumTemps = 0; | 1019 const intptr_t kNumTemps = 0; |
1020 LocationSummary* locs = new(isolate) LocationSummary( | 1020 LocationSummary* locs = new(zone) LocationSummary( |
1021 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 1021 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
1022 locs->set_in(0, Location::RequiresRegister()); | 1022 locs->set_in(0, Location::RequiresRegister()); |
1023 // The smi index is either untagged (element size == 1), or it is left smi | 1023 // The smi index is either untagged (element size == 1), or it is left smi |
1024 // tagged (for all element sizes > 1). | 1024 // tagged (for all element sizes > 1). |
1025 if (index_scale() == 1) { | 1025 if (index_scale() == 1) { |
1026 locs->set_in(1, CanBeImmediateIndex(index(), class_id()) | 1026 locs->set_in(1, CanBeImmediateIndex(index(), class_id()) |
1027 ? Location::Constant(index()->definition()->AsConstant()) | 1027 ? Location::Constant(index()->definition()->AsConstant()) |
1028 : Location::WritableRegister()); | 1028 : Location::WritableRegister()); |
1029 } else { | 1029 } else { |
1030 locs->set_in(1, CanBeImmediateIndex(index(), class_id()) | 1030 locs->set_in(1, CanBeImmediateIndex(index(), class_id()) |
1031 ? Location::Constant(index()->definition()->AsConstant()) | 1031 ? Location::Constant(index()->definition()->AsConstant()) |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1138 __ SmiTag(result); | 1138 __ SmiTag(result); |
1139 break; | 1139 break; |
1140 default: | 1140 default: |
1141 ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid)); | 1141 ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid)); |
1142 __ movq(result, element_address); | 1142 __ movq(result, element_address); |
1143 break; | 1143 break; |
1144 } | 1144 } |
1145 } | 1145 } |
1146 | 1146 |
1147 | 1147 |
1148 LocationSummary* LoadCodeUnitsInstr::MakeLocationSummary(Isolate* isolate, | 1148 LocationSummary* LoadCodeUnitsInstr::MakeLocationSummary(Zone* zone, |
1149 bool opt) const { | 1149 bool opt) const { |
1150 const intptr_t kNumInputs = 2; | 1150 const intptr_t kNumInputs = 2; |
1151 const intptr_t kNumTemps = 0; | 1151 const intptr_t kNumTemps = 0; |
1152 LocationSummary* summary = new(isolate) LocationSummary( | 1152 LocationSummary* summary = new(zone) LocationSummary( |
1153 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 1153 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
1154 summary->set_in(0, Location::RequiresRegister()); | 1154 summary->set_in(0, Location::RequiresRegister()); |
1155 // The smi index is either untagged (element size == 1), or it is left smi | 1155 // The smi index is either untagged (element size == 1), or it is left smi |
1156 // tagged (for all element sizes > 1). | 1156 // tagged (for all element sizes > 1). |
1157 summary->set_in(1, index_scale() == 1 ? Location::WritableRegister() | 1157 summary->set_in(1, index_scale() == 1 ? Location::WritableRegister() |
1158 : Location::RequiresRegister()); | 1158 : Location::RequiresRegister()); |
1159 summary->set_out(0, Location::RequiresRegister()); | 1159 summary->set_out(0, Location::RequiresRegister()); |
1160 return summary; | 1160 return summary; |
1161 } | 1161 } |
1162 | 1162 |
1163 | 1163 |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1231 return kUnboxedInt32x4; | 1231 return kUnboxedInt32x4; |
1232 case kTypedDataFloat64x2ArrayCid: | 1232 case kTypedDataFloat64x2ArrayCid: |
1233 return kUnboxedFloat64x2; | 1233 return kUnboxedFloat64x2; |
1234 default: | 1234 default: |
1235 UNIMPLEMENTED(); | 1235 UNIMPLEMENTED(); |
1236 return kTagged; | 1236 return kTagged; |
1237 } | 1237 } |
1238 } | 1238 } |
1239 | 1239 |
1240 | 1240 |
1241 LocationSummary* StoreIndexedInstr::MakeLocationSummary(Isolate* isolate, | 1241 LocationSummary* StoreIndexedInstr::MakeLocationSummary(Zone* zone, |
1242 bool opt) const { | 1242 bool opt) const { |
1243 const intptr_t kNumInputs = 3; | 1243 const intptr_t kNumInputs = 3; |
1244 const intptr_t kNumTemps = 0; | 1244 const intptr_t kNumTemps = 0; |
1245 LocationSummary* locs = new(isolate) LocationSummary( | 1245 LocationSummary* locs = new(zone) LocationSummary( |
1246 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 1246 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
1247 locs->set_in(0, Location::RequiresRegister()); | 1247 locs->set_in(0, Location::RequiresRegister()); |
1248 // The smi index is either untagged (element size == 1), or it is left smi | 1248 // The smi index is either untagged (element size == 1), or it is left smi |
1249 // tagged (for all element sizes > 1). | 1249 // tagged (for all element sizes > 1). |
1250 if (index_scale() == 1) { | 1250 if (index_scale() == 1) { |
1251 locs->set_in(1, CanBeImmediateIndex(index(), class_id()) | 1251 locs->set_in(1, CanBeImmediateIndex(index(), class_id()) |
1252 ? Location::Constant(index()->definition()->AsConstant()) | 1252 ? Location::Constant(index()->definition()->AsConstant()) |
1253 : Location::WritableRegister()); | 1253 : Location::WritableRegister()); |
1254 } else { | 1254 } else { |
1255 locs->set_in(1, CanBeImmediateIndex(index(), class_id()) | 1255 locs->set_in(1, CanBeImmediateIndex(index(), class_id()) |
1256 ? Location::Constant(index()->definition()->AsConstant()) | 1256 ? Location::Constant(index()->definition()->AsConstant()) |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1400 case kTypedDataFloat64x2ArrayCid: | 1400 case kTypedDataFloat64x2ArrayCid: |
1401 case kTypedDataFloat32x4ArrayCid: | 1401 case kTypedDataFloat32x4ArrayCid: |
1402 __ movups(element_address, locs()->in(2).fpu_reg()); | 1402 __ movups(element_address, locs()->in(2).fpu_reg()); |
1403 break; | 1403 break; |
1404 default: | 1404 default: |
1405 UNREACHABLE(); | 1405 UNREACHABLE(); |
1406 } | 1406 } |
1407 } | 1407 } |
1408 | 1408 |
1409 | 1409 |
1410 LocationSummary* GuardFieldClassInstr::MakeLocationSummary(Isolate* isolate, | 1410 LocationSummary* GuardFieldClassInstr::MakeLocationSummary(Zone* zone, |
1411 bool opt) const { | 1411 bool opt) const { |
1412 const intptr_t kNumInputs = 1; | 1412 const intptr_t kNumInputs = 1; |
1413 | 1413 |
1414 const intptr_t value_cid = value()->Type()->ToCid(); | 1414 const intptr_t value_cid = value()->Type()->ToCid(); |
1415 const intptr_t field_cid = field().guarded_cid(); | 1415 const intptr_t field_cid = field().guarded_cid(); |
1416 | 1416 |
1417 const bool emit_full_guard = !opt || (field_cid == kIllegalCid); | 1417 const bool emit_full_guard = !opt || (field_cid == kIllegalCid); |
1418 const bool needs_value_cid_temp_reg = | 1418 const bool needs_value_cid_temp_reg = |
1419 (value_cid == kDynamicCid) && (emit_full_guard || (field_cid != kSmiCid)); | 1419 (value_cid == kDynamicCid) && (emit_full_guard || (field_cid != kSmiCid)); |
1420 const bool needs_field_temp_reg = emit_full_guard; | 1420 const bool needs_field_temp_reg = emit_full_guard; |
1421 | 1421 |
1422 intptr_t num_temps = 0; | 1422 intptr_t num_temps = 0; |
1423 if (needs_value_cid_temp_reg) { | 1423 if (needs_value_cid_temp_reg) { |
1424 num_temps++; | 1424 num_temps++; |
1425 } | 1425 } |
1426 if (needs_field_temp_reg) { | 1426 if (needs_field_temp_reg) { |
1427 num_temps++; | 1427 num_temps++; |
1428 } | 1428 } |
1429 | 1429 |
1430 LocationSummary* summary = new(isolate) LocationSummary( | 1430 LocationSummary* summary = new(zone) LocationSummary( |
1431 isolate, kNumInputs, num_temps, LocationSummary::kNoCall); | 1431 zone, kNumInputs, num_temps, LocationSummary::kNoCall); |
1432 summary->set_in(0, Location::RequiresRegister()); | 1432 summary->set_in(0, Location::RequiresRegister()); |
1433 | 1433 |
1434 for (intptr_t i = 0; i < num_temps; i++) { | 1434 for (intptr_t i = 0; i < num_temps; i++) { |
1435 summary->set_temp(i, Location::RequiresRegister()); | 1435 summary->set_temp(i, Location::RequiresRegister()); |
1436 } | 1436 } |
1437 | 1437 |
1438 | 1438 |
1439 return summary; | 1439 return summary; |
1440 } | 1440 } |
1441 | 1441 |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1555 } else { | 1555 } else { |
1556 // Both value's and field's class id is known. | 1556 // Both value's and field's class id is known. |
1557 ASSERT((value_cid != field_cid) && (value_cid != nullability)); | 1557 ASSERT((value_cid != field_cid) && (value_cid != nullability)); |
1558 __ jmp(fail); | 1558 __ jmp(fail); |
1559 } | 1559 } |
1560 } | 1560 } |
1561 __ Bind(&ok); | 1561 __ Bind(&ok); |
1562 } | 1562 } |
1563 | 1563 |
1564 | 1564 |
1565 LocationSummary* GuardFieldLengthInstr::MakeLocationSummary(Isolate* isolate, | 1565 LocationSummary* GuardFieldLengthInstr::MakeLocationSummary(Zone* zone, |
1566 bool opt) const { | 1566 bool opt) const { |
1567 const intptr_t kNumInputs = 1; | 1567 const intptr_t kNumInputs = 1; |
1568 if (!opt || (field().guarded_list_length() == Field::kUnknownFixedLength)) { | 1568 if (!opt || (field().guarded_list_length() == Field::kUnknownFixedLength)) { |
1569 const intptr_t kNumTemps = 3; | 1569 const intptr_t kNumTemps = 3; |
1570 LocationSummary* summary = new(isolate) LocationSummary( | 1570 LocationSummary* summary = new(zone) LocationSummary( |
1571 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 1571 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
1572 summary->set_in(0, Location::RequiresRegister()); | 1572 summary->set_in(0, Location::RequiresRegister()); |
1573 // We need temporaries for field object, length offset and expected length. | 1573 // We need temporaries for field object, length offset and expected length. |
1574 summary->set_temp(0, Location::RequiresRegister()); | 1574 summary->set_temp(0, Location::RequiresRegister()); |
1575 summary->set_temp(1, Location::RequiresRegister()); | 1575 summary->set_temp(1, Location::RequiresRegister()); |
1576 summary->set_temp(2, Location::RequiresRegister()); | 1576 summary->set_temp(2, Location::RequiresRegister()); |
1577 return summary; | 1577 return summary; |
1578 } else { | 1578 } else { |
1579 LocationSummary* summary = new(isolate) LocationSummary( | 1579 LocationSummary* summary = new(zone) LocationSummary( |
1580 isolate, kNumInputs, 0, LocationSummary::kNoCall); | 1580 zone, kNumInputs, 0, LocationSummary::kNoCall); |
1581 summary->set_in(0, Location::RequiresRegister()); | 1581 summary->set_in(0, Location::RequiresRegister()); |
1582 return summary; | 1582 return summary; |
1583 } | 1583 } |
1584 UNREACHABLE(); | 1584 UNREACHABLE(); |
1585 } | 1585 } |
1586 | 1586 |
1587 | 1587 |
1588 void GuardFieldLengthInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 1588 void GuardFieldLengthInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
1589 if (field().guarded_list_length() == Field::kNoFixedLength) { | 1589 if (field().guarded_list_length() == Field::kNoFixedLength) { |
1590 ASSERT(!compiler->is_optimizing()); | 1590 ASSERT(!compiler->is_optimizing()); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1709 } | 1709 } |
1710 } | 1710 } |
1711 | 1711 |
1712 private: | 1712 private: |
1713 Instruction* instruction_; | 1713 Instruction* instruction_; |
1714 const Class& cls_; | 1714 const Class& cls_; |
1715 const Register result_; | 1715 const Register result_; |
1716 }; | 1716 }; |
1717 | 1717 |
1718 | 1718 |
1719 LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(Isolate* isolate, | 1719 LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(Zone* zone, |
1720 bool opt) const { | 1720 bool opt) const { |
1721 const intptr_t kNumInputs = 2; | 1721 const intptr_t kNumInputs = 2; |
1722 const intptr_t kNumTemps = | 1722 const intptr_t kNumTemps = |
1723 (IsUnboxedStore() && opt) ? 2 : | 1723 (IsUnboxedStore() && opt) ? 2 : |
1724 ((IsPotentialUnboxedStore()) ? 3 : 0); | 1724 ((IsPotentialUnboxedStore()) ? 3 : 0); |
1725 LocationSummary* summary = new(isolate) LocationSummary( | 1725 LocationSummary* summary = new(zone) LocationSummary( |
1726 isolate, kNumInputs, kNumTemps, | 1726 zone, kNumInputs, kNumTemps, |
1727 ((IsUnboxedStore() && opt && is_potential_unboxed_initialization_) || | 1727 ((IsUnboxedStore() && opt && is_potential_unboxed_initialization_) || |
1728 IsPotentialUnboxedStore()) | 1728 IsPotentialUnboxedStore()) |
1729 ? LocationSummary::kCallOnSlowPath | 1729 ? LocationSummary::kCallOnSlowPath |
1730 : LocationSummary::kNoCall); | 1730 : LocationSummary::kNoCall); |
1731 | 1731 |
1732 summary->set_in(0, Location::RequiresRegister()); | 1732 summary->set_in(0, Location::RequiresRegister()); |
1733 if (IsUnboxedStore() && opt) { | 1733 if (IsUnboxedStore() && opt) { |
1734 summary->set_in(1, Location::RequiresFpuRegister()); | 1734 summary->set_in(1, Location::RequiresFpuRegister()); |
1735 summary->set_temp(0, Location::RequiresRegister()); | 1735 summary->set_temp(0, Location::RequiresRegister()); |
1736 summary->set_temp(1, Location::RequiresRegister()); | 1736 summary->set_temp(1, Location::RequiresRegister()); |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1940 value_reg, | 1940 value_reg, |
1941 is_object_reference_initialization_ ? | 1941 is_object_reference_initialization_ ? |
1942 Assembler::kEmptyOrSmiOrNull : | 1942 Assembler::kEmptyOrSmiOrNull : |
1943 Assembler::kHeapObjectOrSmi); | 1943 Assembler::kHeapObjectOrSmi); |
1944 } | 1944 } |
1945 } | 1945 } |
1946 __ Bind(&skip_store); | 1946 __ Bind(&skip_store); |
1947 } | 1947 } |
1948 | 1948 |
1949 | 1949 |
1950 LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Isolate* isolate, | 1950 LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Zone* zone, |
1951 bool opt) const { | 1951 bool opt) const { |
1952 const intptr_t kNumInputs = 1; | 1952 const intptr_t kNumInputs = 1; |
1953 const intptr_t kNumTemps = 0; | 1953 const intptr_t kNumTemps = 0; |
1954 LocationSummary* summary = new(isolate) LocationSummary( | 1954 LocationSummary* summary = new(zone) LocationSummary( |
1955 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 1955 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
1956 summary->set_in(0, Location::RequiresRegister()); | 1956 summary->set_in(0, Location::RequiresRegister()); |
1957 summary->set_out(0, Location::RequiresRegister()); | 1957 summary->set_out(0, Location::RequiresRegister()); |
1958 return summary; | 1958 return summary; |
1959 } | 1959 } |
1960 | 1960 |
1961 | 1961 |
1962 // When the parser is building an implicit static getter for optimization, | 1962 // When the parser is building an implicit static getter for optimization, |
1963 // it can generate a function body where deoptimization ids do not line up | 1963 // it can generate a function body where deoptimization ids do not line up |
1964 // with the unoptimized code. | 1964 // with the unoptimized code. |
1965 // | 1965 // |
1966 // This is safe only so long as LoadStaticFieldInstr cannot deoptimize. | 1966 // This is safe only so long as LoadStaticFieldInstr cannot deoptimize. |
1967 void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 1967 void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
1968 Register field = locs()->in(0).reg(); | 1968 Register field = locs()->in(0).reg(); |
1969 Register result = locs()->out(0).reg(); | 1969 Register result = locs()->out(0).reg(); |
1970 __ movq(result, FieldAddress(field, Field::value_offset())); | 1970 __ movq(result, FieldAddress(field, Field::value_offset())); |
1971 } | 1971 } |
1972 | 1972 |
1973 | 1973 |
1974 LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Isolate* isolate, | 1974 LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Zone* zone, |
1975 bool opt) const { | 1975 bool opt) const { |
1976 LocationSummary* locs = new(isolate) LocationSummary( | 1976 LocationSummary* locs = new(zone) LocationSummary( |
1977 isolate, 1, 1, LocationSummary::kNoCall); | 1977 zone, 1, 1, LocationSummary::kNoCall); |
1978 locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister() | 1978 locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister() |
1979 : Location::RequiresRegister()); | 1979 : Location::RequiresRegister()); |
1980 locs->set_temp(0, Location::RequiresRegister()); | 1980 locs->set_temp(0, Location::RequiresRegister()); |
1981 return locs; | 1981 return locs; |
1982 } | 1982 } |
1983 | 1983 |
1984 | 1984 |
1985 void StoreStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 1985 void StoreStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
1986 Register value = locs()->in(0).reg(); | 1986 Register value = locs()->in(0).reg(); |
1987 Register temp = locs()->temp(0).reg(); | 1987 Register temp = locs()->temp(0).reg(); |
1988 | 1988 |
1989 __ LoadObject(temp, field(), PP); | 1989 __ LoadObject(temp, field(), PP); |
1990 if (this->value()->NeedsStoreBuffer()) { | 1990 if (this->value()->NeedsStoreBuffer()) { |
1991 __ StoreIntoObject(temp, | 1991 __ StoreIntoObject(temp, |
1992 FieldAddress(temp, Field::value_offset()), value, CanValueBeSmi()); | 1992 FieldAddress(temp, Field::value_offset()), value, CanValueBeSmi()); |
1993 } else { | 1993 } else { |
1994 __ StoreIntoObjectNoBarrier( | 1994 __ StoreIntoObjectNoBarrier( |
1995 temp, FieldAddress(temp, Field::value_offset()), value); | 1995 temp, FieldAddress(temp, Field::value_offset()), value); |
1996 } | 1996 } |
1997 } | 1997 } |
1998 | 1998 |
1999 | 1999 |
2000 LocationSummary* InstanceOfInstr::MakeLocationSummary(Isolate* isolate, | 2000 LocationSummary* InstanceOfInstr::MakeLocationSummary(Zone* zone, |
2001 bool opt) const { | 2001 bool opt) const { |
2002 const intptr_t kNumInputs = 3; | 2002 const intptr_t kNumInputs = 3; |
2003 const intptr_t kNumTemps = 0; | 2003 const intptr_t kNumTemps = 0; |
2004 LocationSummary* summary = new(isolate) LocationSummary( | 2004 LocationSummary* summary = new(zone) LocationSummary( |
2005 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); | 2005 zone, kNumInputs, kNumTemps, LocationSummary::kCall); |
2006 summary->set_in(0, Location::RegisterLocation(RAX)); | 2006 summary->set_in(0, Location::RegisterLocation(RAX)); |
2007 summary->set_in(1, Location::RegisterLocation(RCX)); | 2007 summary->set_in(1, Location::RegisterLocation(RCX)); |
2008 summary->set_in(2, Location::RegisterLocation(RDX)); | 2008 summary->set_in(2, Location::RegisterLocation(RDX)); |
2009 summary->set_out(0, Location::RegisterLocation(RAX)); | 2009 summary->set_out(0, Location::RegisterLocation(RAX)); |
2010 return summary; | 2010 return summary; |
2011 } | 2011 } |
2012 | 2012 |
2013 | 2013 |
2014 void InstanceOfInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2014 void InstanceOfInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2015 ASSERT(locs()->in(0).reg() == RAX); // Value. | 2015 ASSERT(locs()->in(0).reg() == RAX); // Value. |
2016 ASSERT(locs()->in(1).reg() == RCX); // Instantiator. | 2016 ASSERT(locs()->in(1).reg() == RCX); // Instantiator. |
2017 ASSERT(locs()->in(2).reg() == RDX); // Instantiator type arguments. | 2017 ASSERT(locs()->in(2).reg() == RDX); // Instantiator type arguments. |
2018 | 2018 |
2019 compiler->GenerateInstanceOf(token_pos(), | 2019 compiler->GenerateInstanceOf(token_pos(), |
2020 deopt_id(), | 2020 deopt_id(), |
2021 type(), | 2021 type(), |
2022 negate_result(), | 2022 negate_result(), |
2023 locs()); | 2023 locs()); |
2024 ASSERT(locs()->out(0).reg() == RAX); | 2024 ASSERT(locs()->out(0).reg() == RAX); |
2025 } | 2025 } |
2026 | 2026 |
2027 | 2027 |
2028 // TODO(srdjan): In case of constant inputs make CreateArray kNoCall and | 2028 // TODO(srdjan): In case of constant inputs make CreateArray kNoCall and |
2029 // use slow path stub. | 2029 // use slow path stub. |
2030 LocationSummary* CreateArrayInstr::MakeLocationSummary(Isolate* isolate, | 2030 LocationSummary* CreateArrayInstr::MakeLocationSummary(Zone* zone, |
2031 bool opt) const { | 2031 bool opt) const { |
2032 const intptr_t kNumInputs = 2; | 2032 const intptr_t kNumInputs = 2; |
2033 const intptr_t kNumTemps = 0; | 2033 const intptr_t kNumTemps = 0; |
2034 LocationSummary* locs = new(isolate) LocationSummary( | 2034 LocationSummary* locs = new(zone) LocationSummary( |
2035 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); | 2035 zone, kNumInputs, kNumTemps, LocationSummary::kCall); |
2036 locs->set_in(0, Location::RegisterLocation(RBX)); | 2036 locs->set_in(0, Location::RegisterLocation(RBX)); |
2037 locs->set_in(1, Location::RegisterLocation(R10)); | 2037 locs->set_in(1, Location::RegisterLocation(R10)); |
2038 locs->set_out(0, Location::RegisterLocation(RAX)); | 2038 locs->set_out(0, Location::RegisterLocation(RAX)); |
2039 return locs; | 2039 return locs; |
2040 } | 2040 } |
2041 | 2041 |
2042 | 2042 |
2043 // Inlines array allocation for known constant values. | 2043 // Inlines array allocation for known constant values. |
2044 static void InlineArrayAllocation(FlowGraphCompiler* compiler, | 2044 static void InlineArrayAllocation(FlowGraphCompiler* compiler, |
2045 intptr_t num_elements, | 2045 intptr_t num_elements, |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2132 compiler->GenerateCall(token_pos(), | 2132 compiler->GenerateCall(token_pos(), |
2133 &label, | 2133 &label, |
2134 RawPcDescriptors::kOther, | 2134 RawPcDescriptors::kOther, |
2135 locs()); | 2135 locs()); |
2136 compiler->AddStubCallTarget(stub); | 2136 compiler->AddStubCallTarget(stub); |
2137 __ Bind(&done); | 2137 __ Bind(&done); |
2138 ASSERT(locs()->out(0).reg() == kResultReg); | 2138 ASSERT(locs()->out(0).reg() == kResultReg); |
2139 } | 2139 } |
2140 | 2140 |
2141 | 2141 |
2142 LocationSummary* LoadFieldInstr::MakeLocationSummary(Isolate* isolate, | 2142 LocationSummary* LoadFieldInstr::MakeLocationSummary(Zone* zone, |
2143 bool opt) const { | 2143 bool opt) const { |
2144 const intptr_t kNumInputs = 1; | 2144 const intptr_t kNumInputs = 1; |
2145 const intptr_t kNumTemps = | 2145 const intptr_t kNumTemps = |
2146 (IsUnboxedLoad() && opt) ? 1 : | 2146 (IsUnboxedLoad() && opt) ? 1 : |
2147 ((IsPotentialUnboxedLoad()) ? 2 : 0); | 2147 ((IsPotentialUnboxedLoad()) ? 2 : 0); |
2148 LocationSummary* locs = new(isolate) LocationSummary( | 2148 LocationSummary* locs = new(zone) LocationSummary( |
2149 isolate, kNumInputs, kNumTemps, | 2149 zone, kNumInputs, kNumTemps, |
2150 (opt && !IsPotentialUnboxedLoad()) | 2150 (opt && !IsPotentialUnboxedLoad()) |
2151 ? LocationSummary::kNoCall | 2151 ? LocationSummary::kNoCall |
2152 : LocationSummary::kCallOnSlowPath); | 2152 : LocationSummary::kCallOnSlowPath); |
2153 | 2153 |
2154 locs->set_in(0, Location::RequiresRegister()); | 2154 locs->set_in(0, Location::RequiresRegister()); |
2155 | 2155 |
2156 if (IsUnboxedLoad() && opt) { | 2156 if (IsUnboxedLoad() && opt) { |
2157 locs->set_temp(0, Location::RequiresRegister()); | 2157 locs->set_temp(0, Location::RequiresRegister()); |
2158 } else if (IsPotentialUnboxedLoad()) { | 2158 } else if (IsPotentialUnboxedLoad()) { |
2159 locs->set_temp(0, opt ? Location::RequiresFpuRegister() | 2159 locs->set_temp(0, opt ? Location::RequiresFpuRegister() |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2257 __ jmp(&done); | 2257 __ jmp(&done); |
2258 } | 2258 } |
2259 | 2259 |
2260 __ Bind(&load_pointer); | 2260 __ Bind(&load_pointer); |
2261 } | 2261 } |
2262 __ movq(result, FieldAddress(instance_reg, offset_in_bytes())); | 2262 __ movq(result, FieldAddress(instance_reg, offset_in_bytes())); |
2263 __ Bind(&done); | 2263 __ Bind(&done); |
2264 } | 2264 } |
2265 | 2265 |
2266 | 2266 |
2267 LocationSummary* InstantiateTypeInstr::MakeLocationSummary(Isolate* isolate, | 2267 LocationSummary* InstantiateTypeInstr::MakeLocationSummary(Zone* zone, |
2268 bool opt) const { | 2268 bool opt) const { |
2269 const intptr_t kNumInputs = 1; | 2269 const intptr_t kNumInputs = 1; |
2270 const intptr_t kNumTemps = 0; | 2270 const intptr_t kNumTemps = 0; |
2271 LocationSummary* locs = new(isolate) LocationSummary( | 2271 LocationSummary* locs = new(zone) LocationSummary( |
2272 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); | 2272 zone, kNumInputs, kNumTemps, LocationSummary::kCall); |
2273 locs->set_in(0, Location::RegisterLocation(RAX)); | 2273 locs->set_in(0, Location::RegisterLocation(RAX)); |
2274 locs->set_out(0, Location::RegisterLocation(RAX)); | 2274 locs->set_out(0, Location::RegisterLocation(RAX)); |
2275 return locs; | 2275 return locs; |
2276 } | 2276 } |
2277 | 2277 |
2278 | 2278 |
2279 void InstantiateTypeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2279 void InstantiateTypeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2280 Register instantiator_reg = locs()->in(0).reg(); | 2280 Register instantiator_reg = locs()->in(0).reg(); |
2281 Register result_reg = locs()->out(0).reg(); | 2281 Register result_reg = locs()->out(0).reg(); |
2282 | 2282 |
2283 // 'instantiator_reg' is the instantiator TypeArguments object (or null). | 2283 // 'instantiator_reg' is the instantiator TypeArguments object (or null). |
2284 // A runtime call to instantiate the type is required. | 2284 // A runtime call to instantiate the type is required. |
2285 __ PushObject(Object::null_object(), PP); // Make room for the result. | 2285 __ PushObject(Object::null_object(), PP); // Make room for the result. |
2286 __ PushObject(type(), PP); | 2286 __ PushObject(type(), PP); |
2287 __ pushq(instantiator_reg); // Push instantiator type arguments. | 2287 __ pushq(instantiator_reg); // Push instantiator type arguments. |
2288 compiler->GenerateRuntimeCall(token_pos(), | 2288 compiler->GenerateRuntimeCall(token_pos(), |
2289 deopt_id(), | 2289 deopt_id(), |
2290 kInstantiateTypeRuntimeEntry, | 2290 kInstantiateTypeRuntimeEntry, |
2291 2, | 2291 2, |
2292 locs()); | 2292 locs()); |
2293 __ Drop(2); // Drop instantiator and uninstantiated type. | 2293 __ Drop(2); // Drop instantiator and uninstantiated type. |
2294 __ popq(result_reg); // Pop instantiated type. | 2294 __ popq(result_reg); // Pop instantiated type. |
2295 ASSERT(instantiator_reg == result_reg); | 2295 ASSERT(instantiator_reg == result_reg); |
2296 } | 2296 } |
2297 | 2297 |
2298 | 2298 |
2299 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary( | 2299 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary( |
2300 Isolate* isolate, bool opt) const { | 2300 Zone* zone, bool opt) const { |
2301 const intptr_t kNumInputs = 1; | 2301 const intptr_t kNumInputs = 1; |
2302 const intptr_t kNumTemps = 0; | 2302 const intptr_t kNumTemps = 0; |
2303 LocationSummary* locs = new(isolate) LocationSummary( | 2303 LocationSummary* locs = new(zone) LocationSummary( |
2304 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); | 2304 zone, kNumInputs, kNumTemps, LocationSummary::kCall); |
2305 locs->set_in(0, Location::RegisterLocation(RAX)); | 2305 locs->set_in(0, Location::RegisterLocation(RAX)); |
2306 locs->set_out(0, Location::RegisterLocation(RAX)); | 2306 locs->set_out(0, Location::RegisterLocation(RAX)); |
2307 return locs; | 2307 return locs; |
2308 } | 2308 } |
2309 | 2309 |
2310 | 2310 |
2311 void InstantiateTypeArgumentsInstr::EmitNativeCode( | 2311 void InstantiateTypeArgumentsInstr::EmitNativeCode( |
2312 FlowGraphCompiler* compiler) { | 2312 FlowGraphCompiler* compiler) { |
2313 Register instantiator_reg = locs()->in(0).reg(); | 2313 Register instantiator_reg = locs()->in(0).reg(); |
2314 Register result_reg = locs()->out(0).reg(); | 2314 Register result_reg = locs()->out(0).reg(); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2362 2, | 2362 2, |
2363 locs()); | 2363 locs()); |
2364 __ Drop(2); // Drop instantiator and uninstantiated type arguments. | 2364 __ Drop(2); // Drop instantiator and uninstantiated type arguments. |
2365 __ popq(result_reg); // Pop instantiated type arguments. | 2365 __ popq(result_reg); // Pop instantiated type arguments. |
2366 __ Bind(&type_arguments_instantiated); | 2366 __ Bind(&type_arguments_instantiated); |
2367 ASSERT(instantiator_reg == result_reg); | 2367 ASSERT(instantiator_reg == result_reg); |
2368 } | 2368 } |
2369 | 2369 |
2370 | 2370 |
2371 LocationSummary* AllocateUninitializedContextInstr::MakeLocationSummary( | 2371 LocationSummary* AllocateUninitializedContextInstr::MakeLocationSummary( |
2372 Isolate* isolate, | 2372 Zone* zone, |
2373 bool opt) const { | 2373 bool opt) const { |
2374 ASSERT(opt); | 2374 ASSERT(opt); |
2375 const intptr_t kNumInputs = 0; | 2375 const intptr_t kNumInputs = 0; |
2376 const intptr_t kNumTemps = 1; | 2376 const intptr_t kNumTemps = 1; |
2377 LocationSummary* locs = new(isolate) LocationSummary( | 2377 LocationSummary* locs = new(zone) LocationSummary( |
2378 isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath); | 2378 zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath); |
2379 locs->set_temp(0, Location::RegisterLocation(R10)); | 2379 locs->set_temp(0, Location::RegisterLocation(R10)); |
2380 locs->set_out(0, Location::RegisterLocation(RAX)); | 2380 locs->set_out(0, Location::RegisterLocation(RAX)); |
2381 return locs; | 2381 return locs; |
2382 } | 2382 } |
2383 | 2383 |
2384 | 2384 |
2385 class AllocateContextSlowPath : public SlowPathCode { | 2385 class AllocateContextSlowPath : public SlowPathCode { |
2386 public: | 2386 public: |
2387 explicit AllocateContextSlowPath( | 2387 explicit AllocateContextSlowPath( |
2388 AllocateUninitializedContextInstr* instruction) | 2388 AllocateUninitializedContextInstr* instruction) |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2430 temp); // end address | 2430 temp); // end address |
2431 | 2431 |
2432 // Setup up number of context variables field. | 2432 // Setup up number of context variables field. |
2433 __ movq(FieldAddress(result, Context::num_variables_offset()), | 2433 __ movq(FieldAddress(result, Context::num_variables_offset()), |
2434 Immediate(num_context_variables())); | 2434 Immediate(num_context_variables())); |
2435 | 2435 |
2436 __ Bind(slow_path->exit_label()); | 2436 __ Bind(slow_path->exit_label()); |
2437 } | 2437 } |
2438 | 2438 |
2439 | 2439 |
2440 LocationSummary* AllocateContextInstr::MakeLocationSummary(Isolate* isolate, | 2440 LocationSummary* AllocateContextInstr::MakeLocationSummary(Zone* zone, |
2441 bool opt) const { | 2441 bool opt) const { |
2442 const intptr_t kNumInputs = 0; | 2442 const intptr_t kNumInputs = 0; |
2443 const intptr_t kNumTemps = 1; | 2443 const intptr_t kNumTemps = 1; |
2444 LocationSummary* locs = new(isolate) LocationSummary( | 2444 LocationSummary* locs = new(zone) LocationSummary( |
2445 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); | 2445 zone, kNumInputs, kNumTemps, LocationSummary::kCall); |
2446 locs->set_temp(0, Location::RegisterLocation(R10)); | 2446 locs->set_temp(0, Location::RegisterLocation(R10)); |
2447 locs->set_out(0, Location::RegisterLocation(RAX)); | 2447 locs->set_out(0, Location::RegisterLocation(RAX)); |
2448 return locs; | 2448 return locs; |
2449 } | 2449 } |
2450 | 2450 |
2451 | 2451 |
2452 void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2452 void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2453 ASSERT(locs()->temp(0).reg() == R10); | 2453 ASSERT(locs()->temp(0).reg() == R10); |
2454 ASSERT(locs()->out(0).reg() == RAX); | 2454 ASSERT(locs()->out(0).reg() == RAX); |
2455 StubCode* stub_code = compiler->isolate()->stub_code(); | 2455 StubCode* stub_code = compiler->isolate()->stub_code(); |
2456 | 2456 |
2457 __ LoadImmediate(R10, Immediate(num_context_variables()), PP); | 2457 __ LoadImmediate(R10, Immediate(num_context_variables()), PP); |
2458 const ExternalLabel label(stub_code->AllocateContextEntryPoint()); | 2458 const ExternalLabel label(stub_code->AllocateContextEntryPoint()); |
2459 compiler->GenerateCall(token_pos(), | 2459 compiler->GenerateCall(token_pos(), |
2460 &label, | 2460 &label, |
2461 RawPcDescriptors::kOther, | 2461 RawPcDescriptors::kOther, |
2462 locs()); | 2462 locs()); |
2463 } | 2463 } |
2464 | 2464 |
2465 | 2465 |
2466 LocationSummary* InitStaticFieldInstr::MakeLocationSummary(Isolate* isolate, | 2466 LocationSummary* InitStaticFieldInstr::MakeLocationSummary(Zone* zone, |
2467 bool opt) const { | 2467 bool opt) const { |
2468 const intptr_t kNumInputs = 1; | 2468 const intptr_t kNumInputs = 1; |
2469 const intptr_t kNumTemps = 1; | 2469 const intptr_t kNumTemps = 1; |
2470 LocationSummary* locs = new(isolate) LocationSummary( | 2470 LocationSummary* locs = new(zone) LocationSummary( |
2471 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); | 2471 zone, kNumInputs, kNumTemps, LocationSummary::kCall); |
2472 locs->set_in(0, Location::RegisterLocation(RAX)); | 2472 locs->set_in(0, Location::RegisterLocation(RAX)); |
2473 locs->set_temp(0, Location::RegisterLocation(RCX)); | 2473 locs->set_temp(0, Location::RegisterLocation(RCX)); |
2474 return locs; | 2474 return locs; |
2475 } | 2475 } |
2476 | 2476 |
2477 | 2477 |
2478 void InitStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2478 void InitStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2479 Register field = locs()->in(0).reg(); | 2479 Register field = locs()->in(0).reg(); |
2480 Register temp = locs()->temp(0).reg(); | 2480 Register temp = locs()->temp(0).reg(); |
2481 | 2481 |
(...skipping 12 matching lines...) Expand all Loading... |
2494 compiler->GenerateRuntimeCall(token_pos(), | 2494 compiler->GenerateRuntimeCall(token_pos(), |
2495 deopt_id(), | 2495 deopt_id(), |
2496 kInitStaticFieldRuntimeEntry, | 2496 kInitStaticFieldRuntimeEntry, |
2497 1, | 2497 1, |
2498 locs()); | 2498 locs()); |
2499 __ Drop(2); // Remove argument and unused result. | 2499 __ Drop(2); // Remove argument and unused result. |
2500 __ Bind(&no_call); | 2500 __ Bind(&no_call); |
2501 } | 2501 } |
2502 | 2502 |
2503 | 2503 |
2504 LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate, | 2504 LocationSummary* CloneContextInstr::MakeLocationSummary(Zone* zone, |
2505 bool opt) const { | 2505 bool opt) const { |
2506 const intptr_t kNumInputs = 1; | 2506 const intptr_t kNumInputs = 1; |
2507 const intptr_t kNumTemps = 0; | 2507 const intptr_t kNumTemps = 0; |
2508 LocationSummary* locs = new(isolate) LocationSummary( | 2508 LocationSummary* locs = new(zone) LocationSummary( |
2509 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); | 2509 zone, kNumInputs, kNumTemps, LocationSummary::kCall); |
2510 locs->set_in(0, Location::RegisterLocation(RAX)); | 2510 locs->set_in(0, Location::RegisterLocation(RAX)); |
2511 locs->set_out(0, Location::RegisterLocation(RAX)); | 2511 locs->set_out(0, Location::RegisterLocation(RAX)); |
2512 return locs; | 2512 return locs; |
2513 } | 2513 } |
2514 | 2514 |
2515 | 2515 |
2516 void CloneContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2516 void CloneContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2517 Register context_value = locs()->in(0).reg(); | 2517 Register context_value = locs()->in(0).reg(); |
2518 Register result = locs()->out(0).reg(); | 2518 Register result = locs()->out(0).reg(); |
2519 | 2519 |
2520 __ PushObject(Object::null_object(), PP); // Make room for the result. | 2520 __ PushObject(Object::null_object(), PP); // Make room for the result. |
2521 __ pushq(context_value); | 2521 __ pushq(context_value); |
2522 compiler->GenerateRuntimeCall(token_pos(), | 2522 compiler->GenerateRuntimeCall(token_pos(), |
2523 deopt_id(), | 2523 deopt_id(), |
2524 kCloneContextRuntimeEntry, | 2524 kCloneContextRuntimeEntry, |
2525 1, | 2525 1, |
2526 locs()); | 2526 locs()); |
2527 __ popq(result); // Remove argument. | 2527 __ popq(result); // Remove argument. |
2528 __ popq(result); // Get result (cloned context). | 2528 __ popq(result); // Get result (cloned context). |
2529 } | 2529 } |
2530 | 2530 |
2531 | 2531 |
2532 LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Isolate* isolate, | 2532 LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Zone* zone, |
2533 bool opt) const { | 2533 bool opt) const { |
2534 UNREACHABLE(); | 2534 UNREACHABLE(); |
2535 return NULL; | 2535 return NULL; |
2536 } | 2536 } |
2537 | 2537 |
2538 | 2538 |
2539 void CatchBlockEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2539 void CatchBlockEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2540 __ Bind(compiler->GetJumpLabel(this)); | 2540 __ Bind(compiler->GetJumpLabel(this)); |
2541 compiler->AddExceptionHandler(catch_try_index(), | 2541 compiler->AddExceptionHandler(catch_try_index(), |
2542 try_index(), | 2542 try_index(), |
(...skipping 17 matching lines...) Expand all Loading... |
2560 | 2560 |
2561 // Restore stack and initialize the two exception variables: | 2561 // Restore stack and initialize the two exception variables: |
2562 // exception and stack trace variables. | 2562 // exception and stack trace variables. |
2563 __ movq(Address(RBP, exception_var().index() * kWordSize), | 2563 __ movq(Address(RBP, exception_var().index() * kWordSize), |
2564 kExceptionObjectReg); | 2564 kExceptionObjectReg); |
2565 __ movq(Address(RBP, stacktrace_var().index() * kWordSize), | 2565 __ movq(Address(RBP, stacktrace_var().index() * kWordSize), |
2566 kStackTraceObjectReg); | 2566 kStackTraceObjectReg); |
2567 } | 2567 } |
2568 | 2568 |
2569 | 2569 |
2570 LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(Isolate* isolate, | 2570 LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(Zone* zone, |
2571 bool opt) const { | 2571 bool opt) const { |
2572 const intptr_t kNumInputs = 0; | 2572 const intptr_t kNumInputs = 0; |
2573 const intptr_t kNumTemps = 1; | 2573 const intptr_t kNumTemps = 1; |
2574 LocationSummary* summary = new(isolate) LocationSummary( | 2574 LocationSummary* summary = new(zone) LocationSummary( |
2575 isolate, kNumInputs, | 2575 zone, kNumInputs, |
2576 kNumTemps, | 2576 kNumTemps, |
2577 LocationSummary::kCallOnSlowPath); | 2577 LocationSummary::kCallOnSlowPath); |
2578 summary->set_temp(0, Location::RequiresRegister()); | 2578 summary->set_temp(0, Location::RequiresRegister()); |
2579 return summary; | 2579 return summary; |
2580 } | 2580 } |
2581 | 2581 |
2582 | 2582 |
2583 class CheckStackOverflowSlowPath : public SlowPathCode { | 2583 class CheckStackOverflowSlowPath : public SlowPathCode { |
2584 public: | 2584 public: |
2585 explicit CheckStackOverflowSlowPath(CheckStackOverflowInstr* instruction) | 2585 explicit CheckStackOverflowSlowPath(CheckStackOverflowInstr* instruction) |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2790 } | 2790 } |
2791 } | 2791 } |
2792 | 2792 |
2793 | 2793 |
2794 static bool CanBeImmediate(const Object& constant) { | 2794 static bool CanBeImmediate(const Object& constant) { |
2795 return constant.IsSmi() && | 2795 return constant.IsSmi() && |
2796 Immediate(reinterpret_cast<int64_t>(constant.raw())).is_int32(); | 2796 Immediate(reinterpret_cast<int64_t>(constant.raw())).is_int32(); |
2797 } | 2797 } |
2798 | 2798 |
2799 | 2799 |
2800 LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Isolate* isolate, | 2800 LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Zone* zone, |
2801 bool opt) const { | 2801 bool opt) const { |
2802 const intptr_t kNumInputs = 2; | 2802 const intptr_t kNumInputs = 2; |
2803 | 2803 |
2804 ConstantInstr* right_constant = right()->definition()->AsConstant(); | 2804 ConstantInstr* right_constant = right()->definition()->AsConstant(); |
2805 if ((right_constant != NULL) && | 2805 if ((right_constant != NULL) && |
2806 (op_kind() != Token::kTRUNCDIV) && | 2806 (op_kind() != Token::kTRUNCDIV) && |
2807 (op_kind() != Token::kSHL) && | 2807 (op_kind() != Token::kSHL) && |
2808 (op_kind() != Token::kMUL) && | 2808 (op_kind() != Token::kMUL) && |
2809 (op_kind() != Token::kMOD) && | 2809 (op_kind() != Token::kMOD) && |
2810 CanBeImmediate(right_constant->value())) { | 2810 CanBeImmediate(right_constant->value())) { |
2811 const intptr_t kNumTemps = 0; | 2811 const intptr_t kNumTemps = 0; |
2812 LocationSummary* summary = new(isolate) LocationSummary( | 2812 LocationSummary* summary = new(zone) LocationSummary( |
2813 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 2813 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
2814 summary->set_in(0, Location::RequiresRegister()); | 2814 summary->set_in(0, Location::RequiresRegister()); |
2815 summary->set_in(1, Location::Constant(right_constant)); | 2815 summary->set_in(1, Location::Constant(right_constant)); |
2816 summary->set_out(0, Location::SameAsFirstInput()); | 2816 summary->set_out(0, Location::SameAsFirstInput()); |
2817 return summary; | 2817 return summary; |
2818 } | 2818 } |
2819 | 2819 |
2820 if (op_kind() == Token::kTRUNCDIV) { | 2820 if (op_kind() == Token::kTRUNCDIV) { |
2821 const intptr_t kNumTemps = 1; | 2821 const intptr_t kNumTemps = 1; |
2822 LocationSummary* summary = new(isolate) LocationSummary( | 2822 LocationSummary* summary = new(zone) LocationSummary( |
2823 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 2823 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
2824 if (RightIsPowerOfTwoConstant()) { | 2824 if (RightIsPowerOfTwoConstant()) { |
2825 summary->set_in(0, Location::RequiresRegister()); | 2825 summary->set_in(0, Location::RequiresRegister()); |
2826 ConstantInstr* right_constant = right()->definition()->AsConstant(); | 2826 ConstantInstr* right_constant = right()->definition()->AsConstant(); |
2827 summary->set_in(1, Location::Constant(right_constant)); | 2827 summary->set_in(1, Location::Constant(right_constant)); |
2828 summary->set_temp(0, Location::RequiresRegister()); | 2828 summary->set_temp(0, Location::RequiresRegister()); |
2829 summary->set_out(0, Location::SameAsFirstInput()); | 2829 summary->set_out(0, Location::SameAsFirstInput()); |
2830 } else { | 2830 } else { |
2831 // Both inputs must be writable because they will be untagged. | 2831 // Both inputs must be writable because they will be untagged. |
2832 summary->set_in(0, Location::RegisterLocation(RAX)); | 2832 summary->set_in(0, Location::RegisterLocation(RAX)); |
2833 summary->set_in(1, Location::WritableRegister()); | 2833 summary->set_in(1, Location::WritableRegister()); |
2834 summary->set_out(0, Location::SameAsFirstInput()); | 2834 summary->set_out(0, Location::SameAsFirstInput()); |
2835 // Will be used for sign extension and division. | 2835 // Will be used for sign extension and division. |
2836 summary->set_temp(0, Location::RegisterLocation(RDX)); | 2836 summary->set_temp(0, Location::RegisterLocation(RDX)); |
2837 } | 2837 } |
2838 return summary; | 2838 return summary; |
2839 } else if (op_kind() == Token::kMOD) { | 2839 } else if (op_kind() == Token::kMOD) { |
2840 const intptr_t kNumTemps = 1; | 2840 const intptr_t kNumTemps = 1; |
2841 LocationSummary* summary = new(isolate) LocationSummary( | 2841 LocationSummary* summary = new(zone) LocationSummary( |
2842 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 2842 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
2843 // Both inputs must be writable because they will be untagged. | 2843 // Both inputs must be writable because they will be untagged. |
2844 summary->set_in(0, Location::RegisterLocation(RDX)); | 2844 summary->set_in(0, Location::RegisterLocation(RDX)); |
2845 summary->set_in(1, Location::WritableRegister()); | 2845 summary->set_in(1, Location::WritableRegister()); |
2846 summary->set_out(0, Location::SameAsFirstInput()); | 2846 summary->set_out(0, Location::SameAsFirstInput()); |
2847 // Will be used for sign extension and division. | 2847 // Will be used for sign extension and division. |
2848 summary->set_temp(0, Location::RegisterLocation(RAX)); | 2848 summary->set_temp(0, Location::RegisterLocation(RAX)); |
2849 return summary; | 2849 return summary; |
2850 } else if (op_kind() == Token::kSHR) { | 2850 } else if (op_kind() == Token::kSHR) { |
2851 const intptr_t kNumTemps = 0; | 2851 const intptr_t kNumTemps = 0; |
2852 LocationSummary* summary = new(isolate) LocationSummary( | 2852 LocationSummary* summary = new(zone) LocationSummary( |
2853 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 2853 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
2854 summary->set_in(0, Location::RequiresRegister()); | 2854 summary->set_in(0, Location::RequiresRegister()); |
2855 summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX)); | 2855 summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX)); |
2856 summary->set_out(0, Location::SameAsFirstInput()); | 2856 summary->set_out(0, Location::SameAsFirstInput()); |
2857 return summary; | 2857 return summary; |
2858 } else if (op_kind() == Token::kSHL) { | 2858 } else if (op_kind() == Token::kSHL) { |
2859 const intptr_t kNumTemps = can_overflow() ? 1 : 0; | 2859 const intptr_t kNumTemps = can_overflow() ? 1 : 0; |
2860 LocationSummary* summary = new(isolate) LocationSummary( | 2860 LocationSummary* summary = new(zone) LocationSummary( |
2861 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 2861 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
2862 summary->set_in(0, Location::RequiresRegister()); | 2862 summary->set_in(0, Location::RequiresRegister()); |
2863 summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX)); | 2863 summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX)); |
2864 if (can_overflow()) { | 2864 if (can_overflow()) { |
2865 summary->set_temp(0, Location::RequiresRegister()); | 2865 summary->set_temp(0, Location::RequiresRegister()); |
2866 } | 2866 } |
2867 summary->set_out(0, Location::SameAsFirstInput()); | 2867 summary->set_out(0, Location::SameAsFirstInput()); |
2868 return summary; | 2868 return summary; |
2869 } else { | 2869 } else { |
2870 const intptr_t kNumTemps = 0; | 2870 const intptr_t kNumTemps = 0; |
2871 LocationSummary* summary = new(isolate) LocationSummary( | 2871 LocationSummary* summary = new(zone) LocationSummary( |
2872 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 2872 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
2873 summary->set_in(0, Location::RequiresRegister()); | 2873 summary->set_in(0, Location::RequiresRegister()); |
2874 ConstantInstr* constant = right()->definition()->AsConstant(); | 2874 ConstantInstr* constant = right()->definition()->AsConstant(); |
2875 if (constant != NULL) { | 2875 if (constant != NULL) { |
2876 summary->set_in(1, Location::RegisterOrSmiConstant(right())); | 2876 summary->set_in(1, Location::RegisterOrSmiConstant(right())); |
2877 } else { | 2877 } else { |
2878 summary->set_in(1, Location::PrefersRegister()); | 2878 summary->set_in(1, Location::PrefersRegister()); |
2879 } | 2879 } |
2880 summary->set_out(0, Location::SameAsFirstInput()); | 2880 summary->set_out(0, Location::SameAsFirstInput()); |
2881 return summary; | 2881 return summary; |
2882 } | 2882 } |
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3211 default: | 3211 default: |
3212 UNREACHABLE(); | 3212 UNREACHABLE(); |
3213 break; | 3213 break; |
3214 } | 3214 } |
3215 if (FLAG_throw_on_javascript_int_overflow) { | 3215 if (FLAG_throw_on_javascript_int_overflow) { |
3216 EmitJavascriptOverflowCheck(compiler, range(), deopt, result); | 3216 EmitJavascriptOverflowCheck(compiler, range(), deopt, result); |
3217 } | 3217 } |
3218 } | 3218 } |
3219 | 3219 |
3220 | 3220 |
3221 LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Isolate* isolate, | 3221 LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Zone* zone, |
3222 bool opt) const { | 3222 bool opt) const { |
3223 intptr_t left_cid = left()->Type()->ToCid(); | 3223 intptr_t left_cid = left()->Type()->ToCid(); |
3224 intptr_t right_cid = right()->Type()->ToCid(); | 3224 intptr_t right_cid = right()->Type()->ToCid(); |
3225 ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid)); | 3225 ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid)); |
3226 const intptr_t kNumInputs = 2; | 3226 const intptr_t kNumInputs = 2; |
3227 const bool need_temp = (left()->definition() != right()->definition()) | 3227 const bool need_temp = (left()->definition() != right()->definition()) |
3228 && (left_cid != kSmiCid) | 3228 && (left_cid != kSmiCid) |
3229 && (right_cid != kSmiCid); | 3229 && (right_cid != kSmiCid); |
3230 const intptr_t kNumTemps = need_temp ? 1 : 0; | 3230 const intptr_t kNumTemps = need_temp ? 1 : 0; |
3231 LocationSummary* summary = new(isolate) LocationSummary( | 3231 LocationSummary* summary = new(zone) LocationSummary( |
3232 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3232 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3233 summary->set_in(0, Location::RequiresRegister()); | 3233 summary->set_in(0, Location::RequiresRegister()); |
3234 summary->set_in(1, Location::RequiresRegister()); | 3234 summary->set_in(1, Location::RequiresRegister()); |
3235 if (need_temp) summary->set_temp(0, Location::RequiresRegister()); | 3235 if (need_temp) summary->set_temp(0, Location::RequiresRegister()); |
3236 return summary; | 3236 return summary; |
3237 } | 3237 } |
3238 | 3238 |
3239 | 3239 |
3240 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3240 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3241 Label* deopt = compiler->AddDeoptStub(deopt_id(), | 3241 Label* deopt = compiler->AddDeoptStub(deopt_id(), |
3242 ICData::kDeoptBinaryDoubleOp, | 3242 ICData::kDeoptBinaryDoubleOp, |
(...skipping 11 matching lines...) Expand all Loading... |
3254 } else { | 3254 } else { |
3255 Register temp = locs()->temp(0).reg(); | 3255 Register temp = locs()->temp(0).reg(); |
3256 __ movq(temp, left); | 3256 __ movq(temp, left); |
3257 __ orq(temp, right); | 3257 __ orq(temp, right); |
3258 __ testq(temp, Immediate(kSmiTagMask)); | 3258 __ testq(temp, Immediate(kSmiTagMask)); |
3259 } | 3259 } |
3260 __ j(ZERO, deopt); | 3260 __ j(ZERO, deopt); |
3261 } | 3261 } |
3262 | 3262 |
3263 | 3263 |
3264 LocationSummary* BoxInstr::MakeLocationSummary(Isolate* isolate, | 3264 LocationSummary* BoxInstr::MakeLocationSummary(Zone* zone, |
3265 bool opt) const { | 3265 bool opt) const { |
3266 const intptr_t kNumInputs = 1; | 3266 const intptr_t kNumInputs = 1; |
3267 const intptr_t kNumTemps = 0; | 3267 const intptr_t kNumTemps = 0; |
3268 LocationSummary* summary = new(isolate) LocationSummary( | 3268 LocationSummary* summary = new(zone) LocationSummary( |
3269 isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath); | 3269 zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath); |
3270 summary->set_in(0, Location::RequiresFpuRegister()); | 3270 summary->set_in(0, Location::RequiresFpuRegister()); |
3271 summary->set_out(0, Location::RequiresRegister()); | 3271 summary->set_out(0, Location::RequiresRegister()); |
3272 return summary; | 3272 return summary; |
3273 } | 3273 } |
3274 | 3274 |
3275 | 3275 |
3276 void BoxInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3276 void BoxInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3277 Register out_reg = locs()->out(0).reg(); | 3277 Register out_reg = locs()->out(0).reg(); |
3278 XmmRegister value = locs()->in(0).fpu_reg(); | 3278 XmmRegister value = locs()->in(0).fpu_reg(); |
3279 | 3279 |
3280 BoxAllocationSlowPath::Allocate( | 3280 BoxAllocationSlowPath::Allocate( |
3281 compiler, this, compiler->BoxClassFor(from_representation()), out_reg); | 3281 compiler, this, compiler->BoxClassFor(from_representation()), out_reg); |
3282 __ movsd(FieldAddress(out_reg, Double::value_offset()), value); | 3282 __ movsd(FieldAddress(out_reg, Double::value_offset()), value); |
3283 switch (from_representation()) { | 3283 switch (from_representation()) { |
3284 case kUnboxedDouble: | 3284 case kUnboxedDouble: |
3285 __ movsd(FieldAddress(out_reg, ValueOffset()), value); | 3285 __ movsd(FieldAddress(out_reg, ValueOffset()), value); |
3286 break; | 3286 break; |
3287 case kUnboxedFloat32x4: | 3287 case kUnboxedFloat32x4: |
3288 case kUnboxedFloat64x2: | 3288 case kUnboxedFloat64x2: |
3289 case kUnboxedInt32x4: | 3289 case kUnboxedInt32x4: |
3290 __ movups(FieldAddress(out_reg, ValueOffset()), value); | 3290 __ movups(FieldAddress(out_reg, ValueOffset()), value); |
3291 break; | 3291 break; |
3292 default: | 3292 default: |
3293 UNREACHABLE(); | 3293 UNREACHABLE(); |
3294 break; | 3294 break; |
3295 } | 3295 } |
3296 } | 3296 } |
3297 | 3297 |
3298 | 3298 |
3299 LocationSummary* UnboxInstr::MakeLocationSummary(Isolate* isolate, | 3299 LocationSummary* UnboxInstr::MakeLocationSummary(Zone* zone, |
3300 bool opt) const { | 3300 bool opt) const { |
3301 const intptr_t kNumInputs = 1; | 3301 const intptr_t kNumInputs = 1; |
3302 const intptr_t kNumTemps = 0; | 3302 const intptr_t kNumTemps = 0; |
3303 const bool needs_writable_input = | 3303 const bool needs_writable_input = |
3304 (representation() != kUnboxedMint) && | 3304 (representation() != kUnboxedMint) && |
3305 (value()->Type()->ToNullableCid() != BoxCid()); | 3305 (value()->Type()->ToNullableCid() != BoxCid()); |
3306 LocationSummary* summary = new(isolate) LocationSummary( | 3306 LocationSummary* summary = new(zone) LocationSummary( |
3307 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3307 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3308 summary->set_in(0, needs_writable_input ? Location::WritableRegister() | 3308 summary->set_in(0, needs_writable_input ? Location::WritableRegister() |
3309 : Location::RequiresRegister()); | 3309 : Location::RequiresRegister()); |
3310 if (representation() == kUnboxedMint) { | 3310 if (representation() == kUnboxedMint) { |
3311 summary->set_out(0, Location::SameAsFirstInput()); | 3311 summary->set_out(0, Location::SameAsFirstInput()); |
3312 } else { | 3312 } else { |
3313 summary->set_out(0, Location::RequiresFpuRegister()); | 3313 summary->set_out(0, Location::RequiresFpuRegister()); |
3314 } | 3314 } |
3315 return summary; | 3315 return summary; |
3316 } | 3316 } |
3317 | 3317 |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3405 Label done; | 3405 Label done; |
3406 __ jmp(&done); | 3406 __ jmp(&done); |
3407 __ Bind(&is_smi); | 3407 __ Bind(&is_smi); |
3408 EmitSmiConversion(compiler); | 3408 EmitSmiConversion(compiler); |
3409 __ Bind(&done); | 3409 __ Bind(&done); |
3410 } | 3410 } |
3411 } | 3411 } |
3412 } | 3412 } |
3413 | 3413 |
3414 | 3414 |
3415 LocationSummary* UnboxInteger32Instr::MakeLocationSummary(Isolate* isolate, | 3415 LocationSummary* UnboxInteger32Instr::MakeLocationSummary(Zone* zone, |
3416 bool opt) const { | 3416 bool opt) const { |
3417 const intptr_t kNumInputs = 1; | 3417 const intptr_t kNumInputs = 1; |
3418 const intptr_t kNumTemps = (!is_truncating() && CanDeoptimize()) ? 1 : 0; | 3418 const intptr_t kNumTemps = (!is_truncating() && CanDeoptimize()) ? 1 : 0; |
3419 LocationSummary* summary = new(isolate) LocationSummary( | 3419 LocationSummary* summary = new(zone) LocationSummary( |
3420 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3420 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3421 summary->set_in(0, Location::RequiresRegister()); | 3421 summary->set_in(0, Location::RequiresRegister()); |
3422 summary->set_out(0, Location::SameAsFirstInput()); | 3422 summary->set_out(0, Location::SameAsFirstInput()); |
3423 if (kNumTemps > 0) { | 3423 if (kNumTemps > 0) { |
3424 summary->set_temp(0, Location::RequiresRegister()); | 3424 summary->set_temp(0, Location::RequiresRegister()); |
3425 } | 3425 } |
3426 return summary; | 3426 return summary; |
3427 } | 3427 } |
3428 | 3428 |
3429 | 3429 |
3430 void UnboxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3430 void UnboxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
(...skipping 22 matching lines...) Expand all Loading... |
3453 if (!is_truncating() && (deopt != NULL)) { | 3453 if (!is_truncating() && (deopt != NULL)) { |
3454 ASSERT(representation() == kUnboxedInt32); | 3454 ASSERT(representation() == kUnboxedInt32); |
3455 Register temp = locs()->temp(0).reg(); | 3455 Register temp = locs()->temp(0).reg(); |
3456 __ movsxd(temp, value); | 3456 __ movsxd(temp, value); |
3457 __ cmpq(temp, value); | 3457 __ cmpq(temp, value); |
3458 __ j(NOT_EQUAL, deopt); | 3458 __ j(NOT_EQUAL, deopt); |
3459 } | 3459 } |
3460 } | 3460 } |
3461 | 3461 |
3462 | 3462 |
3463 LocationSummary* BoxInteger32Instr::MakeLocationSummary(Isolate* isolate, | 3463 LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone, |
3464 bool opt) const { | 3464 bool opt) const { |
3465 ASSERT((from_representation() == kUnboxedInt32) || | 3465 ASSERT((from_representation() == kUnboxedInt32) || |
3466 (from_representation() == kUnboxedUint32)); | 3466 (from_representation() == kUnboxedUint32)); |
3467 const intptr_t kNumInputs = 1; | 3467 const intptr_t kNumInputs = 1; |
3468 const intptr_t kNumTemps = 0; | 3468 const intptr_t kNumTemps = 0; |
3469 LocationSummary* summary = new(isolate) LocationSummary( | 3469 LocationSummary* summary = new(zone) LocationSummary( |
3470 isolate, | 3470 zone, |
3471 kNumInputs, | 3471 kNumInputs, |
3472 kNumTemps, | 3472 kNumTemps, |
3473 LocationSummary::kNoCall); | 3473 LocationSummary::kNoCall); |
3474 summary->set_in(0, Location::RequiresRegister()); | 3474 summary->set_in(0, Location::RequiresRegister()); |
3475 summary->set_out(0, Location::RequiresRegister()); | 3475 summary->set_out(0, Location::RequiresRegister()); |
3476 return summary; | 3476 return summary; |
3477 } | 3477 } |
3478 | 3478 |
3479 | 3479 |
3480 void BoxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3480 void BoxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3481 const Register value = locs()->in(0).reg(); | 3481 const Register value = locs()->in(0).reg(); |
3482 const Register out = locs()->out(0).reg(); | 3482 const Register out = locs()->out(0).reg(); |
3483 ASSERT(value != out); | 3483 ASSERT(value != out); |
3484 | 3484 |
3485 ASSERT(kSmiTagSize == 1); | 3485 ASSERT(kSmiTagSize == 1); |
3486 if (from_representation() == kUnboxedInt32) { | 3486 if (from_representation() == kUnboxedInt32) { |
3487 __ movsxd(out, value); | 3487 __ movsxd(out, value); |
3488 } else { | 3488 } else { |
3489 ASSERT(from_representation() == kUnboxedUint32); | 3489 ASSERT(from_representation() == kUnboxedUint32); |
3490 __ movl(out, value); | 3490 __ movl(out, value); |
3491 } | 3491 } |
3492 __ SmiTag(out); | 3492 __ SmiTag(out); |
3493 } | 3493 } |
3494 | 3494 |
3495 | 3495 |
3496 LocationSummary* BoxInt64Instr::MakeLocationSummary(Isolate* isolate, | 3496 LocationSummary* BoxInt64Instr::MakeLocationSummary(Zone* zone, |
3497 bool opt) const { | 3497 bool opt) const { |
3498 const intptr_t kNumInputs = 1; | 3498 const intptr_t kNumInputs = 1; |
3499 const intptr_t kNumTemps = 0; | 3499 const intptr_t kNumTemps = 0; |
3500 LocationSummary* summary = new(isolate) LocationSummary( | 3500 LocationSummary* summary = new(zone) LocationSummary( |
3501 isolate, | 3501 zone, |
3502 kNumInputs, | 3502 kNumInputs, |
3503 kNumTemps, | 3503 kNumTemps, |
3504 ValueFitsSmi() ? LocationSummary::kNoCall | 3504 ValueFitsSmi() ? LocationSummary::kNoCall |
3505 : LocationSummary::kCallOnSlowPath); | 3505 : LocationSummary::kCallOnSlowPath); |
3506 summary->set_in(0, Location::RequiresRegister()); | 3506 summary->set_in(0, Location::RequiresRegister()); |
3507 summary->set_out(0, Location::RequiresRegister()); | 3507 summary->set_out(0, Location::RequiresRegister()); |
3508 return summary; | 3508 return summary; |
3509 } | 3509 } |
3510 | 3510 |
3511 | 3511 |
3512 void BoxInt64Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3512 void BoxInt64Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3513 const Register out = locs()->out(0).reg(); | 3513 const Register out = locs()->out(0).reg(); |
3514 const Register value = locs()->in(0).reg(); | 3514 const Register value = locs()->in(0).reg(); |
3515 __ MoveRegister(out, value); | 3515 __ MoveRegister(out, value); |
3516 __ SmiTag(out); | 3516 __ SmiTag(out); |
3517 if (!ValueFitsSmi()) { | 3517 if (!ValueFitsSmi()) { |
3518 Label done; | 3518 Label done; |
3519 __ j(NO_OVERFLOW, &done); | 3519 __ j(NO_OVERFLOW, &done); |
3520 BoxAllocationSlowPath::Allocate( | 3520 BoxAllocationSlowPath::Allocate( |
3521 compiler, this, compiler->mint_class(), out); | 3521 compiler, this, compiler->mint_class(), out); |
3522 __ movq(FieldAddress(out, Mint::value_offset()), value); | 3522 __ movq(FieldAddress(out, Mint::value_offset()), value); |
3523 __ Bind(&done); | 3523 __ Bind(&done); |
3524 } | 3524 } |
3525 } | 3525 } |
3526 | 3526 |
3527 | 3527 |
3528 LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate, | 3528 LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Zone* zone, |
3529 bool opt) const { | 3529 bool opt) const { |
3530 const intptr_t kNumInputs = 2; | 3530 const intptr_t kNumInputs = 2; |
3531 const intptr_t kNumTemps = 0; | 3531 const intptr_t kNumTemps = 0; |
3532 LocationSummary* summary = new(isolate) LocationSummary( | 3532 LocationSummary* summary = new(zone) LocationSummary( |
3533 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3533 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3534 summary->set_in(0, Location::RequiresFpuRegister()); | 3534 summary->set_in(0, Location::RequiresFpuRegister()); |
3535 summary->set_in(1, Location::RequiresFpuRegister()); | 3535 summary->set_in(1, Location::RequiresFpuRegister()); |
3536 summary->set_out(0, Location::SameAsFirstInput()); | 3536 summary->set_out(0, Location::SameAsFirstInput()); |
3537 return summary; | 3537 return summary; |
3538 } | 3538 } |
3539 | 3539 |
3540 | 3540 |
3541 void BinaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3541 void BinaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3542 XmmRegister left = locs()->in(0).fpu_reg(); | 3542 XmmRegister left = locs()->in(0).fpu_reg(); |
3543 XmmRegister right = locs()->in(1).fpu_reg(); | 3543 XmmRegister right = locs()->in(1).fpu_reg(); |
3544 | 3544 |
3545 ASSERT(locs()->out(0).fpu_reg() == left); | 3545 ASSERT(locs()->out(0).fpu_reg() == left); |
3546 | 3546 |
3547 switch (op_kind()) { | 3547 switch (op_kind()) { |
3548 case Token::kADD: __ addsd(left, right); break; | 3548 case Token::kADD: __ addsd(left, right); break; |
3549 case Token::kSUB: __ subsd(left, right); break; | 3549 case Token::kSUB: __ subsd(left, right); break; |
3550 case Token::kMUL: __ mulsd(left, right); break; | 3550 case Token::kMUL: __ mulsd(left, right); break; |
3551 case Token::kDIV: __ divsd(left, right); break; | 3551 case Token::kDIV: __ divsd(left, right); break; |
3552 default: UNREACHABLE(); | 3552 default: UNREACHABLE(); |
3553 } | 3553 } |
3554 } | 3554 } |
3555 | 3555 |
3556 | 3556 |
3557 LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Isolate* isolate, | 3557 LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Zone* zone, |
3558 bool opt) const { | 3558 bool opt) const { |
3559 const intptr_t kNumInputs = 2; | 3559 const intptr_t kNumInputs = 2; |
3560 const intptr_t kNumTemps = 0; | 3560 const intptr_t kNumTemps = 0; |
3561 LocationSummary* summary = new(isolate) LocationSummary( | 3561 LocationSummary* summary = new(zone) LocationSummary( |
3562 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3562 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3563 summary->set_in(0, Location::RequiresFpuRegister()); | 3563 summary->set_in(0, Location::RequiresFpuRegister()); |
3564 summary->set_in(1, Location::RequiresFpuRegister()); | 3564 summary->set_in(1, Location::RequiresFpuRegister()); |
3565 summary->set_out(0, Location::SameAsFirstInput()); | 3565 summary->set_out(0, Location::SameAsFirstInput()); |
3566 return summary; | 3566 return summary; |
3567 } | 3567 } |
3568 | 3568 |
3569 | 3569 |
3570 void BinaryFloat32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3570 void BinaryFloat32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3571 XmmRegister left = locs()->in(0).fpu_reg(); | 3571 XmmRegister left = locs()->in(0).fpu_reg(); |
3572 XmmRegister right = locs()->in(1).fpu_reg(); | 3572 XmmRegister right = locs()->in(1).fpu_reg(); |
3573 | 3573 |
3574 ASSERT(locs()->out(0).fpu_reg() == left); | 3574 ASSERT(locs()->out(0).fpu_reg() == left); |
3575 | 3575 |
3576 switch (op_kind()) { | 3576 switch (op_kind()) { |
3577 case Token::kADD: __ addps(left, right); break; | 3577 case Token::kADD: __ addps(left, right); break; |
3578 case Token::kSUB: __ subps(left, right); break; | 3578 case Token::kSUB: __ subps(left, right); break; |
3579 case Token::kMUL: __ mulps(left, right); break; | 3579 case Token::kMUL: __ mulps(left, right); break; |
3580 case Token::kDIV: __ divps(left, right); break; | 3580 case Token::kDIV: __ divps(left, right); break; |
3581 default: UNREACHABLE(); | 3581 default: UNREACHABLE(); |
3582 } | 3582 } |
3583 } | 3583 } |
3584 | 3584 |
3585 | 3585 |
3586 LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(Isolate* isolate, | 3586 LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(Zone* zone, |
3587 bool opt) const { | 3587 bool opt) const { |
3588 const intptr_t kNumInputs = 2; | 3588 const intptr_t kNumInputs = 2; |
3589 const intptr_t kNumTemps = 0; | 3589 const intptr_t kNumTemps = 0; |
3590 LocationSummary* summary = new(isolate) LocationSummary( | 3590 LocationSummary* summary = new(zone) LocationSummary( |
3591 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3591 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3592 summary->set_in(0, Location::RequiresFpuRegister()); | 3592 summary->set_in(0, Location::RequiresFpuRegister()); |
3593 summary->set_in(1, Location::RequiresFpuRegister()); | 3593 summary->set_in(1, Location::RequiresFpuRegister()); |
3594 summary->set_out(0, Location::SameAsFirstInput()); | 3594 summary->set_out(0, Location::SameAsFirstInput()); |
3595 return summary; | 3595 return summary; |
3596 } | 3596 } |
3597 | 3597 |
3598 | 3598 |
3599 void BinaryFloat64x2OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3599 void BinaryFloat64x2OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3600 XmmRegister left = locs()->in(0).fpu_reg(); | 3600 XmmRegister left = locs()->in(0).fpu_reg(); |
3601 XmmRegister right = locs()->in(1).fpu_reg(); | 3601 XmmRegister right = locs()->in(1).fpu_reg(); |
3602 | 3602 |
3603 ASSERT(locs()->out(0).fpu_reg() == left); | 3603 ASSERT(locs()->out(0).fpu_reg() == left); |
3604 | 3604 |
3605 switch (op_kind()) { | 3605 switch (op_kind()) { |
3606 case Token::kADD: __ addpd(left, right); break; | 3606 case Token::kADD: __ addpd(left, right); break; |
3607 case Token::kSUB: __ subpd(left, right); break; | 3607 case Token::kSUB: __ subpd(left, right); break; |
3608 case Token::kMUL: __ mulpd(left, right); break; | 3608 case Token::kMUL: __ mulpd(left, right); break; |
3609 case Token::kDIV: __ divpd(left, right); break; | 3609 case Token::kDIV: __ divpd(left, right); break; |
3610 default: UNREACHABLE(); | 3610 default: UNREACHABLE(); |
3611 } | 3611 } |
3612 } | 3612 } |
3613 | 3613 |
3614 | 3614 |
3615 LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(Isolate* isolate, | 3615 LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(Zone* zone, |
3616 bool opt) const { | 3616 bool opt) const { |
3617 const intptr_t kNumInputs = 1; | 3617 const intptr_t kNumInputs = 1; |
3618 const intptr_t kNumTemps = 0; | 3618 const intptr_t kNumTemps = 0; |
3619 LocationSummary* summary = new(isolate) LocationSummary( | 3619 LocationSummary* summary = new(zone) LocationSummary( |
3620 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3620 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3621 summary->set_in(0, Location::RequiresFpuRegister()); | 3621 summary->set_in(0, Location::RequiresFpuRegister()); |
3622 summary->set_out(0, Location::SameAsFirstInput()); | 3622 summary->set_out(0, Location::SameAsFirstInput()); |
3623 return summary; | 3623 return summary; |
3624 } | 3624 } |
3625 | 3625 |
3626 | 3626 |
3627 void Simd32x4ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3627 void Simd32x4ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3628 XmmRegister value = locs()->in(0).fpu_reg(); | 3628 XmmRegister value = locs()->in(0).fpu_reg(); |
3629 | 3629 |
3630 ASSERT(locs()->out(0).fpu_reg() == value); | 3630 ASSERT(locs()->out(0).fpu_reg() == value); |
(...skipping 17 matching lines...) Expand all Loading... |
3648 break; | 3648 break; |
3649 case MethodRecognizer::kFloat32x4Shuffle: | 3649 case MethodRecognizer::kFloat32x4Shuffle: |
3650 case MethodRecognizer::kInt32x4Shuffle: | 3650 case MethodRecognizer::kInt32x4Shuffle: |
3651 __ shufps(value, value, Immediate(mask_)); | 3651 __ shufps(value, value, Immediate(mask_)); |
3652 break; | 3652 break; |
3653 default: UNREACHABLE(); | 3653 default: UNREACHABLE(); |
3654 } | 3654 } |
3655 } | 3655 } |
3656 | 3656 |
3657 | 3657 |
3658 LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(Isolate* isolate, | 3658 LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(Zone* zone, |
3659 bool opt) const { | 3659 bool opt) const { |
3660 const intptr_t kNumInputs = 2; | 3660 const intptr_t kNumInputs = 2; |
3661 const intptr_t kNumTemps = 0; | 3661 const intptr_t kNumTemps = 0; |
3662 LocationSummary* summary = new(isolate) LocationSummary( | 3662 LocationSummary* summary = new(zone) LocationSummary( |
3663 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3663 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3664 summary->set_in(0, Location::RequiresFpuRegister()); | 3664 summary->set_in(0, Location::RequiresFpuRegister()); |
3665 summary->set_in(1, Location::RequiresFpuRegister()); | 3665 summary->set_in(1, Location::RequiresFpuRegister()); |
3666 summary->set_out(0, Location::SameAsFirstInput()); | 3666 summary->set_out(0, Location::SameAsFirstInput()); |
3667 return summary; | 3667 return summary; |
3668 } | 3668 } |
3669 | 3669 |
3670 | 3670 |
3671 void Simd32x4ShuffleMixInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3671 void Simd32x4ShuffleMixInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3672 XmmRegister left = locs()->in(0).fpu_reg(); | 3672 XmmRegister left = locs()->in(0).fpu_reg(); |
3673 XmmRegister right = locs()->in(1).fpu_reg(); | 3673 XmmRegister right = locs()->in(1).fpu_reg(); |
3674 | 3674 |
3675 ASSERT(locs()->out(0).fpu_reg() == left); | 3675 ASSERT(locs()->out(0).fpu_reg() == left); |
3676 switch (op_kind()) { | 3676 switch (op_kind()) { |
3677 case MethodRecognizer::kFloat32x4ShuffleMix: | 3677 case MethodRecognizer::kFloat32x4ShuffleMix: |
3678 case MethodRecognizer::kInt32x4ShuffleMix: | 3678 case MethodRecognizer::kInt32x4ShuffleMix: |
3679 __ shufps(left, right, Immediate(mask_)); | 3679 __ shufps(left, right, Immediate(mask_)); |
3680 break; | 3680 break; |
3681 default: UNREACHABLE(); | 3681 default: UNREACHABLE(); |
3682 } | 3682 } |
3683 } | 3683 } |
3684 | 3684 |
3685 | 3685 |
3686 LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(Isolate* isolate, | 3686 LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(Zone* zone, |
3687 bool opt) const { | 3687 bool opt) const { |
3688 const intptr_t kNumInputs = 1; | 3688 const intptr_t kNumInputs = 1; |
3689 const intptr_t kNumTemps = 0; | 3689 const intptr_t kNumTemps = 0; |
3690 LocationSummary* summary = new(isolate) LocationSummary( | 3690 LocationSummary* summary = new(zone) LocationSummary( |
3691 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3691 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3692 summary->set_in(0, Location::RequiresFpuRegister()); | 3692 summary->set_in(0, Location::RequiresFpuRegister()); |
3693 summary->set_out(0, Location::RequiresRegister()); | 3693 summary->set_out(0, Location::RequiresRegister()); |
3694 return summary; | 3694 return summary; |
3695 } | 3695 } |
3696 | 3696 |
3697 | 3697 |
3698 void Simd32x4GetSignMaskInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3698 void Simd32x4GetSignMaskInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3699 XmmRegister value = locs()->in(0).fpu_reg(); | 3699 XmmRegister value = locs()->in(0).fpu_reg(); |
3700 Register out = locs()->out(0).reg(); | 3700 Register out = locs()->out(0).reg(); |
3701 | 3701 |
3702 __ movmskps(out, value); | 3702 __ movmskps(out, value); |
3703 __ SmiTag(out); | 3703 __ SmiTag(out); |
3704 } | 3704 } |
3705 | 3705 |
3706 | 3706 |
3707 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary( | 3707 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary( |
3708 Isolate* isolate, bool opt) const { | 3708 Zone* zone, bool opt) const { |
3709 const intptr_t kNumInputs = 4; | 3709 const intptr_t kNumInputs = 4; |
3710 const intptr_t kNumTemps = 0; | 3710 const intptr_t kNumTemps = 0; |
3711 LocationSummary* summary = new(isolate) LocationSummary( | 3711 LocationSummary* summary = new(zone) LocationSummary( |
3712 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3712 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3713 summary->set_in(0, Location::RequiresFpuRegister()); | 3713 summary->set_in(0, Location::RequiresFpuRegister()); |
3714 summary->set_in(1, Location::RequiresFpuRegister()); | 3714 summary->set_in(1, Location::RequiresFpuRegister()); |
3715 summary->set_in(2, Location::RequiresFpuRegister()); | 3715 summary->set_in(2, Location::RequiresFpuRegister()); |
3716 summary->set_in(3, Location::RequiresFpuRegister()); | 3716 summary->set_in(3, Location::RequiresFpuRegister()); |
3717 summary->set_out(0, Location::SameAsFirstInput()); | 3717 summary->set_out(0, Location::SameAsFirstInput()); |
3718 return summary; | 3718 return summary; |
3719 } | 3719 } |
3720 | 3720 |
3721 | 3721 |
3722 void Float32x4ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3722 void Float32x4ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
(...skipping 12 matching lines...) Expand all Loading... |
3735 __ cvtsd2ss(v0, v0); | 3735 __ cvtsd2ss(v0, v0); |
3736 __ movss(Address(RSP, 8), v0); | 3736 __ movss(Address(RSP, 8), v0); |
3737 __ movsd(v0, v3); | 3737 __ movsd(v0, v3); |
3738 __ cvtsd2ss(v0, v0); | 3738 __ cvtsd2ss(v0, v0); |
3739 __ movss(Address(RSP, 12), v0); | 3739 __ movss(Address(RSP, 12), v0); |
3740 __ movups(v0, Address(RSP, 0)); | 3740 __ movups(v0, Address(RSP, 0)); |
3741 __ AddImmediate(RSP, Immediate(16), PP); | 3741 __ AddImmediate(RSP, Immediate(16), PP); |
3742 } | 3742 } |
3743 | 3743 |
3744 | 3744 |
3745 LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(Isolate* isolate, | 3745 LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(Zone* zone, |
3746 bool opt) const { | 3746 bool opt) const { |
3747 const intptr_t kNumInputs = 0; | 3747 const intptr_t kNumInputs = 0; |
3748 const intptr_t kNumTemps = 0; | 3748 const intptr_t kNumTemps = 0; |
3749 LocationSummary* summary = new(isolate) LocationSummary( | 3749 LocationSummary* summary = new(zone) LocationSummary( |
3750 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3750 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3751 summary->set_out(0, Location::RequiresFpuRegister()); | 3751 summary->set_out(0, Location::RequiresFpuRegister()); |
3752 return summary; | 3752 return summary; |
3753 } | 3753 } |
3754 | 3754 |
3755 | 3755 |
3756 void Float32x4ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3756 void Float32x4ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3757 XmmRegister value = locs()->out(0).fpu_reg(); | 3757 XmmRegister value = locs()->out(0).fpu_reg(); |
3758 __ xorps(value, value); | 3758 __ xorps(value, value); |
3759 } | 3759 } |
3760 | 3760 |
3761 | 3761 |
3762 LocationSummary* Float32x4SplatInstr::MakeLocationSummary(Isolate* isolate, | 3762 LocationSummary* Float32x4SplatInstr::MakeLocationSummary(Zone* zone, |
3763 bool opt) const { | 3763 bool opt) const { |
3764 const intptr_t kNumInputs = 1; | 3764 const intptr_t kNumInputs = 1; |
3765 const intptr_t kNumTemps = 0; | 3765 const intptr_t kNumTemps = 0; |
3766 LocationSummary* summary = new(isolate) LocationSummary( | 3766 LocationSummary* summary = new(zone) LocationSummary( |
3767 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3767 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3768 summary->set_in(0, Location::RequiresFpuRegister()); | 3768 summary->set_in(0, Location::RequiresFpuRegister()); |
3769 summary->set_out(0, Location::SameAsFirstInput()); | 3769 summary->set_out(0, Location::SameAsFirstInput()); |
3770 return summary; | 3770 return summary; |
3771 } | 3771 } |
3772 | 3772 |
3773 | 3773 |
3774 void Float32x4SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3774 void Float32x4SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3775 XmmRegister value = locs()->out(0).fpu_reg(); | 3775 XmmRegister value = locs()->out(0).fpu_reg(); |
3776 ASSERT(locs()->in(0).fpu_reg() == locs()->out(0).fpu_reg()); | 3776 ASSERT(locs()->in(0).fpu_reg() == locs()->out(0).fpu_reg()); |
3777 // Convert to Float32. | 3777 // Convert to Float32. |
3778 __ cvtsd2ss(value, value); | 3778 __ cvtsd2ss(value, value); |
3779 // Splat across all lanes. | 3779 // Splat across all lanes. |
3780 __ shufps(value, value, Immediate(0x00)); | 3780 __ shufps(value, value, Immediate(0x00)); |
3781 } | 3781 } |
3782 | 3782 |
3783 | 3783 |
3784 LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(Isolate* isolate, | 3784 LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(Zone* zone, |
3785 bool opt) const { | 3785 bool opt) const { |
3786 const intptr_t kNumInputs = 2; | 3786 const intptr_t kNumInputs = 2; |
3787 const intptr_t kNumTemps = 0; | 3787 const intptr_t kNumTemps = 0; |
3788 LocationSummary* summary = new(isolate) LocationSummary( | 3788 LocationSummary* summary = new(zone) LocationSummary( |
3789 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3789 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3790 summary->set_in(0, Location::RequiresFpuRegister()); | 3790 summary->set_in(0, Location::RequiresFpuRegister()); |
3791 summary->set_in(1, Location::RequiresFpuRegister()); | 3791 summary->set_in(1, Location::RequiresFpuRegister()); |
3792 summary->set_out(0, Location::SameAsFirstInput()); | 3792 summary->set_out(0, Location::SameAsFirstInput()); |
3793 return summary; | 3793 return summary; |
3794 } | 3794 } |
3795 | 3795 |
3796 | 3796 |
3797 void Float32x4ComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3797 void Float32x4ComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3798 XmmRegister left = locs()->in(0).fpu_reg(); | 3798 XmmRegister left = locs()->in(0).fpu_reg(); |
3799 XmmRegister right = locs()->in(1).fpu_reg(); | 3799 XmmRegister right = locs()->in(1).fpu_reg(); |
(...skipping 18 matching lines...) Expand all Loading... |
3818 break; | 3818 break; |
3819 case MethodRecognizer::kFloat32x4LessThanOrEqual: | 3819 case MethodRecognizer::kFloat32x4LessThanOrEqual: |
3820 __ cmppsle(left, right); | 3820 __ cmppsle(left, right); |
3821 break; | 3821 break; |
3822 | 3822 |
3823 default: UNREACHABLE(); | 3823 default: UNREACHABLE(); |
3824 } | 3824 } |
3825 } | 3825 } |
3826 | 3826 |
3827 | 3827 |
3828 LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(Isolate* isolate, | 3828 LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(Zone* zone, |
3829 bool opt) const { | 3829 bool opt) const { |
3830 const intptr_t kNumInputs = 2; | 3830 const intptr_t kNumInputs = 2; |
3831 const intptr_t kNumTemps = 0; | 3831 const intptr_t kNumTemps = 0; |
3832 LocationSummary* summary = new(isolate) LocationSummary( | 3832 LocationSummary* summary = new(zone) LocationSummary( |
3833 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3833 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3834 summary->set_in(0, Location::RequiresFpuRegister()); | 3834 summary->set_in(0, Location::RequiresFpuRegister()); |
3835 summary->set_in(1, Location::RequiresFpuRegister()); | 3835 summary->set_in(1, Location::RequiresFpuRegister()); |
3836 summary->set_out(0, Location::SameAsFirstInput()); | 3836 summary->set_out(0, Location::SameAsFirstInput()); |
3837 return summary; | 3837 return summary; |
3838 } | 3838 } |
3839 | 3839 |
3840 | 3840 |
3841 void Float32x4MinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3841 void Float32x4MinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3842 XmmRegister left = locs()->in(0).fpu_reg(); | 3842 XmmRegister left = locs()->in(0).fpu_reg(); |
3843 XmmRegister right = locs()->in(1).fpu_reg(); | 3843 XmmRegister right = locs()->in(1).fpu_reg(); |
3844 | 3844 |
3845 ASSERT(locs()->out(0).fpu_reg() == left); | 3845 ASSERT(locs()->out(0).fpu_reg() == left); |
3846 | 3846 |
3847 switch (op_kind()) { | 3847 switch (op_kind()) { |
3848 case MethodRecognizer::kFloat32x4Min: | 3848 case MethodRecognizer::kFloat32x4Min: |
3849 __ minps(left, right); | 3849 __ minps(left, right); |
3850 break; | 3850 break; |
3851 case MethodRecognizer::kFloat32x4Max: | 3851 case MethodRecognizer::kFloat32x4Max: |
3852 __ maxps(left, right); | 3852 __ maxps(left, right); |
3853 break; | 3853 break; |
3854 default: UNREACHABLE(); | 3854 default: UNREACHABLE(); |
3855 } | 3855 } |
3856 } | 3856 } |
3857 | 3857 |
3858 | 3858 |
3859 LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(Isolate* isolate, | 3859 LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(Zone* zone, |
3860 bool opt) const { | 3860 bool opt) const { |
3861 const intptr_t kNumInputs = 2; | 3861 const intptr_t kNumInputs = 2; |
3862 const intptr_t kNumTemps = 0; | 3862 const intptr_t kNumTemps = 0; |
3863 LocationSummary* summary = new(isolate) LocationSummary( | 3863 LocationSummary* summary = new(zone) LocationSummary( |
3864 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3864 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3865 summary->set_in(0, Location::RequiresFpuRegister()); | 3865 summary->set_in(0, Location::RequiresFpuRegister()); |
3866 summary->set_in(1, Location::RequiresFpuRegister()); | 3866 summary->set_in(1, Location::RequiresFpuRegister()); |
3867 summary->set_out(0, Location::SameAsFirstInput()); | 3867 summary->set_out(0, Location::SameAsFirstInput()); |
3868 return summary; | 3868 return summary; |
3869 } | 3869 } |
3870 | 3870 |
3871 | 3871 |
3872 void Float32x4ScaleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3872 void Float32x4ScaleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3873 XmmRegister left = locs()->in(0).fpu_reg(); | 3873 XmmRegister left = locs()->in(0).fpu_reg(); |
3874 XmmRegister right = locs()->in(1).fpu_reg(); | 3874 XmmRegister right = locs()->in(1).fpu_reg(); |
3875 | 3875 |
3876 ASSERT(locs()->out(0).fpu_reg() == left); | 3876 ASSERT(locs()->out(0).fpu_reg() == left); |
3877 | 3877 |
3878 switch (op_kind()) { | 3878 switch (op_kind()) { |
3879 case MethodRecognizer::kFloat32x4Scale: | 3879 case MethodRecognizer::kFloat32x4Scale: |
3880 __ cvtsd2ss(left, left); | 3880 __ cvtsd2ss(left, left); |
3881 __ shufps(left, left, Immediate(0x00)); | 3881 __ shufps(left, left, Immediate(0x00)); |
3882 __ mulps(left, right); | 3882 __ mulps(left, right); |
3883 break; | 3883 break; |
3884 default: UNREACHABLE(); | 3884 default: UNREACHABLE(); |
3885 } | 3885 } |
3886 } | 3886 } |
3887 | 3887 |
3888 | 3888 |
3889 LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(Isolate* isolate, | 3889 LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(Zone* zone, |
3890 bool opt) const { | 3890 bool opt) const { |
3891 const intptr_t kNumInputs = 1; | 3891 const intptr_t kNumInputs = 1; |
3892 const intptr_t kNumTemps = 0; | 3892 const intptr_t kNumTemps = 0; |
3893 LocationSummary* summary = new(isolate) LocationSummary( | 3893 LocationSummary* summary = new(zone) LocationSummary( |
3894 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3894 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3895 summary->set_in(0, Location::RequiresFpuRegister()); | 3895 summary->set_in(0, Location::RequiresFpuRegister()); |
3896 summary->set_out(0, Location::SameAsFirstInput()); | 3896 summary->set_out(0, Location::SameAsFirstInput()); |
3897 return summary; | 3897 return summary; |
3898 } | 3898 } |
3899 | 3899 |
3900 | 3900 |
3901 void Float32x4SqrtInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3901 void Float32x4SqrtInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3902 XmmRegister left = locs()->in(0).fpu_reg(); | 3902 XmmRegister left = locs()->in(0).fpu_reg(); |
3903 | 3903 |
3904 ASSERT(locs()->out(0).fpu_reg() == left); | 3904 ASSERT(locs()->out(0).fpu_reg() == left); |
3905 | 3905 |
3906 switch (op_kind()) { | 3906 switch (op_kind()) { |
3907 case MethodRecognizer::kFloat32x4Sqrt: | 3907 case MethodRecognizer::kFloat32x4Sqrt: |
3908 __ sqrtps(left); | 3908 __ sqrtps(left); |
3909 break; | 3909 break; |
3910 case MethodRecognizer::kFloat32x4Reciprocal: | 3910 case MethodRecognizer::kFloat32x4Reciprocal: |
3911 __ reciprocalps(left); | 3911 __ reciprocalps(left); |
3912 break; | 3912 break; |
3913 case MethodRecognizer::kFloat32x4ReciprocalSqrt: | 3913 case MethodRecognizer::kFloat32x4ReciprocalSqrt: |
3914 __ rsqrtps(left); | 3914 __ rsqrtps(left); |
3915 break; | 3915 break; |
3916 default: UNREACHABLE(); | 3916 default: UNREACHABLE(); |
3917 } | 3917 } |
3918 } | 3918 } |
3919 | 3919 |
3920 | 3920 |
3921 LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(Isolate* isolate, | 3921 LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(Zone* zone, |
3922 bool opt) const { | 3922 bool opt) const { |
3923 const intptr_t kNumInputs = 1; | 3923 const intptr_t kNumInputs = 1; |
3924 const intptr_t kNumTemps = 0; | 3924 const intptr_t kNumTemps = 0; |
3925 LocationSummary* summary = new(isolate) LocationSummary( | 3925 LocationSummary* summary = new(zone) LocationSummary( |
3926 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3926 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3927 summary->set_in(0, Location::RequiresFpuRegister()); | 3927 summary->set_in(0, Location::RequiresFpuRegister()); |
3928 summary->set_out(0, Location::SameAsFirstInput()); | 3928 summary->set_out(0, Location::SameAsFirstInput()); |
3929 return summary; | 3929 return summary; |
3930 } | 3930 } |
3931 | 3931 |
3932 | 3932 |
3933 void Float32x4ZeroArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3933 void Float32x4ZeroArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3934 XmmRegister left = locs()->in(0).fpu_reg(); | 3934 XmmRegister left = locs()->in(0).fpu_reg(); |
3935 | 3935 |
3936 ASSERT(locs()->out(0).fpu_reg() == left); | 3936 ASSERT(locs()->out(0).fpu_reg() == left); |
3937 switch (op_kind()) { | 3937 switch (op_kind()) { |
3938 case MethodRecognizer::kFloat32x4Negate: | 3938 case MethodRecognizer::kFloat32x4Negate: |
3939 __ negateps(left); | 3939 __ negateps(left); |
3940 break; | 3940 break; |
3941 case MethodRecognizer::kFloat32x4Absolute: | 3941 case MethodRecognizer::kFloat32x4Absolute: |
3942 __ absps(left); | 3942 __ absps(left); |
3943 break; | 3943 break; |
3944 default: UNREACHABLE(); | 3944 default: UNREACHABLE(); |
3945 } | 3945 } |
3946 } | 3946 } |
3947 | 3947 |
3948 | 3948 |
3949 LocationSummary* Float32x4ClampInstr::MakeLocationSummary(Isolate* isolate, | 3949 LocationSummary* Float32x4ClampInstr::MakeLocationSummary(Zone* zone, |
3950 bool opt) const { | 3950 bool opt) const { |
3951 const intptr_t kNumInputs = 3; | 3951 const intptr_t kNumInputs = 3; |
3952 const intptr_t kNumTemps = 0; | 3952 const intptr_t kNumTemps = 0; |
3953 LocationSummary* summary = new(isolate) LocationSummary( | 3953 LocationSummary* summary = new(zone) LocationSummary( |
3954 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3954 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3955 summary->set_in(0, Location::RequiresFpuRegister()); | 3955 summary->set_in(0, Location::RequiresFpuRegister()); |
3956 summary->set_in(1, Location::RequiresFpuRegister()); | 3956 summary->set_in(1, Location::RequiresFpuRegister()); |
3957 summary->set_in(2, Location::RequiresFpuRegister()); | 3957 summary->set_in(2, Location::RequiresFpuRegister()); |
3958 summary->set_out(0, Location::SameAsFirstInput()); | 3958 summary->set_out(0, Location::SameAsFirstInput()); |
3959 return summary; | 3959 return summary; |
3960 } | 3960 } |
3961 | 3961 |
3962 | 3962 |
3963 void Float32x4ClampInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3963 void Float32x4ClampInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3964 XmmRegister left = locs()->in(0).fpu_reg(); | 3964 XmmRegister left = locs()->in(0).fpu_reg(); |
3965 XmmRegister lower = locs()->in(1).fpu_reg(); | 3965 XmmRegister lower = locs()->in(1).fpu_reg(); |
3966 XmmRegister upper = locs()->in(2).fpu_reg(); | 3966 XmmRegister upper = locs()->in(2).fpu_reg(); |
3967 ASSERT(locs()->out(0).fpu_reg() == left); | 3967 ASSERT(locs()->out(0).fpu_reg() == left); |
3968 __ minps(left, upper); | 3968 __ minps(left, upper); |
3969 __ maxps(left, lower); | 3969 __ maxps(left, lower); |
3970 } | 3970 } |
3971 | 3971 |
3972 | 3972 |
3973 LocationSummary* Float32x4WithInstr::MakeLocationSummary(Isolate* isolate, | 3973 LocationSummary* Float32x4WithInstr::MakeLocationSummary(Zone* zone, |
3974 bool opt) const { | 3974 bool opt) const { |
3975 const intptr_t kNumInputs = 2; | 3975 const intptr_t kNumInputs = 2; |
3976 const intptr_t kNumTemps = 0; | 3976 const intptr_t kNumTemps = 0; |
3977 LocationSummary* summary = new(isolate) LocationSummary( | 3977 LocationSummary* summary = new(zone) LocationSummary( |
3978 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3978 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3979 summary->set_in(0, Location::RequiresFpuRegister()); | 3979 summary->set_in(0, Location::RequiresFpuRegister()); |
3980 summary->set_in(1, Location::RequiresFpuRegister()); | 3980 summary->set_in(1, Location::RequiresFpuRegister()); |
3981 summary->set_out(0, Location::SameAsFirstInput()); | 3981 summary->set_out(0, Location::SameAsFirstInput()); |
3982 return summary; | 3982 return summary; |
3983 } | 3983 } |
3984 | 3984 |
3985 | 3985 |
3986 void Float32x4WithInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3986 void Float32x4WithInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3987 XmmRegister replacement = locs()->in(0).fpu_reg(); | 3987 XmmRegister replacement = locs()->in(0).fpu_reg(); |
3988 XmmRegister value = locs()->in(1).fpu_reg(); | 3988 XmmRegister value = locs()->in(1).fpu_reg(); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4032 __ movss(Address(RSP, 12), replacement); | 4032 __ movss(Address(RSP, 12), replacement); |
4033 // Move updated value into output register. | 4033 // Move updated value into output register. |
4034 __ movups(replacement, Address(RSP, 0)); | 4034 __ movups(replacement, Address(RSP, 0)); |
4035 __ AddImmediate(RSP, Immediate(16), PP); | 4035 __ AddImmediate(RSP, Immediate(16), PP); |
4036 break; | 4036 break; |
4037 default: UNREACHABLE(); | 4037 default: UNREACHABLE(); |
4038 } | 4038 } |
4039 } | 4039 } |
4040 | 4040 |
4041 | 4041 |
4042 LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(Isolate* isolate, | 4042 LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(Zone* zone, |
4043 bool opt) const { | 4043 bool opt) const { |
4044 const intptr_t kNumInputs = 1; | 4044 const intptr_t kNumInputs = 1; |
4045 const intptr_t kNumTemps = 0; | 4045 const intptr_t kNumTemps = 0; |
4046 LocationSummary* summary = new(isolate) LocationSummary( | 4046 LocationSummary* summary = new(zone) LocationSummary( |
4047 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4047 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4048 summary->set_in(0, Location::RequiresFpuRegister()); | 4048 summary->set_in(0, Location::RequiresFpuRegister()); |
4049 summary->set_out(0, Location::SameAsFirstInput()); | 4049 summary->set_out(0, Location::SameAsFirstInput()); |
4050 return summary; | 4050 return summary; |
4051 } | 4051 } |
4052 | 4052 |
4053 | 4053 |
4054 void Float32x4ToInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4054 void Float32x4ToInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4055 // NOP. | 4055 // NOP. |
4056 } | 4056 } |
4057 | 4057 |
4058 | 4058 |
4059 LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(Isolate* isolate, | 4059 LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(Zone* zone, |
4060 bool opt) const { | 4060 bool opt) const { |
4061 const intptr_t kNumInputs = 1; | 4061 const intptr_t kNumInputs = 1; |
4062 const intptr_t kNumTemps = 0; | 4062 const intptr_t kNumTemps = 0; |
4063 LocationSummary* summary = new(isolate) LocationSummary( | 4063 LocationSummary* summary = new(zone) LocationSummary( |
4064 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4064 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4065 summary->set_in(0, Location::RequiresFpuRegister()); | 4065 summary->set_in(0, Location::RequiresFpuRegister()); |
4066 summary->set_out(0, Location::SameAsFirstInput()); | 4066 summary->set_out(0, Location::SameAsFirstInput()); |
4067 return summary; | 4067 return summary; |
4068 } | 4068 } |
4069 | 4069 |
4070 | 4070 |
4071 void Simd64x2ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4071 void Simd64x2ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4072 XmmRegister value = locs()->in(0).fpu_reg(); | 4072 XmmRegister value = locs()->in(0).fpu_reg(); |
4073 | 4073 |
4074 ASSERT(locs()->out(0).fpu_reg() == value); | 4074 ASSERT(locs()->out(0).fpu_reg() == value); |
4075 switch (op_kind()) { | 4075 switch (op_kind()) { |
4076 case MethodRecognizer::kFloat64x2GetX: | 4076 case MethodRecognizer::kFloat64x2GetX: |
4077 // nop. | 4077 // nop. |
4078 break; | 4078 break; |
4079 case MethodRecognizer::kFloat64x2GetY: | 4079 case MethodRecognizer::kFloat64x2GetY: |
4080 __ shufpd(value, value, Immediate(0x33)); | 4080 __ shufpd(value, value, Immediate(0x33)); |
4081 break; | 4081 break; |
4082 default: UNREACHABLE(); | 4082 default: UNREACHABLE(); |
4083 } | 4083 } |
4084 } | 4084 } |
4085 | 4085 |
4086 | 4086 |
4087 LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(Isolate* isolate, | 4087 LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(Zone* zone, |
4088 bool opt) const { | 4088 bool opt) const { |
4089 const intptr_t kNumInputs = 0; | 4089 const intptr_t kNumInputs = 0; |
4090 const intptr_t kNumTemps = 0; | 4090 const intptr_t kNumTemps = 0; |
4091 LocationSummary* summary = new(isolate) LocationSummary( | 4091 LocationSummary* summary = new(zone) LocationSummary( |
4092 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4092 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4093 summary->set_out(0, Location::RequiresFpuRegister()); | 4093 summary->set_out(0, Location::RequiresFpuRegister()); |
4094 return summary; | 4094 return summary; |
4095 } | 4095 } |
4096 | 4096 |
4097 | 4097 |
4098 void Float64x2ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4098 void Float64x2ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4099 XmmRegister value = locs()->out(0).fpu_reg(); | 4099 XmmRegister value = locs()->out(0).fpu_reg(); |
4100 __ xorpd(value, value); | 4100 __ xorpd(value, value); |
4101 } | 4101 } |
4102 | 4102 |
4103 | 4103 |
4104 LocationSummary* Float64x2SplatInstr::MakeLocationSummary(Isolate* isolate, | 4104 LocationSummary* Float64x2SplatInstr::MakeLocationSummary(Zone* zone, |
4105 bool opt) const { | 4105 bool opt) const { |
4106 const intptr_t kNumInputs = 1; | 4106 const intptr_t kNumInputs = 1; |
4107 const intptr_t kNumTemps = 0; | 4107 const intptr_t kNumTemps = 0; |
4108 LocationSummary* summary = new(isolate) LocationSummary( | 4108 LocationSummary* summary = new(zone) LocationSummary( |
4109 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4109 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4110 summary->set_in(0, Location::RequiresFpuRegister()); | 4110 summary->set_in(0, Location::RequiresFpuRegister()); |
4111 summary->set_out(0, Location::SameAsFirstInput()); | 4111 summary->set_out(0, Location::SameAsFirstInput()); |
4112 return summary; | 4112 return summary; |
4113 } | 4113 } |
4114 | 4114 |
4115 | 4115 |
4116 void Float64x2SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4116 void Float64x2SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4117 XmmRegister value = locs()->out(0).fpu_reg(); | 4117 XmmRegister value = locs()->out(0).fpu_reg(); |
4118 __ shufpd(value, value, Immediate(0x0)); | 4118 __ shufpd(value, value, Immediate(0x0)); |
4119 } | 4119 } |
4120 | 4120 |
4121 | 4121 |
4122 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary( | 4122 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary( |
4123 Isolate* isolate, bool opt) const { | 4123 Zone* zone, bool opt) const { |
4124 const intptr_t kNumInputs = 2; | 4124 const intptr_t kNumInputs = 2; |
4125 const intptr_t kNumTemps = 0; | 4125 const intptr_t kNumTemps = 0; |
4126 LocationSummary* summary = new(isolate) LocationSummary( | 4126 LocationSummary* summary = new(zone) LocationSummary( |
4127 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4127 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4128 summary->set_in(0, Location::RequiresFpuRegister()); | 4128 summary->set_in(0, Location::RequiresFpuRegister()); |
4129 summary->set_in(1, Location::RequiresFpuRegister()); | 4129 summary->set_in(1, Location::RequiresFpuRegister()); |
4130 summary->set_out(0, Location::SameAsFirstInput()); | 4130 summary->set_out(0, Location::SameAsFirstInput()); |
4131 return summary; | 4131 return summary; |
4132 } | 4132 } |
4133 | 4133 |
4134 | 4134 |
4135 void Float64x2ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4135 void Float64x2ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4136 XmmRegister v0 = locs()->in(0).fpu_reg(); | 4136 XmmRegister v0 = locs()->in(0).fpu_reg(); |
4137 XmmRegister v1 = locs()->in(1).fpu_reg(); | 4137 XmmRegister v1 = locs()->in(1).fpu_reg(); |
4138 ASSERT(v0 == locs()->out(0).fpu_reg()); | 4138 ASSERT(v0 == locs()->out(0).fpu_reg()); |
4139 // shufpd mask 0x0 results in: | 4139 // shufpd mask 0x0 results in: |
4140 // Lower 64-bits of v0 = Lower 64-bits of v0. | 4140 // Lower 64-bits of v0 = Lower 64-bits of v0. |
4141 // Upper 64-bits of v0 = Lower 64-bits of v1. | 4141 // Upper 64-bits of v0 = Lower 64-bits of v1. |
4142 __ shufpd(v0, v1, Immediate(0x0)); | 4142 __ shufpd(v0, v1, Immediate(0x0)); |
4143 } | 4143 } |
4144 | 4144 |
4145 | 4145 |
4146 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary( | 4146 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary( |
4147 Isolate* isolate, bool opt) const { | 4147 Zone* zone, bool opt) const { |
4148 const intptr_t kNumInputs = 1; | 4148 const intptr_t kNumInputs = 1; |
4149 const intptr_t kNumTemps = 0; | 4149 const intptr_t kNumTemps = 0; |
4150 LocationSummary* summary = new(isolate) LocationSummary( | 4150 LocationSummary* summary = new(zone) LocationSummary( |
4151 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4151 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4152 summary->set_in(0, Location::RequiresFpuRegister()); | 4152 summary->set_in(0, Location::RequiresFpuRegister()); |
4153 summary->set_out(0, Location::SameAsFirstInput()); | 4153 summary->set_out(0, Location::SameAsFirstInput()); |
4154 return summary; | 4154 return summary; |
4155 } | 4155 } |
4156 | 4156 |
4157 | 4157 |
4158 void Float64x2ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4158 void Float64x2ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4159 XmmRegister value = locs()->out(0).fpu_reg(); | 4159 XmmRegister value = locs()->out(0).fpu_reg(); |
4160 __ cvtpd2ps(value, value); | 4160 __ cvtpd2ps(value, value); |
4161 } | 4161 } |
4162 | 4162 |
4163 | 4163 |
4164 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary( | 4164 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary( |
4165 Isolate* isolate, bool opt) const { | 4165 Zone* zone, bool opt) const { |
4166 const intptr_t kNumInputs = 1; | 4166 const intptr_t kNumInputs = 1; |
4167 const intptr_t kNumTemps = 0; | 4167 const intptr_t kNumTemps = 0; |
4168 LocationSummary* summary = new(isolate) LocationSummary( | 4168 LocationSummary* summary = new(zone) LocationSummary( |
4169 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4169 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4170 summary->set_in(0, Location::RequiresFpuRegister()); | 4170 summary->set_in(0, Location::RequiresFpuRegister()); |
4171 summary->set_out(0, Location::SameAsFirstInput()); | 4171 summary->set_out(0, Location::SameAsFirstInput()); |
4172 return summary; | 4172 return summary; |
4173 } | 4173 } |
4174 | 4174 |
4175 | 4175 |
4176 void Float32x4ToFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4176 void Float32x4ToFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4177 XmmRegister value = locs()->out(0).fpu_reg(); | 4177 XmmRegister value = locs()->out(0).fpu_reg(); |
4178 __ cvtps2pd(value, value); | 4178 __ cvtps2pd(value, value); |
4179 } | 4179 } |
4180 | 4180 |
4181 | 4181 |
4182 LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(Isolate* isolate, | 4182 LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(Zone* zone, |
4183 bool opt) const { | 4183 bool opt) const { |
4184 const intptr_t kNumInputs = 1; | 4184 const intptr_t kNumInputs = 1; |
4185 const intptr_t kNumTemps = 0; | 4185 const intptr_t kNumTemps = 0; |
4186 LocationSummary* summary = new(isolate) LocationSummary( | 4186 LocationSummary* summary = new(zone) LocationSummary( |
4187 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4187 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4188 summary->set_in(0, Location::RequiresFpuRegister()); | 4188 summary->set_in(0, Location::RequiresFpuRegister()); |
4189 if (representation() == kTagged) { | 4189 if (representation() == kTagged) { |
4190 ASSERT(op_kind() == MethodRecognizer::kFloat64x2GetSignMask); | 4190 ASSERT(op_kind() == MethodRecognizer::kFloat64x2GetSignMask); |
4191 summary->set_out(0, Location::RequiresRegister()); | 4191 summary->set_out(0, Location::RequiresRegister()); |
4192 } else { | 4192 } else { |
4193 ASSERT(representation() == kUnboxedFloat64x2); | 4193 ASSERT(representation() == kUnboxedFloat64x2); |
4194 summary->set_out(0, Location::SameAsFirstInput()); | 4194 summary->set_out(0, Location::SameAsFirstInput()); |
4195 } | 4195 } |
4196 return summary; | 4196 return summary; |
4197 } | 4197 } |
(...skipping 17 matching lines...) Expand all Loading... |
4215 break; | 4215 break; |
4216 case MethodRecognizer::kFloat64x2GetSignMask: | 4216 case MethodRecognizer::kFloat64x2GetSignMask: |
4217 __ movmskpd(locs()->out(0).reg(), left); | 4217 __ movmskpd(locs()->out(0).reg(), left); |
4218 __ SmiTag(locs()->out(0).reg()); | 4218 __ SmiTag(locs()->out(0).reg()); |
4219 break; | 4219 break; |
4220 default: UNREACHABLE(); | 4220 default: UNREACHABLE(); |
4221 } | 4221 } |
4222 } | 4222 } |
4223 | 4223 |
4224 | 4224 |
4225 LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(Isolate* isolate, | 4225 LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(Zone* zone, |
4226 bool opt) const { | 4226 bool opt) const { |
4227 const intptr_t kNumInputs = 2; | 4227 const intptr_t kNumInputs = 2; |
4228 const intptr_t kNumTemps = 0; | 4228 const intptr_t kNumTemps = 0; |
4229 LocationSummary* summary = new(isolate) LocationSummary( | 4229 LocationSummary* summary = new(zone) LocationSummary( |
4230 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4230 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4231 summary->set_in(0, Location::RequiresFpuRegister()); | 4231 summary->set_in(0, Location::RequiresFpuRegister()); |
4232 summary->set_in(1, Location::RequiresFpuRegister()); | 4232 summary->set_in(1, Location::RequiresFpuRegister()); |
4233 summary->set_out(0, Location::SameAsFirstInput()); | 4233 summary->set_out(0, Location::SameAsFirstInput()); |
4234 return summary; | 4234 return summary; |
4235 } | 4235 } |
4236 | 4236 |
4237 | 4237 |
4238 void Float64x2OneArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4238 void Float64x2OneArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4239 XmmRegister left = locs()->in(0).fpu_reg(); | 4239 XmmRegister left = locs()->in(0).fpu_reg(); |
4240 XmmRegister right = locs()->in(1).fpu_reg(); | 4240 XmmRegister right = locs()->in(1).fpu_reg(); |
(...skipping 29 matching lines...) Expand all Loading... |
4270 break; | 4270 break; |
4271 case MethodRecognizer::kFloat64x2Max: | 4271 case MethodRecognizer::kFloat64x2Max: |
4272 __ maxpd(left, right); | 4272 __ maxpd(left, right); |
4273 break; | 4273 break; |
4274 default: UNREACHABLE(); | 4274 default: UNREACHABLE(); |
4275 } | 4275 } |
4276 } | 4276 } |
4277 | 4277 |
4278 | 4278 |
4279 LocationSummary* Int32x4ConstructorInstr::MakeLocationSummary( | 4279 LocationSummary* Int32x4ConstructorInstr::MakeLocationSummary( |
4280 Isolate* isolate, bool opt) const { | 4280 Zone* zone, bool opt) const { |
4281 const intptr_t kNumInputs = 4; | 4281 const intptr_t kNumInputs = 4; |
4282 const intptr_t kNumTemps = 0; | 4282 const intptr_t kNumTemps = 0; |
4283 LocationSummary* summary = new(isolate) LocationSummary( | 4283 LocationSummary* summary = new(zone) LocationSummary( |
4284 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4284 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4285 summary->set_in(0, Location::RequiresRegister()); | 4285 summary->set_in(0, Location::RequiresRegister()); |
4286 summary->set_in(1, Location::RequiresRegister()); | 4286 summary->set_in(1, Location::RequiresRegister()); |
4287 summary->set_in(2, Location::RequiresRegister()); | 4287 summary->set_in(2, Location::RequiresRegister()); |
4288 summary->set_in(3, Location::RequiresRegister()); | 4288 summary->set_in(3, Location::RequiresRegister()); |
4289 summary->set_out(0, Location::RequiresFpuRegister()); | 4289 summary->set_out(0, Location::RequiresFpuRegister()); |
4290 return summary; | 4290 return summary; |
4291 } | 4291 } |
4292 | 4292 |
4293 | 4293 |
4294 void Int32x4ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4294 void Int32x4ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4295 Register v0 = locs()->in(0).reg(); | 4295 Register v0 = locs()->in(0).reg(); |
4296 Register v1 = locs()->in(1).reg(); | 4296 Register v1 = locs()->in(1).reg(); |
4297 Register v2 = locs()->in(2).reg(); | 4297 Register v2 = locs()->in(2).reg(); |
4298 Register v3 = locs()->in(3).reg(); | 4298 Register v3 = locs()->in(3).reg(); |
4299 XmmRegister result = locs()->out(0).fpu_reg(); | 4299 XmmRegister result = locs()->out(0).fpu_reg(); |
4300 __ AddImmediate(RSP, Immediate(-4 * kInt32Size), PP); | 4300 __ AddImmediate(RSP, Immediate(-4 * kInt32Size), PP); |
4301 __ movl(Address(RSP, 0 * kInt32Size), v0); | 4301 __ movl(Address(RSP, 0 * kInt32Size), v0); |
4302 __ movl(Address(RSP, 1 * kInt32Size), v1); | 4302 __ movl(Address(RSP, 1 * kInt32Size), v1); |
4303 __ movl(Address(RSP, 2 * kInt32Size), v2); | 4303 __ movl(Address(RSP, 2 * kInt32Size), v2); |
4304 __ movl(Address(RSP, 3 * kInt32Size), v3); | 4304 __ movl(Address(RSP, 3 * kInt32Size), v3); |
4305 __ movups(result, Address(RSP, 0)); | 4305 __ movups(result, Address(RSP, 0)); |
4306 __ AddImmediate(RSP, Immediate(4 * kInt32Size), PP); | 4306 __ AddImmediate(RSP, Immediate(4 * kInt32Size), PP); |
4307 } | 4307 } |
4308 | 4308 |
4309 | 4309 |
4310 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary( | 4310 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary( |
4311 Isolate* isolate, bool opt) const { | 4311 Zone* zone, bool opt) const { |
4312 const intptr_t kNumInputs = 4; | 4312 const intptr_t kNumInputs = 4; |
4313 const intptr_t kNumTemps = 1; | 4313 const intptr_t kNumTemps = 1; |
4314 LocationSummary* summary = new(isolate) LocationSummary( | 4314 LocationSummary* summary = new(zone) LocationSummary( |
4315 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4315 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4316 summary->set_in(0, Location::RequiresRegister()); | 4316 summary->set_in(0, Location::RequiresRegister()); |
4317 summary->set_in(1, Location::RequiresRegister()); | 4317 summary->set_in(1, Location::RequiresRegister()); |
4318 summary->set_in(2, Location::RequiresRegister()); | 4318 summary->set_in(2, Location::RequiresRegister()); |
4319 summary->set_in(3, Location::RequiresRegister()); | 4319 summary->set_in(3, Location::RequiresRegister()); |
4320 summary->set_temp(0, Location::RequiresRegister()); | 4320 summary->set_temp(0, Location::RequiresRegister()); |
4321 summary->set_out(0, Location::RequiresFpuRegister()); | 4321 summary->set_out(0, Location::RequiresFpuRegister()); |
4322 return summary; | 4322 return summary; |
4323 } | 4323 } |
4324 | 4324 |
4325 | 4325 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4370 __ Bind(&w_false); | 4370 __ Bind(&w_false); |
4371 __ LoadImmediate(temp, Immediate(0x0), PP); | 4371 __ LoadImmediate(temp, Immediate(0x0), PP); |
4372 __ Bind(&w_done); | 4372 __ Bind(&w_done); |
4373 __ movl(Address(RSP, 12), temp); | 4373 __ movl(Address(RSP, 12), temp); |
4374 | 4374 |
4375 __ movups(result, Address(RSP, 0)); | 4375 __ movups(result, Address(RSP, 0)); |
4376 __ AddImmediate(RSP, Immediate(16), PP); | 4376 __ AddImmediate(RSP, Immediate(16), PP); |
4377 } | 4377 } |
4378 | 4378 |
4379 | 4379 |
4380 LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(Isolate* isolate, | 4380 LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(Zone* zone, |
4381 bool opt) const { | 4381 bool opt) const { |
4382 const intptr_t kNumInputs = 1; | 4382 const intptr_t kNumInputs = 1; |
4383 const intptr_t kNumTemps = 0; | 4383 const intptr_t kNumTemps = 0; |
4384 LocationSummary* summary = new(isolate) LocationSummary( | 4384 LocationSummary* summary = new(zone) LocationSummary( |
4385 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4385 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4386 summary->set_in(0, Location::RequiresFpuRegister()); | 4386 summary->set_in(0, Location::RequiresFpuRegister()); |
4387 summary->set_out(0, Location::RequiresRegister()); | 4387 summary->set_out(0, Location::RequiresRegister()); |
4388 return summary; | 4388 return summary; |
4389 } | 4389 } |
4390 | 4390 |
4391 | 4391 |
4392 void Int32x4GetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4392 void Int32x4GetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4393 XmmRegister value = locs()->in(0).fpu_reg(); | 4393 XmmRegister value = locs()->in(0).fpu_reg(); |
4394 Register result = locs()->out(0).reg(); | 4394 Register result = locs()->out(0).reg(); |
4395 Label done; | 4395 Label done; |
(...skipping 20 matching lines...) Expand all Loading... |
4416 __ testl(result, result); | 4416 __ testl(result, result); |
4417 __ j(NOT_ZERO, &non_zero, Assembler::kNearJump); | 4417 __ j(NOT_ZERO, &non_zero, Assembler::kNearJump); |
4418 __ LoadObject(result, Bool::False(), PP); | 4418 __ LoadObject(result, Bool::False(), PP); |
4419 __ jmp(&done); | 4419 __ jmp(&done); |
4420 __ Bind(&non_zero); | 4420 __ Bind(&non_zero); |
4421 __ LoadObject(result, Bool::True(), PP); | 4421 __ LoadObject(result, Bool::True(), PP); |
4422 __ Bind(&done); | 4422 __ Bind(&done); |
4423 } | 4423 } |
4424 | 4424 |
4425 | 4425 |
4426 LocationSummary* Int32x4SelectInstr::MakeLocationSummary(Isolate* isolate, | 4426 LocationSummary* Int32x4SelectInstr::MakeLocationSummary(Zone* zone, |
4427 bool opt) const { | 4427 bool opt) const { |
4428 const intptr_t kNumInputs = 3; | 4428 const intptr_t kNumInputs = 3; |
4429 const intptr_t kNumTemps = 1; | 4429 const intptr_t kNumTemps = 1; |
4430 LocationSummary* summary = new(isolate) LocationSummary( | 4430 LocationSummary* summary = new(zone) LocationSummary( |
4431 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4431 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4432 summary->set_in(0, Location::RequiresFpuRegister()); | 4432 summary->set_in(0, Location::RequiresFpuRegister()); |
4433 summary->set_in(1, Location::RequiresFpuRegister()); | 4433 summary->set_in(1, Location::RequiresFpuRegister()); |
4434 summary->set_in(2, Location::RequiresFpuRegister()); | 4434 summary->set_in(2, Location::RequiresFpuRegister()); |
4435 summary->set_temp(0, Location::RequiresFpuRegister()); | 4435 summary->set_temp(0, Location::RequiresFpuRegister()); |
4436 summary->set_out(0, Location::SameAsFirstInput()); | 4436 summary->set_out(0, Location::SameAsFirstInput()); |
4437 return summary; | 4437 return summary; |
4438 } | 4438 } |
4439 | 4439 |
4440 | 4440 |
4441 void Int32x4SelectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4441 void Int32x4SelectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4442 XmmRegister mask = locs()->in(0).fpu_reg(); | 4442 XmmRegister mask = locs()->in(0).fpu_reg(); |
4443 XmmRegister trueValue = locs()->in(1).fpu_reg(); | 4443 XmmRegister trueValue = locs()->in(1).fpu_reg(); |
4444 XmmRegister falseValue = locs()->in(2).fpu_reg(); | 4444 XmmRegister falseValue = locs()->in(2).fpu_reg(); |
4445 XmmRegister out = locs()->out(0).fpu_reg(); | 4445 XmmRegister out = locs()->out(0).fpu_reg(); |
4446 XmmRegister temp = locs()->temp(0).fpu_reg(); | 4446 XmmRegister temp = locs()->temp(0).fpu_reg(); |
4447 ASSERT(out == mask); | 4447 ASSERT(out == mask); |
4448 // Copy mask. | 4448 // Copy mask. |
4449 __ movaps(temp, mask); | 4449 __ movaps(temp, mask); |
4450 // Invert it. | 4450 // Invert it. |
4451 __ notps(temp); | 4451 __ notps(temp); |
4452 // mask = mask & trueValue. | 4452 // mask = mask & trueValue. |
4453 __ andps(mask, trueValue); | 4453 __ andps(mask, trueValue); |
4454 // temp = temp & falseValue. | 4454 // temp = temp & falseValue. |
4455 __ andps(temp, falseValue); | 4455 __ andps(temp, falseValue); |
4456 // out = mask | temp. | 4456 // out = mask | temp. |
4457 __ orps(mask, temp); | 4457 __ orps(mask, temp); |
4458 } | 4458 } |
4459 | 4459 |
4460 | 4460 |
4461 LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(Isolate* isolate, | 4461 LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(Zone* zone, |
4462 bool opt) const { | 4462 bool opt) const { |
4463 const intptr_t kNumInputs = 2; | 4463 const intptr_t kNumInputs = 2; |
4464 const intptr_t kNumTemps = 1; | 4464 const intptr_t kNumTemps = 1; |
4465 LocationSummary* summary = new(isolate) LocationSummary( | 4465 LocationSummary* summary = new(zone) LocationSummary( |
4466 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4466 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4467 summary->set_in(0, Location::RequiresFpuRegister()); | 4467 summary->set_in(0, Location::RequiresFpuRegister()); |
4468 summary->set_in(1, Location::RequiresRegister()); | 4468 summary->set_in(1, Location::RequiresRegister()); |
4469 summary->set_temp(0, Location::RequiresRegister()); | 4469 summary->set_temp(0, Location::RequiresRegister()); |
4470 summary->set_out(0, Location::SameAsFirstInput()); | 4470 summary->set_out(0, Location::SameAsFirstInput()); |
4471 return summary; | 4471 return summary; |
4472 } | 4472 } |
4473 | 4473 |
4474 | 4474 |
4475 void Int32x4SetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4475 void Int32x4SetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4476 XmmRegister mask = locs()->in(0).fpu_reg(); | 4476 XmmRegister mask = locs()->in(0).fpu_reg(); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4518 break; | 4518 break; |
4519 default: UNREACHABLE(); | 4519 default: UNREACHABLE(); |
4520 } | 4520 } |
4521 __ Bind(&exitPath); | 4521 __ Bind(&exitPath); |
4522 // Copy mask back to register. | 4522 // Copy mask back to register. |
4523 __ movups(mask, Address(RSP, 0)); | 4523 __ movups(mask, Address(RSP, 0)); |
4524 __ AddImmediate(RSP, Immediate(16), PP); | 4524 __ AddImmediate(RSP, Immediate(16), PP); |
4525 } | 4525 } |
4526 | 4526 |
4527 | 4527 |
4528 LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(Isolate* isolate, | 4528 LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(Zone* zone, |
4529 bool opt) const { | 4529 bool opt) const { |
4530 const intptr_t kNumInputs = 1; | 4530 const intptr_t kNumInputs = 1; |
4531 const intptr_t kNumTemps = 0; | 4531 const intptr_t kNumTemps = 0; |
4532 LocationSummary* summary = new(isolate) LocationSummary( | 4532 LocationSummary* summary = new(zone) LocationSummary( |
4533 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4533 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4534 summary->set_in(0, Location::RequiresFpuRegister()); | 4534 summary->set_in(0, Location::RequiresFpuRegister()); |
4535 summary->set_out(0, Location::SameAsFirstInput()); | 4535 summary->set_out(0, Location::SameAsFirstInput()); |
4536 return summary; | 4536 return summary; |
4537 } | 4537 } |
4538 | 4538 |
4539 | 4539 |
4540 void Int32x4ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4540 void Int32x4ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4541 // NOP. | 4541 // NOP. |
4542 } | 4542 } |
4543 | 4543 |
4544 | 4544 |
4545 LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(Isolate* isolate, | 4545 LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(Zone* zone, |
4546 bool opt) const { | 4546 bool opt) const { |
4547 const intptr_t kNumInputs = 2; | 4547 const intptr_t kNumInputs = 2; |
4548 const intptr_t kNumTemps = 0; | 4548 const intptr_t kNumTemps = 0; |
4549 LocationSummary* summary = new(isolate) LocationSummary( | 4549 LocationSummary* summary = new(zone) LocationSummary( |
4550 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4550 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4551 summary->set_in(0, Location::RequiresFpuRegister()); | 4551 summary->set_in(0, Location::RequiresFpuRegister()); |
4552 summary->set_in(1, Location::RequiresFpuRegister()); | 4552 summary->set_in(1, Location::RequiresFpuRegister()); |
4553 summary->set_out(0, Location::SameAsFirstInput()); | 4553 summary->set_out(0, Location::SameAsFirstInput()); |
4554 return summary; | 4554 return summary; |
4555 } | 4555 } |
4556 | 4556 |
4557 | 4557 |
4558 void BinaryInt32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4558 void BinaryInt32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4559 XmmRegister left = locs()->in(0).fpu_reg(); | 4559 XmmRegister left = locs()->in(0).fpu_reg(); |
4560 XmmRegister right = locs()->in(1).fpu_reg(); | 4560 XmmRegister right = locs()->in(1).fpu_reg(); |
(...skipping 15 matching lines...) Expand all Loading... |
4576 __ addpl(left, right); | 4576 __ addpl(left, right); |
4577 break; | 4577 break; |
4578 case Token::kSUB: | 4578 case Token::kSUB: |
4579 __ subpl(left, right); | 4579 __ subpl(left, right); |
4580 break; | 4580 break; |
4581 default: UNREACHABLE(); | 4581 default: UNREACHABLE(); |
4582 } | 4582 } |
4583 } | 4583 } |
4584 | 4584 |
4585 | 4585 |
4586 LocationSummary* MathUnaryInstr::MakeLocationSummary(Isolate* isolate, | 4586 LocationSummary* MathUnaryInstr::MakeLocationSummary(Zone* zone, |
4587 bool opt) const { | 4587 bool opt) const { |
4588 if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) { | 4588 if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) { |
4589 // Calling convention on x64 uses XMM0 and XMM1 to pass the first two | 4589 // Calling convention on x64 uses XMM0 and XMM1 to pass the first two |
4590 // double arguments and XMM0 to return the result. Unfortunately | 4590 // double arguments and XMM0 to return the result. Unfortunately |
4591 // currently we can't specify these registers because ParallelMoveResolver | 4591 // currently we can't specify these registers because ParallelMoveResolver |
4592 // assumes that XMM0 is free at all times. | 4592 // assumes that XMM0 is free at all times. |
4593 // TODO(vegorov): allow XMM0 to be used. | 4593 // TODO(vegorov): allow XMM0 to be used. |
4594 const intptr_t kNumTemps = 1; | 4594 const intptr_t kNumTemps = 1; |
4595 LocationSummary* summary = new(isolate) LocationSummary( | 4595 LocationSummary* summary = new(zone) LocationSummary( |
4596 isolate, InputCount(), kNumTemps, LocationSummary::kCall); | 4596 zone, InputCount(), kNumTemps, LocationSummary::kCall); |
4597 summary->set_in(0, Location::FpuRegisterLocation(XMM1)); | 4597 summary->set_in(0, Location::FpuRegisterLocation(XMM1)); |
4598 // R13 is chosen because it is callee saved so we do not need to back it | 4598 // R13 is chosen because it is callee saved so we do not need to back it |
4599 // up before calling into the runtime. | 4599 // up before calling into the runtime. |
4600 summary->set_temp(0, Location::RegisterLocation(R13)); | 4600 summary->set_temp(0, Location::RegisterLocation(R13)); |
4601 summary->set_out(0, Location::FpuRegisterLocation(XMM1)); | 4601 summary->set_out(0, Location::FpuRegisterLocation(XMM1)); |
4602 return summary; | 4602 return summary; |
4603 } | 4603 } |
4604 ASSERT((kind() == MathUnaryInstr::kSqrt) || | 4604 ASSERT((kind() == MathUnaryInstr::kSqrt) || |
4605 (kind() == MathUnaryInstr::kDoubleSquare)); | 4605 (kind() == MathUnaryInstr::kDoubleSquare)); |
4606 const intptr_t kNumInputs = 1; | 4606 const intptr_t kNumInputs = 1; |
4607 const intptr_t kNumTemps = 0; | 4607 const intptr_t kNumTemps = 0; |
4608 LocationSummary* summary = new(isolate) LocationSummary( | 4608 LocationSummary* summary = new(zone) LocationSummary( |
4609 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4609 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4610 summary->set_in(0, Location::RequiresFpuRegister()); | 4610 summary->set_in(0, Location::RequiresFpuRegister()); |
4611 if (kind() == MathUnaryInstr::kDoubleSquare) { | 4611 if (kind() == MathUnaryInstr::kDoubleSquare) { |
4612 summary->set_out(0, Location::SameAsFirstInput()); | 4612 summary->set_out(0, Location::SameAsFirstInput()); |
4613 } else { | 4613 } else { |
4614 summary->set_out(0, Location::RequiresFpuRegister()); | 4614 summary->set_out(0, Location::RequiresFpuRegister()); |
4615 } | 4615 } |
4616 return summary; | 4616 return summary; |
4617 } | 4617 } |
4618 | 4618 |
4619 | 4619 |
(...skipping 13 matching lines...) Expand all Loading... |
4633 __ movaps(XMM0, locs()->in(0).fpu_reg()); | 4633 __ movaps(XMM0, locs()->in(0).fpu_reg()); |
4634 __ CallRuntime(TargetFunction(), InputCount()); | 4634 __ CallRuntime(TargetFunction(), InputCount()); |
4635 __ movaps(locs()->out(0).fpu_reg(), XMM0); | 4635 __ movaps(locs()->out(0).fpu_reg(), XMM0); |
4636 // Restore RSP. | 4636 // Restore RSP. |
4637 __ movq(RSP, locs()->temp(0).reg()); | 4637 __ movq(RSP, locs()->temp(0).reg()); |
4638 } | 4638 } |
4639 } | 4639 } |
4640 | 4640 |
4641 | 4641 |
4642 LocationSummary* CaseInsensitiveCompareUC16Instr::MakeLocationSummary( | 4642 LocationSummary* CaseInsensitiveCompareUC16Instr::MakeLocationSummary( |
4643 Isolate* isolate, bool opt) const { | 4643 Zone* zone, bool opt) const { |
4644 const intptr_t kNumTemps = 0; | 4644 const intptr_t kNumTemps = 0; |
4645 LocationSummary* summary = new(isolate) LocationSummary( | 4645 LocationSummary* summary = new(zone) LocationSummary( |
4646 isolate, InputCount(), kNumTemps, LocationSummary::kCall); | 4646 zone, InputCount(), kNumTemps, LocationSummary::kCall); |
4647 summary->set_in(0, Location::RegisterLocation(CallingConventions::kArg1Reg)); | 4647 summary->set_in(0, Location::RegisterLocation(CallingConventions::kArg1Reg)); |
4648 summary->set_in(1, Location::RegisterLocation(CallingConventions::kArg2Reg)); | 4648 summary->set_in(1, Location::RegisterLocation(CallingConventions::kArg2Reg)); |
4649 summary->set_in(2, Location::RegisterLocation(CallingConventions::kArg3Reg)); | 4649 summary->set_in(2, Location::RegisterLocation(CallingConventions::kArg3Reg)); |
4650 summary->set_in(3, Location::RegisterLocation(CallingConventions::kArg4Reg)); | 4650 summary->set_in(3, Location::RegisterLocation(CallingConventions::kArg4Reg)); |
4651 summary->set_out(0, Location::RegisterLocation(RAX)); | 4651 summary->set_out(0, Location::RegisterLocation(RAX)); |
4652 return summary; | 4652 return summary; |
4653 } | 4653 } |
4654 | 4654 |
4655 | 4655 |
4656 void CaseInsensitiveCompareUC16Instr::EmitNativeCode( | 4656 void CaseInsensitiveCompareUC16Instr::EmitNativeCode( |
4657 FlowGraphCompiler* compiler) { | 4657 FlowGraphCompiler* compiler) { |
4658 | 4658 |
4659 // Save RSP. R13 is chosen because it is callee saved so we do not need to | 4659 // Save RSP. R13 is chosen because it is callee saved so we do not need to |
4660 // back it up before calling into the runtime. | 4660 // back it up before calling into the runtime. |
4661 static const Register kSavedSPReg = R13; | 4661 static const Register kSavedSPReg = R13; |
4662 __ movq(kSavedSPReg, RSP); | 4662 __ movq(kSavedSPReg, RSP); |
4663 __ ReserveAlignedFrameSpace(0); | 4663 __ ReserveAlignedFrameSpace(0); |
4664 | 4664 |
4665 // Call the function. Parameters are already in their correct spots. | 4665 // Call the function. Parameters are already in their correct spots. |
4666 __ CallRuntime(TargetFunction(), TargetFunction().argument_count()); | 4666 __ CallRuntime(TargetFunction(), TargetFunction().argument_count()); |
4667 | 4667 |
4668 // Restore RSP. | 4668 // Restore RSP. |
4669 __ movq(RSP, kSavedSPReg); | 4669 __ movq(RSP, kSavedSPReg); |
4670 } | 4670 } |
4671 | 4671 |
4672 | 4672 |
4673 LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Isolate* isolate, | 4673 LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Zone* zone, |
4674 bool opt) const { | 4674 bool opt) const { |
4675 const intptr_t kNumInputs = 1; | 4675 const intptr_t kNumInputs = 1; |
4676 return LocationSummary::Make(isolate, | 4676 return LocationSummary::Make(zone, |
4677 kNumInputs, | 4677 kNumInputs, |
4678 Location::SameAsFirstInput(), | 4678 Location::SameAsFirstInput(), |
4679 LocationSummary::kNoCall); | 4679 LocationSummary::kNoCall); |
4680 } | 4680 } |
4681 | 4681 |
4682 | 4682 |
4683 void UnarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4683 void UnarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4684 Register value = locs()->in(0).reg(); | 4684 Register value = locs()->in(0).reg(); |
4685 ASSERT(value == locs()->out(0).reg()); | 4685 ASSERT(value == locs()->out(0).reg()); |
4686 switch (op_kind()) { | 4686 switch (op_kind()) { |
(...skipping 10 matching lines...) Expand all Loading... |
4697 __ notq(value); | 4697 __ notq(value); |
4698 // Remove inverted smi-tag. | 4698 // Remove inverted smi-tag. |
4699 __ AndImmediate(value, Immediate(~kSmiTagMask), PP); | 4699 __ AndImmediate(value, Immediate(~kSmiTagMask), PP); |
4700 break; | 4700 break; |
4701 default: | 4701 default: |
4702 UNREACHABLE(); | 4702 UNREACHABLE(); |
4703 } | 4703 } |
4704 } | 4704 } |
4705 | 4705 |
4706 | 4706 |
4707 LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate, | 4707 LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(Zone* zone, |
4708 bool opt) const { | 4708 bool opt) const { |
4709 const intptr_t kNumInputs = 1; | 4709 const intptr_t kNumInputs = 1; |
4710 const intptr_t kNumTemps = 0; | 4710 const intptr_t kNumTemps = 0; |
4711 LocationSummary* summary = new(isolate) LocationSummary( | 4711 LocationSummary* summary = new(zone) LocationSummary( |
4712 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4712 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4713 summary->set_in(0, Location::RequiresFpuRegister()); | 4713 summary->set_in(0, Location::RequiresFpuRegister()); |
4714 summary->set_out(0, Location::SameAsFirstInput()); | 4714 summary->set_out(0, Location::SameAsFirstInput()); |
4715 return summary; | 4715 return summary; |
4716 } | 4716 } |
4717 | 4717 |
4718 | 4718 |
4719 void UnaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4719 void UnaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4720 XmmRegister value = locs()->in(0).fpu_reg(); | 4720 XmmRegister value = locs()->in(0).fpu_reg(); |
4721 ASSERT(locs()->out(0).fpu_reg() == value); | 4721 ASSERT(locs()->out(0).fpu_reg() == value); |
4722 __ DoubleNegate(value); | 4722 __ DoubleNegate(value); |
4723 } | 4723 } |
4724 | 4724 |
4725 | 4725 |
4726 LocationSummary* MathMinMaxInstr::MakeLocationSummary(Isolate* isolate, | 4726 LocationSummary* MathMinMaxInstr::MakeLocationSummary(Zone* zone, |
4727 bool opt) const { | 4727 bool opt) const { |
4728 if (result_cid() == kDoubleCid) { | 4728 if (result_cid() == kDoubleCid) { |
4729 const intptr_t kNumInputs = 2; | 4729 const intptr_t kNumInputs = 2; |
4730 const intptr_t kNumTemps = 1; | 4730 const intptr_t kNumTemps = 1; |
4731 LocationSummary* summary = new(isolate) LocationSummary( | 4731 LocationSummary* summary = new(zone) LocationSummary( |
4732 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4732 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4733 summary->set_in(0, Location::RequiresFpuRegister()); | 4733 summary->set_in(0, Location::RequiresFpuRegister()); |
4734 summary->set_in(1, Location::RequiresFpuRegister()); | 4734 summary->set_in(1, Location::RequiresFpuRegister()); |
4735 // Reuse the left register so that code can be made shorter. | 4735 // Reuse the left register so that code can be made shorter. |
4736 summary->set_out(0, Location::SameAsFirstInput()); | 4736 summary->set_out(0, Location::SameAsFirstInput()); |
4737 summary->set_temp(0, Location::RequiresRegister()); | 4737 summary->set_temp(0, Location::RequiresRegister()); |
4738 return summary; | 4738 return summary; |
4739 } | 4739 } |
4740 ASSERT(result_cid() == kSmiCid); | 4740 ASSERT(result_cid() == kSmiCid); |
4741 const intptr_t kNumInputs = 2; | 4741 const intptr_t kNumInputs = 2; |
4742 const intptr_t kNumTemps = 0; | 4742 const intptr_t kNumTemps = 0; |
4743 LocationSummary* summary = new(isolate) LocationSummary( | 4743 LocationSummary* summary = new(zone) LocationSummary( |
4744 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4744 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4745 summary->set_in(0, Location::RequiresRegister()); | 4745 summary->set_in(0, Location::RequiresRegister()); |
4746 summary->set_in(1, Location::RequiresRegister()); | 4746 summary->set_in(1, Location::RequiresRegister()); |
4747 // Reuse the left register so that code can be made shorter. | 4747 // Reuse the left register so that code can be made shorter. |
4748 summary->set_out(0, Location::SameAsFirstInput()); | 4748 summary->set_out(0, Location::SameAsFirstInput()); |
4749 return summary; | 4749 return summary; |
4750 } | 4750 } |
4751 | 4751 |
4752 | 4752 |
4753 void MathMinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4753 void MathMinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4754 ASSERT((op_kind() == MethodRecognizer::kMathMin) || | 4754 ASSERT((op_kind() == MethodRecognizer::kMathMin) || |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4806 __ cmpq(left, right); | 4806 __ cmpq(left, right); |
4807 ASSERT(result == left); | 4807 ASSERT(result == left); |
4808 if (is_min) { | 4808 if (is_min) { |
4809 __ cmovgeq(result, right); | 4809 __ cmovgeq(result, right); |
4810 } else { | 4810 } else { |
4811 __ cmovlessq(result, right); | 4811 __ cmovlessq(result, right); |
4812 } | 4812 } |
4813 } | 4813 } |
4814 | 4814 |
4815 | 4815 |
4816 LocationSummary* Int32ToDoubleInstr::MakeLocationSummary(Isolate* isolate, | 4816 LocationSummary* Int32ToDoubleInstr::MakeLocationSummary(Zone* zone, |
4817 bool opt) const { | 4817 bool opt) const { |
4818 const intptr_t kNumInputs = 1; | 4818 const intptr_t kNumInputs = 1; |
4819 const intptr_t kNumTemps = 0; | 4819 const intptr_t kNumTemps = 0; |
4820 LocationSummary* result = new(isolate) LocationSummary( | 4820 LocationSummary* result = new(zone) LocationSummary( |
4821 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4821 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4822 result->set_in(0, Location::RequiresRegister()); | 4822 result->set_in(0, Location::RequiresRegister()); |
4823 result->set_out(0, Location::RequiresFpuRegister()); | 4823 result->set_out(0, Location::RequiresFpuRegister()); |
4824 return result; | 4824 return result; |
4825 } | 4825 } |
4826 | 4826 |
4827 | 4827 |
4828 void Int32ToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4828 void Int32ToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4829 Register value = locs()->in(0).reg(); | 4829 Register value = locs()->in(0).reg(); |
4830 FpuRegister result = locs()->out(0).fpu_reg(); | 4830 FpuRegister result = locs()->out(0).fpu_reg(); |
4831 __ cvtsi2sdl(result, value); | 4831 __ cvtsi2sdl(result, value); |
4832 } | 4832 } |
4833 | 4833 |
4834 | 4834 |
4835 LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Isolate* isolate, | 4835 LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Zone* zone, |
4836 bool opt) const { | 4836 bool opt) const { |
4837 const intptr_t kNumInputs = 1; | 4837 const intptr_t kNumInputs = 1; |
4838 const intptr_t kNumTemps = 0; | 4838 const intptr_t kNumTemps = 0; |
4839 LocationSummary* result = new(isolate) LocationSummary( | 4839 LocationSummary* result = new(zone) LocationSummary( |
4840 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4840 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4841 result->set_in(0, Location::WritableRegister()); | 4841 result->set_in(0, Location::WritableRegister()); |
4842 result->set_out(0, Location::RequiresFpuRegister()); | 4842 result->set_out(0, Location::RequiresFpuRegister()); |
4843 return result; | 4843 return result; |
4844 } | 4844 } |
4845 | 4845 |
4846 | 4846 |
4847 void SmiToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4847 void SmiToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4848 Register value = locs()->in(0).reg(); | 4848 Register value = locs()->in(0).reg(); |
4849 FpuRegister result = locs()->out(0).fpu_reg(); | 4849 FpuRegister result = locs()->out(0).fpu_reg(); |
4850 __ SmiUntag(value); | 4850 __ SmiUntag(value); |
4851 __ cvtsi2sdq(result, value); | 4851 __ cvtsi2sdq(result, value); |
4852 } | 4852 } |
4853 | 4853 |
4854 | 4854 |
4855 LocationSummary* MintToDoubleInstr::MakeLocationSummary(Isolate* isolate, | 4855 LocationSummary* MintToDoubleInstr::MakeLocationSummary(Zone* zone, |
4856 bool opt) const { | 4856 bool opt) const { |
4857 UNIMPLEMENTED(); | 4857 UNIMPLEMENTED(); |
4858 return NULL; | 4858 return NULL; |
4859 } | 4859 } |
4860 | 4860 |
4861 | 4861 |
4862 void MintToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4862 void MintToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4863 UNIMPLEMENTED(); | 4863 UNIMPLEMENTED(); |
4864 } | 4864 } |
4865 | 4865 |
4866 | 4866 |
4867 LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Isolate* isolate, | 4867 LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Zone* zone, |
4868 bool opt) const { | 4868 bool opt) const { |
4869 const intptr_t kNumInputs = 1; | 4869 const intptr_t kNumInputs = 1; |
4870 const intptr_t kNumTemps = 1; | 4870 const intptr_t kNumTemps = 1; |
4871 LocationSummary* result = new(isolate) LocationSummary( | 4871 LocationSummary* result = new(zone) LocationSummary( |
4872 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); | 4872 zone, kNumInputs, kNumTemps, LocationSummary::kCall); |
4873 result->set_in(0, Location::RegisterLocation(RCX)); | 4873 result->set_in(0, Location::RegisterLocation(RCX)); |
4874 result->set_out(0, Location::RegisterLocation(RAX)); | 4874 result->set_out(0, Location::RegisterLocation(RAX)); |
4875 result->set_temp(0, Location::RegisterLocation(RBX)); | 4875 result->set_temp(0, Location::RegisterLocation(RBX)); |
4876 return result; | 4876 return result; |
4877 } | 4877 } |
4878 | 4878 |
4879 | 4879 |
4880 void DoubleToIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4880 void DoubleToIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4881 Register result = locs()->out(0).reg(); | 4881 Register result = locs()->out(0).reg(); |
4882 Register value_obj = locs()->in(0).reg(); | 4882 Register value_obj = locs()->in(0).reg(); |
(...skipping 27 matching lines...) Expand all Loading... |
4910 instance_call()->token_pos(), | 4910 instance_call()->token_pos(), |
4911 target, | 4911 target, |
4912 kNumberOfArguments, | 4912 kNumberOfArguments, |
4913 Object::null_array(), // No argument names. | 4913 Object::null_array(), // No argument names. |
4914 locs(), | 4914 locs(), |
4915 ICData::Handle()); | 4915 ICData::Handle()); |
4916 __ Bind(&done); | 4916 __ Bind(&done); |
4917 } | 4917 } |
4918 | 4918 |
4919 | 4919 |
4920 LocationSummary* DoubleToSmiInstr::MakeLocationSummary(Isolate* isolate, | 4920 LocationSummary* DoubleToSmiInstr::MakeLocationSummary(Zone* zone, |
4921 bool opt) const { | 4921 bool opt) const { |
4922 const intptr_t kNumInputs = 1; | 4922 const intptr_t kNumInputs = 1; |
4923 const intptr_t kNumTemps = 1; | 4923 const intptr_t kNumTemps = 1; |
4924 LocationSummary* result = new(isolate) LocationSummary( | 4924 LocationSummary* result = new(zone) LocationSummary( |
4925 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4925 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4926 result->set_in(0, Location::RequiresFpuRegister()); | 4926 result->set_in(0, Location::RequiresFpuRegister()); |
4927 result->set_out(0, Location::RequiresRegister()); | 4927 result->set_out(0, Location::RequiresRegister()); |
4928 result->set_temp(0, Location::RequiresRegister()); | 4928 result->set_temp(0, Location::RequiresRegister()); |
4929 return result; | 4929 return result; |
4930 } | 4930 } |
4931 | 4931 |
4932 | 4932 |
4933 void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4933 void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4934 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi); | 4934 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi); |
4935 Register result = locs()->out(0).reg(); | 4935 Register result = locs()->out(0).reg(); |
4936 XmmRegister value = locs()->in(0).fpu_reg(); | 4936 XmmRegister value = locs()->in(0).fpu_reg(); |
4937 Register temp = locs()->temp(0).reg(); | 4937 Register temp = locs()->temp(0).reg(); |
4938 | 4938 |
4939 __ cvttsd2siq(result, value); | 4939 __ cvttsd2siq(result, value); |
4940 // Overflow is signalled with minint. | 4940 // Overflow is signalled with minint. |
4941 Label do_call, done; | 4941 Label do_call, done; |
4942 // Check for overflow and that it fits into Smi. | 4942 // Check for overflow and that it fits into Smi. |
4943 __ movq(temp, result); | 4943 __ movq(temp, result); |
4944 __ shlq(temp, Immediate(1)); | 4944 __ shlq(temp, Immediate(1)); |
4945 __ j(OVERFLOW, deopt); | 4945 __ j(OVERFLOW, deopt); |
4946 __ SmiTag(result); | 4946 __ SmiTag(result); |
4947 if (FLAG_throw_on_javascript_int_overflow) { | 4947 if (FLAG_throw_on_javascript_int_overflow) { |
4948 EmitJavascriptOverflowCheck(compiler, range(), deopt, result); | 4948 EmitJavascriptOverflowCheck(compiler, range(), deopt, result); |
4949 } | 4949 } |
4950 } | 4950 } |
4951 | 4951 |
4952 | 4952 |
4953 LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(Isolate* isolate, | 4953 LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(Zone* zone, |
4954 bool opt) const { | 4954 bool opt) const { |
4955 const intptr_t kNumInputs = 1; | 4955 const intptr_t kNumInputs = 1; |
4956 const intptr_t kNumTemps = 0; | 4956 const intptr_t kNumTemps = 0; |
4957 LocationSummary* result = new(isolate) LocationSummary( | 4957 LocationSummary* result = new(zone) LocationSummary( |
4958 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4958 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4959 result->set_in(0, Location::RequiresFpuRegister()); | 4959 result->set_in(0, Location::RequiresFpuRegister()); |
4960 result->set_out(0, Location::RequiresFpuRegister()); | 4960 result->set_out(0, Location::RequiresFpuRegister()); |
4961 return result; | 4961 return result; |
4962 } | 4962 } |
4963 | 4963 |
4964 | 4964 |
4965 void DoubleToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4965 void DoubleToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4966 XmmRegister value = locs()->in(0).fpu_reg(); | 4966 XmmRegister value = locs()->in(0).fpu_reg(); |
4967 XmmRegister result = locs()->out(0).fpu_reg(); | 4967 XmmRegister result = locs()->out(0).fpu_reg(); |
4968 switch (recognized_kind()) { | 4968 switch (recognized_kind()) { |
4969 case MethodRecognizer::kDoubleTruncate: | 4969 case MethodRecognizer::kDoubleTruncate: |
4970 __ roundsd(result, value, Assembler::kRoundToZero); | 4970 __ roundsd(result, value, Assembler::kRoundToZero); |
4971 break; | 4971 break; |
4972 case MethodRecognizer::kDoubleFloor: | 4972 case MethodRecognizer::kDoubleFloor: |
4973 __ roundsd(result, value, Assembler::kRoundDown); | 4973 __ roundsd(result, value, Assembler::kRoundDown); |
4974 break; | 4974 break; |
4975 case MethodRecognizer::kDoubleCeil: | 4975 case MethodRecognizer::kDoubleCeil: |
4976 __ roundsd(result, value, Assembler::kRoundUp); | 4976 __ roundsd(result, value, Assembler::kRoundUp); |
4977 break; | 4977 break; |
4978 default: | 4978 default: |
4979 UNREACHABLE(); | 4979 UNREACHABLE(); |
4980 } | 4980 } |
4981 } | 4981 } |
4982 | 4982 |
4983 | 4983 |
4984 LocationSummary* DoubleToFloatInstr::MakeLocationSummary(Isolate* isolate, | 4984 LocationSummary* DoubleToFloatInstr::MakeLocationSummary(Zone* zone, |
4985 bool opt) const { | 4985 bool opt) const { |
4986 const intptr_t kNumInputs = 1; | 4986 const intptr_t kNumInputs = 1; |
4987 const intptr_t kNumTemps = 0; | 4987 const intptr_t kNumTemps = 0; |
4988 LocationSummary* result = new(isolate) LocationSummary( | 4988 LocationSummary* result = new(zone) LocationSummary( |
4989 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4989 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4990 result->set_in(0, Location::RequiresFpuRegister()); | 4990 result->set_in(0, Location::RequiresFpuRegister()); |
4991 result->set_out(0, Location::SameAsFirstInput()); | 4991 result->set_out(0, Location::SameAsFirstInput()); |
4992 return result; | 4992 return result; |
4993 } | 4993 } |
4994 | 4994 |
4995 | 4995 |
4996 void DoubleToFloatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4996 void DoubleToFloatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4997 __ cvtsd2ss(locs()->out(0).fpu_reg(), locs()->in(0).fpu_reg()); | 4997 __ cvtsd2ss(locs()->out(0).fpu_reg(), locs()->in(0).fpu_reg()); |
4998 } | 4998 } |
4999 | 4999 |
5000 | 5000 |
5001 LocationSummary* FloatToDoubleInstr::MakeLocationSummary(Isolate* isolate, | 5001 LocationSummary* FloatToDoubleInstr::MakeLocationSummary(Zone* zone, |
5002 bool opt) const { | 5002 bool opt) const { |
5003 const intptr_t kNumInputs = 1; | 5003 const intptr_t kNumInputs = 1; |
5004 const intptr_t kNumTemps = 0; | 5004 const intptr_t kNumTemps = 0; |
5005 LocationSummary* result = new(isolate) LocationSummary( | 5005 LocationSummary* result = new(zone) LocationSummary( |
5006 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 5006 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
5007 result->set_in(0, Location::RequiresFpuRegister()); | 5007 result->set_in(0, Location::RequiresFpuRegister()); |
5008 result->set_out(0, Location::SameAsFirstInput()); | 5008 result->set_out(0, Location::SameAsFirstInput()); |
5009 return result; | 5009 return result; |
5010 } | 5010 } |
5011 | 5011 |
5012 | 5012 |
5013 void FloatToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5013 void FloatToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5014 __ cvtss2sd(locs()->out(0).fpu_reg(), locs()->in(0).fpu_reg()); | 5014 __ cvtss2sd(locs()->out(0).fpu_reg(), locs()->in(0).fpu_reg()); |
5015 } | 5015 } |
5016 | 5016 |
5017 | 5017 |
5018 LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(Isolate* isolate, | 5018 LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(Zone* zone, |
5019 bool opt) const { | 5019 bool opt) const { |
5020 // Calling convention on x64 uses XMM0 and XMM1 to pass the first two | 5020 // Calling convention on x64 uses XMM0 and XMM1 to pass the first two |
5021 // double arguments and XMM0 to return the result. Unfortunately | 5021 // double arguments and XMM0 to return the result. Unfortunately |
5022 // currently we can't specify these registers because ParallelMoveResolver | 5022 // currently we can't specify these registers because ParallelMoveResolver |
5023 // assumes that XMM0 is free at all times. | 5023 // assumes that XMM0 is free at all times. |
5024 // TODO(vegorov): allow XMM0 to be used. | 5024 // TODO(vegorov): allow XMM0 to be used. |
5025 ASSERT((InputCount() == 1) || (InputCount() == 2)); | 5025 ASSERT((InputCount() == 1) || (InputCount() == 2)); |
5026 const intptr_t kNumTemps = | 5026 const intptr_t kNumTemps = |
5027 (recognized_kind() == MethodRecognizer::kMathDoublePow) ? 3 : 1; | 5027 (recognized_kind() == MethodRecognizer::kMathDoublePow) ? 3 : 1; |
5028 LocationSummary* result = new(isolate) LocationSummary( | 5028 LocationSummary* result = new(zone) LocationSummary( |
5029 isolate, InputCount(), kNumTemps, LocationSummary::kCall); | 5029 zone, InputCount(), kNumTemps, LocationSummary::kCall); |
5030 result->set_temp(0, Location::RegisterLocation(R13)); | 5030 result->set_temp(0, Location::RegisterLocation(R13)); |
5031 result->set_in(0, Location::FpuRegisterLocation(XMM2)); | 5031 result->set_in(0, Location::FpuRegisterLocation(XMM2)); |
5032 if (InputCount() == 2) { | 5032 if (InputCount() == 2) { |
5033 result->set_in(1, Location::FpuRegisterLocation(XMM1)); | 5033 result->set_in(1, Location::FpuRegisterLocation(XMM1)); |
5034 } | 5034 } |
5035 if (recognized_kind() == MethodRecognizer::kMathDoublePow) { | 5035 if (recognized_kind() == MethodRecognizer::kMathDoublePow) { |
5036 // Temp index 1. | 5036 // Temp index 1. |
5037 result->set_temp(1, Location::RegisterLocation(RAX)); | 5037 result->set_temp(1, Location::RegisterLocation(RAX)); |
5038 // Temp index 2. | 5038 // Temp index 2. |
5039 result->set_temp(2, Location::FpuRegisterLocation(XMM4)); | 5039 result->set_temp(2, Location::FpuRegisterLocation(XMM4)); |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5191 ASSERT(locs()->in(1).fpu_reg() == XMM1); | 5191 ASSERT(locs()->in(1).fpu_reg() == XMM1); |
5192 } | 5192 } |
5193 | 5193 |
5194 __ CallRuntime(TargetFunction(), InputCount()); | 5194 __ CallRuntime(TargetFunction(), InputCount()); |
5195 __ movaps(locs()->out(0).fpu_reg(), XMM0); | 5195 __ movaps(locs()->out(0).fpu_reg(), XMM0); |
5196 // Restore RSP. | 5196 // Restore RSP. |
5197 __ movq(RSP, locs()->temp(kSavedSpTempIndex).reg()); | 5197 __ movq(RSP, locs()->temp(kSavedSpTempIndex).reg()); |
5198 } | 5198 } |
5199 | 5199 |
5200 | 5200 |
5201 LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(Isolate* isolate, | 5201 LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(Zone* zone, |
5202 bool opt) const { | 5202 bool opt) const { |
5203 // Only use this instruction in optimized code. | 5203 // Only use this instruction in optimized code. |
5204 ASSERT(opt); | 5204 ASSERT(opt); |
5205 const intptr_t kNumInputs = 1; | 5205 const intptr_t kNumInputs = 1; |
5206 LocationSummary* summary = new(isolate) LocationSummary( | 5206 LocationSummary* summary = new(zone) LocationSummary( |
5207 isolate, kNumInputs, 0, LocationSummary::kNoCall); | 5207 zone, kNumInputs, 0, LocationSummary::kNoCall); |
5208 if (representation() == kUnboxedDouble) { | 5208 if (representation() == kUnboxedDouble) { |
5209 if (index() == 0) { | 5209 if (index() == 0) { |
5210 summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(), | 5210 summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(), |
5211 Location::Any())); | 5211 Location::Any())); |
5212 } else { | 5212 } else { |
5213 ASSERT(index() == 1); | 5213 ASSERT(index() == 1); |
5214 summary->set_in(0, Location::Pair(Location::Any(), | 5214 summary->set_in(0, Location::Pair(Location::Any(), |
5215 Location::RequiresFpuRegister())); | 5215 Location::RequiresFpuRegister())); |
5216 } | 5216 } |
5217 summary->set_out(0, Location::RequiresFpuRegister()); | 5217 summary->set_out(0, Location::RequiresFpuRegister()); |
(...skipping 23 matching lines...) Expand all Loading... |
5241 __ movaps(out, in); | 5241 __ movaps(out, in); |
5242 } else { | 5242 } else { |
5243 ASSERT(representation() == kTagged); | 5243 ASSERT(representation() == kTagged); |
5244 Register out = locs()->out(0).reg(); | 5244 Register out = locs()->out(0).reg(); |
5245 Register in = in_loc.reg(); | 5245 Register in = in_loc.reg(); |
5246 __ movq(out, in); | 5246 __ movq(out, in); |
5247 } | 5247 } |
5248 } | 5248 } |
5249 | 5249 |
5250 | 5250 |
5251 LocationSummary* MergedMathInstr::MakeLocationSummary(Isolate* isolate, | 5251 LocationSummary* MergedMathInstr::MakeLocationSummary(Zone* zone, |
5252 bool opt) const { | 5252 bool opt) const { |
5253 if (kind() == MergedMathInstr::kTruncDivMod) { | 5253 if (kind() == MergedMathInstr::kTruncDivMod) { |
5254 const intptr_t kNumInputs = 2; | 5254 const intptr_t kNumInputs = 2; |
5255 const intptr_t kNumTemps = 0; | 5255 const intptr_t kNumTemps = 0; |
5256 LocationSummary* summary = new(isolate) LocationSummary( | 5256 LocationSummary* summary = new(zone) LocationSummary( |
5257 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 5257 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
5258 // Both inputs must be writable because they will be untagged. | 5258 // Both inputs must be writable because they will be untagged. |
5259 summary->set_in(0, Location::RegisterLocation(RAX)); | 5259 summary->set_in(0, Location::RegisterLocation(RAX)); |
5260 summary->set_in(1, Location::WritableRegister()); | 5260 summary->set_in(1, Location::WritableRegister()); |
5261 summary->set_out(0, Location::Pair(Location::RegisterLocation(RAX), | 5261 summary->set_out(0, Location::Pair(Location::RegisterLocation(RAX), |
5262 Location::RegisterLocation(RDX))); | 5262 Location::RegisterLocation(RDX))); |
5263 return summary; | 5263 return summary; |
5264 } | 5264 } |
5265 if (kind() == MergedMathInstr::kSinCos) { | 5265 if (kind() == MergedMathInstr::kSinCos) { |
5266 const intptr_t kNumInputs = 1; | 5266 const intptr_t kNumInputs = 1; |
5267 const intptr_t kNumTemps = 1; | 5267 const intptr_t kNumTemps = 1; |
5268 LocationSummary* summary = new(isolate) LocationSummary( | 5268 LocationSummary* summary = new(zone) LocationSummary( |
5269 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); | 5269 zone, kNumInputs, kNumTemps, LocationSummary::kCall); |
5270 // Because we always call into the runtime (LocationSummary::kCall) we | 5270 // Because we always call into the runtime (LocationSummary::kCall) we |
5271 // must specify each input, temp, and output register explicitly. | 5271 // must specify each input, temp, and output register explicitly. |
5272 summary->set_in(0, Location::FpuRegisterLocation(XMM1)); | 5272 summary->set_in(0, Location::FpuRegisterLocation(XMM1)); |
5273 // R13 is chosen because it is callee saved so we do not need to back it | 5273 // R13 is chosen because it is callee saved so we do not need to back it |
5274 // up before calling into the runtime. | 5274 // up before calling into the runtime. |
5275 summary->set_temp(0, Location::RegisterLocation(R13)); | 5275 summary->set_temp(0, Location::RegisterLocation(R13)); |
5276 summary->set_out(0, Location::Pair(Location::FpuRegisterLocation(XMM2), | 5276 summary->set_out(0, Location::Pair(Location::FpuRegisterLocation(XMM2), |
5277 Location::FpuRegisterLocation(XMM3))); | 5277 Location::FpuRegisterLocation(XMM3))); |
5278 return summary; | 5278 return summary; |
5279 } | 5279 } |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5417 // Restore RSP. | 5417 // Restore RSP. |
5418 __ movq(RSP, locs()->temp(0).reg()); | 5418 __ movq(RSP, locs()->temp(0).reg()); |
5419 | 5419 |
5420 return; | 5420 return; |
5421 } | 5421 } |
5422 UNIMPLEMENTED(); | 5422 UNIMPLEMENTED(); |
5423 } | 5423 } |
5424 | 5424 |
5425 | 5425 |
5426 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary( | 5426 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary( |
5427 Isolate* isolate, bool opt) const { | 5427 Zone* zone, bool opt) const { |
5428 return MakeCallSummary(isolate); | 5428 return MakeCallSummary(zone); |
5429 } | 5429 } |
5430 | 5430 |
5431 | 5431 |
5432 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5432 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5433 ASSERT(ic_data().NumArgsTested() == 1); | 5433 ASSERT(ic_data().NumArgsTested() == 1); |
5434 if (!with_checks()) { | 5434 if (!with_checks()) { |
5435 ASSERT(ic_data().HasOneTarget()); | 5435 ASSERT(ic_data().HasOneTarget()); |
5436 const Function& target = Function::ZoneHandle(ic_data().GetTargetAt(0)); | 5436 const Function& target = Function::ZoneHandle(ic_data().GetTargetAt(0)); |
5437 compiler->GenerateStaticCall(deopt_id(), | 5437 compiler->GenerateStaticCall(deopt_id(), |
5438 instance_call()->token_pos(), | 5438 instance_call()->token_pos(), |
(...skipping 18 matching lines...) Expand all Loading... |
5457 RDI, // Class id register. | 5457 RDI, // Class id register. |
5458 instance_call()->ArgumentCount(), | 5458 instance_call()->ArgumentCount(), |
5459 instance_call()->argument_names(), | 5459 instance_call()->argument_names(), |
5460 deopt, | 5460 deopt, |
5461 deopt_id(), | 5461 deopt_id(), |
5462 instance_call()->token_pos(), | 5462 instance_call()->token_pos(), |
5463 locs()); | 5463 locs()); |
5464 } | 5464 } |
5465 | 5465 |
5466 | 5466 |
5467 LocationSummary* BranchInstr::MakeLocationSummary(Isolate* isolate, | 5467 LocationSummary* BranchInstr::MakeLocationSummary(Zone* zone, |
5468 bool opt) const { | 5468 bool opt) const { |
5469 comparison()->InitializeLocationSummary(isolate, opt); | 5469 comparison()->InitializeLocationSummary(zone, opt); |
5470 // Branches don't produce a result. | 5470 // Branches don't produce a result. |
5471 comparison()->locs()->set_out(0, Location::NoLocation()); | 5471 comparison()->locs()->set_out(0, Location::NoLocation()); |
5472 return comparison()->locs(); | 5472 return comparison()->locs(); |
5473 } | 5473 } |
5474 | 5474 |
5475 | 5475 |
5476 void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5476 void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5477 comparison()->EmitBranchCode(compiler, this); | 5477 comparison()->EmitBranchCode(compiler, this); |
5478 } | 5478 } |
5479 | 5479 |
5480 | 5480 |
5481 LocationSummary* CheckClassInstr::MakeLocationSummary(Isolate* isolate, | 5481 LocationSummary* CheckClassInstr::MakeLocationSummary(Zone* zone, |
5482 bool opt) const { | 5482 bool opt) const { |
5483 const intptr_t kNumInputs = 1; | 5483 const intptr_t kNumInputs = 1; |
5484 const bool need_mask_temp = IsDenseSwitch() && !IsDenseMask(ComputeCidMask()); | 5484 const bool need_mask_temp = IsDenseSwitch() && !IsDenseMask(ComputeCidMask()); |
5485 const intptr_t kNumTemps = !IsNullCheck() ? (need_mask_temp ? 2 : 1) : 0; | 5485 const intptr_t kNumTemps = !IsNullCheck() ? (need_mask_temp ? 2 : 1) : 0; |
5486 LocationSummary* summary = new(isolate) LocationSummary( | 5486 LocationSummary* summary = new(zone) LocationSummary( |
5487 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 5487 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
5488 summary->set_in(0, Location::RequiresRegister()); | 5488 summary->set_in(0, Location::RequiresRegister()); |
5489 if (!IsNullCheck()) { | 5489 if (!IsNullCheck()) { |
5490 summary->set_temp(0, Location::RequiresRegister()); | 5490 summary->set_temp(0, Location::RequiresRegister()); |
5491 if (need_mask_temp) { | 5491 if (need_mask_temp) { |
5492 summary->set_temp(1, Location::RequiresRegister()); | 5492 summary->set_temp(1, Location::RequiresRegister()); |
5493 } | 5493 } |
5494 } | 5494 } |
5495 return summary; | 5495 return summary; |
5496 } | 5496 } |
5497 | 5497 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5552 } else { | 5552 } else { |
5553 __ j(EQUAL, &is_ok); | 5553 __ j(EQUAL, &is_ok); |
5554 } | 5554 } |
5555 } | 5555 } |
5556 } | 5556 } |
5557 } | 5557 } |
5558 __ Bind(&is_ok); | 5558 __ Bind(&is_ok); |
5559 } | 5559 } |
5560 | 5560 |
5561 | 5561 |
5562 LocationSummary* CheckSmiInstr::MakeLocationSummary(Isolate* isolate, | 5562 LocationSummary* CheckSmiInstr::MakeLocationSummary(Zone* zone, |
5563 bool opt) const { | 5563 bool opt) const { |
5564 const intptr_t kNumInputs = 1; | 5564 const intptr_t kNumInputs = 1; |
5565 const intptr_t kNumTemps = 0; | 5565 const intptr_t kNumTemps = 0; |
5566 LocationSummary* summary = new(isolate) LocationSummary( | 5566 LocationSummary* summary = new(zone) LocationSummary( |
5567 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 5567 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
5568 summary->set_in(0, Location::RequiresRegister()); | 5568 summary->set_in(0, Location::RequiresRegister()); |
5569 return summary; | 5569 return summary; |
5570 } | 5570 } |
5571 | 5571 |
5572 | 5572 |
5573 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5573 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5574 Register value = locs()->in(0).reg(); | 5574 Register value = locs()->in(0).reg(); |
5575 Label* deopt = compiler->AddDeoptStub(deopt_id(), | 5575 Label* deopt = compiler->AddDeoptStub(deopt_id(), |
5576 ICData::kDeoptCheckSmi, | 5576 ICData::kDeoptCheckSmi, |
5577 licm_hoisted_ ? ICData::kHoisted : 0); | 5577 licm_hoisted_ ? ICData::kHoisted : 0); |
5578 __ testq(value, Immediate(kSmiTagMask)); | 5578 __ testq(value, Immediate(kSmiTagMask)); |
5579 __ j(NOT_ZERO, deopt); | 5579 __ j(NOT_ZERO, deopt); |
5580 } | 5580 } |
5581 | 5581 |
5582 | 5582 |
5583 LocationSummary* CheckClassIdInstr::MakeLocationSummary(Isolate* isolate, | 5583 LocationSummary* CheckClassIdInstr::MakeLocationSummary(Zone* zone, |
5584 bool opt) const { | 5584 bool opt) const { |
5585 const intptr_t kNumInputs = 1; | 5585 const intptr_t kNumInputs = 1; |
5586 const intptr_t kNumTemps = 0; | 5586 const intptr_t kNumTemps = 0; |
5587 LocationSummary* summary = new(isolate) LocationSummary( | 5587 LocationSummary* summary = new(zone) LocationSummary( |
5588 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 5588 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
5589 summary->set_in(0, Location::RequiresRegister()); | 5589 summary->set_in(0, Location::RequiresRegister()); |
5590 return summary; | 5590 return summary; |
5591 } | 5591 } |
5592 | 5592 |
5593 | 5593 |
5594 void CheckClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5594 void CheckClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5595 Register value = locs()->in(0).reg(); | 5595 Register value = locs()->in(0).reg(); |
5596 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass); | 5596 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass); |
5597 __ CompareImmediate(value, Immediate(Smi::RawValue(cid_)), PP); | 5597 __ CompareImmediate(value, Immediate(Smi::RawValue(cid_)), PP); |
5598 __ j(NOT_ZERO, deopt); | 5598 __ j(NOT_ZERO, deopt); |
5599 } | 5599 } |
5600 | 5600 |
5601 | 5601 |
5602 LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Isolate* isolate, | 5602 LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Zone* zone, |
5603 bool opt) const { | 5603 bool opt) const { |
5604 const intptr_t kNumInputs = 2; | 5604 const intptr_t kNumInputs = 2; |
5605 const intptr_t kNumTemps = 0; | 5605 const intptr_t kNumTemps = 0; |
5606 LocationSummary* locs = new(isolate) LocationSummary( | 5606 LocationSummary* locs = new(zone) LocationSummary( |
5607 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 5607 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
5608 locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length())); | 5608 locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length())); |
5609 locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index())); | 5609 locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index())); |
5610 return locs; | 5610 return locs; |
5611 } | 5611 } |
5612 | 5612 |
5613 | 5613 |
5614 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5614 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5615 uint32_t flags = generalized_ ? ICData::kGeneralized : 0; | 5615 uint32_t flags = generalized_ ? ICData::kGeneralized : 0; |
5616 flags |= licm_hoisted_ ? ICData::kHoisted : 0; | 5616 flags |= licm_hoisted_ ? ICData::kHoisted : 0; |
5617 Label* deopt = compiler->AddDeoptStub( | 5617 Label* deopt = compiler->AddDeoptStub( |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5683 case Token::kMUL: | 5683 case Token::kMUL: |
5684 __ imulq(left, right); | 5684 __ imulq(left, right); |
5685 break; | 5685 break; |
5686 default: | 5686 default: |
5687 UNREACHABLE(); | 5687 UNREACHABLE(); |
5688 } | 5688 } |
5689 if (deopt != NULL) __ j(OVERFLOW, deopt); | 5689 if (deopt != NULL) __ j(OVERFLOW, deopt); |
5690 } | 5690 } |
5691 | 5691 |
5692 | 5692 |
5693 LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Isolate* isolate, | 5693 LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Zone* zone, |
5694 bool opt) const { | 5694 bool opt) const { |
5695 const intptr_t kNumInputs = 2; | 5695 const intptr_t kNumInputs = 2; |
5696 const intptr_t kNumTemps = 0; | 5696 const intptr_t kNumTemps = 0; |
5697 LocationSummary* summary = new(isolate) LocationSummary( | 5697 LocationSummary* summary = new(zone) LocationSummary( |
5698 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 5698 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
5699 summary->set_in(0, Location::RequiresRegister()); | 5699 summary->set_in(0, Location::RequiresRegister()); |
5700 summary->set_in(1, Location::RequiresRegister()); | 5700 summary->set_in(1, Location::RequiresRegister()); |
5701 summary->set_out(0, Location::SameAsFirstInput()); | 5701 summary->set_out(0, Location::SameAsFirstInput()); |
5702 return summary; | 5702 return summary; |
5703 } | 5703 } |
5704 | 5704 |
5705 | 5705 |
5706 void BinaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5706 void BinaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5707 const Register left = locs()->in(0).reg(); | 5707 const Register left = locs()->in(0).reg(); |
5708 const Register right = locs()->in(1).reg(); | 5708 const Register right = locs()->in(1).reg(); |
5709 const Register out = locs()->out(0).reg(); | 5709 const Register out = locs()->out(0).reg(); |
5710 | 5710 |
5711 ASSERT(out == left); | 5711 ASSERT(out == left); |
5712 | 5712 |
5713 Label* deopt = NULL; | 5713 Label* deopt = NULL; |
5714 if (CanDeoptimize()) { | 5714 if (CanDeoptimize()) { |
5715 deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryMintOp); | 5715 deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryMintOp); |
5716 } | 5716 } |
5717 | 5717 |
5718 EmitInt64Arithmetic(compiler, op_kind(), left, right, deopt); | 5718 EmitInt64Arithmetic(compiler, op_kind(), left, right, deopt); |
5719 | 5719 |
5720 if (FLAG_throw_on_javascript_int_overflow) { | 5720 if (FLAG_throw_on_javascript_int_overflow) { |
5721 EmitJavascriptOverflowCheck(compiler, range(), deopt, out); | 5721 EmitJavascriptOverflowCheck(compiler, range(), deopt, out); |
5722 } | 5722 } |
5723 } | 5723 } |
5724 | 5724 |
5725 | 5725 |
5726 LocationSummary* UnaryMintOpInstr::MakeLocationSummary(Isolate* isolate, | 5726 LocationSummary* UnaryMintOpInstr::MakeLocationSummary(Zone* zone, |
5727 bool opt) const { | 5727 bool opt) const { |
5728 const intptr_t kNumInputs = 1; | 5728 const intptr_t kNumInputs = 1; |
5729 const intptr_t kNumTemps = 0; | 5729 const intptr_t kNumTemps = 0; |
5730 LocationSummary* summary = new(isolate) LocationSummary( | 5730 LocationSummary* summary = new(zone) LocationSummary( |
5731 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 5731 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
5732 summary->set_in(0, Location::RequiresRegister()); | 5732 summary->set_in(0, Location::RequiresRegister()); |
5733 summary->set_out(0, Location::SameAsFirstInput()); | 5733 summary->set_out(0, Location::SameAsFirstInput()); |
5734 return summary; | 5734 return summary; |
5735 } | 5735 } |
5736 | 5736 |
5737 | 5737 |
5738 void UnaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5738 void UnaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5739 ASSERT(op_kind() == Token::kBIT_NOT); | 5739 ASSERT(op_kind() == Token::kBIT_NOT); |
5740 const Register left = locs()->in(0).reg(); | 5740 const Register left = locs()->in(0).reg(); |
5741 const Register out = locs()->out(0).reg(); | 5741 const Register out = locs()->out(0).reg(); |
(...skipping 13 matching lines...) Expand all Loading... |
5755 | 5755 |
5756 | 5756 |
5757 static const intptr_t kMintShiftCountLimit = 63; | 5757 static const intptr_t kMintShiftCountLimit = 63; |
5758 | 5758 |
5759 bool ShiftMintOpInstr::has_shift_count_check() const { | 5759 bool ShiftMintOpInstr::has_shift_count_check() const { |
5760 return !RangeUtils::IsWithin( | 5760 return !RangeUtils::IsWithin( |
5761 right()->definition()->range(), 0, kMintShiftCountLimit); | 5761 right()->definition()->range(), 0, kMintShiftCountLimit); |
5762 } | 5762 } |
5763 | 5763 |
5764 | 5764 |
5765 LocationSummary* ShiftMintOpInstr::MakeLocationSummary(Isolate* isolate, | 5765 LocationSummary* ShiftMintOpInstr::MakeLocationSummary(Zone* zone, |
5766 bool opt) const { | 5766 bool opt) const { |
5767 const intptr_t kNumInputs = 2; | 5767 const intptr_t kNumInputs = 2; |
5768 const intptr_t kNumTemps = can_overflow() ? 1 : 0; | 5768 const intptr_t kNumTemps = can_overflow() ? 1 : 0; |
5769 LocationSummary* summary = new(isolate) LocationSummary( | 5769 LocationSummary* summary = new(zone) LocationSummary( |
5770 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 5770 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
5771 summary->set_in(0, Location::RequiresRegister()); | 5771 summary->set_in(0, Location::RequiresRegister()); |
5772 summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX)); | 5772 summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX)); |
5773 if (kNumTemps > 0) { | 5773 if (kNumTemps > 0) { |
5774 summary->set_temp(0, Location::RequiresRegister()); | 5774 summary->set_temp(0, Location::RequiresRegister()); |
5775 } | 5775 } |
5776 summary->set_out(0, Location::SameAsFirstInput()); | 5776 summary->set_out(0, Location::SameAsFirstInput()); |
5777 return summary; | 5777 return summary; |
5778 } | 5778 } |
5779 | 5779 |
5780 | 5780 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5861 CompileType ShiftUint32OpInstr::ComputeType() const { | 5861 CompileType ShiftUint32OpInstr::ComputeType() const { |
5862 return CompileType::FromCid(kSmiCid); | 5862 return CompileType::FromCid(kSmiCid); |
5863 } | 5863 } |
5864 | 5864 |
5865 | 5865 |
5866 CompileType UnaryUint32OpInstr::ComputeType() const { | 5866 CompileType UnaryUint32OpInstr::ComputeType() const { |
5867 return CompileType::FromCid(kSmiCid); | 5867 return CompileType::FromCid(kSmiCid); |
5868 } | 5868 } |
5869 | 5869 |
5870 | 5870 |
5871 LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Isolate* isolate, | 5871 LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Zone* zone, |
5872 bool opt) const { | 5872 bool opt) const { |
5873 const intptr_t kNumInputs = 2; | 5873 const intptr_t kNumInputs = 2; |
5874 const intptr_t kNumTemps = (op_kind() == Token::kMUL) ? 1 : 0; | 5874 const intptr_t kNumTemps = (op_kind() == Token::kMUL) ? 1 : 0; |
5875 LocationSummary* summary = new(isolate) LocationSummary( | 5875 LocationSummary* summary = new(zone) LocationSummary( |
5876 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 5876 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
5877 summary->set_in(0, Location::RequiresRegister()); | 5877 summary->set_in(0, Location::RequiresRegister()); |
5878 summary->set_in(1, Location::RequiresRegister()); | 5878 summary->set_in(1, Location::RequiresRegister()); |
5879 summary->set_out(0, Location::SameAsFirstInput()); | 5879 summary->set_out(0, Location::SameAsFirstInput()); |
5880 return summary; | 5880 return summary; |
5881 } | 5881 } |
5882 | 5882 |
5883 | 5883 |
5884 template<typename OperandType> | 5884 template<typename OperandType> |
5885 static void EmitIntegerArithmetic(FlowGraphCompiler* compiler, | 5885 static void EmitIntegerArithmetic(FlowGraphCompiler* compiler, |
5886 Token::Kind op_kind, | 5886 Token::Kind op_kind, |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5926 case Token::kSUB: | 5926 case Token::kSUB: |
5927 case Token::kMUL: | 5927 case Token::kMUL: |
5928 EmitIntegerArithmetic(compiler, op_kind(), left, right, NULL); | 5928 EmitIntegerArithmetic(compiler, op_kind(), left, right, NULL); |
5929 return; | 5929 return; |
5930 default: | 5930 default: |
5931 UNREACHABLE(); | 5931 UNREACHABLE(); |
5932 } | 5932 } |
5933 } | 5933 } |
5934 | 5934 |
5935 | 5935 |
5936 LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Isolate* isolate, | 5936 LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Zone* zone, |
5937 bool opt) const { | 5937 bool opt) const { |
5938 const intptr_t kNumInputs = 2; | 5938 const intptr_t kNumInputs = 2; |
5939 const intptr_t kNumTemps = 0; | 5939 const intptr_t kNumTemps = 0; |
5940 LocationSummary* summary = new(isolate) LocationSummary( | 5940 LocationSummary* summary = new(zone) LocationSummary( |
5941 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 5941 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
5942 summary->set_in(0, Location::RequiresRegister()); | 5942 summary->set_in(0, Location::RequiresRegister()); |
5943 summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX)); | 5943 summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX)); |
5944 summary->set_out(0, Location::SameAsFirstInput()); | 5944 summary->set_out(0, Location::SameAsFirstInput()); |
5945 return summary; | 5945 return summary; |
5946 } | 5946 } |
5947 | 5947 |
5948 | 5948 |
5949 void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 5949 void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
5950 const intptr_t kShifterLimit = 31; | 5950 const intptr_t kShifterLimit = 31; |
5951 | 5951 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6010 | 6010 |
6011 __ Bind(&zero); | 6011 __ Bind(&zero); |
6012 // Shift was greater than 31 bits, just return zero. | 6012 // Shift was greater than 31 bits, just return zero. |
6013 __ xorq(left, left); | 6013 __ xorq(left, left); |
6014 | 6014 |
6015 // Exit path. | 6015 // Exit path. |
6016 __ Bind(&done); | 6016 __ Bind(&done); |
6017 } | 6017 } |
6018 | 6018 |
6019 | 6019 |
6020 LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Isolate* isolate, | 6020 LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Zone* zone, |
6021 bool opt) const { | 6021 bool opt) const { |
6022 const intptr_t kNumInputs = 1; | 6022 const intptr_t kNumInputs = 1; |
6023 const intptr_t kNumTemps = 0; | 6023 const intptr_t kNumTemps = 0; |
6024 LocationSummary* summary = new(isolate) LocationSummary( | 6024 LocationSummary* summary = new(zone) LocationSummary( |
6025 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 6025 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
6026 summary->set_in(0, Location::RequiresRegister()); | 6026 summary->set_in(0, Location::RequiresRegister()); |
6027 summary->set_out(0, Location::SameAsFirstInput()); | 6027 summary->set_out(0, Location::SameAsFirstInput()); |
6028 return summary; | 6028 return summary; |
6029 } | 6029 } |
6030 | 6030 |
6031 | 6031 |
6032 void UnaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 6032 void UnaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
6033 Register out = locs()->out(0).reg(); | 6033 Register out = locs()->out(0).reg(); |
6034 ASSERT(locs()->in(0).reg() == out); | 6034 ASSERT(locs()->in(0).reg() == out); |
6035 | 6035 |
6036 ASSERT(op_kind() == Token::kBIT_NOT); | 6036 ASSERT(op_kind() == Token::kBIT_NOT); |
6037 | 6037 |
6038 __ notl(out); | 6038 __ notl(out); |
6039 } | 6039 } |
6040 | 6040 |
6041 | 6041 |
6042 DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryInt32OpInstr) | 6042 DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryInt32OpInstr) |
6043 | 6043 |
6044 | 6044 |
6045 LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate, | 6045 LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Zone* zone, |
6046 bool opt) const { | 6046 bool opt) const { |
6047 const intptr_t kNumInputs = 1; | 6047 const intptr_t kNumInputs = 1; |
6048 const intptr_t kNumTemps = 0; | 6048 const intptr_t kNumTemps = 0; |
6049 LocationSummary* summary = new(isolate) LocationSummary( | 6049 LocationSummary* summary = new(zone) LocationSummary( |
6050 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 6050 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
6051 if (from() == kUnboxedMint) { | 6051 if (from() == kUnboxedMint) { |
6052 ASSERT((to() == kUnboxedUint32) || (to() == kUnboxedInt32)); | 6052 ASSERT((to() == kUnboxedUint32) || (to() == kUnboxedInt32)); |
6053 summary->set_in(0, Location::RequiresRegister()); | 6053 summary->set_in(0, Location::RequiresRegister()); |
6054 summary->set_out(0, Location::SameAsFirstInput()); | 6054 summary->set_out(0, Location::SameAsFirstInput()); |
6055 } else if (to() == kUnboxedMint) { | 6055 } else if (to() == kUnboxedMint) { |
6056 ASSERT((from() == kUnboxedInt32) || (from() == kUnboxedUint32)); | 6056 ASSERT((from() == kUnboxedInt32) || (from() == kUnboxedUint32)); |
6057 summary->set_in(0, Location::RequiresRegister()); | 6057 summary->set_in(0, Location::RequiresRegister()); |
6058 summary->set_out(0, Location::SameAsFirstInput()); | 6058 summary->set_out(0, Location::SameAsFirstInput()); |
6059 } else { | 6059 } else { |
6060 ASSERT((to() == kUnboxedUint32) || (to() == kUnboxedInt32)); | 6060 ASSERT((to() == kUnboxedUint32) || (to() == kUnboxedInt32)); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6114 // Sign extend. | 6114 // Sign extend. |
6115 ASSERT(from() == kUnboxedInt32); | 6115 ASSERT(from() == kUnboxedInt32); |
6116 __ movsxd(out, value); | 6116 __ movsxd(out, value); |
6117 } | 6117 } |
6118 } else { | 6118 } else { |
6119 UNREACHABLE(); | 6119 UNREACHABLE(); |
6120 } | 6120 } |
6121 } | 6121 } |
6122 | 6122 |
6123 | 6123 |
6124 LocationSummary* ThrowInstr::MakeLocationSummary(Isolate* isolate, | 6124 LocationSummary* ThrowInstr::MakeLocationSummary(Zone* zone, |
6125 bool opt) const { | 6125 bool opt) const { |
6126 return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall); | 6126 return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kCall); |
6127 } | 6127 } |
6128 | 6128 |
6129 | 6129 |
6130 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 6130 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
6131 compiler->GenerateRuntimeCall(token_pos(), | 6131 compiler->GenerateRuntimeCall(token_pos(), |
6132 deopt_id(), | 6132 deopt_id(), |
6133 kThrowRuntimeEntry, | 6133 kThrowRuntimeEntry, |
6134 1, | 6134 1, |
6135 locs()); | 6135 locs()); |
6136 __ int3(); | 6136 __ int3(); |
6137 } | 6137 } |
6138 | 6138 |
6139 | 6139 |
6140 LocationSummary* ReThrowInstr::MakeLocationSummary(Isolate* isolate, | 6140 LocationSummary* ReThrowInstr::MakeLocationSummary(Zone* zone, |
6141 bool opt) const { | 6141 bool opt) const { |
6142 return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall); | 6142 return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kCall); |
6143 } | 6143 } |
6144 | 6144 |
6145 | 6145 |
6146 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 6146 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
6147 compiler->SetNeedsStacktrace(catch_try_index()); | 6147 compiler->SetNeedsStacktrace(catch_try_index()); |
6148 compiler->GenerateRuntimeCall(token_pos(), | 6148 compiler->GenerateRuntimeCall(token_pos(), |
6149 deopt_id(), | 6149 deopt_id(), |
6150 kReThrowRuntimeEntry, | 6150 kReThrowRuntimeEntry, |
6151 2, | 6151 2, |
6152 locs()); | 6152 locs()); |
6153 __ int3(); | 6153 __ int3(); |
6154 } | 6154 } |
6155 | 6155 |
6156 | 6156 |
6157 void GraphEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 6157 void GraphEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
6158 if (!compiler->CanFallThroughTo(normal_entry())) { | 6158 if (!compiler->CanFallThroughTo(normal_entry())) { |
6159 __ jmp(compiler->GetJumpLabel(normal_entry())); | 6159 __ jmp(compiler->GetJumpLabel(normal_entry())); |
6160 } | 6160 } |
6161 } | 6161 } |
6162 | 6162 |
6163 | 6163 |
6164 LocationSummary* GotoInstr::MakeLocationSummary(Isolate* isolate, | 6164 LocationSummary* GotoInstr::MakeLocationSummary(Zone* zone, |
6165 bool opt) const { | 6165 bool opt) const { |
6166 return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall); | 6166 return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall); |
6167 } | 6167 } |
6168 | 6168 |
6169 | 6169 |
6170 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 6170 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
6171 if (!compiler->is_optimizing()) { | 6171 if (!compiler->is_optimizing()) { |
6172 if (FLAG_emit_edge_counters) { | 6172 if (FLAG_emit_edge_counters) { |
6173 compiler->EmitEdgeCounter(); | 6173 compiler->EmitEdgeCounter(); |
6174 } | 6174 } |
6175 // Add a deoptimization descriptor for deoptimizing instructions that | 6175 // Add a deoptimization descriptor for deoptimizing instructions that |
6176 // may be inserted before this instruction. This descriptor points | 6176 // may be inserted before this instruction. This descriptor points |
6177 // after the edge counter for uniformity with ARM and MIPS, where we can | 6177 // after the edge counter for uniformity with ARM and MIPS, where we can |
6178 // reuse pattern matching that matches backwards from the end of the | 6178 // reuse pattern matching that matches backwards from the end of the |
6179 // pattern. | 6179 // pattern. |
6180 compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, | 6180 compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, |
6181 GetDeoptId(), | 6181 GetDeoptId(), |
6182 Scanner::kNoSourcePos); | 6182 Scanner::kNoSourcePos); |
6183 } | 6183 } |
6184 if (HasParallelMove()) { | 6184 if (HasParallelMove()) { |
6185 compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); | 6185 compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); |
6186 } | 6186 } |
6187 | 6187 |
6188 // We can fall through if the successor is the next block in the list. | 6188 // We can fall through if the successor is the next block in the list. |
6189 // Otherwise, we need a jump. | 6189 // Otherwise, we need a jump. |
6190 if (!compiler->CanFallThroughTo(successor())) { | 6190 if (!compiler->CanFallThroughTo(successor())) { |
6191 __ jmp(compiler->GetJumpLabel(successor())); | 6191 __ jmp(compiler->GetJumpLabel(successor())); |
6192 } | 6192 } |
6193 } | 6193 } |
6194 | 6194 |
6195 | 6195 |
6196 LocationSummary* IndirectGotoInstr::MakeLocationSummary(Isolate* isolate, | 6196 LocationSummary* IndirectGotoInstr::MakeLocationSummary(Zone* zone, |
6197 bool opt) const { | 6197 bool opt) const { |
6198 const intptr_t kNumInputs = 1; | 6198 const intptr_t kNumInputs = 1; |
6199 const intptr_t kNumTemps = 1; | 6199 const intptr_t kNumTemps = 1; |
6200 | 6200 |
6201 LocationSummary* summary = new(isolate) LocationSummary( | 6201 LocationSummary* summary = new(zone) LocationSummary( |
6202 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 6202 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
6203 | 6203 |
6204 summary->set_in(0, Location::RequiresRegister()); | 6204 summary->set_in(0, Location::RequiresRegister()); |
6205 summary->set_temp(0, Location::RequiresRegister()); | 6205 summary->set_temp(0, Location::RequiresRegister()); |
6206 | 6206 |
6207 return summary; | 6207 return summary; |
6208 } | 6208 } |
6209 | 6209 |
6210 | 6210 |
6211 void IndirectGotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 6211 void IndirectGotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
6212 Register offset_reg = locs()->in(0).reg(); | 6212 Register offset_reg = locs()->in(0).reg(); |
6213 Register target_address_reg = locs()->temp_slot(0)->reg(); | 6213 Register target_address_reg = locs()->temp_slot(0)->reg(); |
6214 | 6214 |
6215 // Load from [current frame pointer] + kPcMarkerSlotFromFp. | 6215 // Load from [current frame pointer] + kPcMarkerSlotFromFp. |
6216 __ movq(target_address_reg, Address(RBP, kPcMarkerSlotFromFp * kWordSize)); | 6216 __ movq(target_address_reg, Address(RBP, kPcMarkerSlotFromFp * kWordSize)); |
6217 | 6217 |
6218 // Calculate the final absolute address. | 6218 // Calculate the final absolute address. |
6219 if (offset()->definition()->representation() == kTagged) { | 6219 if (offset()->definition()->representation() == kTagged) { |
6220 __ SmiUntag(offset_reg); | 6220 __ SmiUntag(offset_reg); |
6221 } | 6221 } |
6222 __ addq(target_address_reg, offset_reg); | 6222 __ addq(target_address_reg, offset_reg); |
6223 | 6223 |
6224 // Jump to the absolute address. | 6224 // Jump to the absolute address. |
6225 __ jmp(target_address_reg); | 6225 __ jmp(target_address_reg); |
6226 } | 6226 } |
6227 | 6227 |
6228 LocationSummary* StrictCompareInstr::MakeLocationSummary(Isolate* isolate, | 6228 LocationSummary* StrictCompareInstr::MakeLocationSummary(Zone* zone, |
6229 bool opt) const { | 6229 bool opt) const { |
6230 const intptr_t kNumInputs = 2; | 6230 const intptr_t kNumInputs = 2; |
6231 const intptr_t kNumTemps = 0; | 6231 const intptr_t kNumTemps = 0; |
6232 if (needs_number_check()) { | 6232 if (needs_number_check()) { |
6233 LocationSummary* locs = new(isolate) LocationSummary( | 6233 LocationSummary* locs = new(zone) LocationSummary( |
6234 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); | 6234 zone, kNumInputs, kNumTemps, LocationSummary::kCall); |
6235 locs->set_in(0, Location::RegisterLocation(RAX)); | 6235 locs->set_in(0, Location::RegisterLocation(RAX)); |
6236 locs->set_in(1, Location::RegisterLocation(RCX)); | 6236 locs->set_in(1, Location::RegisterLocation(RCX)); |
6237 locs->set_out(0, Location::RegisterLocation(RAX)); | 6237 locs->set_out(0, Location::RegisterLocation(RAX)); |
6238 return locs; | 6238 return locs; |
6239 } | 6239 } |
6240 LocationSummary* locs = new(isolate) LocationSummary( | 6240 LocationSummary* locs = new(zone) LocationSummary( |
6241 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 6241 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
6242 locs->set_in(0, Location::RegisterOrConstant(left())); | 6242 locs->set_in(0, Location::RegisterOrConstant(left())); |
6243 // Only one of the inputs can be a constant. Choose register if the first one | 6243 // Only one of the inputs can be a constant. Choose register if the first one |
6244 // is a constant. | 6244 // is a constant. |
6245 locs->set_in(1, locs->in(0).IsConstant() | 6245 locs->set_in(1, locs->in(0).IsConstant() |
6246 ? Location::RequiresRegister() | 6246 ? Location::RequiresRegister() |
6247 : Location::RegisterOrConstant(right())); | 6247 : Location::RegisterOrConstant(right())); |
6248 locs->set_out(0, Location::RequiresRegister()); | 6248 locs->set_out(0, Location::RequiresRegister()); |
6249 return locs; | 6249 return locs; |
6250 } | 6250 } |
6251 | 6251 |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6303 void StrictCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler, | 6303 void StrictCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
6304 BranchInstr* branch) { | 6304 BranchInstr* branch) { |
6305 ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT); | 6305 ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT); |
6306 | 6306 |
6307 BranchLabels labels = compiler->CreateBranchLabels(branch); | 6307 BranchLabels labels = compiler->CreateBranchLabels(branch); |
6308 Condition true_condition = EmitComparisonCode(compiler, labels); | 6308 Condition true_condition = EmitComparisonCode(compiler, labels); |
6309 EmitBranchOnCondition(compiler, true_condition, labels); | 6309 EmitBranchOnCondition(compiler, true_condition, labels); |
6310 } | 6310 } |
6311 | 6311 |
6312 | 6312 |
6313 LocationSummary* ClosureCallInstr::MakeLocationSummary(Isolate* isolate, | 6313 LocationSummary* ClosureCallInstr::MakeLocationSummary(Zone* zone, |
6314 bool opt) const { | 6314 bool opt) const { |
6315 const intptr_t kNumInputs = 1; | 6315 const intptr_t kNumInputs = 1; |
6316 const intptr_t kNumTemps = 0; | 6316 const intptr_t kNumTemps = 0; |
6317 LocationSummary* summary = new(isolate) LocationSummary( | 6317 LocationSummary* summary = new(zone) LocationSummary( |
6318 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); | 6318 zone, kNumInputs, kNumTemps, LocationSummary::kCall); |
6319 summary->set_in(0, Location::RegisterLocation(RAX)); // Function. | 6319 summary->set_in(0, Location::RegisterLocation(RAX)); // Function. |
6320 summary->set_out(0, Location::RegisterLocation(RAX)); | 6320 summary->set_out(0, Location::RegisterLocation(RAX)); |
6321 return summary; | 6321 return summary; |
6322 } | 6322 } |
6323 | 6323 |
6324 | 6324 |
6325 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 6325 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
6326 // Arguments descriptor is expected in R10. | 6326 // Arguments descriptor is expected in R10. |
6327 intptr_t argument_count = ArgumentCount(); | 6327 intptr_t argument_count = ArgumentCount(); |
6328 const Array& arguments_descriptor = | 6328 const Array& arguments_descriptor = |
(...skipping 24 matching lines...) Expand all Loading... |
6353 // Add deoptimization continuation point after the call and before the | 6353 // Add deoptimization continuation point after the call and before the |
6354 // arguments are removed. | 6354 // arguments are removed. |
6355 compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, | 6355 compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, |
6356 deopt_id_after, | 6356 deopt_id_after, |
6357 token_pos()); | 6357 token_pos()); |
6358 } | 6358 } |
6359 __ Drop(argument_count); | 6359 __ Drop(argument_count); |
6360 } | 6360 } |
6361 | 6361 |
6362 | 6362 |
6363 LocationSummary* BooleanNegateInstr::MakeLocationSummary(Isolate* isolate, | 6363 LocationSummary* BooleanNegateInstr::MakeLocationSummary(Zone* zone, |
6364 bool opt) const { | 6364 bool opt) const { |
6365 return LocationSummary::Make(isolate, | 6365 return LocationSummary::Make(zone, |
6366 1, | 6366 1, |
6367 Location::RequiresRegister(), | 6367 Location::RequiresRegister(), |
6368 LocationSummary::kNoCall); | 6368 LocationSummary::kNoCall); |
6369 } | 6369 } |
6370 | 6370 |
6371 | 6371 |
6372 void BooleanNegateInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 6372 void BooleanNegateInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
6373 Register value = locs()->in(0).reg(); | 6373 Register value = locs()->in(0).reg(); |
6374 Register result = locs()->out(0).reg(); | 6374 Register result = locs()->out(0).reg(); |
6375 | 6375 |
6376 Label done; | 6376 Label done; |
6377 __ LoadObject(result, Bool::True(), PP); | 6377 __ LoadObject(result, Bool::True(), PP); |
6378 __ CompareRegisters(result, value); | 6378 __ CompareRegisters(result, value); |
6379 __ j(NOT_EQUAL, &done, Assembler::kNearJump); | 6379 __ j(NOT_EQUAL, &done, Assembler::kNearJump); |
6380 __ LoadObject(result, Bool::False(), PP); | 6380 __ LoadObject(result, Bool::False(), PP); |
6381 __ Bind(&done); | 6381 __ Bind(&done); |
6382 } | 6382 } |
6383 | 6383 |
6384 | 6384 |
6385 LocationSummary* AllocateObjectInstr::MakeLocationSummary(Isolate* isolate, | 6385 LocationSummary* AllocateObjectInstr::MakeLocationSummary(Zone* zone, |
6386 bool opt) const { | 6386 bool opt) const { |
6387 return MakeCallSummary(isolate); | 6387 return MakeCallSummary(zone); |
6388 } | 6388 } |
6389 | 6389 |
6390 | 6390 |
6391 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 6391 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
6392 Isolate* isolate = compiler->isolate(); | 6392 Isolate* isolate = compiler->isolate(); |
6393 StubCode* stub_code = isolate->stub_code(); | 6393 StubCode* stub_code = isolate->stub_code(); |
6394 const Code& stub = Code::Handle(isolate, | 6394 const Code& stub = Code::Handle(isolate, |
6395 stub_code->GetAllocationStubForClass(cls())); | 6395 stub_code->GetAllocationStubForClass(cls())); |
6396 const ExternalLabel label(stub.EntryPoint()); | 6396 const ExternalLabel label(stub.EntryPoint()); |
6397 compiler->GenerateCall(token_pos(), | 6397 compiler->GenerateCall(token_pos(), |
(...skipping 14 matching lines...) Expand all Loading... |
6412 __ movq(R10, Immediate(kInvalidObjectPointer)); | 6412 __ movq(R10, Immediate(kInvalidObjectPointer)); |
6413 __ movq(RBX, Immediate(kInvalidObjectPointer)); | 6413 __ movq(RBX, Immediate(kInvalidObjectPointer)); |
6414 #endif | 6414 #endif |
6415 } | 6415 } |
6416 | 6416 |
6417 } // namespace dart | 6417 } // namespace dart |
6418 | 6418 |
6419 #undef __ | 6419 #undef __ |
6420 | 6420 |
6421 #endif // defined TARGET_ARCH_X64 | 6421 #endif // defined TARGET_ARCH_X64 |
OLD | NEW |