| 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 7006 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7017 __ ret(2 * kPointerSize); | 7017 __ ret(2 * kPointerSize); |
| 7018 } | 7018 } |
| 7019 | 7019 |
| 7020 | 7020 |
| 7021 struct AheadOfTimeWriteBarrierStubList { | 7021 struct AheadOfTimeWriteBarrierStubList { |
| 7022 Register object, value, address; | 7022 Register object, value, address; |
| 7023 RememberedSetAction action; | 7023 RememberedSetAction action; |
| 7024 }; | 7024 }; |
| 7025 | 7025 |
| 7026 | 7026 |
| 7027 #define REG(Name) { kRegister_ ## Name ## _Code } | 7027 struct AheadOfTimeWriteBarrierStubList kAheadOfTime[] = { |
| 7028 | |
| 7029 static const AheadOfTimeWriteBarrierStubList kAheadOfTime[] = { | |
| 7030 // Used in RegExpExecStub. | 7028 // Used in RegExpExecStub. |
| 7031 { REG(ebx), REG(eax), REG(edi), EMIT_REMEMBERED_SET }, | 7029 { ebx, eax, edi, EMIT_REMEMBERED_SET }, |
| 7032 // Used in CompileArrayPushCall. | 7030 // Used in CompileArrayPushCall. |
| 7033 { REG(ebx), REG(ecx), REG(edx), EMIT_REMEMBERED_SET }, | 7031 { ebx, ecx, edx, EMIT_REMEMBERED_SET }, |
| 7034 { REG(ebx), REG(edi), REG(edx), OMIT_REMEMBERED_SET }, | 7032 { ebx, edi, edx, OMIT_REMEMBERED_SET }, |
| 7035 // Used in CompileStoreGlobal and CallFunctionStub. | 7033 // Used in CompileStoreGlobal and CallFunctionStub. |
| 7036 { REG(ebx), REG(ecx), REG(edx), OMIT_REMEMBERED_SET }, | 7034 { ebx, ecx, edx, OMIT_REMEMBERED_SET }, |
| 7037 // Used in StoreStubCompiler::CompileStoreField and | 7035 // Used in StoreStubCompiler::CompileStoreField and |
| 7038 // KeyedStoreStubCompiler::CompileStoreField via GenerateStoreField. | 7036 // KeyedStoreStubCompiler::CompileStoreField via GenerateStoreField. |
| 7039 { REG(edx), REG(ecx), REG(ebx), EMIT_REMEMBERED_SET }, | 7037 { edx, ecx, ebx, EMIT_REMEMBERED_SET }, |
| 7040 // GenerateStoreField calls the stub with two different permutations of | 7038 // GenerateStoreField calls the stub with two different permutations of |
| 7041 // registers. This is the second. | 7039 // registers. This is the second. |
| 7042 { REG(ebx), REG(ecx), REG(edx), EMIT_REMEMBERED_SET }, | 7040 { ebx, ecx, edx, EMIT_REMEMBERED_SET }, |
| 7043 // StoreIC::GenerateNormal via GenerateDictionaryStore | 7041 // StoreIC::GenerateNormal via GenerateDictionaryStore |
| 7044 { REG(ebx), REG(edi), REG(edx), EMIT_REMEMBERED_SET }, | 7042 { ebx, edi, edx, EMIT_REMEMBERED_SET }, |
| 7045 // KeyedStoreIC::GenerateGeneric. | 7043 // KeyedStoreIC::GenerateGeneric. |
| 7046 { REG(ebx), REG(edx), REG(ecx), EMIT_REMEMBERED_SET}, | 7044 { ebx, edx, ecx, EMIT_REMEMBERED_SET}, |
| 7047 // KeyedStoreStubCompiler::GenerateStoreFastElement. | 7045 // KeyedStoreStubCompiler::GenerateStoreFastElement. |
| 7048 { REG(edi), REG(ebx), REG(ecx), EMIT_REMEMBERED_SET}, | 7046 { edi, ebx, ecx, EMIT_REMEMBERED_SET}, |
| 7049 { REG(edx), REG(edi), REG(ebx), EMIT_REMEMBERED_SET}, | 7047 { edx, edi, ebx, EMIT_REMEMBERED_SET}, |
| 7050 // ElementsTransitionGenerator::GenerateSmiOnlyToObject | 7048 // ElementsTransitionGenerator::GenerateSmiOnlyToObject |
| 7051 // and ElementsTransitionGenerator::GenerateSmiOnlyToDouble | 7049 // and ElementsTransitionGenerator::GenerateSmiOnlyToDouble |
| 7052 // and ElementsTransitionGenerator::GenerateDoubleToObject | 7050 // and ElementsTransitionGenerator::GenerateDoubleToObject |
| 7053 { REG(edx), REG(ebx), REG(edi), EMIT_REMEMBERED_SET}, | 7051 { edx, ebx, edi, EMIT_REMEMBERED_SET}, |
| 7054 { REG(edx), REG(ebx), REG(edi), OMIT_REMEMBERED_SET}, | 7052 { edx, ebx, edi, OMIT_REMEMBERED_SET}, |
| 7055 // ElementsTransitionGenerator::GenerateDoubleToObject | 7053 // ElementsTransitionGenerator::GenerateDoubleToObject |
| 7056 { REG(eax), REG(edx), REG(esi), EMIT_REMEMBERED_SET}, | 7054 { eax, edx, esi, EMIT_REMEMBERED_SET}, |
| 7057 { REG(edx), REG(eax), REG(edi), EMIT_REMEMBERED_SET}, | 7055 { edx, eax, edi, EMIT_REMEMBERED_SET}, |
| 7058 // StoreArrayLiteralElementStub::Generate | 7056 // StoreArrayLiteralElementStub::Generate |
| 7059 { REG(ebx), REG(eax), REG(ecx), EMIT_REMEMBERED_SET}, | 7057 { ebx, eax, ecx, EMIT_REMEMBERED_SET}, |
| 7060 // Null termination. | 7058 // Null termination. |
| 7061 { REG(no_reg), REG(no_reg), REG(no_reg), EMIT_REMEMBERED_SET} | 7059 { no_reg, no_reg, no_reg, EMIT_REMEMBERED_SET} |
| 7062 }; | 7060 }; |
| 7063 | 7061 |
| 7064 #undef REG | |
| 7065 | 7062 |
| 7066 bool RecordWriteStub::IsPregenerated() { | 7063 bool RecordWriteStub::IsPregenerated() { |
| 7067 for (const AheadOfTimeWriteBarrierStubList* entry = kAheadOfTime; | 7064 for (AheadOfTimeWriteBarrierStubList* entry = kAheadOfTime; |
| 7068 !entry->object.is(no_reg); | 7065 !entry->object.is(no_reg); |
| 7069 entry++) { | 7066 entry++) { |
| 7070 if (object_.is(entry->object) && | 7067 if (object_.is(entry->object) && |
| 7071 value_.is(entry->value) && | 7068 value_.is(entry->value) && |
| 7072 address_.is(entry->address) && | 7069 address_.is(entry->address) && |
| 7073 remembered_set_action_ == entry->action && | 7070 remembered_set_action_ == entry->action && |
| 7074 save_fp_regs_mode_ == kDontSaveFPRegs) { | 7071 save_fp_regs_mode_ == kDontSaveFPRegs) { |
| 7075 return true; | 7072 return true; |
| 7076 } | 7073 } |
| 7077 } | 7074 } |
| 7078 return false; | 7075 return false; |
| 7079 } | 7076 } |
| 7080 | 7077 |
| 7081 | 7078 |
| 7082 void StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime() { | 7079 void StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime() { |
| 7083 StoreBufferOverflowStub stub1(kDontSaveFPRegs); | 7080 StoreBufferOverflowStub stub1(kDontSaveFPRegs); |
| 7084 stub1.GetCode()->set_is_pregenerated(true); | 7081 stub1.GetCode()->set_is_pregenerated(true); |
| 7085 | 7082 |
| 7086 CpuFeatures::TryForceFeatureScope scope(SSE2); | 7083 CpuFeatures::TryForceFeatureScope scope(SSE2); |
| 7087 if (CpuFeatures::IsSupported(SSE2)) { | 7084 if (CpuFeatures::IsSupported(SSE2)) { |
| 7088 StoreBufferOverflowStub stub2(kSaveFPRegs); | 7085 StoreBufferOverflowStub stub2(kSaveFPRegs); |
| 7089 stub2.GetCode()->set_is_pregenerated(true); | 7086 stub2.GetCode()->set_is_pregenerated(true); |
| 7090 } | 7087 } |
| 7091 } | 7088 } |
| 7092 | 7089 |
| 7093 | 7090 |
| 7094 void RecordWriteStub::GenerateFixedRegStubsAheadOfTime() { | 7091 void RecordWriteStub::GenerateFixedRegStubsAheadOfTime() { |
| 7095 for (const AheadOfTimeWriteBarrierStubList* entry = kAheadOfTime; | 7092 for (AheadOfTimeWriteBarrierStubList* entry = kAheadOfTime; |
| 7096 !entry->object.is(no_reg); | 7093 !entry->object.is(no_reg); |
| 7097 entry++) { | 7094 entry++) { |
| 7098 RecordWriteStub stub(entry->object, | 7095 RecordWriteStub stub(entry->object, |
| 7099 entry->value, | 7096 entry->value, |
| 7100 entry->address, | 7097 entry->address, |
| 7101 entry->action, | 7098 entry->action, |
| 7102 kDontSaveFPRegs); | 7099 kDontSaveFPRegs); |
| 7103 stub.GetCode()->set_is_pregenerated(true); | 7100 stub.GetCode()->set_is_pregenerated(true); |
| 7104 } | 7101 } |
| 7105 } | 7102 } |
| (...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7379 false); | 7376 false); |
| 7380 __ pop(edx); | 7377 __ pop(edx); |
| 7381 __ ret(0); | 7378 __ ret(0); |
| 7382 } | 7379 } |
| 7383 | 7380 |
| 7384 #undef __ | 7381 #undef __ |
| 7385 | 7382 |
| 7386 } } // namespace v8::internal | 7383 } } // namespace v8::internal |
| 7387 | 7384 |
| 7388 #endif // V8_TARGET_ARCH_IA32 | 7385 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |