Commit 292323b3 authored by lrn@chromium.org's avatar lrn@chromium.org

X64: Fix bugs affecting Win64.

Increase stack space on Win64 sample and cctest executables.

Review URL: http://codereview.chromium.org/264047


git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3056 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent ac731896
...@@ -10,6 +10,10 @@ ...@@ -10,6 +10,10 @@
*.suo *.suo
*.user *.user
*.xcodeproj *.xcodeproj
*.idb
*.pdb
#*#
*~
d8 d8
d8_g d8_g
shell shell
......
...@@ -373,7 +373,8 @@ CCTEST_EXTRA_FLAGS = { ...@@ -373,7 +373,8 @@ CCTEST_EXTRA_FLAGS = {
'CPPDEFINES': ['V8_TARGET_ARCH_IA32'] 'CPPDEFINES': ['V8_TARGET_ARCH_IA32']
}, },
'arch:x64': { 'arch:x64': {
'CPPDEFINES': ['V8_TARGET_ARCH_X64'] 'CPPDEFINES': ['V8_TARGET_ARCH_X64'],
'LINKFLAGS': ['/STACK:2091752']
}, },
} }
} }
...@@ -474,7 +475,7 @@ SAMPLE_FLAGS = { ...@@ -474,7 +475,7 @@ SAMPLE_FLAGS = {
}, },
'arch:x64': { 'arch:x64': {
'CPPDEFINES': ['V8_TARGET_ARCH_X64'], 'CPPDEFINES': ['V8_TARGET_ARCH_X64'],
'LINKFLAGS': ['/MACHINE:X64'] 'LINKFLAGS': ['/MACHINE:X64', '/STACK:2091752']
}, },
'mode:debug': { 'mode:debug': {
'CCFLAGS': ['/Od'], 'CCFLAGS': ['/Od'],
......
...@@ -386,7 +386,8 @@ void StackGuard::ThreadLocal::Initialize() { ...@@ -386,7 +386,8 @@ void StackGuard::ThreadLocal::Initialize() {
if (initial_climit_ == kIllegalLimit) { if (initial_climit_ == kIllegalLimit) {
// Takes the address of the limit variable in order to find out where // Takes the address of the limit variable in order to find out where
// the top of stack is right now. // the top of stack is right now.
intptr_t limit = reinterpret_cast<intptr_t>(&limit) - kLimitSize; uintptr_t limit = reinterpret_cast<uintptr_t>(&limit) - kLimitSize;
ASSERT(reinterpret_cast<uintptr_t>(&limit) > kLimitSize);
initial_jslimit_ = SimulatorStack::JsLimitFromCLimit(limit); initial_jslimit_ = SimulatorStack::JsLimitFromCLimit(limit);
jslimit_ = SimulatorStack::JsLimitFromCLimit(limit); jslimit_ = SimulatorStack::JsLimitFromCLimit(limit);
initial_climit_ = limit; initial_climit_ = limit;
......
...@@ -216,6 +216,7 @@ class StackGuard : public AllStatic { ...@@ -216,6 +216,7 @@ class StackGuard : public AllStatic {
static void DisableInterrupts(); static void DisableInterrupts();
static const uintptr_t kLimitSize = kPointerSize * 128 * KB; static const uintptr_t kLimitSize = kPointerSize * 128 * KB;
#ifdef V8_TARGET_ARCH_X64 #ifdef V8_TARGET_ARCH_X64
static const uintptr_t kInterruptLimit = V8_UINT64_C(0xfffffffffffffffe); static const uintptr_t kInterruptLimit = V8_UINT64_C(0xfffffffffffffffe);
static const uintptr_t kIllegalLimit = V8_UINT64_C(0xfffffffffffffff8); static const uintptr_t kIllegalLimit = V8_UINT64_C(0xfffffffffffffff8);
......
...@@ -1794,7 +1794,6 @@ class Sampler::PlatformData : public Malloced { ...@@ -1794,7 +1794,6 @@ class Sampler::PlatformData : public Malloced {
context.ContextFlags = CONTEXT_FULL; context.ContextFlags = CONTEXT_FULL;
if (GetThreadContext(profiled_thread_, &context) != 0) { if (GetThreadContext(profiled_thread_, &context) != 0) {
#if V8_HOST_ARCH_X64 #if V8_HOST_ARCH_X64
UNIMPLEMENTED();
sample.pc = context.Rip; sample.pc = context.Rip;
sample.sp = context.Rsp; sample.sp = context.Rsp;
sample.fp = context.Rbp; sample.fp = context.Rbp;
......
...@@ -728,7 +728,10 @@ THREADED_TEST(BigInteger) { ...@@ -728,7 +728,10 @@ THREADED_TEST(BigInteger) {
LocalContext env; LocalContext env;
// We cannot add one to a Smi::kMaxValue without wrapping. // We cannot add one to a Smi::kMaxValue without wrapping.
if (i::kSmiValueSize < 32) { if (i::kSmiValueSize < 32) {
int32_t value = i::Smi::kMaxValue + 1; // The casts allow this to compile, even if Smi::kMaxValue is 2^31-1.
// The code will not be run in that case, due to the "if" guard.
int32_t value =
static_cast<int32_t>(static_cast<uint32_t>(i::Smi::kMaxValue) + 1);
CHECK(value > i::Smi::kMaxValue); CHECK(value > i::Smi::kMaxValue);
CHECK(!i::Smi::IsValid(value)); CHECK(!i::Smi::IsValid(value));
Local<v8::Integer> value_obj = v8::Integer::New(value); Local<v8::Integer> value_obj = v8::Integer::New(value);
......
...@@ -44,6 +44,7 @@ using v8::internal::Label; ...@@ -44,6 +44,7 @@ using v8::internal::Label;
using v8::internal::rax; using v8::internal::rax;
using v8::internal::rsi; using v8::internal::rsi;
using v8::internal::rdi; using v8::internal::rdi;
using v8::internal::rcx;
using v8::internal::rdx; using v8::internal::rdx;
using v8::internal::rbp; using v8::internal::rbp;
using v8::internal::rsp; using v8::internal::rsp;
...@@ -53,20 +54,28 @@ using v8::internal::less_equal; ...@@ -53,20 +54,28 @@ using v8::internal::less_equal;
using v8::internal::not_equal; using v8::internal::not_equal;
using v8::internal::greater; using v8::internal::greater;
// Test the x64 assembler by compiling some simple functions into // Test the x64 assembler by compiling some simple functions into
// a buffer and executing them. These tests do not initialize the // a buffer and executing them. These tests do not initialize the
// V8 library, create a context, or use any V8 objects. // V8 library, create a context, or use any V8 objects.
// The AMD64 calling convention is used, with the first five arguments // The AMD64 calling convention is used, with the first six arguments
// in RSI, RDI, RDX, RCX, R8, and R9, and floating point arguments in // in RDI, RSI, RDX, RCX, R8, and R9, and floating point arguments in
// the XMM registers. The return value is in RAX. // the XMM registers. The return value is in RAX.
// This calling convention is used on Linux, with GCC, and on Mac OS, // This calling convention is used on Linux, with GCC, and on Mac OS,
// with GCC. A different convention is used on 64-bit windows. // with GCC. A different convention is used on 64-bit windows,
// where the first four integer arguments are passed in RCX, RDX, R8 and R9.
typedef int (*F0)(); typedef int (*F0)();
typedef int (*F1)(int64_t x); typedef int (*F1)(int64_t x);
typedef int (*F2)(int64_t x, int64_t y); typedef int (*F2)(int64_t x, int64_t y);
#ifdef _WIN64
static const v8::internal::Register arg1 = rcx;
static const v8::internal::Register arg2 = rdx;
#else
static const v8::internal::Register arg1 = rdi;
static const v8::internal::Register arg2 = rsi;
#endif
#define __ assm. #define __ assm.
...@@ -80,7 +89,7 @@ TEST(AssemblerX64ReturnOperation) { ...@@ -80,7 +89,7 @@ TEST(AssemblerX64ReturnOperation) {
Assembler assm(buffer, actual_size); Assembler assm(buffer, actual_size);
// Assemble a simple function that copies argument 2 and returns it. // Assemble a simple function that copies argument 2 and returns it.
__ movq(rax, rsi); __ movq(rax, arg2);
__ nop(); __ nop();
__ ret(0); __ ret(0);
...@@ -105,9 +114,9 @@ TEST(AssemblerX64StackOperations) { ...@@ -105,9 +114,9 @@ TEST(AssemblerX64StackOperations) {
// incorrect stack frames when debugging this function (which has them). // incorrect stack frames when debugging this function (which has them).
__ push(rbp); __ push(rbp);
__ movq(rbp, rsp); __ movq(rbp, rsp);
__ push(rsi); // Value at (rbp - 8) __ push(arg2); // Value at (rbp - 8)
__ push(rsi); // Value at (rbp - 16) __ push(arg2); // Value at (rbp - 16)
__ push(rdi); // Value at (rbp - 24) __ push(arg1); // Value at (rbp - 24)
__ pop(rax); __ pop(rax);
__ pop(rax); __ pop(rax);
__ pop(rax); __ pop(rax);
...@@ -132,8 +141,8 @@ TEST(AssemblerX64ArithmeticOperations) { ...@@ -132,8 +141,8 @@ TEST(AssemblerX64ArithmeticOperations) {
Assembler assm(buffer, actual_size); Assembler assm(buffer, actual_size);
// Assemble a simple function that adds arguments returning the sum. // Assemble a simple function that adds arguments returning the sum.
__ movq(rax, rsi); __ movq(rax, arg2);
__ addq(rax, rdi); __ addq(rax, arg1);
__ ret(0); __ ret(0);
CodeDesc desc; CodeDesc desc;
...@@ -154,8 +163,8 @@ TEST(AssemblerX64ImulOperation) { ...@@ -154,8 +163,8 @@ TEST(AssemblerX64ImulOperation) {
// Assemble a simple function that multiplies arguments returning the high // Assemble a simple function that multiplies arguments returning the high
// word. // word.
__ movq(rax, rsi); __ movq(rax, arg2);
__ imul(rdi); __ imul(arg1);
__ movq(rax, rdx); __ movq(rax, rdx);
__ ret(0); __ ret(0);
...@@ -182,14 +191,16 @@ TEST(AssemblerX64MemoryOperands) { ...@@ -182,14 +191,16 @@ TEST(AssemblerX64MemoryOperands) {
// Assemble a simple function that copies argument 2 and returns it. // Assemble a simple function that copies argument 2 and returns it.
__ push(rbp); __ push(rbp);
__ movq(rbp, rsp); __ movq(rbp, rsp);
__ push(rsi); // Value at (rbp - 8)
__ push(rsi); // Value at (rbp - 16) __ push(arg2); // Value at (rbp - 8)
__ push(rdi); // Value at (rbp - 24) __ push(arg2); // Value at (rbp - 16)
__ push(arg1); // Value at (rbp - 24)
const int kStackElementSize = 8; const int kStackElementSize = 8;
__ movq(rax, Operand(rbp, -3 * kStackElementSize)); __ movq(rax, Operand(rbp, -3 * kStackElementSize));
__ pop(rsi); __ pop(arg2);
__ pop(rsi); __ pop(arg2);
__ pop(rsi); __ pop(arg2);
__ pop(rbp); __ pop(rbp);
__ nop(); __ nop();
__ ret(0); __ ret(0);
...@@ -210,13 +221,14 @@ TEST(AssemblerX64ControlFlow) { ...@@ -210,13 +221,14 @@ TEST(AssemblerX64ControlFlow) {
CHECK(buffer); CHECK(buffer);
Assembler assm(buffer, actual_size); Assembler assm(buffer, actual_size);
// Assemble a simple function that copies argument 2 and returns it. // Assemble a simple function that copies argument 1 and returns it.
__ push(rbp); __ push(rbp);
__ movq(rbp, rsp); __ movq(rbp, rsp);
__ movq(rax, rdi); __ movq(rax, arg1);
Label target; Label target;
__ jmp(&target); __ jmp(&target);
__ movq(rax, rsi); __ movq(rax, arg2);
__ bind(&target); __ bind(&target);
__ pop(rbp); __ pop(rbp);
__ ret(0); __ ret(0);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment