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 1277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1288 const Register scratch = r1; | 1288 const Register scratch = r1; |
1289 | 1289 |
1290 if (save_doubles_ == kSaveFPRegs) { | 1290 if (save_doubles_ == kSaveFPRegs) { |
1291 __ SaveFPRegs(sp, scratch); | 1291 __ SaveFPRegs(sp, scratch); |
1292 } | 1292 } |
1293 const int argument_count = 1; | 1293 const int argument_count = 1; |
1294 const int fp_argument_count = 0; | 1294 const int fp_argument_count = 0; |
1295 | 1295 |
1296 AllowExternalCallThatCantCauseGC scope(masm); | 1296 AllowExternalCallThatCantCauseGC scope(masm); |
1297 __ PrepareCallCFunction(argument_count, fp_argument_count, scratch); | 1297 __ PrepareCallCFunction(argument_count, fp_argument_count, scratch); |
1298 __ mov(r0, Operand(ExternalReference::isolate_address())); | 1298 __ mov(r0, Operand(ExternalReference::isolate_address(masm->isolate()))); |
1299 __ CallCFunction( | 1299 __ CallCFunction( |
1300 ExternalReference::store_buffer_overflow_function(masm->isolate()), | 1300 ExternalReference::store_buffer_overflow_function(masm->isolate()), |
1301 argument_count); | 1301 argument_count); |
1302 if (save_doubles_ == kSaveFPRegs) { | 1302 if (save_doubles_ == kSaveFPRegs) { |
1303 __ RestoreFPRegs(sp, scratch); | 1303 __ RestoreFPRegs(sp, scratch); |
1304 } | 1304 } |
1305 __ ldm(ia_w, sp, kCallerSaved | pc.bit()); // Also pop pc to get Ret(0). | 1305 __ ldm(ia_w, sp, kCallerSaved | pc.bit()); // Also pop pc to get Ret(0). |
1306 } | 1306 } |
1307 | 1307 |
1308 | 1308 |
(...skipping 1786 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3095 ASSERT(IsPowerOf2(frame_alignment)); | 3095 ASSERT(IsPowerOf2(frame_alignment)); |
3096 __ tst(sp, Operand(frame_alignment_mask)); | 3096 __ tst(sp, Operand(frame_alignment_mask)); |
3097 __ b(eq, &alignment_as_expected); | 3097 __ b(eq, &alignment_as_expected); |
3098 // Don't use Check here, as it will call Runtime_Abort re-entering here. | 3098 // Don't use Check here, as it will call Runtime_Abort re-entering here. |
3099 __ stop("Unexpected alignment"); | 3099 __ stop("Unexpected alignment"); |
3100 __ bind(&alignment_as_expected); | 3100 __ bind(&alignment_as_expected); |
3101 } | 3101 } |
3102 } | 3102 } |
3103 #endif | 3103 #endif |
3104 | 3104 |
3105 __ mov(r2, Operand(ExternalReference::isolate_address())); | 3105 __ mov(r2, Operand(ExternalReference::isolate_address(isolate))); |
3106 | 3106 |
3107 // To let the GC traverse the return address of the exit frames, we need to | 3107 // To let the GC traverse the return address of the exit frames, we need to |
3108 // know where the return address is. The CEntryStub is unmovable, so | 3108 // know where the return address is. The CEntryStub is unmovable, so |
3109 // we can store the address on the stack to be able to find it again and | 3109 // we can store the address on the stack to be able to find it again and |
3110 // we never have to restore it, because it will not change. | 3110 // we never have to restore it, because it will not change. |
3111 // Compute the return address in lr to return to after the jump below. Pc is | 3111 // Compute the return address in lr to return to after the jump below. Pc is |
3112 // already at '+ 8' from the current instruction but return is after three | 3112 // already at '+ 8' from the current instruction but return is after three |
3113 // instructions so add another 4 to pc to get the return address. | 3113 // instructions so add another 4 to pc to get the return address. |
3114 { | 3114 { |
3115 // Prevent literal pool emission before return address. | 3115 // Prevent literal pool emission before return address. |
(...skipping 1196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4312 | 4312 |
4313 // Isolates: note we add an additional parameter here (isolate pointer). | 4313 // Isolates: note we add an additional parameter here (isolate pointer). |
4314 const int kRegExpExecuteArguments = 9; | 4314 const int kRegExpExecuteArguments = 9; |
4315 const int kParameterRegisters = 4; | 4315 const int kParameterRegisters = 4; |
4316 __ EnterExitFrame(false, kRegExpExecuteArguments - kParameterRegisters); | 4316 __ EnterExitFrame(false, kRegExpExecuteArguments - kParameterRegisters); |
4317 | 4317 |
4318 // Stack pointer now points to cell where return address is to be written. | 4318 // Stack pointer now points to cell where return address is to be written. |
4319 // Arguments are before that on the stack or in registers. | 4319 // Arguments are before that on the stack or in registers. |
4320 | 4320 |
4321 // Argument 9 (sp[20]): Pass current isolate address. | 4321 // Argument 9 (sp[20]): Pass current isolate address. |
4322 __ mov(r0, Operand(ExternalReference::isolate_address())); | 4322 __ mov(r0, Operand(ExternalReference::isolate_address(isolate))); |
4323 __ str(r0, MemOperand(sp, 5 * kPointerSize)); | 4323 __ str(r0, MemOperand(sp, 5 * kPointerSize)); |
4324 | 4324 |
4325 // Argument 8 (sp[16]): Indicate that this is a direct call from JavaScript. | 4325 // Argument 8 (sp[16]): Indicate that this is a direct call from JavaScript. |
4326 __ mov(r0, Operand(1)); | 4326 __ mov(r0, Operand(1)); |
4327 __ str(r0, MemOperand(sp, 4 * kPointerSize)); | 4327 __ str(r0, MemOperand(sp, 4 * kPointerSize)); |
4328 | 4328 |
4329 // Argument 7 (sp[12]): Start (high end) of backtracking stack memory area. | 4329 // Argument 7 (sp[12]): Start (high end) of backtracking stack memory area. |
4330 __ mov(r0, Operand(address_of_regexp_stack_memory_address)); | 4330 __ mov(r0, Operand(address_of_regexp_stack_memory_address)); |
4331 __ ldr(r0, MemOperand(r0, 0)); | 4331 __ ldr(r0, MemOperand(r0, 0)); |
4332 __ mov(r2, Operand(address_of_regexp_stack_memory_size)); | 4332 __ mov(r2, Operand(address_of_regexp_stack_memory_size)); |
(...skipping 2576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6909 regs_.SaveCallerSaveRegisters(masm, save_fp_regs_mode_); | 6909 regs_.SaveCallerSaveRegisters(masm, save_fp_regs_mode_); |
6910 int argument_count = 3; | 6910 int argument_count = 3; |
6911 __ PrepareCallCFunction(argument_count, regs_.scratch0()); | 6911 __ PrepareCallCFunction(argument_count, regs_.scratch0()); |
6912 Register address = | 6912 Register address = |
6913 r0.is(regs_.address()) ? regs_.scratch0() : regs_.address(); | 6913 r0.is(regs_.address()) ? regs_.scratch0() : regs_.address(); |
6914 ASSERT(!address.is(regs_.object())); | 6914 ASSERT(!address.is(regs_.object())); |
6915 ASSERT(!address.is(r0)); | 6915 ASSERT(!address.is(r0)); |
6916 __ Move(address, regs_.address()); | 6916 __ Move(address, regs_.address()); |
6917 __ Move(r0, regs_.object()); | 6917 __ Move(r0, regs_.object()); |
6918 __ Move(r1, address); | 6918 __ Move(r1, address); |
6919 __ mov(r2, Operand(ExternalReference::isolate_address())); | 6919 __ mov(r2, Operand(ExternalReference::isolate_address(masm->isolate()))); |
6920 | 6920 |
6921 AllowExternalCallThatCantCauseGC scope(masm); | 6921 AllowExternalCallThatCantCauseGC scope(masm); |
6922 if (mode == INCREMENTAL_COMPACTION) { | 6922 if (mode == INCREMENTAL_COMPACTION) { |
6923 __ CallCFunction( | 6923 __ CallCFunction( |
6924 ExternalReference::incremental_evacuation_record_write_function( | 6924 ExternalReference::incremental_evacuation_record_write_function( |
6925 masm->isolate()), | 6925 masm->isolate()), |
6926 argument_count); | 6926 argument_count); |
6927 } else { | 6927 } else { |
6928 ASSERT(mode == INCREMENTAL); | 6928 ASSERT(mode == INCREMENTAL); |
6929 __ CallCFunction( | 6929 __ CallCFunction( |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7151 | 7151 |
7152 __ Pop(lr, r5, r1); | 7152 __ Pop(lr, r5, r1); |
7153 __ Ret(); | 7153 __ Ret(); |
7154 } | 7154 } |
7155 | 7155 |
7156 #undef __ | 7156 #undef __ |
7157 | 7157 |
7158 } } // namespace v8::internal | 7158 } } // namespace v8::internal |
7159 | 7159 |
7160 #endif // V8_TARGET_ARCH_ARM | 7160 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |