Chromium Code Reviews| 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 4038 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4049 break; | 4049 break; |
| 4050 case Token::BIT_NOT: | 4050 case Token::BIT_NOT: |
| 4051 __ InvokeBuiltin(Builtins::BIT_NOT, JUMP_JS); | 4051 __ InvokeBuiltin(Builtins::BIT_NOT, JUMP_JS); |
| 4052 break; | 4052 break; |
| 4053 default: | 4053 default: |
| 4054 UNREACHABLE(); | 4054 UNREACHABLE(); |
| 4055 } | 4055 } |
| 4056 } | 4056 } |
| 4057 | 4057 |
| 4058 | 4058 |
| 4059 void MathPowStub::Generate(MacroAssembler* masm) { | |
| 4060 Label call_runtime; | |
| 4061 | |
| 4062 if (CpuFeatures::IsSupported(VFP3)) { | |
| 4063 CpuFeatures::Scope scope(VFP3); | |
| 4064 | |
| 4065 Label base_not_smi; | |
| 4066 Label exponent_not_smi; | |
| 4067 Label convert_exponent; | |
| 4068 | |
| 4069 const Register base = r0; | |
| 4070 const Register exponent = r1; | |
| 4071 const Register result = r0; | |
| 4072 const Register heapnumbermap = r5; | |
| 4073 const Register heapnumber = r6; | |
| 4074 const DoubleRegister double_base = d0; | |
| 4075 const DoubleRegister double_exponent = d1; | |
| 4076 const DoubleRegister double_result = d2; | |
| 4077 const SwVfpRegister single_scratch = s0; | |
| 4078 const Register scratch = r9; | |
| 4079 const Register scratch2 = r7; | |
| 4080 | |
| 4081 ASSERT(result.is(r0)); | |
| 4082 | |
| 4083 __ LoadRoot(heapnumbermap, Heap::kHeapNumberMapRootIndex); | |
| 4084 __ ldr(base, MemOperand(sp, 1 * kPointerSize)); | |
| 4085 __ ldr(exponent, MemOperand(sp, 0 * kPointerSize)); | |
| 4086 | |
| 4087 // Convert base to double value and store it in d0. | |
| 4088 __ JumpIfNotSmi(base, &base_not_smi); | |
| 4089 // Base is a Smi. Untag and convert it. | |
| 4090 __ SmiUntag(base); | |
| 4091 __ vmov(single_scratch, base); | |
| 4092 __ vcvt_f64_s32(double_base, single_scratch); | |
| 4093 __ b(&convert_exponent); | |
| 4094 | |
| 4095 __ bind(&base_not_smi); | |
| 4096 __ ldr(scratch, FieldMemOperand(base, JSObject::kMapOffset)); | |
| 4097 __ cmp(scratch, heapnumbermap); | |
| 4098 __ b(ne, &call_runtime); | |
| 4099 // Base is a heapnumber. Load it into double register. | |
| 4100 __ vldr(double_base, FieldMemOperand(base, HeapNumber::kValueOffset)); | |
| 4101 | |
| 4102 __ bind(&convert_exponent); | |
| 4103 __ JumpIfNotSmi(exponent, &exponent_not_smi); | |
| 4104 __ SmiUntag(exponent); | |
| 4105 | |
| 4106 // The base is in a double register and the exponent is | |
| 4107 // an untagged smi. Allocate a heap number and call a | |
| 4108 // C function for integer exponents. | |
|
Søren Thygesen Gjesse
2011/03/08 10:05:12
Maybe add a comment that heapnumber is callee save
Karl Klose
2011/03/08 10:29:00
Done.
| |
| 4109 __ AllocateHeapNumber(heapnumber, | |
| 4110 scratch, | |
| 4111 scratch2, | |
| 4112 heapnumbermap, | |
| 4113 &call_runtime); | |
| 4114 __ push(lr); | |
| 4115 __ PrepareCallCFunction(3, scratch); | |
| 4116 __ mov(r2, exponent); | |
| 4117 __ vmov(r0, r1, double_base); | |
| 4118 __ CallCFunction(ExternalReference::power_double_int_function(), 3); | |
| 4119 __ pop(lr); | |
| 4120 __ GetCFunctionDoubleResult(double_result); | |
| 4121 __ vstr(double_result, | |
| 4122 FieldMemOperand(heapnumber, HeapNumber::kValueOffset)); | |
| 4123 __ mov(result, heapnumber); | |
|
Søren Thygesen Gjesse
2011/03/08 10:05:12
I think it would be fine to just use r0 here and d
Karl Klose
2011/03/08 10:29:00
Done.
| |
| 4124 __ Ret(2 * kPointerSize); | |
| 4125 | |
| 4126 __ bind(&exponent_not_smi); | |
| 4127 __ ldr(scratch, FieldMemOperand(exponent, JSObject::kMapOffset)); | |
| 4128 __ cmp(scratch, heapnumbermap); | |
| 4129 __ b(ne, &call_runtime); | |
| 4130 // Exponent is a heapnumber. Load it into double register. | |
| 4131 __ vldr(double_exponent, | |
| 4132 FieldMemOperand(exponent, HeapNumber::kValueOffset)); | |
| 4133 | |
| 4134 // The base and the exponent are in double registers. | |
| 4135 // Allocate a heap number and call a C function for | |
| 4136 // double exponents. | |
|
Søren Thygesen Gjesse
2011/03/08 10:05:12
Ditto.
Karl Klose
2011/03/08 10:29:00
Done.
| |
| 4137 __ AllocateHeapNumber(heapnumber, | |
| 4138 scratch, | |
| 4139 scratch2, | |
| 4140 heapnumbermap, | |
| 4141 &call_runtime); | |
| 4142 __ push(lr); | |
| 4143 __ PrepareCallCFunction(4, scratch); | |
| 4144 __ vmov(r0, r1, double_base); | |
| 4145 __ vmov(r2, r3, double_exponent); | |
| 4146 __ CallCFunction(ExternalReference::power_double_double_function(), 4); | |
| 4147 __ pop(lr); | |
| 4148 __ GetCFunctionDoubleResult(double_result); | |
| 4149 __ vstr(double_result, | |
| 4150 FieldMemOperand(heapnumber, HeapNumber::kValueOffset)); | |
| 4151 __ mov(result, heapnumber); | |
|
Søren Thygesen Gjesse
2011/03/08 10:05:12
Ditto.
Karl Klose
2011/03/08 10:29:00
Done.
| |
| 4152 __ Ret(2 * kPointerSize); | |
| 4153 } | |
| 4154 | |
| 4155 __ bind(&call_runtime); | |
| 4156 __ TailCallRuntime(Runtime::kMath_pow_cfunction, 2, 1); | |
| 4157 } | |
| 4158 | |
| 4159 | |
| 4059 void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) { | 4160 void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) { |
| 4060 __ Throw(r0); | 4161 __ Throw(r0); |
| 4061 } | 4162 } |
| 4062 | 4163 |
| 4063 | 4164 |
| 4064 void CEntryStub::GenerateThrowUncatchable(MacroAssembler* masm, | 4165 void CEntryStub::GenerateThrowUncatchable(MacroAssembler* masm, |
| 4065 UncatchableExceptionType type) { | 4166 UncatchableExceptionType type) { |
| 4066 __ ThrowUncatchable(type, r0); | 4167 __ ThrowUncatchable(type, r0); |
| 4067 } | 4168 } |
| 4068 | 4169 |
| (...skipping 2808 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6877 __ strb(untagged_value, MemOperand(external_pointer, untagged_key)); | 6978 __ strb(untagged_value, MemOperand(external_pointer, untagged_key)); |
| 6878 __ Ret(); | 6979 __ Ret(); |
| 6879 } | 6980 } |
| 6880 | 6981 |
| 6881 | 6982 |
| 6882 #undef __ | 6983 #undef __ |
| 6883 | 6984 |
| 6884 } } // namespace v8::internal | 6985 } } // namespace v8::internal |
| 6885 | 6986 |
| 6886 #endif // V8_TARGET_ARCH_ARM | 6987 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |