Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(399)

Unified Diff: test/cctest/test-assembler-x64.cc

Issue 115816: Add immediate operands and arithmetic operations to the x64 assembler. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/x64/assembler-x64-inl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 __
« no previous file with comments | « src/x64/assembler-x64-inl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698