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 712 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
723 __ add(r0, sp, Operand(1 * kPointerSize)); | 723 __ add(r0, sp, Operand(1 * kPointerSize)); |
724 // v8::Arguments::implicit_args_ | 724 // v8::Arguments::implicit_args_ |
725 __ str(r2, MemOperand(r0, 0 * kPointerSize)); | 725 __ str(r2, MemOperand(r0, 0 * kPointerSize)); |
726 // v8::Arguments::values_ | 726 // v8::Arguments::values_ |
727 __ add(ip, r2, Operand(argc * kPointerSize)); | 727 __ add(ip, r2, Operand(argc * kPointerSize)); |
728 __ str(ip, MemOperand(r0, 1 * kPointerSize)); | 728 __ str(ip, MemOperand(r0, 1 * kPointerSize)); |
729 // v8::Arguments::length_ = argc | 729 // v8::Arguments::length_ = argc |
730 __ mov(ip, Operand(argc)); | 730 __ mov(ip, Operand(argc)); |
731 __ str(ip, MemOperand(r0, 2 * kPointerSize)); | 731 __ str(ip, MemOperand(r0, 2 * kPointerSize)); |
732 // v8::Arguments::is_construct_call = 0 | 732 // v8::Arguments::is_construct_call = 0 |
733 __ mov(ip, Operand(0)); | 733 __ mov(ip, Operand::Zero()); |
734 __ str(ip, MemOperand(r0, 3 * kPointerSize)); | 734 __ str(ip, MemOperand(r0, 3 * kPointerSize)); |
735 | 735 |
736 const int kStackUnwindSpace = argc + kFastApiCallArguments + 1; | 736 const int kStackUnwindSpace = argc + kFastApiCallArguments + 1; |
737 Address function_address = v8::ToCData<Address>(api_call_info->callback()); | 737 Address function_address = v8::ToCData<Address>(api_call_info->callback()); |
738 ApiFunction fun(function_address); | 738 ApiFunction fun(function_address); |
739 ExternalReference ref = ExternalReference(&fun, | 739 ExternalReference ref = ExternalReference(&fun, |
740 ExternalReference::DIRECT_API_CALL, | 740 ExternalReference::DIRECT_API_CALL, |
741 masm->isolate()); | 741 masm->isolate()); |
742 AllowExternalCallThatCantCauseGC scope(masm); | 742 AllowExternalCallThatCantCauseGC scope(masm); |
743 | 743 |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
996 __ vstr(s0, scratch1, 0); | 996 __ vstr(s0, scratch1, 0); |
997 } else { | 997 } else { |
998 Label not_special, done; | 998 Label not_special, done; |
999 // Move sign bit from source to destination. This works because the sign | 999 // Move sign bit from source to destination. This works because the sign |
1000 // bit in the exponent word of the double has the same position and polarity | 1000 // bit in the exponent word of the double has the same position and polarity |
1001 // as the 2's complement sign bit in a Smi. | 1001 // as the 2's complement sign bit in a Smi. |
1002 ASSERT(kBinary32SignMask == 0x80000000u); | 1002 ASSERT(kBinary32SignMask == 0x80000000u); |
1003 | 1003 |
1004 __ and_(fval, ival, Operand(kBinary32SignMask), SetCC); | 1004 __ and_(fval, ival, Operand(kBinary32SignMask), SetCC); |
1005 // Negate value if it is negative. | 1005 // Negate value if it is negative. |
1006 __ rsb(ival, ival, Operand(0, RelocInfo::NONE), LeaveCC, ne); | 1006 __ rsb(ival, ival, Operand::Zero(), LeaveCC, ne); |
1007 | 1007 |
1008 // We have -1, 0 or 1, which we treat specially. Register ival contains | 1008 // We have -1, 0 or 1, which we treat specially. Register ival contains |
1009 // absolute value: it is either equal to 1 (special case of -1 and 1), | 1009 // absolute value: it is either equal to 1 (special case of -1 and 1), |
1010 // greater than 1 (not a special case) or less than 1 (special case of 0). | 1010 // greater than 1 (not a special case) or less than 1 (special case of 0). |
1011 __ cmp(ival, Operand(1)); | 1011 __ cmp(ival, Operand(1)); |
1012 __ b(gt, ¬_special); | 1012 __ b(gt, ¬_special); |
1013 | 1013 |
1014 // For 1 or -1 we need to or in the 0 exponent (biased). | 1014 // For 1 or -1 we need to or in the 0 exponent (biased). |
1015 static const uint32_t exponent_word_for_1 = | 1015 static const uint32_t exponent_word_for_1 = |
1016 kBinary32ExponentBias << kBinary32ExponentShift; | 1016 kBinary32ExponentBias << kBinary32ExponentShift; |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1065 meaningful_bits - HeapNumber::kMantissaBitsInTopWord; | 1065 meaningful_bits - HeapNumber::kMantissaBitsInTopWord; |
1066 | 1066 |
1067 const int mantissa_shift_for_lo_word = | 1067 const int mantissa_shift_for_lo_word = |
1068 kBitsPerInt - mantissa_shift_for_hi_word; | 1068 kBitsPerInt - mantissa_shift_for_hi_word; |
1069 | 1069 |
1070 __ mov(scratch, Operand(biased_exponent << HeapNumber::kExponentShift)); | 1070 __ mov(scratch, Operand(biased_exponent << HeapNumber::kExponentShift)); |
1071 if (mantissa_shift_for_hi_word > 0) { | 1071 if (mantissa_shift_for_hi_word > 0) { |
1072 __ mov(loword, Operand(hiword, LSL, mantissa_shift_for_lo_word)); | 1072 __ mov(loword, Operand(hiword, LSL, mantissa_shift_for_lo_word)); |
1073 __ orr(hiword, scratch, Operand(hiword, LSR, mantissa_shift_for_hi_word)); | 1073 __ orr(hiword, scratch, Operand(hiword, LSR, mantissa_shift_for_hi_word)); |
1074 } else { | 1074 } else { |
1075 __ mov(loword, Operand(0, RelocInfo::NONE)); | 1075 __ mov(loword, Operand::Zero()); |
1076 __ orr(hiword, scratch, Operand(hiword, LSL, mantissa_shift_for_hi_word)); | 1076 __ orr(hiword, scratch, Operand(hiword, LSL, mantissa_shift_for_hi_word)); |
1077 } | 1077 } |
1078 | 1078 |
1079 // If least significant bit of biased exponent was not 1 it was corrupted | 1079 // If least significant bit of biased exponent was not 1 it was corrupted |
1080 // by most significant bit of mantissa so we should fix that. | 1080 // by most significant bit of mantissa so we should fix that. |
1081 if (!(biased_exponent & 1)) { | 1081 if (!(biased_exponent & 1)) { |
1082 __ bic(hiword, hiword, Operand(1 << HeapNumber::kExponentShift)); | 1082 __ bic(hiword, hiword, Operand(1 << HeapNumber::kExponentShift)); |
1083 } | 1083 } |
1084 } | 1084 } |
1085 | 1085 |
(...skipping 1142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2228 // Move the result back to general purpose register r0. | 2228 // Move the result back to general purpose register r0. |
2229 __ vmov(r0, s0); | 2229 __ vmov(r0, s0); |
2230 // Check if the result fits into a smi. | 2230 // Check if the result fits into a smi. |
2231 __ add(r1, r0, Operand(0x40000000), SetCC); | 2231 __ add(r1, r0, Operand(0x40000000), SetCC); |
2232 __ b(&wont_fit_smi, mi); | 2232 __ b(&wont_fit_smi, mi); |
2233 // Tag the result. | 2233 // Tag the result. |
2234 STATIC_ASSERT(kSmiTag == 0); | 2234 STATIC_ASSERT(kSmiTag == 0); |
2235 __ mov(r0, Operand(r0, LSL, kSmiTagSize)); | 2235 __ mov(r0, Operand(r0, LSL, kSmiTagSize)); |
2236 | 2236 |
2237 // Check for -0. | 2237 // Check for -0. |
2238 __ cmp(r0, Operand(0, RelocInfo::NONE)); | 2238 __ cmp(r0, Operand::Zero()); |
2239 __ b(&restore_fpscr_and_return, ne); | 2239 __ b(&restore_fpscr_and_return, ne); |
2240 // r5 already holds the HeapNumber exponent. | 2240 // r5 already holds the HeapNumber exponent. |
2241 __ tst(r5, Operand(HeapNumber::kSignMask)); | 2241 __ tst(r5, Operand(HeapNumber::kSignMask)); |
2242 // If our HeapNumber is negative it was -0, so load its address and return. | 2242 // If our HeapNumber is negative it was -0, so load its address and return. |
2243 // Else r0 is loaded with 0, so we can also just return. | 2243 // Else r0 is loaded with 0, so we can also just return. |
2244 __ ldr(r0, MemOperand(sp, 0 * kPointerSize), ne); | 2244 __ ldr(r0, MemOperand(sp, 0 * kPointerSize), ne); |
2245 | 2245 |
2246 __ bind(&restore_fpscr_and_return); | 2246 __ bind(&restore_fpscr_and_return); |
2247 // Restore FPSCR and return. | 2247 // Restore FPSCR and return. |
2248 __ vmsr(r3); | 2248 __ vmsr(r3); |
(...skipping 2002 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4251 bool is_signed_type = IsElementTypeSigned(elements_kind); | 4251 bool is_signed_type = IsElementTypeSigned(elements_kind); |
4252 int meaningfull_bits = is_signed_type ? (kBitsPerInt - 1) : kBitsPerInt; | 4252 int meaningfull_bits = is_signed_type ? (kBitsPerInt - 1) : kBitsPerInt; |
4253 int32_t min_value = is_signed_type ? 0x80000000 : 0x00000000; | 4253 int32_t min_value = is_signed_type ? 0x80000000 : 0x00000000; |
4254 | 4254 |
4255 Label done, sign; | 4255 Label done, sign; |
4256 | 4256 |
4257 // Test for all special exponent values: zeros, subnormal numbers, NaNs | 4257 // Test for all special exponent values: zeros, subnormal numbers, NaNs |
4258 // and infinities. All these should be converted to 0. | 4258 // and infinities. All these should be converted to 0. |
4259 __ mov(r7, Operand(HeapNumber::kExponentMask)); | 4259 __ mov(r7, Operand(HeapNumber::kExponentMask)); |
4260 __ and_(r9, r5, Operand(r7), SetCC); | 4260 __ and_(r9, r5, Operand(r7), SetCC); |
4261 __ mov(r5, Operand(0, RelocInfo::NONE), LeaveCC, eq); | 4261 __ mov(r5, Operand::Zero(), LeaveCC, eq); |
4262 __ b(eq, &done); | 4262 __ b(eq, &done); |
4263 | 4263 |
4264 __ teq(r9, Operand(r7)); | 4264 __ teq(r9, Operand(r7)); |
4265 __ mov(r5, Operand(0, RelocInfo::NONE), LeaveCC, eq); | 4265 __ mov(r5, Operand::Zero(), LeaveCC, eq); |
4266 __ b(eq, &done); | 4266 __ b(eq, &done); |
4267 | 4267 |
4268 // Unbias exponent. | 4268 // Unbias exponent. |
4269 __ mov(r9, Operand(r9, LSR, HeapNumber::kExponentShift)); | 4269 __ mov(r9, Operand(r9, LSR, HeapNumber::kExponentShift)); |
4270 __ sub(r9, r9, Operand(HeapNumber::kExponentBias), SetCC); | 4270 __ sub(r9, r9, Operand(HeapNumber::kExponentBias), SetCC); |
4271 // If exponent is negative then result is 0. | 4271 // If exponent is negative then result is 0. |
4272 __ mov(r5, Operand(0, RelocInfo::NONE), LeaveCC, mi); | 4272 __ mov(r5, Operand::Zero(), LeaveCC, mi); |
4273 __ b(mi, &done); | 4273 __ b(mi, &done); |
4274 | 4274 |
4275 // If exponent is too big then result is minimal value. | 4275 // If exponent is too big then result is minimal value. |
4276 __ cmp(r9, Operand(meaningfull_bits - 1)); | 4276 __ cmp(r9, Operand(meaningfull_bits - 1)); |
4277 __ mov(r5, Operand(min_value), LeaveCC, ge); | 4277 __ mov(r5, Operand(min_value), LeaveCC, ge); |
4278 __ b(ge, &done); | 4278 __ b(ge, &done); |
4279 | 4279 |
4280 __ and_(r7, r5, Operand(HeapNumber::kSignMask), SetCC); | 4280 __ and_(r7, r5, Operand(HeapNumber::kSignMask), SetCC); |
4281 __ and_(r5, r5, Operand(HeapNumber::kMantissaMask)); | 4281 __ and_(r5, r5, Operand(HeapNumber::kMantissaMask)); |
4282 __ orr(r5, r5, Operand(1u << HeapNumber::kMantissaBitsInTopWord)); | 4282 __ orr(r5, r5, Operand(1u << HeapNumber::kMantissaBitsInTopWord)); |
4283 | 4283 |
4284 __ rsb(r9, r9, Operand(HeapNumber::kMantissaBitsInTopWord), SetCC); | 4284 __ rsb(r9, r9, Operand(HeapNumber::kMantissaBitsInTopWord), SetCC); |
4285 __ mov(r5, Operand(r5, LSR, r9), LeaveCC, pl); | 4285 __ mov(r5, Operand(r5, LSR, r9), LeaveCC, pl); |
4286 __ b(pl, &sign); | 4286 __ b(pl, &sign); |
4287 | 4287 |
4288 __ rsb(r9, r9, Operand(0, RelocInfo::NONE)); | 4288 __ rsb(r9, r9, Operand::Zero()); |
4289 __ mov(r5, Operand(r5, LSL, r9)); | 4289 __ mov(r5, Operand(r5, LSL, r9)); |
4290 __ rsb(r9, r9, Operand(meaningfull_bits)); | 4290 __ rsb(r9, r9, Operand(meaningfull_bits)); |
4291 __ orr(r5, r5, Operand(r6, LSR, r9)); | 4291 __ orr(r5, r5, Operand(r6, LSR, r9)); |
4292 | 4292 |
4293 __ bind(&sign); | 4293 __ bind(&sign); |
4294 __ teq(r7, Operand(0, RelocInfo::NONE)); | 4294 __ teq(r7, Operand::Zero()); |
4295 __ rsb(r5, r5, Operand(0, RelocInfo::NONE), LeaveCC, ne); | 4295 __ rsb(r5, r5, Operand::Zero(), LeaveCC, ne); |
4296 | 4296 |
4297 __ bind(&done); | 4297 __ bind(&done); |
4298 switch (elements_kind) { | 4298 switch (elements_kind) { |
4299 case EXTERNAL_BYTE_ELEMENTS: | 4299 case EXTERNAL_BYTE_ELEMENTS: |
4300 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: | 4300 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
4301 __ strb(r5, MemOperand(r3, key, LSR, 1)); | 4301 __ strb(r5, MemOperand(r3, key, LSR, 1)); |
4302 break; | 4302 break; |
4303 case EXTERNAL_SHORT_ELEMENTS: | 4303 case EXTERNAL_SHORT_ELEMENTS: |
4304 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: | 4304 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
4305 __ strh(r5, MemOperand(r3, key, LSL, 0)); | 4305 __ strh(r5, MemOperand(r3, key, LSL, 0)); |
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4777 __ Jump(ic_slow, RelocInfo::CODE_TARGET); | 4777 __ Jump(ic_slow, RelocInfo::CODE_TARGET); |
4778 } | 4778 } |
4779 } | 4779 } |
4780 | 4780 |
4781 | 4781 |
4782 #undef __ | 4782 #undef __ |
4783 | 4783 |
4784 } } // namespace v8::internal | 4784 } } // namespace v8::internal |
4785 | 4785 |
4786 #endif // V8_TARGET_ARCH_ARM | 4786 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |