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 "lib/error.h" | 10 #include "lib/error.h" |
(...skipping 2987 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2998 | 2998 |
2999 | 2999 |
3000 void Float32x4ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3000 void Float32x4ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3001 XmmRegister v0 = locs()->in(0).fpu_reg(); | 3001 XmmRegister v0 = locs()->in(0).fpu_reg(); |
3002 XmmRegister v1 = locs()->in(1).fpu_reg(); | 3002 XmmRegister v1 = locs()->in(1).fpu_reg(); |
3003 XmmRegister v2 = locs()->in(2).fpu_reg(); | 3003 XmmRegister v2 = locs()->in(2).fpu_reg(); |
3004 XmmRegister v3 = locs()->in(3).fpu_reg(); | 3004 XmmRegister v3 = locs()->in(3).fpu_reg(); |
3005 ASSERT(v0 == locs()->out().fpu_reg()); | 3005 ASSERT(v0 == locs()->out().fpu_reg()); |
3006 __ subq(RSP, Immediate(16)); | 3006 __ subq(RSP, Immediate(16)); |
3007 __ cvtsd2ss(v0, v0); | 3007 __ cvtsd2ss(v0, v0); |
3008 __ movss(Address(RSP, -16), v0); | 3008 __ movss(Address(RSP, 0), v0); |
3009 __ movsd(v0, v1); | 3009 __ movsd(v0, v1); |
3010 __ cvtsd2ss(v0, v0); | 3010 __ cvtsd2ss(v0, v0); |
3011 __ movss(Address(RSP, -12), v0); | 3011 __ movss(Address(RSP, 4), v0); |
3012 __ movsd(v0, v2); | 3012 __ movsd(v0, v2); |
3013 __ cvtsd2ss(v0, v0); | 3013 __ cvtsd2ss(v0, v0); |
3014 __ movss(Address(RSP, -8), v0); | 3014 __ movss(Address(RSP, 8), v0); |
3015 __ movsd(v0, v3); | 3015 __ movsd(v0, v3); |
3016 __ cvtsd2ss(v0, v0); | 3016 __ cvtsd2ss(v0, v0); |
3017 __ movss(Address(RSP, -4), v0); | 3017 __ movss(Address(RSP, 12), v0); |
3018 __ movups(v0, Address(RSP, -16)); | 3018 __ movups(v0, Address(RSP, 0)); |
3019 __ addq(RSP, Immediate(16)); | 3019 __ addq(RSP, Immediate(16)); |
3020 } | 3020 } |
3021 | 3021 |
3022 | 3022 |
3023 LocationSummary* Float32x4ZeroInstr::MakeLocationSummary() const { | 3023 LocationSummary* Float32x4ZeroInstr::MakeLocationSummary() const { |
3024 const intptr_t kNumInputs = 0; | 3024 const intptr_t kNumInputs = 0; |
3025 const intptr_t kNumTemps = 0; | 3025 const intptr_t kNumTemps = 0; |
3026 LocationSummary* summary = | 3026 LocationSummary* summary = |
3027 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3027 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3028 summary->set_out(Location::RequiresFpuRegister()); | 3028 summary->set_out(Location::RequiresFpuRegister()); |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3244 const intptr_t kNumInputs = 2; | 3244 const intptr_t kNumInputs = 2; |
3245 const intptr_t kNumTemps = 0; | 3245 const intptr_t kNumTemps = 0; |
3246 LocationSummary* summary = | 3246 LocationSummary* summary = |
3247 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3247 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3248 summary->set_in(0, Location::RequiresFpuRegister()); | 3248 summary->set_in(0, Location::RequiresFpuRegister()); |
3249 summary->set_in(1, Location::RequiresFpuRegister()); | 3249 summary->set_in(1, Location::RequiresFpuRegister()); |
3250 summary->set_out(Location::SameAsFirstInput()); | 3250 summary->set_out(Location::SameAsFirstInput()); |
3251 return summary; | 3251 return summary; |
3252 } | 3252 } |
3253 | 3253 |
| 3254 |
3254 void Float32x4WithInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3255 void Float32x4WithInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3255 XmmRegister replacement = locs()->in(0).fpu_reg(); | 3256 XmmRegister replacement = locs()->in(0).fpu_reg(); |
3256 XmmRegister value = locs()->in(1).fpu_reg(); | 3257 XmmRegister value = locs()->in(1).fpu_reg(); |
3257 | 3258 |
3258 ASSERT(locs()->out().fpu_reg() == replacement); | 3259 ASSERT(locs()->out().fpu_reg() == replacement); |
3259 | 3260 |
3260 switch (op_kind()) { | 3261 switch (op_kind()) { |
3261 case MethodRecognizer::kFloat32x4WithX: | 3262 case MethodRecognizer::kFloat32x4WithX: |
3262 __ cvtsd2ss(replacement, replacement); | 3263 __ cvtsd2ss(replacement, replacement); |
3263 __ subq(RSP, Immediate(16)); | 3264 __ subq(RSP, Immediate(16)); |
3264 // Move value to stack. | 3265 // Move value to stack. |
3265 __ movups(Address(RSP, -16), value); | 3266 __ movups(Address(RSP, 0), value); |
3266 // Write over X value. | 3267 // Write over X value. |
3267 __ movss(Address(RSP, -16), replacement); | 3268 __ movss(Address(RSP, 0), replacement); |
3268 // Move updated value into output register. | 3269 // Move updated value into output register. |
3269 __ movups(replacement, Address(RSP, -16)); | 3270 __ movups(replacement, Address(RSP, 0)); |
3270 __ addq(RSP, Immediate(16)); | 3271 __ addq(RSP, Immediate(16)); |
3271 break; | 3272 break; |
3272 case MethodRecognizer::kFloat32x4WithY: | 3273 case MethodRecognizer::kFloat32x4WithY: |
3273 __ cvtsd2ss(replacement, replacement); | 3274 __ cvtsd2ss(replacement, replacement); |
3274 __ subq(RSP, Immediate(16)); | 3275 __ subq(RSP, Immediate(16)); |
3275 // Move value to stack. | 3276 // Move value to stack. |
3276 __ movups(Address(RSP, -16), value); | 3277 __ movups(Address(RSP, 0), value); |
3277 // Write over Y value. | 3278 // Write over Y value. |
3278 __ movss(Address(RSP, -12), replacement); | 3279 __ movss(Address(RSP, 4), replacement); |
3279 // Move updated value into output register. | 3280 // Move updated value into output register. |
3280 __ movups(replacement, Address(RSP, -16)); | 3281 __ movups(replacement, Address(RSP, 0)); |
3281 __ addq(RSP, Immediate(16)); | 3282 __ addq(RSP, Immediate(16)); |
3282 break; | 3283 break; |
3283 case MethodRecognizer::kFloat32x4WithZ: | 3284 case MethodRecognizer::kFloat32x4WithZ: |
3284 __ cvtsd2ss(replacement, replacement); | 3285 __ cvtsd2ss(replacement, replacement); |
3285 __ subq(RSP, Immediate(16)); | 3286 __ subq(RSP, Immediate(16)); |
3286 // Move value to stack. | 3287 // Move value to stack. |
3287 __ movups(Address(RSP, -16), value); | 3288 __ movups(Address(RSP, 0), value); |
3288 // Write over Z value. | 3289 // Write over Z value. |
3289 __ movss(Address(RSP, -8), replacement); | 3290 __ movss(Address(RSP, 8), replacement); |
3290 // Move updated value into output register. | 3291 // Move updated value into output register. |
3291 __ movups(replacement, Address(RSP, -16)); | 3292 __ movups(replacement, Address(RSP, 0)); |
3292 __ addq(RSP, Immediate(16)); | 3293 __ addq(RSP, Immediate(16)); |
3293 break; | 3294 break; |
3294 case MethodRecognizer::kFloat32x4WithW: | 3295 case MethodRecognizer::kFloat32x4WithW: |
3295 __ cvtsd2ss(replacement, replacement); | 3296 __ cvtsd2ss(replacement, replacement); |
3296 __ subq(RSP, Immediate(16)); | 3297 __ subq(RSP, Immediate(16)); |
3297 // Move value to stack. | 3298 // Move value to stack. |
3298 __ movups(Address(RSP, -16), value); | 3299 __ movups(Address(RSP, 0), value); |
3299 // Write over W value. | 3300 // Write over W value. |
3300 __ movss(Address(RSP, -4), replacement); | 3301 __ movss(Address(RSP, 12), replacement); |
3301 // Move updated value into output register. | 3302 // Move updated value into output register. |
3302 __ movups(replacement, Address(RSP, -16)); | 3303 __ movups(replacement, Address(RSP, 0)); |
3303 __ addq(RSP, Immediate(16)); | 3304 __ addq(RSP, Immediate(16)); |
3304 break; | 3305 break; |
3305 default: UNREACHABLE(); | 3306 default: UNREACHABLE(); |
3306 } | 3307 } |
3307 } | 3308 } |
3308 | 3309 |
3309 | 3310 |
3310 LocationSummary* Float32x4ToUint32x4Instr::MakeLocationSummary() const { | 3311 LocationSummary* Float32x4ToUint32x4Instr::MakeLocationSummary() const { |
3311 const intptr_t kNumInputs = 1; | 3312 const intptr_t kNumInputs = 1; |
3312 const intptr_t kNumTemps = 0; | 3313 const intptr_t kNumTemps = 0; |
3313 LocationSummary* summary = | 3314 LocationSummary* summary = |
3314 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3315 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3315 summary->set_in(0, Location::RequiresFpuRegister()); | 3316 summary->set_in(0, Location::RequiresFpuRegister()); |
3316 summary->set_out(Location::SameAsFirstInput()); | 3317 summary->set_out(Location::SameAsFirstInput()); |
3317 return summary; | 3318 return summary; |
3318 } | 3319 } |
3319 | 3320 |
3320 | 3321 |
3321 void Float32x4ToUint32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3322 void Float32x4ToUint32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3322 // NOP. | 3323 // NOP. |
3323 } | 3324 } |
3324 | 3325 |
3325 | 3326 |
| 3327 LocationSummary* Uint32x4BoolConstructorInstr::MakeLocationSummary() const { |
| 3328 const intptr_t kNumInputs = 4; |
| 3329 const intptr_t kNumTemps = 1; |
| 3330 LocationSummary* summary = |
| 3331 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| 3332 summary->set_in(0, Location::RequiresRegister()); |
| 3333 summary->set_in(1, Location::RequiresRegister()); |
| 3334 summary->set_in(2, Location::RequiresRegister()); |
| 3335 summary->set_in(3, Location::RequiresRegister()); |
| 3336 summary->set_temp(0, Location::RequiresRegister()); |
| 3337 summary->set_out(Location::RequiresFpuRegister()); |
| 3338 return summary; |
| 3339 } |
| 3340 |
| 3341 |
| 3342 void Uint32x4BoolConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 3343 Register v0 = locs()->in(0).reg(); |
| 3344 Register v1 = locs()->in(1).reg(); |
| 3345 Register v2 = locs()->in(2).reg(); |
| 3346 Register v3 = locs()->in(3).reg(); |
| 3347 Register temp = locs()->temp(0).reg(); |
| 3348 XmmRegister result = locs()->out().fpu_reg(); |
| 3349 Label x_false, x_done; |
| 3350 Label y_false, y_done; |
| 3351 Label z_false, z_done; |
| 3352 Label w_false, w_done; |
| 3353 __ subq(RSP, Immediate(16)); |
| 3354 |
| 3355 __ CompareObject(v0, Bool::True()); |
| 3356 __ j(NOT_EQUAL, &x_false); |
| 3357 __ movq(temp, Immediate(0xFFFFFFFF)); |
| 3358 __ jmp(&x_done); |
| 3359 __ Bind(&x_false); |
| 3360 __ movq(temp, Immediate(0x0)); |
| 3361 __ Bind(&x_done); |
| 3362 __ movl(Address(RSP, 0), temp); |
| 3363 |
| 3364 __ CompareObject(v1, Bool::True()); |
| 3365 __ j(NOT_EQUAL, &y_false); |
| 3366 __ movq(temp, Immediate(0xFFFFFFFF)); |
| 3367 __ jmp(&y_done); |
| 3368 __ Bind(&y_false); |
| 3369 __ movq(temp, Immediate(0x0)); |
| 3370 __ Bind(&y_done); |
| 3371 __ movl(Address(RSP, 4), temp); |
| 3372 |
| 3373 __ CompareObject(v2, Bool::True()); |
| 3374 __ j(NOT_EQUAL, &z_false); |
| 3375 __ movq(temp, Immediate(0xFFFFFFFF)); |
| 3376 __ jmp(&z_done); |
| 3377 __ Bind(&z_false); |
| 3378 __ movq(temp, Immediate(0x0)); |
| 3379 __ Bind(&z_done); |
| 3380 __ movl(Address(RSP, 8), temp); |
| 3381 |
| 3382 __ CompareObject(v3, Bool::True()); |
| 3383 __ j(NOT_EQUAL, &w_false); |
| 3384 __ movq(temp, Immediate(0xFFFFFFFF)); |
| 3385 __ jmp(&w_done); |
| 3386 __ Bind(&w_false); |
| 3387 __ movq(temp, Immediate(0x0)); |
| 3388 __ Bind(&w_done); |
| 3389 __ movl(Address(RSP, 12), temp); |
| 3390 |
| 3391 __ movups(result, Address(RSP, 0)); |
| 3392 __ addq(RSP, Immediate(16)); |
| 3393 } |
| 3394 |
| 3395 |
| 3396 LocationSummary* Uint32x4GetFlagInstr::MakeLocationSummary() const { |
| 3397 const intptr_t kNumInputs = 1; |
| 3398 const intptr_t kNumTemps = 0; |
| 3399 LocationSummary* summary = |
| 3400 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| 3401 summary->set_in(0, Location::RequiresFpuRegister()); |
| 3402 summary->set_out(Location::RequiresRegister()); |
| 3403 return summary; |
| 3404 } |
| 3405 |
| 3406 |
| 3407 void Uint32x4GetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 3408 XmmRegister value = locs()->in(0).fpu_reg(); |
| 3409 Register result = locs()->out().reg(); |
| 3410 Label done; |
| 3411 Label non_zero; |
| 3412 __ subq(RSP, Immediate(16)); |
| 3413 // Move value to stack. |
| 3414 __ movups(Address(RSP, 0), value); |
| 3415 switch (op_kind()) { |
| 3416 case MethodRecognizer::kUint32x4GetFlagX: |
| 3417 __ movl(result, Address(RSP, 0)); |
| 3418 break; |
| 3419 case MethodRecognizer::kUint32x4GetFlagY: |
| 3420 __ movl(result, Address(RSP, 4)); |
| 3421 break; |
| 3422 case MethodRecognizer::kUint32x4GetFlagZ: |
| 3423 __ movl(result, Address(RSP, 8)); |
| 3424 break; |
| 3425 case MethodRecognizer::kUint32x4GetFlagW: |
| 3426 __ movl(result, Address(RSP, 12)); |
| 3427 break; |
| 3428 default: UNREACHABLE(); |
| 3429 } |
| 3430 __ addq(RSP, Immediate(16)); |
| 3431 __ testl(result, result); |
| 3432 __ j(NOT_ZERO, &non_zero, Assembler::kNearJump); |
| 3433 __ LoadObject(result, Bool::False()); |
| 3434 __ jmp(&done); |
| 3435 __ Bind(&non_zero); |
| 3436 __ LoadObject(result, Bool::True()); |
| 3437 __ Bind(&done); |
| 3438 } |
| 3439 |
| 3440 |
| 3441 LocationSummary* Uint32x4SelectInstr::MakeLocationSummary() const { |
| 3442 const intptr_t kNumInputs = 3; |
| 3443 const intptr_t kNumTemps = 1; |
| 3444 LocationSummary* summary = |
| 3445 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| 3446 summary->set_in(0, Location::RequiresFpuRegister()); |
| 3447 summary->set_in(1, Location::RequiresFpuRegister()); |
| 3448 summary->set_in(2, Location::RequiresFpuRegister()); |
| 3449 summary->set_temp(0, Location::RequiresFpuRegister()); |
| 3450 summary->set_out(Location::SameAsFirstInput()); |
| 3451 return summary; |
| 3452 } |
| 3453 |
| 3454 |
| 3455 void Uint32x4SelectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 3456 XmmRegister mask = locs()->in(0).fpu_reg(); |
| 3457 XmmRegister trueValue = locs()->in(1).fpu_reg(); |
| 3458 XmmRegister falseValue = locs()->in(2).fpu_reg(); |
| 3459 XmmRegister out = locs()->out().fpu_reg(); |
| 3460 XmmRegister temp = locs()->temp(0).fpu_reg(); |
| 3461 ASSERT(out == mask); |
| 3462 // Copy mask. |
| 3463 __ movaps(temp, mask); |
| 3464 // Invert it. |
| 3465 __ notps(temp); |
| 3466 // mask = mask & trueValue. |
| 3467 __ andps(mask, trueValue); |
| 3468 // temp = temp & falseValue. |
| 3469 __ andps(temp, falseValue); |
| 3470 // out = mask | temp. |
| 3471 __ orps(mask, temp); |
| 3472 } |
| 3473 |
| 3474 |
| 3475 LocationSummary* Uint32x4SetFlagInstr::MakeLocationSummary() const { |
| 3476 const intptr_t kNumInputs = 2; |
| 3477 const intptr_t kNumTemps = 1; |
| 3478 LocationSummary* summary = |
| 3479 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| 3480 summary->set_in(0, Location::RequiresFpuRegister()); |
| 3481 summary->set_in(1, Location::RequiresRegister()); |
| 3482 summary->set_temp(0, Location::RequiresRegister()); |
| 3483 summary->set_out(Location::SameAsFirstInput()); |
| 3484 return summary; |
| 3485 } |
| 3486 |
| 3487 |
| 3488 void Uint32x4SetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 3489 XmmRegister mask = locs()->in(0).fpu_reg(); |
| 3490 Register flag = locs()->in(1).reg(); |
| 3491 Register temp = locs()->temp(0).reg(); |
| 3492 ASSERT(mask == locs()->out().fpu_reg()); |
| 3493 __ subq(RSP, Immediate(16)); |
| 3494 // Copy mask to stack. |
| 3495 __ movups(Address(RSP, 0), mask); |
| 3496 Label falsePath, exitPath; |
| 3497 __ CompareObject(flag, Bool::True()); |
| 3498 __ j(NOT_EQUAL, &falsePath); |
| 3499 switch (op_kind()) { |
| 3500 case MethodRecognizer::kUint32x4WithFlagX: |
| 3501 __ movq(temp, Immediate(0xFFFFFFFF)); |
| 3502 __ movl(Address(RSP, 0), temp); |
| 3503 __ jmp(&exitPath); |
| 3504 __ Bind(&falsePath); |
| 3505 __ movq(temp, Immediate(0x0)); |
| 3506 __ movl(Address(RSP, 0), temp); |
| 3507 break; |
| 3508 case MethodRecognizer::kUint32x4WithFlagY: |
| 3509 __ movq(temp, Immediate(0xFFFFFFFF)); |
| 3510 __ movl(Address(RSP, 4), temp); |
| 3511 __ jmp(&exitPath); |
| 3512 __ Bind(&falsePath); |
| 3513 __ movq(temp, Immediate(0x0)); |
| 3514 __ movl(Address(RSP, 4), temp); |
| 3515 break; |
| 3516 case MethodRecognizer::kUint32x4WithFlagZ: |
| 3517 __ movq(temp, Immediate(0xFFFFFFFF)); |
| 3518 __ movl(Address(RSP, 8), temp); |
| 3519 __ jmp(&exitPath); |
| 3520 __ Bind(&falsePath); |
| 3521 __ movq(temp, Immediate(0x0)); |
| 3522 __ movl(Address(RSP, 8), temp); |
| 3523 break; |
| 3524 case MethodRecognizer::kUint32x4WithFlagW: |
| 3525 __ movq(temp, Immediate(0xFFFFFFFF)); |
| 3526 __ movl(Address(RSP, 12), temp); |
| 3527 __ jmp(&exitPath); |
| 3528 __ Bind(&falsePath); |
| 3529 __ movq(temp, Immediate(0x0)); |
| 3530 __ movl(Address(RSP, 12), temp); |
| 3531 break; |
| 3532 default: UNREACHABLE(); |
| 3533 } |
| 3534 __ Bind(&exitPath); |
| 3535 // Copy mask back to register. |
| 3536 __ movups(mask, Address(RSP, 0)); |
| 3537 __ addq(RSP, Immediate(16)); |
| 3538 } |
| 3539 |
| 3540 |
| 3541 LocationSummary* Uint32x4ToFloat32x4Instr::MakeLocationSummary() const { |
| 3542 const intptr_t kNumInputs = 1; |
| 3543 const intptr_t kNumTemps = 0; |
| 3544 LocationSummary* summary = |
| 3545 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| 3546 summary->set_in(0, Location::RequiresFpuRegister()); |
| 3547 summary->set_out(Location::SameAsFirstInput()); |
| 3548 return summary; |
| 3549 } |
| 3550 |
| 3551 |
| 3552 void Uint32x4ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 3553 // NOP. |
| 3554 } |
| 3555 |
| 3556 |
| 3557 LocationSummary* BinaryUint32x4OpInstr::MakeLocationSummary() const { |
| 3558 const intptr_t kNumInputs = 2; |
| 3559 const intptr_t kNumTemps = 0; |
| 3560 LocationSummary* summary = |
| 3561 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| 3562 summary->set_in(0, Location::RequiresFpuRegister()); |
| 3563 summary->set_in(1, Location::RequiresFpuRegister()); |
| 3564 summary->set_out(Location::SameAsFirstInput()); |
| 3565 return summary; |
| 3566 } |
| 3567 |
| 3568 |
| 3569 void BinaryUint32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 3570 XmmRegister left = locs()->in(0).fpu_reg(); |
| 3571 XmmRegister right = locs()->in(1).fpu_reg(); |
| 3572 ASSERT(left == locs()->out().fpu_reg()); |
| 3573 switch (op_kind()) { |
| 3574 case Token::kBIT_AND: { |
| 3575 __ andps(left, right); |
| 3576 break; |
| 3577 } |
| 3578 case Token::kBIT_OR: { |
| 3579 __ orps(left, right); |
| 3580 break; |
| 3581 } |
| 3582 case Token::kBIT_XOR: { |
| 3583 __ xorps(left, right); |
| 3584 break; |
| 3585 } |
| 3586 default: UNREACHABLE(); |
| 3587 } |
| 3588 } |
| 3589 |
| 3590 |
3326 LocationSummary* MathSqrtInstr::MakeLocationSummary() const { | 3591 LocationSummary* MathSqrtInstr::MakeLocationSummary() const { |
3327 const intptr_t kNumInputs = 1; | 3592 const intptr_t kNumInputs = 1; |
3328 const intptr_t kNumTemps = 0; | 3593 const intptr_t kNumTemps = 0; |
3329 LocationSummary* summary = | 3594 LocationSummary* summary = |
3330 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3595 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3331 summary->set_in(0, Location::RequiresFpuRegister()); | 3596 summary->set_in(0, Location::RequiresFpuRegister()); |
3332 summary->set_out(Location::RequiresFpuRegister()); | 3597 summary->set_out(Location::RequiresFpuRegister()); |
3333 return summary; | 3598 return summary; |
3334 } | 3599 } |
3335 | 3600 |
(...skipping 716 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4052 PcDescriptors::kOther, | 4317 PcDescriptors::kOther, |
4053 locs()); | 4318 locs()); |
4054 __ Drop(2); // Discard type arguments and receiver. | 4319 __ Drop(2); // Discard type arguments and receiver. |
4055 } | 4320 } |
4056 | 4321 |
4057 } // namespace dart | 4322 } // namespace dart |
4058 | 4323 |
4059 #undef __ | 4324 #undef __ |
4060 | 4325 |
4061 #endif // defined TARGET_ARCH_X64 | 4326 #endif // defined TARGET_ARCH_X64 |
OLD | NEW |