Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(18)

Side by Side Diff: src/arm/stub-cache-arm.cc

Issue 11745030: ARM: generate integer zero in a uniform manner. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/arm/regexp-macro-assembler-arm.cc ('k') | test/cctest/test-assembler-arm.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 717 matching lines...) Expand 10 before | Expand all | Expand 10 after
728 __ add(r0, sp, Operand(1 * kPointerSize)); 728 __ add(r0, sp, Operand(1 * kPointerSize));
729 // v8::Arguments::implicit_args_ 729 // v8::Arguments::implicit_args_
730 __ str(r2, MemOperand(r0, 0 * kPointerSize)); 730 __ str(r2, MemOperand(r0, 0 * kPointerSize));
731 // v8::Arguments::values_ 731 // v8::Arguments::values_
732 __ add(ip, r2, Operand(argc * kPointerSize)); 732 __ add(ip, r2, Operand(argc * kPointerSize));
733 __ str(ip, MemOperand(r0, 1 * kPointerSize)); 733 __ str(ip, MemOperand(r0, 1 * kPointerSize));
734 // v8::Arguments::length_ = argc 734 // v8::Arguments::length_ = argc
735 __ mov(ip, Operand(argc)); 735 __ mov(ip, Operand(argc));
736 __ str(ip, MemOperand(r0, 2 * kPointerSize)); 736 __ str(ip, MemOperand(r0, 2 * kPointerSize));
737 // v8::Arguments::is_construct_call = 0 737 // v8::Arguments::is_construct_call = 0
738 __ mov(ip, Operand(0)); 738 __ mov(ip, Operand::Zero());
739 __ str(ip, MemOperand(r0, 3 * kPointerSize)); 739 __ str(ip, MemOperand(r0, 3 * kPointerSize));
740 740
741 const int kStackUnwindSpace = argc + kFastApiCallArguments + 1; 741 const int kStackUnwindSpace = argc + kFastApiCallArguments + 1;
742 Address function_address = v8::ToCData<Address>(api_call_info->callback()); 742 Address function_address = v8::ToCData<Address>(api_call_info->callback());
743 ApiFunction fun(function_address); 743 ApiFunction fun(function_address);
744 ExternalReference ref = ExternalReference(&fun, 744 ExternalReference ref = ExternalReference(&fun,
745 ExternalReference::DIRECT_API_CALL, 745 ExternalReference::DIRECT_API_CALL,
746 masm->isolate()); 746 masm->isolate());
747 AllowExternalCallThatCantCauseGC scope(masm); 747 AllowExternalCallThatCantCauseGC scope(masm);
748 748
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
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::NONE32), LeaveCC, ne); 1011 __ rsb(ival, ival, Operand::Zero(), 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, &not_special); 1017 __ b(gt, &not_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
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::NONE32)); 2244 __ cmp(r0, Operand::Zero());
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
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::NONE32), LeaveCC, eq); 3947 __ mov(r5, Operand::Zero(), 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::NONE32), LeaveCC, eq); 3951 __ mov(r5, Operand::Zero(), 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::NONE32), LeaveCC, mi); 3958 __ mov(r5, Operand::Zero(), 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::NONE32)); 3974 __ rsb(r9, r9, Operand::Zero());
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::NONE32)); 3980 __ teq(r7, Operand::Zero());
3981 __ rsb(r5, r5, Operand(0, RelocInfo::NONE32), LeaveCC, ne); 3981 __ rsb(r5, r5, Operand::Zero(), 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
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
OLDNEW
« no previous file with comments | « src/arm/regexp-macro-assembler-arm.cc ('k') | test/cctest/test-assembler-arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698