diff options
Diffstat (limited to 'deps/v8/test/cctest/test-assembler-x64.cc')
-rw-r--r-- | deps/v8/test/cctest/test-assembler-x64.cc | 95 |
1 files changed, 88 insertions, 7 deletions
diff --git a/deps/v8/test/cctest/test-assembler-x64.cc b/deps/v8/test/cctest/test-assembler-x64.cc index 28f7c9b703..d81923fa5c 100644 --- a/deps/v8/test/cctest/test-assembler-x64.cc +++ b/deps/v8/test/cctest/test-assembler-x64.cc @@ -36,6 +36,7 @@ #include "cctest.h" using v8::internal::Assembler; +using v8::internal::Code; using v8::internal::CodeDesc; using v8::internal::FUNCTION_CAST; using v8::internal::Immediate; @@ -53,6 +54,7 @@ using v8::internal::r15; using v8::internal::r8; using v8::internal::r9; using v8::internal::rax; +using v8::internal::rbx; using v8::internal::rbp; using v8::internal::rcx; using v8::internal::rdi; @@ -86,8 +88,18 @@ static const v8::internal::Register arg2 = rsi; #define __ assm. +static v8::Persistent<v8::Context> env; + + +static void InitializeVM() { + if (env.IsEmpty()) { + env = v8::Context::New(); + } +} + + TEST(AssemblerX64ReturnOperation) { - OS::Setup(); + OS::SetUp(); // Allocate an executable page of memory. size_t actual_size; byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, @@ -109,7 +121,7 @@ TEST(AssemblerX64ReturnOperation) { } TEST(AssemblerX64StackOperations) { - OS::Setup(); + OS::SetUp(); // Allocate an executable page of memory. size_t actual_size; byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, @@ -141,7 +153,7 @@ TEST(AssemblerX64StackOperations) { } TEST(AssemblerX64ArithmeticOperations) { - OS::Setup(); + OS::SetUp(); // Allocate an executable page of memory. size_t actual_size; byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, @@ -163,7 +175,7 @@ TEST(AssemblerX64ArithmeticOperations) { } TEST(AssemblerX64ImulOperation) { - OS::Setup(); + OS::SetUp(); // Allocate an executable page of memory. size_t actual_size; byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, @@ -191,7 +203,7 @@ TEST(AssemblerX64ImulOperation) { } TEST(AssemblerX64MemoryOperands) { - OS::Setup(); + OS::SetUp(); // Allocate an executable page of memory. size_t actual_size; byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, @@ -225,7 +237,7 @@ TEST(AssemblerX64MemoryOperands) { } TEST(AssemblerX64ControlFlow) { - OS::Setup(); + OS::SetUp(); // Allocate an executable page of memory. size_t actual_size; byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, @@ -254,7 +266,7 @@ TEST(AssemblerX64ControlFlow) { } TEST(AssemblerX64LoopImmediates) { - OS::Setup(); + OS::SetUp(); // Allocate an executable page of memory. size_t actual_size; byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, @@ -359,4 +371,73 @@ TEST(AssemblerX64LabelChaining) { __ nop(); } + +TEST(AssemblerMultiByteNop) { + InitializeVM(); + v8::HandleScope scope; + v8::internal::byte buffer[1024]; + Assembler assm(Isolate::Current(), buffer, sizeof(buffer)); + __ push(rbx); + __ push(rcx); + __ push(rdx); + __ push(rdi); + __ push(rsi); + __ movq(rax, Immediate(1)); + __ movq(rbx, Immediate(2)); + __ movq(rcx, Immediate(3)); + __ movq(rdx, Immediate(4)); + __ movq(rdi, Immediate(5)); + __ movq(rsi, Immediate(6)); + for (int i = 0; i < 16; i++) { + int before = assm.pc_offset(); + __ Nop(i); + CHECK_EQ(assm.pc_offset() - before, i); + } + + Label fail; + __ cmpq(rax, Immediate(1)); + __ j(not_equal, &fail); + __ cmpq(rbx, Immediate(2)); + __ j(not_equal, &fail); + __ cmpq(rcx, Immediate(3)); + __ j(not_equal, &fail); + __ cmpq(rdx, Immediate(4)); + __ j(not_equal, &fail); + __ cmpq(rdi, Immediate(5)); + __ j(not_equal, &fail); + __ cmpq(rsi, Immediate(6)); + __ j(not_equal, &fail); + __ movq(rax, Immediate(42)); + __ pop(rsi); + __ pop(rdi); + __ pop(rdx); + __ pop(rcx); + __ pop(rbx); + __ ret(0); + __ bind(&fail); + __ movq(rax, Immediate(13)); + __ pop(rsi); + __ pop(rdi); + __ pop(rdx); + __ pop(rcx); + __ pop(rbx); + __ ret(0); + + CodeDesc desc; + assm.GetCode(&desc); + Code* code = Code::cast(HEAP->CreateCode( + desc, + Code::ComputeFlags(Code::STUB), + v8::internal::Handle<v8::internal::Object>( + HEAP->undefined_value()))->ToObjectChecked()); + CHECK(code->IsCode()); + + F0 f = FUNCTION_CAST<F0>(code->entry()); + int res = f(); + CHECK_EQ(42, res); +} + + + + #undef __ |