Index: test/cctest/test-macro-assembler-mips64.cc |
diff --git a/test/cctest/test-macro-assembler-mips.cc b/test/cctest/test-macro-assembler-mips64.cc |
similarity index 62% |
copy from test/cctest/test-macro-assembler-mips.cc |
copy to test/cctest/test-macro-assembler-mips64.cc |
index 33a4611540f427cb800d1a60ded88c47f0a93391..eef658de67fef55ccada02340cdb5a43b14f20d6 100644 |
--- a/test/cctest/test-macro-assembler-mips.cc |
+++ b/test/cctest/test-macro-assembler-mips64.cc |
@@ -31,13 +31,13 @@ |
#include "test/cctest/cctest.h" |
#include "src/macro-assembler.h" |
-#include "src/mips/macro-assembler-mips.h" |
-#include "src/mips/simulator-mips.h" |
+#include "src/mips64/macro-assembler-mips64.h" |
+#include "src/mips64/simulator-mips64.h" |
using namespace v8::internal; |
-typedef void* (*F)(int x, int y, int p2, int p3, int p4); |
+typedef void* (*F)(int64_t x, int64_t y, int p2, int p3, int p4); |
#define __ masm-> |
@@ -86,11 +86,11 @@ TEST(CopyBytes) { |
// Code to be generated: The stuff in CopyBytes followed by a store of a0 and |
// a1, respectively. |
__ CopyBytes(a0, a1, a2, a3); |
- __ li(a2, Operand(reinterpret_cast<int>(&a0_))); |
- __ li(a3, Operand(reinterpret_cast<int>(&a1_))); |
- __ sw(a0, MemOperand(a2)); |
+ __ li(a2, Operand(reinterpret_cast<int64_t>(&a0_))); |
+ __ li(a3, Operand(reinterpret_cast<int64_t>(&a1_))); |
+ __ sd(a0, MemOperand(a2)); |
__ jr(ra); |
- __ sw(a1, MemOperand(a3)); |
+ __ sd(a1, MemOperand(a3)); |
CodeDesc desc; |
masm->GetCode(&desc); |
@@ -111,8 +111,9 @@ TEST(CopyBytes) { |
for (byte* dest = dest_buffer; dest < dest_buffer + fuzz; dest++) { |
memset(dest_buffer, 0, data_size); |
CHECK(dest + size < dest_buffer + data_size); |
- (void) CALL_GENERATED_CODE(f, reinterpret_cast<int>(src), |
- reinterpret_cast<int>(dest), size, 0, 0); |
+ (void) CALL_GENERATED_CODE(f, reinterpret_cast<int64_t>(src), |
+ reinterpret_cast<int64_t>(dest), |
+ size, 0, 0); |
// a0 and a1 should point at the first byte after the copied data. |
CHECK_EQ(src + size, a0_); |
CHECK_EQ(dest + size, a1_); |
@@ -132,47 +133,85 @@ TEST(CopyBytes) { |
} |
-static void TestNaN(const char *code) { |
- // NaN value is different on MIPS and x86 architectures, and TEST(NaNx) |
- // tests checks the case where a x86 NaN value is serialized into the |
- // snapshot on the simulator during cross compilation. |
- v8::HandleScope scope(CcTest::isolate()); |
- v8::Local<v8::Context> context = CcTest::NewContext(PRINT_EXTENSION); |
- v8::Context::Scope context_scope(context); |
- |
- v8::Local<v8::Script> script = v8::Script::Compile(v8_str(code)); |
- v8::Local<v8::Object> result = v8::Local<v8::Object>::Cast(script->Run()); |
- // Have to populate the handle manually, as it's not Cast-able. |
- i::Handle<i::JSObject> o = |
- v8::Utils::OpenHandle<v8::Object, i::JSObject>(result); |
- i::Handle<i::JSArray> array1(reinterpret_cast<i::JSArray*>(*o)); |
- i::FixedDoubleArray* a = i::FixedDoubleArray::cast(array1->elements()); |
- double value = a->get_scalar(0); |
- CHECK(std::isnan(value) && |
- i::BitCast<uint64_t>(value) == |
- i::BitCast<uint64_t>( |
- i::FixedDoubleArray::canonical_not_the_hole_nan_as_double())); |
-} |
+TEST(LoadConstants) { |
+ CcTest::InitializeVM(); |
+ Isolate* isolate = Isolate::Current(); |
+ HandleScope handles(isolate); |
+ int64_t refConstants[64]; |
+ int64_t result[64]; |
-TEST(NaN0) { |
- TestNaN( |
- "var result;" |
- "for (var i = 0; i < 2; i++) {" |
- " result = new Array(Number.NaN, Number.POSITIVE_INFINITY);" |
- "}" |
- "result;"); |
-} |
+ int64_t mask = 1; |
+ for (int i = 0; i < 64; i++) { |
+ refConstants[i] = ~(mask << i); |
+ } |
+ MacroAssembler assembler(isolate, NULL, 0); |
+ MacroAssembler* masm = &assembler; |
+ |
+ __ mov(a4, a0); |
+ for (int i = 0; i < 64; i++) { |
+ // Load constant. |
+ __ li(a5, Operand(refConstants[i])); |
+ __ sd(a5, MemOperand(a4)); |
+ __ Daddu(a4, a4, Operand(kPointerSize)); |
+ } |
-TEST(NaN1) { |
- TestNaN( |
- "var result;" |
- "for (var i = 0; i < 2; i++) {" |
- " result = [NaN];" |
- "}" |
- "result;"); |
+ __ jr(ra); |
+ __ nop(); |
+ |
+ CodeDesc desc; |
+ masm->GetCode(&desc); |
+ Handle<Code> code = isolate->factory()->NewCode( |
+ desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
+ |
+ ::F f = FUNCTION_CAST< ::F>(code->entry()); |
+ (void) CALL_GENERATED_CODE(f, reinterpret_cast<int64_t>(result), |
+ 0, 0, 0, 0); |
+ // Check results. |
+ for (int i = 0; i < 64; i++) { |
+ CHECK(refConstants[i] == result[i]); |
+ } |
} |
+TEST(LoadAddress) { |
+ CcTest::InitializeVM(); |
+ Isolate* isolate = Isolate::Current(); |
+ HandleScope handles(isolate); |
+ |
+ MacroAssembler assembler(isolate, NULL, 0); |
+ MacroAssembler* masm = &assembler; |
+ Label to_jump, skip; |
+ __ mov(a4, a0); |
+ |
+ __ Branch(&skip); |
+ __ bind(&to_jump); |
+ __ nop(); |
+ __ nop(); |
+ __ jr(ra); |
+ __ nop(); |
+ __ bind(&skip); |
+ __ li(a4, Operand(masm->jump_address(&to_jump)), ADDRESS_LOAD); |
+ int check_size = masm->InstructionsGeneratedSince(&skip); |
+ CHECK_EQ(check_size, 4); |
+ __ jr(a4); |
+ __ nop(); |
+ __ stop("invalid"); |
+ __ stop("invalid"); |
+ __ stop("invalid"); |
+ __ stop("invalid"); |
+ __ stop("invalid"); |
+ |
+ |
+ CodeDesc desc; |
+ masm->GetCode(&desc); |
+ Handle<Code> code = isolate->factory()->NewCode( |
+ desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); |
+ |
+ ::F f = FUNCTION_CAST< ::F>(code->entry()); |
+ (void) CALL_GENERATED_CODE(f, 0, 0, 0, 0, 0); |
+ // Check results. |
+} |
+ |
#undef __ |