| 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 3142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3153 | 3153 |
| 3154 | 3154 |
| 3155 void FullCodeGenerator::EmitDateField(CallRuntime* expr) { | 3155 void FullCodeGenerator::EmitDateField(CallRuntime* expr) { |
| 3156 ZoneList<Expression*>* args = expr->arguments(); | 3156 ZoneList<Expression*>* args = expr->arguments(); |
| 3157 ASSERT(args->length() == 2); | 3157 ASSERT(args->length() == 2); |
| 3158 ASSERT_NE(NULL, args->at(1)->AsLiteral()); | 3158 ASSERT_NE(NULL, args->at(1)->AsLiteral()); |
| 3159 Smi* index = Smi::cast(*(args->at(1)->AsLiteral()->handle())); | 3159 Smi* index = Smi::cast(*(args->at(1)->AsLiteral()->handle())); |
| 3160 | 3160 |
| 3161 VisitForAccumulatorValue(args->at(0)); // Load the object. | 3161 VisitForAccumulatorValue(args->at(0)); // Load the object. |
| 3162 | 3162 |
| 3163 Label runtime, done; | 3163 Label runtime, done, not_date_object; |
| 3164 Register object = v0; | 3164 Register object = v0; |
| 3165 Register result = v0; | 3165 Register result = v0; |
| 3166 Register scratch0 = t5; | 3166 Register scratch0 = t5; |
| 3167 Register scratch1 = a1; | 3167 Register scratch1 = a1; |
| 3168 | 3168 |
| 3169 #ifdef DEBUG | 3169 __ JumpIfSmi(object, ¬_date_object); |
| 3170 __ AbortIfSmi(object); | |
| 3171 __ GetObjectType(object, scratch1, scratch1); | 3170 __ GetObjectType(object, scratch1, scratch1); |
| 3172 __ Assert(eq, "Trying to get date field from non-date.", | 3171 __ Branch(¬_date_object, ne, scratch1, Operand(JS_DATE_TYPE)); |
| 3173 scratch1, Operand(JS_DATE_TYPE)); | |
| 3174 #endif | |
| 3175 | 3172 |
| 3176 if (index->value() == 0) { | 3173 if (index->value() == 0) { |
| 3177 __ lw(result, FieldMemOperand(object, JSDate::kValueOffset)); | 3174 __ lw(result, FieldMemOperand(object, JSDate::kValueOffset)); |
| 3175 __ jmp(&done); |
| 3178 } else { | 3176 } else { |
| 3179 if (index->value() < JSDate::kFirstUncachedField) { | 3177 if (index->value() < JSDate::kFirstUncachedField) { |
| 3180 ExternalReference stamp = ExternalReference::date_cache_stamp(isolate()); | 3178 ExternalReference stamp = ExternalReference::date_cache_stamp(isolate()); |
| 3181 __ li(scratch1, Operand(stamp)); | 3179 __ li(scratch1, Operand(stamp)); |
| 3182 __ lw(scratch1, MemOperand(scratch1)); | 3180 __ lw(scratch1, MemOperand(scratch1)); |
| 3183 __ lw(scratch0, FieldMemOperand(object, JSDate::kCacheStampOffset)); | 3181 __ lw(scratch0, FieldMemOperand(object, JSDate::kCacheStampOffset)); |
| 3184 __ Branch(&runtime, ne, scratch1, Operand(scratch0)); | 3182 __ Branch(&runtime, ne, scratch1, Operand(scratch0)); |
| 3185 __ lw(result, FieldMemOperand(object, JSDate::kValueOffset + | 3183 __ lw(result, FieldMemOperand(object, JSDate::kValueOffset + |
| 3186 kPointerSize * index->value())); | 3184 kPointerSize * index->value())); |
| 3187 __ jmp(&done); | 3185 __ jmp(&done); |
| 3188 } | 3186 } |
| 3189 __ bind(&runtime); | 3187 __ bind(&runtime); |
| 3190 __ PrepareCallCFunction(2, scratch1); | 3188 __ PrepareCallCFunction(2, scratch1); |
| 3191 __ li(a1, Operand(index)); | 3189 __ li(a1, Operand(index)); |
| 3192 __ Move(a0, object); | 3190 __ Move(a0, object); |
| 3193 __ CallCFunction(ExternalReference::get_date_field_function(isolate()), 2); | 3191 __ CallCFunction(ExternalReference::get_date_field_function(isolate()), 2); |
| 3194 __ bind(&done); | 3192 __ jmp(&done); |
| 3195 } | 3193 } |
| 3196 | 3194 |
| 3195 __ bind(¬_date_object); |
| 3196 __ CallRuntime(Runtime::kThrowNotDateError, 0); |
| 3197 __ bind(&done); |
| 3197 context()->Plug(v0); | 3198 context()->Plug(v0); |
| 3198 } | 3199 } |
| 3199 | 3200 |
| 3200 | 3201 |
| 3201 void FullCodeGenerator::EmitMathPow(CallRuntime* expr) { | 3202 void FullCodeGenerator::EmitMathPow(CallRuntime* expr) { |
| 3202 // Load the arguments on the stack and call the runtime function. | 3203 // Load the arguments on the stack and call the runtime function. |
| 3203 ZoneList<Expression*>* args = expr->arguments(); | 3204 ZoneList<Expression*>* args = expr->arguments(); |
| 3204 ASSERT(args->length() == 2); | 3205 ASSERT(args->length() == 2); |
| 3205 VisitForStackValue(args->at(0)); | 3206 VisitForStackValue(args->at(0)); |
| 3206 VisitForStackValue(args->at(1)); | 3207 VisitForStackValue(args->at(1)); |
| (...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3613 | 3614 |
| 3614 context()->Plug(if_true, if_false); | 3615 context()->Plug(if_true, if_false); |
| 3615 } | 3616 } |
| 3616 | 3617 |
| 3617 | 3618 |
| 3618 void FullCodeGenerator::EmitGetCachedArrayIndex(CallRuntime* expr) { | 3619 void FullCodeGenerator::EmitGetCachedArrayIndex(CallRuntime* expr) { |
| 3619 ZoneList<Expression*>* args = expr->arguments(); | 3620 ZoneList<Expression*>* args = expr->arguments(); |
| 3620 ASSERT(args->length() == 1); | 3621 ASSERT(args->length() == 1); |
| 3621 VisitForAccumulatorValue(args->at(0)); | 3622 VisitForAccumulatorValue(args->at(0)); |
| 3622 | 3623 |
| 3623 if (generate_debug_code_) { | 3624 __ AbortIfNotString(v0); |
| 3624 __ AbortIfNotString(v0); | |
| 3625 } | |
| 3626 | 3625 |
| 3627 __ lw(v0, FieldMemOperand(v0, String::kHashFieldOffset)); | 3626 __ lw(v0, FieldMemOperand(v0, String::kHashFieldOffset)); |
| 3628 __ IndexFromHash(v0, v0); | 3627 __ IndexFromHash(v0, v0); |
| 3629 | 3628 |
| 3630 context()->Plug(v0); | 3629 context()->Plug(v0); |
| 3631 } | 3630 } |
| 3632 | 3631 |
| 3633 | 3632 |
| 3634 void FullCodeGenerator::EmitFastAsciiArrayJoin(CallRuntime* expr) { | 3633 void FullCodeGenerator::EmitFastAsciiArrayJoin(CallRuntime* expr) { |
| 3635 Label bailout, done, one_char_separator, long_separator, | 3634 Label bailout, done, one_char_separator, long_separator, |
| (...skipping 983 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4619 *context_length = 0; | 4618 *context_length = 0; |
| 4620 return previous_; | 4619 return previous_; |
| 4621 } | 4620 } |
| 4622 | 4621 |
| 4623 | 4622 |
| 4624 #undef __ | 4623 #undef __ |
| 4625 | 4624 |
| 4626 } } // namespace v8::internal | 4625 } } // namespace v8::internal |
| 4627 | 4626 |
| 4628 #endif // V8_TARGET_ARCH_MIPS | 4627 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |