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

Side by Side Diff: src/mips/lithium-codegen-mips.cc

Issue 8896021: MIPS: Port Math.pow inlining to ARM. (Closed)
Patch Set: Created 9 years 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
« no previous file with comments | « src/mips/full-codegen-mips.cc ('k') | src/mips/lithium-mips.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 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 3006 matching lines...) Expand 10 before | Expand all | Expand 10 after
3017 __ neg_d(result, temp); 3017 __ neg_d(result, temp);
3018 3018
3019 // Add +0 to convert -0 to +0. 3019 // Add +0 to convert -0 to +0.
3020 __ add_d(result, input, kDoubleRegZero); 3020 __ add_d(result, input, kDoubleRegZero);
3021 __ sqrt_d(result, result); 3021 __ sqrt_d(result, result);
3022 __ bind(&done); 3022 __ bind(&done);
3023 } 3023 }
3024 3024
3025 3025
3026 void LCodeGen::DoPower(LPower* instr) { 3026 void LCodeGen::DoPower(LPower* instr) {
3027 LOperand* left = instr->InputAt(0);
3028 LOperand* right = instr->InputAt(1);
3029 Register scratch = scratch0();
3030 DoubleRegister result_reg = ToDoubleRegister(instr->result());
3031 Representation exponent_type = instr->hydrogen()->right()->representation(); 3027 Representation exponent_type = instr->hydrogen()->right()->representation();
3032 if (exponent_type.IsDouble()) { 3028 // Having marked this as a call, we can use any registers.
3033 // Prepare arguments and call C function. 3029 // Just make sure that the input/output registers are the expected ones.
3034 __ PrepareCallCFunction(0, 2, scratch); 3030 ASSERT(!instr->InputAt(1)->IsDoubleRegister() ||
3035 __ SetCallCDoubleArguments(ToDoubleRegister(left), 3031 ToDoubleRegister(instr->InputAt(1)).is(f4));
3036 ToDoubleRegister(right)); 3032 ASSERT(!instr->InputAt(1)->IsRegister() ||
3037 __ CallCFunction( 3033 ToRegister(instr->InputAt(1)).is(a2));
3038 ExternalReference::power_double_double_function(isolate()), 0, 2); 3034 ASSERT(ToDoubleRegister(instr->InputAt(0)).is(f2));
3035 ASSERT(ToDoubleRegister(instr->result()).is(f0));
3036
3037 if (exponent_type.IsTagged()) {
3038 Label no_deopt;
3039 __ JumpIfSmi(a2, &no_deopt);
3040 __ lw(t3, FieldMemOperand(a2, HeapObject::kMapOffset));
3041 DeoptimizeIf(ne, instr->environment(), t3, Operand(at));
3042 __ bind(&no_deopt);
3043 MathPowStub stub(MathPowStub::TAGGED);
3044 __ CallStub(&stub);
3039 } else if (exponent_type.IsInteger32()) { 3045 } else if (exponent_type.IsInteger32()) {
3040 ASSERT(ToRegister(right).is(a0)); 3046 MathPowStub stub(MathPowStub::INTEGER);
3041 // Prepare arguments and call C function. 3047 __ CallStub(&stub);
3042 __ PrepareCallCFunction(1, 1, scratch);
3043 __ SetCallCDoubleArguments(ToDoubleRegister(left), ToRegister(right));
3044 __ CallCFunction(
3045 ExternalReference::power_double_int_function(isolate()), 1, 1);
3046 } else { 3048 } else {
3047 ASSERT(exponent_type.IsTagged()); 3049 ASSERT(exponent_type.IsDouble());
3048 ASSERT(instr->hydrogen()->left()->representation().IsDouble()); 3050 MathPowStub stub(MathPowStub::DOUBLE);
3049 3051 __ CallStub(&stub);
3050 Register right_reg = ToRegister(right);
3051
3052 // Check for smi on the right hand side.
3053 Label non_smi, call;
3054 __ JumpIfNotSmi(right_reg, &non_smi);
3055
3056 // Untag smi and convert it to a double.
3057 __ SmiUntag(right_reg);
3058 FPURegister single_scratch = double_scratch0();
3059 __ mtc1(right_reg, single_scratch);
3060 __ cvt_d_w(result_reg, single_scratch);
3061 __ Branch(&call);
3062
3063 // Heap number map check.
3064 __ bind(&non_smi);
3065 __ lw(scratch, FieldMemOperand(right_reg, HeapObject::kMapOffset));
3066 __ LoadRoot(at, Heap::kHeapNumberMapRootIndex);
3067 DeoptimizeIf(ne, instr->environment(), scratch, Operand(at));
3068 __ ldc1(result_reg, FieldMemOperand(right_reg, HeapNumber::kValueOffset));
3069
3070 // Prepare arguments and call C function.
3071 __ bind(&call);
3072 __ PrepareCallCFunction(0, 2, scratch);
3073 __ SetCallCDoubleArguments(ToDoubleRegister(left), result_reg);
3074 __ CallCFunction(
3075 ExternalReference::power_double_double_function(isolate()), 0, 2);
3076 } 3052 }
3077 // Store the result in the result register.
3078 __ GetCFunctionDoubleResult(result_reg);
3079 } 3053 }
3080 3054
3081 3055
3082 void LCodeGen::DoMathLog(LUnaryMathOperation* instr) { 3056 void LCodeGen::DoMathLog(LUnaryMathOperation* instr) {
3083 ASSERT(ToDoubleRegister(instr->result()).is(f4)); 3057 ASSERT(ToDoubleRegister(instr->result()).is(f4));
3084 TranscendentalCacheStub stub(TranscendentalCache::LOG, 3058 TranscendentalCacheStub stub(TranscendentalCache::LOG,
3085 TranscendentalCacheStub::UNTAGGED); 3059 TranscendentalCacheStub::UNTAGGED);
3086 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); 3060 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
3087 } 3061 }
3088 3062
(...skipping 1587 matching lines...) Expand 10 before | Expand all | Expand 10 after
4676 ASSERT(!environment->HasBeenRegistered()); 4650 ASSERT(!environment->HasBeenRegistered());
4677 RegisterEnvironmentForDeoptimization(environment, Safepoint::kNoLazyDeopt); 4651 RegisterEnvironmentForDeoptimization(environment, Safepoint::kNoLazyDeopt);
4678 ASSERT(osr_pc_offset_ == -1); 4652 ASSERT(osr_pc_offset_ == -1);
4679 osr_pc_offset_ = masm()->pc_offset(); 4653 osr_pc_offset_ = masm()->pc_offset();
4680 } 4654 }
4681 4655
4682 4656
4683 #undef __ 4657 #undef __
4684 4658
4685 } } // namespace v8::internal 4659 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/mips/full-codegen-mips.cc ('k') | src/mips/lithium-mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698