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 990 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1001 __ vstr(s0, scratch1, 0); | 1001 __ vstr(s0, scratch1, 0); |
1002 } else { | 1002 } else { |
1003 Label not_special, done; | 1003 Label not_special, done; |
1004 // Move sign bit from source to destination. This works because the sign | 1004 // Move sign bit from source to destination. This works because the sign |
1005 // bit in the exponent word of the double has the same position and polarity | 1005 // bit in the exponent word of the double has the same position and polarity |
1006 // as the 2's complement sign bit in a Smi. | 1006 // as the 2's complement sign bit in a Smi. |
1007 ASSERT(kBinary32SignMask == 0x80000000u); | 1007 ASSERT(kBinary32SignMask == 0x80000000u); |
1008 | 1008 |
1009 __ and_(fval, ival, Operand(kBinary32SignMask), SetCC); | 1009 __ and_(fval, ival, Operand(kBinary32SignMask), SetCC); |
1010 // Negate value if it is negative. | 1010 // Negate value if it is negative. |
1011 __ rsb(ival, ival, Operand(0, RelocInfo::NONE), LeaveCC, ne); | 1011 __ rsb(ival, ival, Operand(0, RelocInfo::NONE32), LeaveCC, ne); |
1012 | 1012 |
1013 // We have -1, 0 or 1, which we treat specially. Register ival contains | 1013 // We have -1, 0 or 1, which we treat specially. Register ival contains |
1014 // absolute value: it is either equal to 1 (special case of -1 and 1), | 1014 // absolute value: it is either equal to 1 (special case of -1 and 1), |
1015 // greater than 1 (not a special case) or less than 1 (special case of 0). | 1015 // greater than 1 (not a special case) or less than 1 (special case of 0). |
1016 __ cmp(ival, Operand(1)); | 1016 __ cmp(ival, Operand(1)); |
1017 __ b(gt, ¬_special); | 1017 __ b(gt, ¬_special); |
1018 | 1018 |
1019 // For 1 or -1 we need to or in the 0 exponent (biased). | 1019 // For 1 or -1 we need to or in the 0 exponent (biased). |
1020 static const uint32_t exponent_word_for_1 = | 1020 static const uint32_t exponent_word_for_1 = |
1021 kBinary32ExponentBias << kBinary32ExponentShift; | 1021 kBinary32ExponentBias << kBinary32ExponentShift; |
(...skipping 1212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2234 // Move the result back to general purpose register r0. | 2234 // Move the result back to general purpose register r0. |
2235 __ vmov(r0, s0); | 2235 __ vmov(r0, s0); |
2236 // Check if the result fits into a smi. | 2236 // Check if the result fits into a smi. |
2237 __ add(r1, r0, Operand(0x40000000), SetCC); | 2237 __ add(r1, r0, Operand(0x40000000), SetCC); |
2238 __ b(&wont_fit_smi, mi); | 2238 __ b(&wont_fit_smi, mi); |
2239 // Tag the result. | 2239 // Tag the result. |
2240 STATIC_ASSERT(kSmiTag == 0); | 2240 STATIC_ASSERT(kSmiTag == 0); |
2241 __ mov(r0, Operand(r0, LSL, kSmiTagSize)); | 2241 __ mov(r0, Operand(r0, LSL, kSmiTagSize)); |
2242 | 2242 |
2243 // Check for -0. | 2243 // Check for -0. |
2244 __ cmp(r0, Operand(0, RelocInfo::NONE)); | 2244 __ cmp(r0, Operand(0, RelocInfo::NONE32)); |
2245 __ b(&restore_fpscr_and_return, ne); | 2245 __ b(&restore_fpscr_and_return, ne); |
2246 // r5 already holds the HeapNumber exponent. | 2246 // r5 already holds the HeapNumber exponent. |
2247 __ tst(r5, Operand(HeapNumber::kSignMask)); | 2247 __ tst(r5, Operand(HeapNumber::kSignMask)); |
2248 // If our HeapNumber is negative it was -0, so load its address and return. | 2248 // If our HeapNumber is negative it was -0, so load its address and return. |
2249 // Else r0 is loaded with 0, so we can also just return. | 2249 // Else r0 is loaded with 0, so we can also just return. |
2250 __ ldr(r0, MemOperand(sp, 0 * kPointerSize), ne); | 2250 __ ldr(r0, MemOperand(sp, 0 * kPointerSize), ne); |
2251 | 2251 |
2252 __ bind(&restore_fpscr_and_return); | 2252 __ bind(&restore_fpscr_and_return); |
2253 // Restore FPSCR and return. | 2253 // Restore FPSCR and return. |
2254 __ vmsr(r3); | 2254 __ vmsr(r3); |
(...skipping 1682 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3937 bool is_signed_type = IsElementTypeSigned(elements_kind); | 3937 bool is_signed_type = IsElementTypeSigned(elements_kind); |
3938 int meaningfull_bits = is_signed_type ? (kBitsPerInt - 1) : kBitsPerInt; | 3938 int meaningfull_bits = is_signed_type ? (kBitsPerInt - 1) : kBitsPerInt; |
3939 int32_t min_value = is_signed_type ? 0x80000000 : 0x00000000; | 3939 int32_t min_value = is_signed_type ? 0x80000000 : 0x00000000; |
3940 | 3940 |
3941 Label done, sign; | 3941 Label done, sign; |
3942 | 3942 |
3943 // Test for all special exponent values: zeros, subnormal numbers, NaNs | 3943 // Test for all special exponent values: zeros, subnormal numbers, NaNs |
3944 // and infinities. All these should be converted to 0. | 3944 // and infinities. All these should be converted to 0. |
3945 __ mov(r7, Operand(HeapNumber::kExponentMask)); | 3945 __ mov(r7, Operand(HeapNumber::kExponentMask)); |
3946 __ and_(r9, r5, Operand(r7), SetCC); | 3946 __ and_(r9, r5, Operand(r7), SetCC); |
3947 __ mov(r5, Operand(0, RelocInfo::NONE), LeaveCC, eq); | 3947 __ mov(r5, Operand(0, RelocInfo::NONE32), LeaveCC, eq); |
3948 __ b(eq, &done); | 3948 __ b(eq, &done); |
3949 | 3949 |
3950 __ teq(r9, Operand(r7)); | 3950 __ teq(r9, Operand(r7)); |
3951 __ mov(r5, Operand(0, RelocInfo::NONE), LeaveCC, eq); | 3951 __ mov(r5, Operand(0, RelocInfo::NONE32), LeaveCC, eq); |
3952 __ b(eq, &done); | 3952 __ b(eq, &done); |
3953 | 3953 |
3954 // Unbias exponent. | 3954 // Unbias exponent. |
3955 __ mov(r9, Operand(r9, LSR, HeapNumber::kExponentShift)); | 3955 __ mov(r9, Operand(r9, LSR, HeapNumber::kExponentShift)); |
3956 __ sub(r9, r9, Operand(HeapNumber::kExponentBias), SetCC); | 3956 __ sub(r9, r9, Operand(HeapNumber::kExponentBias), SetCC); |
3957 // If exponent is negative then result is 0. | 3957 // If exponent is negative then result is 0. |
3958 __ mov(r5, Operand(0, RelocInfo::NONE), LeaveCC, mi); | 3958 __ mov(r5, Operand(0, RelocInfo::NONE32), LeaveCC, mi); |
3959 __ b(mi, &done); | 3959 __ b(mi, &done); |
3960 | 3960 |
3961 // If exponent is too big then result is minimal value. | 3961 // If exponent is too big then result is minimal value. |
3962 __ cmp(r9, Operand(meaningfull_bits - 1)); | 3962 __ cmp(r9, Operand(meaningfull_bits - 1)); |
3963 __ mov(r5, Operand(min_value), LeaveCC, ge); | 3963 __ mov(r5, Operand(min_value), LeaveCC, ge); |
3964 __ b(ge, &done); | 3964 __ b(ge, &done); |
3965 | 3965 |
3966 __ and_(r7, r5, Operand(HeapNumber::kSignMask), SetCC); | 3966 __ and_(r7, r5, Operand(HeapNumber::kSignMask), SetCC); |
3967 __ and_(r5, r5, Operand(HeapNumber::kMantissaMask)); | 3967 __ and_(r5, r5, Operand(HeapNumber::kMantissaMask)); |
3968 __ orr(r5, r5, Operand(1u << HeapNumber::kMantissaBitsInTopWord)); | 3968 __ orr(r5, r5, Operand(1u << HeapNumber::kMantissaBitsInTopWord)); |
3969 | 3969 |
3970 __ rsb(r9, r9, Operand(HeapNumber::kMantissaBitsInTopWord), SetCC); | 3970 __ rsb(r9, r9, Operand(HeapNumber::kMantissaBitsInTopWord), SetCC); |
3971 __ mov(r5, Operand(r5, LSR, r9), LeaveCC, pl); | 3971 __ mov(r5, Operand(r5, LSR, r9), LeaveCC, pl); |
3972 __ b(pl, &sign); | 3972 __ b(pl, &sign); |
3973 | 3973 |
3974 __ rsb(r9, r9, Operand(0, RelocInfo::NONE)); | 3974 __ rsb(r9, r9, Operand(0, RelocInfo::NONE32)); |
3975 __ mov(r5, Operand(r5, LSL, r9)); | 3975 __ mov(r5, Operand(r5, LSL, r9)); |
3976 __ rsb(r9, r9, Operand(meaningfull_bits)); | 3976 __ rsb(r9, r9, Operand(meaningfull_bits)); |
3977 __ orr(r5, r5, Operand(r6, LSR, r9)); | 3977 __ orr(r5, r5, Operand(r6, LSR, r9)); |
3978 | 3978 |
3979 __ bind(&sign); | 3979 __ bind(&sign); |
3980 __ teq(r7, Operand(0, RelocInfo::NONE)); | 3980 __ teq(r7, Operand(0, RelocInfo::NONE32)); |
3981 __ rsb(r5, r5, Operand(0, RelocInfo::NONE), LeaveCC, ne); | 3981 __ rsb(r5, r5, Operand(0, RelocInfo::NONE32), LeaveCC, ne); |
3982 | 3982 |
3983 __ bind(&done); | 3983 __ bind(&done); |
3984 switch (elements_kind) { | 3984 switch (elements_kind) { |
3985 case EXTERNAL_BYTE_ELEMENTS: | 3985 case EXTERNAL_BYTE_ELEMENTS: |
3986 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: | 3986 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
3987 __ strb(r5, MemOperand(r3, key, LSR, 1)); | 3987 __ strb(r5, MemOperand(r3, key, LSR, 1)); |
3988 break; | 3988 break; |
3989 case EXTERNAL_SHORT_ELEMENTS: | 3989 case EXTERNAL_SHORT_ELEMENTS: |
3990 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: | 3990 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
3991 __ strh(r5, MemOperand(r3, key, LSL, 0)); | 3991 __ strh(r5, MemOperand(r3, key, LSL, 0)); |
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4372 __ Jump(ic_slow, RelocInfo::CODE_TARGET); | 4372 __ Jump(ic_slow, RelocInfo::CODE_TARGET); |
4373 } | 4373 } |
4374 } | 4374 } |
4375 | 4375 |
4376 | 4376 |
4377 #undef __ | 4377 #undef __ |
4378 | 4378 |
4379 } } // namespace v8::internal | 4379 } } // namespace v8::internal |
4380 | 4380 |
4381 #endif // V8_TARGET_ARCH_ARM | 4381 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |