Lines 710-720
Link Here
|
710 |
__ mov(r3, Operand(stack_limit)); |
710 |
__ mov(r3, Operand(stack_limit)); |
711 |
__ LoadP(r3, MemOperand(r3)); |
711 |
__ LoadP(r3, MemOperand(r3)); |
712 |
__ sub(r3, sp, r3, LeaveOE, SetRC); |
712 |
__ sub(r3, sp, r3, LeaveOE, SetRC); |
|
|
713 |
Operand extra_space_for_variables(num_registers_ * kSystemPointerSize); |
714 |
|
713 |
// Handle it if the stack pointer is already below the stack limit. |
715 |
// Handle it if the stack pointer is already below the stack limit. |
714 |
__ ble(&stack_limit_hit, cr0); |
716 |
__ ble(&stack_limit_hit, cr0); |
715 |
// Check if there is room for the variable number of registers above |
717 |
// Check if there is room for the variable number of registers above |
716 |
// the stack limit. |
718 |
// the stack limit. |
717 |
__ Cmpli(r3, Operand(num_registers_ * kSystemPointerSize), r0); |
719 |
__ Cmpli(r3, extra_space_for_variables, r0); |
718 |
__ bge(&stack_ok); |
720 |
__ bge(&stack_ok); |
719 |
// Exit with OutOfMemory exception. There is not enough space on the stack |
721 |
// Exit with OutOfMemory exception. There is not enough space on the stack |
720 |
// for our working registers. |
722 |
// for our working registers. |
Lines 722-728
Link Here
|
722 |
__ b(&return_r3); |
724 |
__ b(&return_r3); |
723 |
|
725 |
|
724 |
__ bind(&stack_limit_hit); |
726 |
__ bind(&stack_limit_hit); |
725 |
CallCheckStackGuardState(r3); |
727 |
CallCheckStackGuardState(r3, extra_space_for_variables); |
726 |
__ cmpi(r3, Operand::Zero()); |
728 |
__ cmpi(r3, Operand::Zero()); |
727 |
// If returned value is non-zero, we exit with the returned value as result. |
729 |
// If returned value is non-zero, we exit with the returned value as result. |
728 |
__ bne(&return_r3); |
730 |
__ bne(&return_r3); |
Lines 1097-1103
Link Here
|
1097 |
|
1099 |
|
1098 |
// Private methods: |
1100 |
// Private methods: |
1099 |
|
1101 |
|
1100 |
void RegExpMacroAssemblerPPC::CallCheckStackGuardState(Register scratch) { |
1102 |
void RegExpMacroAssemblerPPC::CallCheckStackGuardState(Register scratch, |
|
|
1103 |
Operand extra_space) { |
1101 |
DCHECK(!isolate()->IsGeneratingEmbeddedBuiltins()); |
1104 |
DCHECK(!isolate()->IsGeneratingEmbeddedBuiltins()); |
1102 |
DCHECK(!masm_->options().isolate_independent_code); |
1105 |
DCHECK(!masm_->options().isolate_independent_code); |
1103 |
|
1106 |
|
Lines 1128-1137
Link Here
|
1128 |
__ li(r0, Operand::Zero()); |
1131 |
__ li(r0, Operand::Zero()); |
1129 |
__ StorePU(r0, MemOperand(sp, -stack_space * kSystemPointerSize)); |
1132 |
__ StorePU(r0, MemOperand(sp, -stack_space * kSystemPointerSize)); |
1130 |
|
1133 |
|
|
|
1134 |
// Extra space for variables to consider in stack check. |
1135 |
__ mov(arg_reg_4, extra_space); |
1131 |
// RegExp code frame pointer. |
1136 |
// RegExp code frame pointer. |
1132 |
__ mr(r5, frame_pointer()); |
1137 |
__ mr(arg_reg_3, frame_pointer()); |
1133 |
// Code of self. |
1138 |
// Code of self. |
1134 |
__ mov(r4, Operand(masm_->CodeObject())); |
1139 |
__ mov(arg_reg_2, Operand(masm_->CodeObject())); |
1135 |
// r3 will point to the return address, placed by DirectCEntry. |
1140 |
// r3 will point to the return address, placed by DirectCEntry. |
1136 |
__ addi(r3, sp, Operand(kStackFrameExtraParamSlot * kSystemPointerSize)); |
1141 |
__ addi(r3, sp, Operand(kStackFrameExtraParamSlot * kSystemPointerSize)); |
1137 |
|
1142 |
|
Lines 1156-1162
Link Here
|
1156 |
__ mov(code_pointer(), Operand(masm_->CodeObject())); |
1161 |
__ mov(code_pointer(), Operand(masm_->CodeObject())); |
1157 |
} |
1162 |
} |
1158 |
|
1163 |
|
1159 |
|
|
|
1160 |
// Helper function for reading a value out of a stack frame. |
1164 |
// Helper function for reading a value out of a stack frame. |
1161 |
template <typename T> |
1165 |
template <typename T> |
1162 |
static T& frame_entry(Address re_frame, int frame_offset) { |
1166 |
static T& frame_entry(Address re_frame, int frame_offset) { |
Lines 1171-1177
Link Here
|
1171 |
|
1175 |
|
1172 |
int RegExpMacroAssemblerPPC::CheckStackGuardState(Address* return_address, |
1176 |
int RegExpMacroAssemblerPPC::CheckStackGuardState(Address* return_address, |
1173 |
Address raw_code, |
1177 |
Address raw_code, |
1174 |
Address re_frame) { |
1178 |
Address re_frame, |
|
|
1179 |
uintptr_t extra_space) { |
1175 |
Code re_code = Code::cast(Object(raw_code)); |
1180 |
Code re_code = Code::cast(Object(raw_code)); |
1176 |
return NativeRegExpMacroAssembler::CheckStackGuardState( |
1181 |
return NativeRegExpMacroAssembler::CheckStackGuardState( |
1177 |
frame_entry<Isolate*>(re_frame, kIsolate), |
1182 |
frame_entry<Isolate*>(re_frame, kIsolate), |
Lines 1181-1190
Link Here
|
1181 |
return_address, re_code, |
1186 |
return_address, re_code, |
1182 |
frame_entry_address<Address>(re_frame, kInputString), |
1187 |
frame_entry_address<Address>(re_frame, kInputString), |
1183 |
frame_entry_address<const byte*>(re_frame, kInputStart), |
1188 |
frame_entry_address<const byte*>(re_frame, kInputStart), |
1184 |
frame_entry_address<const byte*>(re_frame, kInputEnd)); |
1189 |
frame_entry_address<const byte*>(re_frame, kInputEnd), |
|
|
1190 |
extra_space); |
1185 |
} |
1191 |
} |
1186 |
|
1192 |
|
1187 |
|
|
|
1188 |
MemOperand RegExpMacroAssemblerPPC::register_location(int register_index) { |
1193 |
MemOperand RegExpMacroAssemblerPPC::register_location(int register_index) { |
1189 |
DCHECK(register_index < (1 << 30)); |
1194 |
DCHECK(register_index < (1 << 30)); |
1190 |
if (num_registers_ <= register_index) { |
1195 |
if (num_registers_ <= register_index) { |