Index: test/cctest/test-assembler-x64.cc |
=================================================================== |
--- test/cctest/test-assembler-x64.cc (revision 2068) |
+++ test/cctest/test-assembler-x64.cc (working copy) |
@@ -39,6 +39,7 @@ |
using v8::internal::OS; |
using v8::internal::Assembler; |
using v8::internal::Operand; |
+using v8::internal::Immediate; |
using v8::internal::Label; |
using v8::internal::rax; |
using v8::internal::rsi; |
@@ -47,6 +48,9 @@ |
using v8::internal::rsp; |
using v8::internal::FUNCTION_CAST; |
using v8::internal::CodeDesc; |
+using v8::internal::less_equal; |
+using v8::internal::not_equal; |
+using v8::internal::greater; |
// Test the x64 assembler by compiling some simple functions into |
@@ -75,7 +79,7 @@ |
Assembler assm(buffer, actual_size); |
// Assemble a simple function that copies argument 2 and returns it. |
- __ mov(rax, rsi); |
+ __ movq(rax, rsi); |
__ nop(); |
__ ret(0); |
@@ -99,7 +103,7 @@ |
// We compile without stack frame pointers, so the gdb debugger shows |
// incorrect stack frames when debugging this function (which has them). |
__ push(rbp); |
- __ mov(rbp, rsp); |
+ __ movq(rbp, rsp); |
__ push(rsi); // Value at (rbp - 8) |
__ push(rsi); // Value at (rbp - 16) |
__ push(rdi); // Value at (rbp - 24) |
@@ -127,7 +131,7 @@ |
Assembler assm(buffer, actual_size); |
// Assemble a simple function that copies argument 2 and returns it. |
- __ mov(rax, rsi); |
+ __ movq(rax, rsi); |
__ add(rax, rdi); |
__ ret(0); |
@@ -149,12 +153,12 @@ |
// Assemble a simple function that copies argument 2 and returns it. |
__ push(rbp); |
- __ mov(rbp, rsp); |
+ __ movq(rbp, rsp); |
__ push(rsi); // Value at (rbp - 8) |
__ push(rsi); // Value at (rbp - 16) |
__ push(rdi); // Value at (rbp - 24) |
const int kStackElementSize = 8; |
- __ mov(rax, Operand(rbp, -3 * kStackElementSize)); |
+ __ movq(rax, Operand(rbp, -3 * kStackElementSize)); |
__ pop(rsi); |
__ pop(rsi); |
__ pop(rsi); |
@@ -180,11 +184,11 @@ |
// Assemble a simple function that copies argument 2 and returns it. |
__ push(rbp); |
- __ mov(rbp, rsp); |
- __ mov(rax, rdi); |
+ __ movq(rbp, rsp); |
+ __ movq(rax, rdi); |
Label target; |
__ jmp(&target); |
- __ mov(rax, rsi); |
+ __ movq(rax, rsi); |
__ bind(&target); |
__ pop(rbp); |
__ ret(0); |
@@ -196,4 +200,52 @@ |
CHECK_EQ(3, result); |
} |
+TEST(AssemblerX64LoopImmediates) { |
+ // Allocate an executable page of memory. |
+ size_t actual_size; |
+ byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, |
+ &actual_size, |
+ true)); |
+ CHECK(buffer); |
+ Assembler assm(buffer, actual_size); |
+ // Assemble two loops using rax as counter, and verify the ending counts. |
+ Label Fail; |
+ __ movq(rax, Immediate(-3)); |
+ Label Loop1_test; |
+ Label Loop1_body; |
+ __ jmp(&Loop1_test); |
+ __ bind(&Loop1_body); |
+ __ add(rax, Immediate(7)); |
+ __ bind(&Loop1_test); |
+ __ cmp(rax, Immediate(20)); |
+ __ j(less_equal, &Loop1_body); |
+ // Did the loop terminate with the expected value? |
+ __ cmp(rax, Immediate(25)); |
+ __ j(not_equal, &Fail); |
+ |
+ Label Loop2_test; |
+ Label Loop2_body; |
+ __ movq(rax, Immediate(0x11FEED00)); |
+ __ jmp(&Loop2_test); |
+ __ bind(&Loop2_body); |
+ __ add(rax, Immediate(-0x1100)); |
+ __ bind(&Loop2_test); |
+ __ cmp(rax, Immediate(0x11FE8000)); |
+ __ j(greater, &Loop2_body); |
+ // Did the loop terminate with the expected value? |
+ __ cmp(rax, Immediate(0x11FE7600)); |
+ __ j(not_equal, &Fail); |
+ |
+ __ movq(rax, Immediate(1)); |
+ __ ret(0); |
+ __ bind(&Fail); |
+ __ movq(rax, Immediate(0)); |
+ __ ret(0); |
+ |
+ CodeDesc desc; |
+ assm.GetCode(&desc); |
+ // Call the function from C++. |
+ int result = FUNCTION_CAST<F0>(buffer)(); |
+ CHECK_EQ(1, result); |
+} |
#undef __ |