OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 3295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3306 And(scratch, src, kPointerSize - 1); | 3306 And(scratch, src, kPointerSize - 1); |
3307 Assert(eq, kExpectingAlignmentForCopyBytes, | 3307 Assert(eq, kExpectingAlignmentForCopyBytes, |
3308 scratch, Operand(zero_reg)); | 3308 scratch, Operand(zero_reg)); |
3309 } | 3309 } |
3310 Branch(&byte_loop, lt, length, Operand(kPointerSize)); | 3310 Branch(&byte_loop, lt, length, Operand(kPointerSize)); |
3311 lw(scratch, MemOperand(src)); | 3311 lw(scratch, MemOperand(src)); |
3312 Addu(src, src, kPointerSize); | 3312 Addu(src, src, kPointerSize); |
3313 | 3313 |
3314 // TODO(kalmard) check if this can be optimized to use sw in most cases. | 3314 // TODO(kalmard) check if this can be optimized to use sw in most cases. |
3315 // Can't use unaligned access - copy byte by byte. | 3315 // Can't use unaligned access - copy byte by byte. |
3316 sb(scratch, MemOperand(dst, 0)); | 3316 if (kArchEndian == kLittle) { |
3317 srl(scratch, scratch, 8); | 3317 sb(scratch, MemOperand(dst, 0)); |
3318 sb(scratch, MemOperand(dst, 1)); | 3318 srl(scratch, scratch, 8); |
3319 srl(scratch, scratch, 8); | 3319 sb(scratch, MemOperand(dst, 1)); |
3320 sb(scratch, MemOperand(dst, 2)); | 3320 srl(scratch, scratch, 8); |
3321 srl(scratch, scratch, 8); | 3321 sb(scratch, MemOperand(dst, 2)); |
3322 sb(scratch, MemOperand(dst, 3)); | 3322 srl(scratch, scratch, 8); |
| 3323 sb(scratch, MemOperand(dst, 3)); |
| 3324 } else { |
| 3325 sb(scratch, MemOperand(dst, 3)); |
| 3326 srl(scratch, scratch, 8); |
| 3327 sb(scratch, MemOperand(dst, 2)); |
| 3328 srl(scratch, scratch, 8); |
| 3329 sb(scratch, MemOperand(dst, 1)); |
| 3330 srl(scratch, scratch, 8); |
| 3331 sb(scratch, MemOperand(dst, 0)); |
| 3332 } |
| 3333 |
3323 Addu(dst, dst, 4); | 3334 Addu(dst, dst, 4); |
3324 | 3335 |
3325 Subu(length, length, Operand(kPointerSize)); | 3336 Subu(length, length, Operand(kPointerSize)); |
3326 Branch(&word_loop); | 3337 Branch(&word_loop); |
3327 | 3338 |
3328 // Copy the last bytes if any left. | 3339 // Copy the last bytes if any left. |
3329 bind(&byte_loop); | 3340 bind(&byte_loop); |
3330 Branch(&done, eq, length, Operand(zero_reg)); | 3341 Branch(&done, eq, length, Operand(zero_reg)); |
3331 bind(&byte_loop_1); | 3342 bind(&byte_loop_1); |
3332 lbu(scratch, MemOperand(src)); | 3343 lbu(scratch, MemOperand(src)); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3417 // in the exponent. | 3428 // in the exponent. |
3418 li(scratch1, Operand(kNaNOrInfinityLowerBoundUpper32)); | 3429 li(scratch1, Operand(kNaNOrInfinityLowerBoundUpper32)); |
3419 lw(exponent_reg, FieldMemOperand(value_reg, HeapNumber::kExponentOffset)); | 3430 lw(exponent_reg, FieldMemOperand(value_reg, HeapNumber::kExponentOffset)); |
3420 Branch(&maybe_nan, ge, exponent_reg, Operand(scratch1)); | 3431 Branch(&maybe_nan, ge, exponent_reg, Operand(scratch1)); |
3421 | 3432 |
3422 lw(mantissa_reg, FieldMemOperand(value_reg, HeapNumber::kMantissaOffset)); | 3433 lw(mantissa_reg, FieldMemOperand(value_reg, HeapNumber::kMantissaOffset)); |
3423 | 3434 |
3424 bind(&have_double_value); | 3435 bind(&have_double_value); |
3425 sll(scratch1, key_reg, kDoubleSizeLog2 - kSmiTagSize); | 3436 sll(scratch1, key_reg, kDoubleSizeLog2 - kSmiTagSize); |
3426 Addu(scratch1, scratch1, elements_reg); | 3437 Addu(scratch1, scratch1, elements_reg); |
3427 sw(mantissa_reg, FieldMemOperand( | 3438 sw(mantissa_reg, |
3428 scratch1, FixedDoubleArray::kHeaderSize - elements_offset)); | 3439 FieldMemOperand(scratch1, FixedDoubleArray::kHeaderSize - elements_offset |
3429 uint32_t offset = FixedDoubleArray::kHeaderSize - elements_offset + | 3440 + kHoleNanLower32Offset)); |
3430 sizeof(kHoleNanLower32); | 3441 sw(exponent_reg, |
3431 sw(exponent_reg, FieldMemOperand(scratch1, offset)); | 3442 FieldMemOperand(scratch1, FixedDoubleArray::kHeaderSize - elements_offset |
| 3443 + kHoleNanUpper32Offset)); |
3432 jmp(&done); | 3444 jmp(&done); |
3433 | 3445 |
3434 bind(&maybe_nan); | 3446 bind(&maybe_nan); |
3435 // Could be NaN or Infinity. If fraction is not zero, it's NaN, otherwise | 3447 // Could be NaN or Infinity. If fraction is not zero, it's NaN, otherwise |
3436 // it's an Infinity, and the non-NaN code path applies. | 3448 // it's an Infinity, and the non-NaN code path applies. |
3437 Branch(&is_nan, gt, exponent_reg, Operand(scratch1)); | 3449 Branch(&is_nan, gt, exponent_reg, Operand(scratch1)); |
3438 lw(mantissa_reg, FieldMemOperand(value_reg, HeapNumber::kMantissaOffset)); | 3450 lw(mantissa_reg, FieldMemOperand(value_reg, HeapNumber::kMantissaOffset)); |
3439 Branch(&have_double_value, eq, mantissa_reg, Operand(zero_reg)); | 3451 Branch(&have_double_value, eq, mantissa_reg, Operand(zero_reg)); |
3440 bind(&is_nan); | 3452 bind(&is_nan); |
3441 // Load canonical NaN for storing into the double array. | 3453 // Load canonical NaN for storing into the double array. |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3519 JumpIfSmi(obj, fail); | 3531 JumpIfSmi(obj, fail); |
3520 } | 3532 } |
3521 lw(scratch, FieldMemOperand(obj, HeapObject::kMapOffset)); | 3533 lw(scratch, FieldMemOperand(obj, HeapObject::kMapOffset)); |
3522 LoadRoot(at, index); | 3534 LoadRoot(at, index); |
3523 Branch(fail, ne, scratch, Operand(at)); | 3535 Branch(fail, ne, scratch, Operand(at)); |
3524 } | 3536 } |
3525 | 3537 |
3526 | 3538 |
3527 void MacroAssembler::MovFromFloatResult(DoubleRegister dst) { | 3539 void MacroAssembler::MovFromFloatResult(DoubleRegister dst) { |
3528 if (IsMipsSoftFloatABI) { | 3540 if (IsMipsSoftFloatABI) { |
3529 Move(dst, v0, v1); | 3541 if (kArchEndian == kLittle) { |
| 3542 Move(dst, v0, v1); |
| 3543 } else { |
| 3544 Move(dst, v1, v0); |
| 3545 } |
3530 } else { | 3546 } else { |
3531 Move(dst, f0); // Reg f0 is o32 ABI FP return value. | 3547 Move(dst, f0); // Reg f0 is o32 ABI FP return value. |
3532 } | 3548 } |
3533 } | 3549 } |
3534 | 3550 |
3535 | 3551 |
3536 void MacroAssembler::MovFromFloatParameter(DoubleRegister dst) { | 3552 void MacroAssembler::MovFromFloatParameter(DoubleRegister dst) { |
3537 if (IsMipsSoftFloatABI) { | 3553 if (IsMipsSoftFloatABI) { |
3538 Move(dst, a0, a1); | 3554 if (kArchEndian == kLittle) { |
| 3555 Move(dst, a0, a1); |
| 3556 } else { |
| 3557 Move(dst, a1, a0); |
| 3558 } |
3539 } else { | 3559 } else { |
3540 Move(dst, f12); // Reg f12 is o32 ABI FP first argument value. | 3560 Move(dst, f12); // Reg f12 is o32 ABI FP first argument value. |
3541 } | 3561 } |
3542 } | 3562 } |
3543 | 3563 |
3544 | 3564 |
3545 void MacroAssembler::MovToFloatParameter(DoubleRegister src) { | 3565 void MacroAssembler::MovToFloatParameter(DoubleRegister src) { |
3546 if (!IsMipsSoftFloatABI) { | 3566 if (!IsMipsSoftFloatABI) { |
3547 Move(f12, src); | 3567 Move(f12, src); |
3548 } else { | 3568 } else { |
3549 Move(a0, a1, src); | 3569 if (kArchEndian == kLittle) { |
| 3570 Move(a0, a1, src); |
| 3571 } else { |
| 3572 Move(a1, a0, src); |
| 3573 } |
3550 } | 3574 } |
3551 } | 3575 } |
3552 | 3576 |
3553 | 3577 |
3554 void MacroAssembler::MovToFloatResult(DoubleRegister src) { | 3578 void MacroAssembler::MovToFloatResult(DoubleRegister src) { |
3555 if (!IsMipsSoftFloatABI) { | 3579 if (!IsMipsSoftFloatABI) { |
3556 Move(f0, src); | 3580 Move(f0, src); |
3557 } else { | 3581 } else { |
3558 Move(v0, v1, src); | 3582 if (kArchEndian == kLittle) { |
| 3583 Move(v0, v1, src); |
| 3584 } else { |
| 3585 Move(v1, v0, src); |
| 3586 } |
3559 } | 3587 } |
3560 } | 3588 } |
3561 | 3589 |
3562 | 3590 |
3563 void MacroAssembler::MovToFloatParameters(DoubleRegister src1, | 3591 void MacroAssembler::MovToFloatParameters(DoubleRegister src1, |
3564 DoubleRegister src2) { | 3592 DoubleRegister src2) { |
3565 if (!IsMipsSoftFloatABI) { | 3593 if (!IsMipsSoftFloatABI) { |
3566 if (src2.is(f12)) { | 3594 if (src2.is(f12)) { |
3567 ASSERT(!src1.is(f14)); | 3595 ASSERT(!src1.is(f14)); |
3568 Move(f14, src2); | 3596 Move(f14, src2); |
3569 Move(f12, src1); | 3597 Move(f12, src1); |
3570 } else { | 3598 } else { |
3571 Move(f12, src1); | 3599 Move(f12, src1); |
3572 Move(f14, src2); | 3600 Move(f14, src2); |
3573 } | 3601 } |
3574 } else { | 3602 } else { |
3575 Move(a0, a1, src1); | 3603 if (kArchEndian == kLittle) { |
3576 Move(a2, a3, src2); | 3604 Move(a0, a1, src1); |
| 3605 Move(a2, a3, src2); |
| 3606 } else { |
| 3607 Move(a1, a0, src1); |
| 3608 Move(a3, a2, src2); |
| 3609 } |
3577 } | 3610 } |
3578 } | 3611 } |
3579 | 3612 |
3580 | 3613 |
3581 // ----------------------------------------------------------------------------- | 3614 // ----------------------------------------------------------------------------- |
3582 // JavaScript invokes. | 3615 // JavaScript invokes. |
3583 | 3616 |
3584 void MacroAssembler::InvokePrologue(const ParameterCount& expected, | 3617 void MacroAssembler::InvokePrologue(const ParameterCount& expected, |
3585 const ParameterCount& actual, | 3618 const ParameterCount& actual, |
3586 Handle<Code> code_constant, | 3619 Handle<Code> code_constant, |
(...skipping 2154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5741 } | 5774 } |
5742 if (ms.shift() > 0) sra(result, result, ms.shift()); | 5775 if (ms.shift() > 0) sra(result, result, ms.shift()); |
5743 srl(at, dividend, 31); | 5776 srl(at, dividend, 31); |
5744 Addu(result, result, Operand(at)); | 5777 Addu(result, result, Operand(at)); |
5745 } | 5778 } |
5746 | 5779 |
5747 | 5780 |
5748 } } // namespace v8::internal | 5781 } } // namespace v8::internal |
5749 | 5782 |
5750 #endif // V8_TARGET_ARCH_MIPS | 5783 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |