OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 708 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
719 __ Branch(&done, eq, int_scratch, Operand(zero_reg)); | 719 __ Branch(&done, eq, int_scratch, Operand(zero_reg)); |
720 | 720 |
721 // Preload the sign of the value. | 721 // Preload the sign of the value. |
722 __ And(dst2, int_scratch, Operand(HeapNumber::kSignMask)); | 722 __ And(dst2, int_scratch, Operand(HeapNumber::kSignMask)); |
723 // Get the absolute value of the object (as an unsigned integer). | 723 // Get the absolute value of the object (as an unsigned integer). |
724 Label skip_sub; | 724 Label skip_sub; |
725 __ Branch(&skip_sub, ge, dst2, Operand(zero_reg)); | 725 __ Branch(&skip_sub, ge, dst2, Operand(zero_reg)); |
726 __ Subu(int_scratch, zero_reg, int_scratch); | 726 __ Subu(int_scratch, zero_reg, int_scratch); |
727 __ bind(&skip_sub); | 727 __ bind(&skip_sub); |
728 | 728 |
729 // Get mantisssa[51:20]. | 729 // Get mantissa[51:20]. |
730 | 730 |
731 // Get the position of the first set bit. | 731 // Get the position of the first set bit. |
732 __ clz(dst1, int_scratch); | 732 __ clz(dst1, int_scratch); |
733 __ li(scratch2, 31); | 733 __ li(scratch2, 31); |
734 __ Subu(dst1, scratch2, dst1); | 734 __ Subu(dst1, scratch2, dst1); |
735 | 735 |
736 // Set the exponent. | 736 // Set the exponent. |
737 __ Addu(scratch2, dst1, Operand(HeapNumber::kExponentBias)); | 737 __ Addu(scratch2, dst1, Operand(HeapNumber::kExponentBias)); |
738 __ Ins(dst2, scratch2, | 738 __ Ins(dst2, scratch2, |
739 HeapNumber::kExponentShift, HeapNumber::kExponentBits); | 739 HeapNumber::kExponentShift, HeapNumber::kExponentBits); |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
964 __ subu(tmp, scratch, at); | 964 __ subu(tmp, scratch, at); |
965 __ Branch(not_int32, gt, tmp, Operand(30)); | 965 __ Branch(not_int32, gt, tmp, Operand(30)); |
966 // - Bits [21:0] in the mantissa are not null. | 966 // - Bits [21:0] in the mantissa are not null. |
967 __ And(tmp, src2, 0x3fffff); | 967 __ And(tmp, src2, 0x3fffff); |
968 __ Branch(not_int32, ne, tmp, Operand(zero_reg)); | 968 __ Branch(not_int32, ne, tmp, Operand(zero_reg)); |
969 | 969 |
970 // Otherwise the exponent needs to be big enough to shift left all the | 970 // Otherwise the exponent needs to be big enough to shift left all the |
971 // non zero bits left. So we need the (30 - exponent) last bits of the | 971 // non zero bits left. So we need the (30 - exponent) last bits of the |
972 // 31 higher bits of the mantissa to be null. | 972 // 31 higher bits of the mantissa to be null. |
973 // Because bits [21:0] are null, we can check instead that the | 973 // Because bits [21:0] are null, we can check instead that the |
974 // (32 - exponent) last bits of the 32 higher bits of the mantisssa are null. | 974 // (32 - exponent) last bits of the 32 higher bits of the mantissa are null. |
975 | 975 |
976 // Get the 32 higher bits of the mantissa in dst. | 976 // Get the 32 higher bits of the mantissa in dst. |
977 __ Ext(dst, | 977 __ Ext(dst, |
978 src2, | 978 src2, |
979 HeapNumber::kMantissaBitsInTopWord, | 979 HeapNumber::kMantissaBitsInTopWord, |
980 32 - HeapNumber::kMantissaBitsInTopWord); | 980 32 - HeapNumber::kMantissaBitsInTopWord); |
981 __ sll(at, src1, HeapNumber::kNonMantissaBitsInTopWord); | 981 __ sll(at, src1, HeapNumber::kNonMantissaBitsInTopWord); |
982 __ or_(dst, dst, at); | 982 __ or_(dst, dst, at); |
983 | 983 |
984 // Create the mask and test the lower bits (of the higher bits). | 984 // Create the mask and test the lower bits (of the higher bits). |
(...skipping 3707 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4692 __ Addu(t5, t5, Operand(Smi::FromInt(1))); | 4692 __ Addu(t5, t5, Operand(Smi::FromInt(1))); |
4693 | 4693 |
4694 __ bind(&arguments_test); | 4694 __ bind(&arguments_test); |
4695 __ Branch(&arguments_loop, lt, t5, Operand(a2)); | 4695 __ Branch(&arguments_loop, lt, t5, Operand(a2)); |
4696 | 4696 |
4697 // Return and remove the on-stack parameters. | 4697 // Return and remove the on-stack parameters. |
4698 __ Addu(sp, sp, Operand(3 * kPointerSize)); | 4698 __ Addu(sp, sp, Operand(3 * kPointerSize)); |
4699 __ Ret(); | 4699 __ Ret(); |
4700 | 4700 |
4701 // Do the runtime call to allocate the arguments object. | 4701 // Do the runtime call to allocate the arguments object. |
4702 // a2 = argument count (taggged) | 4702 // a2 = argument count (tagged) |
4703 __ bind(&runtime); | 4703 __ bind(&runtime); |
4704 __ sw(a2, MemOperand(sp, 0 * kPointerSize)); // Patch argument count. | 4704 __ sw(a2, MemOperand(sp, 0 * kPointerSize)); // Patch argument count. |
4705 __ TailCallRuntime(Runtime::kNewArgumentsFast, 3, 1); | 4705 __ TailCallRuntime(Runtime::kNewArgumentsFast, 3, 1); |
4706 } | 4706 } |
4707 | 4707 |
4708 | 4708 |
4709 void ArgumentsAccessStub::GenerateNewStrict(MacroAssembler* masm) { | 4709 void ArgumentsAccessStub::GenerateNewStrict(MacroAssembler* masm) { |
4710 // sp[0] : number of parameters | 4710 // sp[0] : number of parameters |
4711 // sp[4] : receiver displacement | 4711 // sp[4] : receiver displacement |
4712 // sp[8] : function | 4712 // sp[8] : function |
(...skipping 2868 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7581 __ Ret(USE_DELAY_SLOT); | 7581 __ Ret(USE_DELAY_SLOT); |
7582 __ mov(v0, a0); | 7582 __ mov(v0, a0); |
7583 } | 7583 } |
7584 | 7584 |
7585 | 7585 |
7586 #undef __ | 7586 #undef __ |
7587 | 7587 |
7588 } } // namespace v8::internal | 7588 } } // namespace v8::internal |
7589 | 7589 |
7590 #endif // V8_TARGET_ARCH_MIPS | 7590 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |