From ef59fde8de4f75214862f0da6d02b1d819358cb8 Mon Sep 17 00:00:00 2001 From: "erik.corry@gmail.com" Date: Thu, 27 Nov 2008 09:27:30 +0000 Subject: [PATCH] Fix native code Irregexp on MacOSX. 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 | 10 ++++++++++ src/regexp-macro-assembler-ia32.h | 14 ++++++++------ test/cctest/cctest.status | 6 ------ 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/regexp-macro-assembler-ia32.cc b/src/regexp-macro-assembler-ia32.cc index 516006d..c51515e 100644 --- a/src/regexp-macro-assembler-ia32.cc +++ b/src/regexp-macro-assembler-ia32.cc @@ -356,14 +356,23 @@ Handle 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 RegExpMacroAssemblerIA32::GetCode() { __ bind(&exit_label_); __ leave(); + __ pop(ebx); __ pop(edi); __ pop(esi); __ ret(0); diff --git a/src/regexp-macro-assembler-ia32.h b/src/regexp-macro-assembler-ia32.h index c5e8165..d6b2adc 100644 --- a/src/regexp-macro-assembler-ia32.h +++ b/src/regexp-macro-assembler-ia32.h @@ -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; diff --git a/test/cctest/cctest.status b/test/cctest/cctest.status index 08ada6b..9a528d3 100644 --- a/test/cctest/cctest.status +++ b/test/cctest/cctest.status @@ -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 - -- 2.7.4