Fix native code Irregexp on MacOSX.
authorerik.corry@gmail.com <erik.corry@gmail.com@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Thu, 27 Nov 2008 09:27:30 +0000 (09:27 +0000)
committererik.corry@gmail.com <erik.corry@gmail.com@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Thu, 27 Nov 2008 09:27:30 +0000 (09:27 +0000)
Review URL: http://codereview.chromium.org/10984

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@855 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/regexp-macro-assembler-ia32.cc
src/regexp-macro-assembler-ia32.h
test/cctest/cctest.status

index 516006dfaafc794cacaf4cd76a8f9f4d18617c18..c51515ead1128f689a7f1d2aba5a63c5d7aaecbb 100644 (file)
@@ -356,14 +356,23 @@ Handle<Object> RegExpMacroAssemblerIA32::GetCode() {
 
   // Entry code:
   __ bind(&entry_label_);
+  // Save callee-save registers.  Order here should correspond to order of
+  // kBackup_ebx etc.
   __ push(esi);
   __ push(edi);
+  __ push(ebx);  // Callee-save on MacOS.
   __ enter(Immediate(num_registers_ * kPointerSize));
+  // Load string length.
   __ mov(esi, Operand(ebp, kInputEndOffset));
+  // Load input position.
   __ mov(edi, Operand(ebp, kInputStartOffset));
+  // Set up edi to be negative offset from string end.
   __ sub(edi, Operand(esi));
+  // Set up esi to be end of string.  First get location.
   __ mov(edx, Operand(ebp, kInputBuffer));
+  // Dereference location to get string start.
   __ mov(edx, Operand(edx, 0));
+  // Add start to length to complete esi setup.
   __ add(esi, Operand(edx));
   if (num_saved_registers_ > 0) {
     // Fill saved registers with initial value = start offset - 1
@@ -398,6 +407,7 @@ Handle<Object> RegExpMacroAssemblerIA32::GetCode() {
 
   __ bind(&exit_label_);
   __ leave();
+  __ pop(ebx);
   __ pop(edi);
   __ pop(esi);
   __ ret(0);
index c5e816531fd4768e0f268450c5eae07c8ac3ca41..d6b2adcc0ba36e1af6896df948583265a2d433fa 100644 (file)
@@ -88,12 +88,14 @@ class RegExpMacroAssemblerIA32: public RegExpMacroAssembler {
 
  private:
   // Offsets from ebp of arguments to function.
-  static const int kBackup_edi = 1 * sizeof(uint32_t);
-  static const int kBackup_esi= 2 * sizeof(uint32_t);
-  static const int kInputBuffer = 4 * sizeof(uint32_t);
-  static const int kInputStartOffset = 5 * sizeof(uint32_t);
-  static const int kInputEndOffset = 6 * sizeof(uint32_t);
-  static const int kRegisterOutput = 7 * sizeof(uint32_t);
+  static const int kBackup_ebx = sizeof(uint32_t);
+  static const int kBackup_edi = kBackup_ebx + sizeof(uint32_t);
+  static const int kBackup_esi = kBackup_edi + sizeof(uint32_t);
+  static const int kReturn_eip = kBackup_esi + sizeof(uint32_t);
+  static const int kInputBuffer = kReturn_eip + sizeof(uint32_t);
+  static const int kInputStartOffset = kInputBuffer + sizeof(uint32_t);
+  static const int kInputEndOffset = kInputStartOffset + sizeof(uint32_t);
+  static const int kRegisterOutput = kInputEndOffset + sizeof(uint32_t);
 
   // Initial size of code buffer.
   static const size_t kRegExpCodeSize = 1024;
index 08ada6b17fb671ce7b7c2dfa55fd360be02572c8..9a528d3247eb1c41c9ee5e88bd86a13a8db330af 100644 (file)
@@ -38,9 +38,3 @@ test-serialize: SKIP
 # BUG(113): Test seems flaky on ARM.
 test-spaces/LargeObjectSpace: PASS || FAIL
 
-[ $system == macos ]
-
-# TODO(lrn): Please fix this asap.
-test-regexp/MacroAssemblerIA32Simple: PASS || CRASH
-test-regexp/MacroAssemblerIA32Registers: PASS || CRASH
-