OLD | NEW |
1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 17 matching lines...) Expand all Loading... |
28 #include <stdlib.h> | 28 #include <stdlib.h> |
29 | 29 |
30 #include "v8.h" | 30 #include "v8.h" |
31 | 31 |
32 #include "macro-assembler.h" | 32 #include "macro-assembler.h" |
33 #include "factory.h" | 33 #include "factory.h" |
34 #include "platform.h" | 34 #include "platform.h" |
35 #include "serialize.h" | 35 #include "serialize.h" |
36 #include "cctest.h" | 36 #include "cctest.h" |
37 | 37 |
38 using v8::internal::Assembler; | 38 namespace i = v8::internal; |
39 using v8::internal::CodeDesc; | 39 using i::Assembler; |
40 using v8::internal::Condition; | 40 using i::CodeDesc; |
41 using v8::internal::FUNCTION_CAST; | 41 using i::Condition; |
42 using v8::internal::HandleScope; | 42 using i::FUNCTION_CAST; |
43 using v8::internal::Immediate; | 43 using i::HandleScope; |
44 using v8::internal::Isolate; | 44 using i::Immediate; |
45 using v8::internal::Label; | 45 using i::Isolate; |
46 using v8::internal::MacroAssembler; | 46 using i::Label; |
47 using v8::internal::OS; | 47 using i::MacroAssembler; |
48 using v8::internal::Operand; | 48 using i::OS; |
49 using v8::internal::RelocInfo; | 49 using i::Operand; |
50 using v8::internal::Smi; | 50 using i::RelocInfo; |
51 using v8::internal::SmiIndex; | 51 using i::Smi; |
52 using v8::internal::byte; | 52 using i::SmiIndex; |
53 using v8::internal::carry; | 53 using i::byte; |
54 using v8::internal::greater; | 54 using i::carry; |
55 using v8::internal::greater_equal; | 55 using i::greater; |
56 using v8::internal::kIntSize; | 56 using i::greater_equal; |
57 using v8::internal::kPointerSize; | 57 using i::kIntSize; |
58 using v8::internal::kSmiTagMask; | 58 using i::kPointerSize; |
59 using v8::internal::kSmiValueSize; | 59 using i::kSmiTagMask; |
60 using v8::internal::less_equal; | 60 using i::kSmiValueSize; |
61 using v8::internal::negative; | 61 using i::less_equal; |
62 using v8::internal::not_carry; | 62 using i::negative; |
63 using v8::internal::not_equal; | 63 using i::not_carry; |
64 using v8::internal::not_zero; | 64 using i::not_equal; |
65 using v8::internal::positive; | 65 using i::not_zero; |
66 using v8::internal::r11; | 66 using i::positive; |
67 using v8::internal::r13; | 67 using i::r11; |
68 using v8::internal::r14; | 68 using i::r13; |
69 using v8::internal::r15; | 69 using i::r14; |
70 using v8::internal::r8; | 70 using i::r15; |
71 using v8::internal::r9; | 71 using i::r8; |
72 using v8::internal::rax; | 72 using i::r9; |
73 using v8::internal::rbp; | 73 using i::rax; |
74 using v8::internal::rbx; | 74 using i::rbp; |
75 using v8::internal::rcx; | 75 using i::rbx; |
76 using v8::internal::rdi; | 76 using i::rcx; |
77 using v8::internal::rdx; | 77 using i::rdi; |
78 using v8::internal::rsi; | 78 using i::rdx; |
79 using v8::internal::rsp; | 79 using i::rsi; |
80 using v8::internal::times_pointer_size; | 80 using i::rsp; |
| 81 using i::times_pointer_size; |
81 | 82 |
82 // Test the x64 assembler by compiling some simple functions into | 83 // Test the x64 assembler by compiling some simple functions into |
83 // a buffer and executing them. These tests do not initialize the | 84 // a buffer and executing them. These tests do not initialize the |
84 // V8 library, create a context, or use any V8 objects. | 85 // V8 library, create a context, or use any V8 objects. |
85 // The AMD64 calling convention is used, with the first five arguments | 86 // The AMD64 calling convention is used, with the first five arguments |
86 // in RSI, RDI, RDX, RCX, R8, and R9, and floating point arguments in | 87 // in RSI, RDI, RDX, RCX, R8, and R9, and floating point arguments in |
87 // the XMM registers. The return value is in RAX. | 88 // the XMM registers. The return value is in RAX. |
88 // This calling convention is used on Linux, with GCC, and on Mac OS, | 89 // This calling convention is used on Linux, with GCC, and on Mac OS, |
89 // with GCC. A different convention is used on 64-bit windows. | 90 // with GCC. A different convention is used on 64-bit windows. |
90 | 91 |
91 typedef int (*F0)(); | 92 typedef int (*F0)(); |
92 | 93 |
93 #define __ masm-> | 94 #define __ masm-> |
94 | 95 |
95 | 96 |
96 static void EntryCode(MacroAssembler* masm) { | 97 static void EntryCode(MacroAssembler* masm) { |
97 // Smi constant register is callee save. | 98 // Smi constant register is callee save. |
98 __ push(v8::internal::kSmiConstantRegister); | 99 __ push(i::kSmiConstantRegister); |
99 __ push(v8::internal::kRootRegister); | 100 __ push(i::kRootRegister); |
100 __ InitializeSmiConstantRegister(); | 101 __ InitializeSmiConstantRegister(); |
101 __ InitializeRootRegister(); | 102 __ InitializeRootRegister(); |
102 } | 103 } |
103 | 104 |
104 | 105 |
105 static void ExitCode(MacroAssembler* masm) { | 106 static void ExitCode(MacroAssembler* masm) { |
106 // Return -1 if kSmiConstantRegister was clobbered during the test. | 107 // Return -1 if kSmiConstantRegister was clobbered during the test. |
107 __ Move(rdx, Smi::FromInt(1)); | 108 __ Move(rdx, Smi::FromInt(1)); |
108 __ cmpq(rdx, v8::internal::kSmiConstantRegister); | 109 __ cmpq(rdx, i::kSmiConstantRegister); |
109 __ movq(rdx, Immediate(-1)); | 110 __ movq(rdx, Immediate(-1)); |
110 __ cmovq(not_equal, rax, rdx); | 111 __ cmovq(not_equal, rax, rdx); |
111 __ pop(v8::internal::kRootRegister); | 112 __ pop(i::kRootRegister); |
112 __ pop(v8::internal::kSmiConstantRegister); | 113 __ pop(i::kSmiConstantRegister); |
113 } | 114 } |
114 | 115 |
115 | 116 |
116 TEST(Smi) { | 117 TEST(Smi) { |
117 // Check that C++ Smi operations work as expected. | 118 // Check that C++ Smi operations work as expected. |
118 int64_t test_numbers[] = { | 119 int64_t test_numbers[] = { |
119 0, 1, -1, 127, 128, -128, -129, 255, 256, -256, -257, | 120 0, 1, -1, 127, 128, -128, -129, 255, 256, -256, -257, |
120 Smi::kMaxValue, static_cast<int64_t>(Smi::kMaxValue) + 1, | 121 Smi::kMaxValue, static_cast<int64_t>(Smi::kMaxValue) + 1, |
121 Smi::kMinValue, static_cast<int64_t>(Smi::kMinValue) - 1 | 122 Smi::kMinValue, static_cast<int64_t>(Smi::kMinValue) - 1 |
122 }; | 123 }; |
(...skipping 20 matching lines...) Expand all Loading... |
143 __ movl(rax, Immediate(id)); | 144 __ movl(rax, Immediate(id)); |
144 __ Move(rcx, Smi::FromInt(0)); | 145 __ Move(rcx, Smi::FromInt(0)); |
145 __ Set(rdx, reinterpret_cast<intptr_t>(Smi::FromInt(0))); | 146 __ Set(rdx, reinterpret_cast<intptr_t>(Smi::FromInt(0))); |
146 __ cmpq(rcx, rdx); | 147 __ cmpq(rcx, rdx); |
147 __ j(not_equal, exit); | 148 __ j(not_equal, exit); |
148 } | 149 } |
149 | 150 |
150 | 151 |
151 // Test that we can move a Smi value literally into a register. | 152 // Test that we can move a Smi value literally into a register. |
152 TEST(SmiMove) { | 153 TEST(SmiMove) { |
153 v8::internal::V8::Initialize(NULL); | 154 i::V8::Initialize(NULL); |
154 // Allocate an executable page of memory. | 155 // Allocate an executable page of memory. |
155 size_t actual_size; | 156 size_t actual_size; |
156 byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, | 157 byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, |
157 &actual_size, | 158 &actual_size, |
158 true)); | 159 true)); |
159 CHECK(buffer); | 160 CHECK(buffer); |
160 Isolate* isolate = CcTest::i_isolate(); | 161 Isolate* isolate = CcTest::i_isolate(); |
161 HandleScope handles(isolate); | 162 HandleScope handles(isolate); |
162 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); | 163 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); |
163 MacroAssembler* masm = &assembler; // Create a pointer for the __ macro. | 164 MacroAssembler* masm = &assembler; // Create a pointer for the __ macro. |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 __ j(not_equal, exit); | 232 __ j(not_equal, exit); |
232 __ incq(rax); | 233 __ incq(rax); |
233 __ cmpq(rcx, r8); | 234 __ cmpq(rcx, r8); |
234 __ j(not_equal, exit); | 235 __ j(not_equal, exit); |
235 } | 236 } |
236 } | 237 } |
237 | 238 |
238 | 239 |
239 // Test that we can compare smis for equality (and more). | 240 // Test that we can compare smis for equality (and more). |
240 TEST(SmiCompare) { | 241 TEST(SmiCompare) { |
241 v8::internal::V8::Initialize(NULL); | 242 i::V8::Initialize(NULL); |
242 // Allocate an executable page of memory. | 243 // Allocate an executable page of memory. |
243 size_t actual_size; | 244 size_t actual_size; |
244 byte* buffer = | 245 byte* buffer = |
245 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 2, | 246 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 2, |
246 &actual_size, | 247 &actual_size, |
247 true)); | 248 true)); |
248 CHECK(buffer); | 249 CHECK(buffer); |
249 Isolate* isolate = CcTest::i_isolate(); | 250 Isolate* isolate = CcTest::i_isolate(); |
250 HandleScope handles(isolate); | 251 HandleScope handles(isolate); |
251 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); | 252 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 CodeDesc desc; | 284 CodeDesc desc; |
284 masm->GetCode(&desc); | 285 masm->GetCode(&desc); |
285 // Call the function from C++. | 286 // Call the function from C++. |
286 int result = FUNCTION_CAST<F0>(buffer)(); | 287 int result = FUNCTION_CAST<F0>(buffer)(); |
287 CHECK_EQ(0, result); | 288 CHECK_EQ(0, result); |
288 } | 289 } |
289 | 290 |
290 | 291 |
291 | 292 |
292 TEST(Integer32ToSmi) { | 293 TEST(Integer32ToSmi) { |
293 v8::internal::V8::Initialize(NULL); | 294 i::V8::Initialize(NULL); |
294 // Allocate an executable page of memory. | 295 // Allocate an executable page of memory. |
295 size_t actual_size; | 296 size_t actual_size; |
296 byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, | 297 byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, |
297 &actual_size, | 298 &actual_size, |
298 true)); | 299 true)); |
299 CHECK(buffer); | 300 CHECK(buffer); |
300 Isolate* isolate = CcTest::i_isolate(); | 301 Isolate* isolate = CcTest::i_isolate(); |
301 HandleScope handles(isolate); | 302 HandleScope handles(isolate); |
302 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); | 303 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); |
303 | 304 |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
412 __ j(not_equal, exit); | 413 __ j(not_equal, exit); |
413 | 414 |
414 __ incq(rax); | 415 __ incq(rax); |
415 __ Integer64PlusConstantToSmi(rcx, rcx, y); | 416 __ Integer64PlusConstantToSmi(rcx, rcx, y); |
416 __ cmpq(rcx, r8); | 417 __ cmpq(rcx, r8); |
417 __ j(not_equal, exit); | 418 __ j(not_equal, exit); |
418 } | 419 } |
419 | 420 |
420 | 421 |
421 TEST(Integer64PlusConstantToSmi) { | 422 TEST(Integer64PlusConstantToSmi) { |
422 v8::internal::V8::Initialize(NULL); | 423 i::V8::Initialize(NULL); |
423 // Allocate an executable page of memory. | 424 // Allocate an executable page of memory. |
424 size_t actual_size; | 425 size_t actual_size; |
425 byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, | 426 byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, |
426 &actual_size, | 427 &actual_size, |
427 true)); | 428 true)); |
428 CHECK(buffer); | 429 CHECK(buffer); |
429 Isolate* isolate = CcTest::i_isolate(); | 430 Isolate* isolate = CcTest::i_isolate(); |
430 HandleScope handles(isolate); | 431 HandleScope handles(isolate); |
431 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); | 432 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); |
432 | 433 |
(...skipping 24 matching lines...) Expand all Loading... |
457 | 458 |
458 CodeDesc desc; | 459 CodeDesc desc; |
459 masm->GetCode(&desc); | 460 masm->GetCode(&desc); |
460 // Call the function from C++. | 461 // Call the function from C++. |
461 int result = FUNCTION_CAST<F0>(buffer)(); | 462 int result = FUNCTION_CAST<F0>(buffer)(); |
462 CHECK_EQ(0, result); | 463 CHECK_EQ(0, result); |
463 } | 464 } |
464 | 465 |
465 | 466 |
466 TEST(SmiCheck) { | 467 TEST(SmiCheck) { |
467 v8::internal::V8::Initialize(NULL); | 468 i::V8::Initialize(NULL); |
468 // Allocate an executable page of memory. | 469 // Allocate an executable page of memory. |
469 size_t actual_size; | 470 size_t actual_size; |
470 byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, | 471 byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, |
471 &actual_size, | 472 &actual_size, |
472 true)); | 473 true)); |
473 CHECK(buffer); | 474 CHECK(buffer); |
474 Isolate* isolate = CcTest::i_isolate(); | 475 Isolate* isolate = CcTest::i_isolate(); |
475 HandleScope handles(isolate); | 476 HandleScope handles(isolate); |
476 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); | 477 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); |
477 | 478 |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
705 __ jmp(exit); | 706 __ jmp(exit); |
706 __ bind(&smi_ok2); | 707 __ bind(&smi_ok2); |
707 __ incq(rax); | 708 __ incq(rax); |
708 __ cmpq(rcx, r8); | 709 __ cmpq(rcx, r8); |
709 __ j(not_equal, exit); | 710 __ j(not_equal, exit); |
710 } | 711 } |
711 } | 712 } |
712 | 713 |
713 | 714 |
714 TEST(SmiNeg) { | 715 TEST(SmiNeg) { |
715 v8::internal::V8::Initialize(NULL); | 716 i::V8::Initialize(NULL); |
716 // Allocate an executable page of memory. | 717 // Allocate an executable page of memory. |
717 size_t actual_size; | 718 size_t actual_size; |
718 byte* buffer = | 719 byte* buffer = |
719 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, | 720 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, |
720 &actual_size, | 721 &actual_size, |
721 true)); | 722 true)); |
722 CHECK(buffer); | 723 CHECK(buffer); |
723 Isolate* isolate = CcTest::i_isolate(); | 724 Isolate* isolate = CcTest::i_isolate(); |
724 HandleScope handles(isolate); | 725 HandleScope handles(isolate); |
725 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); | 726 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
796 __ j(not_equal, exit); | 797 __ j(not_equal, exit); |
797 | 798 |
798 __ incq(rax); | 799 __ incq(rax); |
799 __ SmiAddConstant(rcx, rcx, Smi::FromInt(second), exit); | 800 __ SmiAddConstant(rcx, rcx, Smi::FromInt(second), exit); |
800 __ cmpq(rcx, r8); | 801 __ cmpq(rcx, r8); |
801 __ j(not_equal, exit); | 802 __ j(not_equal, exit); |
802 } | 803 } |
803 | 804 |
804 | 805 |
805 TEST(SmiAdd) { | 806 TEST(SmiAdd) { |
806 v8::internal::V8::Initialize(NULL); | 807 i::V8::Initialize(NULL); |
807 // Allocate an executable page of memory. | 808 // Allocate an executable page of memory. |
808 size_t actual_size; | 809 size_t actual_size; |
809 byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, | 810 byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, |
810 &actual_size, | 811 &actual_size, |
811 true)); | 812 true)); |
812 CHECK(buffer); | 813 CHECK(buffer); |
813 Isolate* isolate = CcTest::i_isolate(); | 814 Isolate* isolate = CcTest::i_isolate(); |
814 HandleScope handles(isolate); | 815 HandleScope handles(isolate); |
815 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); | 816 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); |
816 | 817 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
866 __ incq(rax); // Test 2. | 867 __ incq(rax); // Test 2. |
867 __ SmiSubConstant(r9, rcx, Smi::FromInt(second)); | 868 __ SmiSubConstant(r9, rcx, Smi::FromInt(second)); |
868 __ cmpq(r9, r8); | 869 __ cmpq(r9, r8); |
869 __ j(not_equal, exit); | 870 __ j(not_equal, exit); |
870 | 871 |
871 __ incq(rax); // Test 3. | 872 __ incq(rax); // Test 3. |
872 __ SmiSubConstant(rcx, rcx, Smi::FromInt(second)); | 873 __ SmiSubConstant(rcx, rcx, Smi::FromInt(second)); |
873 __ cmpq(rcx, r8); | 874 __ cmpq(rcx, r8); |
874 __ j(not_equal, exit); | 875 __ j(not_equal, exit); |
875 | 876 |
| 877 i::SmiExecutionMode mode = static_cast<i::SmiExecutionMode>( |
| 878 i::SMI_NEED_RESERVE_SOURCES | i::SMI_BAILOUT_ON_OVERFLOW); |
876 __ Move(rcx, Smi::FromInt(first)); | 879 __ Move(rcx, Smi::FromInt(first)); |
877 | |
878 __ incq(rax); // Test 4. | 880 __ incq(rax); // Test 4. |
879 __ SmiSubConstant(r9, rcx, Smi::FromInt(second), exit); | 881 __ SmiSubConstant(rcx, rcx, Smi::FromInt(second), mode, exit); |
880 __ cmpq(r9, r8); | 882 __ cmpq(rcx, r8); |
881 __ j(not_equal, exit); | 883 __ j(not_equal, exit); |
882 | 884 |
| 885 mode = static_cast<i::SmiExecutionMode>( |
| 886 i::SMI_NEED_RESERVE_SOURCES | i::SMI_BAILOUT_ON_NO_OVERFLOW); |
| 887 __ Move(rcx, Smi::FromInt(first)); |
| 888 Label done; |
883 __ incq(rax); // Test 5. | 889 __ incq(rax); // Test 5. |
884 __ SmiSubConstant(rcx, rcx, Smi::FromInt(second), exit); | 890 __ SmiSubConstant(rcx, rcx, Smi::FromInt(second), mode, &done); |
| 891 __ jmp(exit); |
| 892 __ bind(&done); |
885 __ cmpq(rcx, r8); | 893 __ cmpq(rcx, r8); |
886 __ j(not_equal, exit); | 894 __ j(not_equal, exit); |
887 } | 895 } |
888 | 896 |
889 static void SmiSubOverflowTest(MacroAssembler* masm, | 897 static void SmiSubOverflowTest(MacroAssembler* masm, |
890 Label* exit, | 898 Label* exit, |
891 int id, | 899 int id, |
892 int x) { | 900 int x) { |
893 // Subtracts a Smi from x so that the subtraction overflows. | 901 // Subtracts a Smi from x so that the subtraction overflows. |
894 ASSERT(x != -1); // Can't overflow by subtracting a Smi. | 902 ASSERT(x != -1); // Can't overflow by subtracting a Smi. |
(...skipping 19 matching lines...) Expand all Loading... |
914 __ incq(rax); | 922 __ incq(rax); |
915 __ SmiSub(rcx, rcx, rdx, &overflow_ok); | 923 __ SmiSub(rcx, rcx, rdx, &overflow_ok); |
916 __ jmp(exit); | 924 __ jmp(exit); |
917 __ bind(&overflow_ok); | 925 __ bind(&overflow_ok); |
918 __ incq(rax); | 926 __ incq(rax); |
919 __ cmpq(rcx, r11); | 927 __ cmpq(rcx, r11); |
920 __ j(not_equal, exit); | 928 __ j(not_equal, exit); |
921 } | 929 } |
922 | 930 |
923 __ movq(rcx, r11); | 931 __ movq(rcx, r11); |
| 932 i::SmiExecutionMode mode = static_cast<i::SmiExecutionMode>( |
| 933 i::SMI_NEED_RESERVE_SOURCES | i::SMI_BAILOUT_ON_OVERFLOW); |
924 { | 934 { |
925 Label overflow_ok; | 935 Label overflow_ok; |
926 __ incq(rax); | 936 __ incq(rax); |
927 __ SmiSubConstant(r9, rcx, Smi::FromInt(y_min), &overflow_ok); | 937 __ SmiSubConstant(rcx, rcx, Smi::FromInt(y_min), mode, &overflow_ok); |
928 __ jmp(exit); | 938 __ jmp(exit); |
929 __ bind(&overflow_ok); | 939 __ bind(&overflow_ok); |
930 __ incq(rax); | 940 __ incq(rax); |
931 __ cmpq(rcx, r11); | |
932 __ j(not_equal, exit); | |
933 } | |
934 | |
935 { | |
936 Label overflow_ok; | |
937 __ incq(rax); | |
938 __ SmiSubConstant(rcx, rcx, Smi::FromInt(y_min), &overflow_ok); | |
939 __ jmp(exit); | |
940 __ bind(&overflow_ok); | |
941 __ incq(rax); | |
942 __ cmpq(rcx, r11); | 941 __ cmpq(rcx, r11); |
943 __ j(not_equal, exit); | 942 __ j(not_equal, exit); |
944 } | 943 } |
945 | 944 |
946 __ Move(rdx, Smi::FromInt(y_max)); | 945 __ Move(rdx, Smi::FromInt(y_max)); |
947 | 946 |
948 { | 947 { |
949 Label overflow_ok; | 948 Label overflow_ok; |
950 __ incq(rax); | 949 __ incq(rax); |
951 __ SmiSub(r9, rcx, rdx, &overflow_ok); | 950 __ SmiSub(r9, rcx, rdx, &overflow_ok); |
(...skipping 12 matching lines...) Expand all Loading... |
964 __ bind(&overflow_ok); | 963 __ bind(&overflow_ok); |
965 __ incq(rax); | 964 __ incq(rax); |
966 __ cmpq(rcx, r11); | 965 __ cmpq(rcx, r11); |
967 __ j(not_equal, exit); | 966 __ j(not_equal, exit); |
968 } | 967 } |
969 | 968 |
970 __ movq(rcx, r11); | 969 __ movq(rcx, r11); |
971 { | 970 { |
972 Label overflow_ok; | 971 Label overflow_ok; |
973 __ incq(rax); | 972 __ incq(rax); |
974 __ SmiSubConstant(r9, rcx, Smi::FromInt(y_max), &overflow_ok); | 973 __ SmiSubConstant(rcx, rcx, Smi::FromInt(y_max), mode, &overflow_ok); |
975 __ jmp(exit); | 974 __ jmp(exit); |
976 __ bind(&overflow_ok); | 975 __ bind(&overflow_ok); |
977 __ incq(rax); | 976 __ incq(rax); |
978 __ cmpq(rcx, r11); | |
979 __ j(not_equal, exit); | |
980 } | |
981 | |
982 { | |
983 Label overflow_ok; | |
984 __ incq(rax); | |
985 __ SmiSubConstant(rcx, rcx, Smi::FromInt(y_max), &overflow_ok); | |
986 __ jmp(exit); | |
987 __ bind(&overflow_ok); | |
988 __ incq(rax); | |
989 __ cmpq(rcx, r11); | 977 __ cmpq(rcx, r11); |
990 __ j(not_equal, exit); | 978 __ j(not_equal, exit); |
991 } | 979 } |
992 } | 980 } |
993 | 981 |
994 | 982 |
995 TEST(SmiSub) { | 983 TEST(SmiSub) { |
996 v8::internal::V8::Initialize(NULL); | 984 i::V8::Initialize(NULL); |
997 // Allocate an executable page of memory. | 985 // Allocate an executable page of memory. |
998 size_t actual_size; | 986 size_t actual_size; |
999 byte* buffer = | 987 byte* buffer = |
1000 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 2, | 988 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 2, |
1001 &actual_size, | 989 &actual_size, |
1002 true)); | 990 true)); |
1003 CHECK(buffer); | 991 CHECK(buffer); |
1004 Isolate* isolate = CcTest::i_isolate(); | 992 Isolate* isolate = CcTest::i_isolate(); |
1005 HandleScope handles(isolate); | 993 HandleScope handles(isolate); |
1006 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); | 994 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1078 __ bind(&overflow_ok2); | 1066 __ bind(&overflow_ok2); |
1079 // 31-bit version doesn't preserve rcx on failure. | 1067 // 31-bit version doesn't preserve rcx on failure. |
1080 // __ incq(rax); | 1068 // __ incq(rax); |
1081 // __ cmpq(r11, rcx); | 1069 // __ cmpq(r11, rcx); |
1082 // __ j(not_equal, exit); | 1070 // __ j(not_equal, exit); |
1083 } | 1071 } |
1084 } | 1072 } |
1085 | 1073 |
1086 | 1074 |
1087 TEST(SmiMul) { | 1075 TEST(SmiMul) { |
1088 v8::internal::V8::Initialize(NULL); | 1076 i::V8::Initialize(NULL); |
1089 // Allocate an executable page of memory. | 1077 // Allocate an executable page of memory. |
1090 size_t actual_size; | 1078 size_t actual_size; |
1091 byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, | 1079 byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, |
1092 &actual_size, | 1080 &actual_size, |
1093 true)); | 1081 true)); |
1094 CHECK(buffer); | 1082 CHECK(buffer); |
1095 Isolate* isolate = CcTest::i_isolate(); | 1083 Isolate* isolate = CcTest::i_isolate(); |
1096 HandleScope handles(isolate); | 1084 HandleScope handles(isolate); |
1097 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); | 1085 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); |
1098 | 1086 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1184 __ bind(&fail_ok2); | 1172 __ bind(&fail_ok2); |
1185 | 1173 |
1186 __ incq(r15); | 1174 __ incq(r15); |
1187 __ cmpq(rcx, r11); | 1175 __ cmpq(rcx, r11); |
1188 __ j(not_equal, exit); | 1176 __ j(not_equal, exit); |
1189 } | 1177 } |
1190 } | 1178 } |
1191 | 1179 |
1192 | 1180 |
1193 TEST(SmiDiv) { | 1181 TEST(SmiDiv) { |
1194 v8::internal::V8::Initialize(NULL); | 1182 i::V8::Initialize(NULL); |
1195 // Allocate an executable page of memory. | 1183 // Allocate an executable page of memory. |
1196 size_t actual_size; | 1184 size_t actual_size; |
1197 byte* buffer = | 1185 byte* buffer = |
1198 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 2, | 1186 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 2, |
1199 &actual_size, | 1187 &actual_size, |
1200 true)); | 1188 true)); |
1201 CHECK(buffer); | 1189 CHECK(buffer); |
1202 Isolate* isolate = CcTest::i_isolate(); | 1190 Isolate* isolate = CcTest::i_isolate(); |
1203 HandleScope handles(isolate); | 1191 HandleScope handles(isolate); |
1204 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); | 1192 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1295 __ bind(&fail_ok2); | 1283 __ bind(&fail_ok2); |
1296 | 1284 |
1297 __ incq(r15); | 1285 __ incq(r15); |
1298 __ cmpq(rcx, r11); | 1286 __ cmpq(rcx, r11); |
1299 __ j(not_equal, exit); | 1287 __ j(not_equal, exit); |
1300 } | 1288 } |
1301 } | 1289 } |
1302 | 1290 |
1303 | 1291 |
1304 TEST(SmiMod) { | 1292 TEST(SmiMod) { |
1305 v8::internal::V8::Initialize(NULL); | 1293 i::V8::Initialize(NULL); |
1306 // Allocate an executable page of memory. | 1294 // Allocate an executable page of memory. |
1307 size_t actual_size; | 1295 size_t actual_size; |
1308 byte* buffer = | 1296 byte* buffer = |
1309 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 2, | 1297 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 2, |
1310 &actual_size, | 1298 &actual_size, |
1311 true)); | 1299 true)); |
1312 CHECK(buffer); | 1300 CHECK(buffer); |
1313 Isolate* isolate = CcTest::i_isolate(); | 1301 Isolate* isolate = CcTest::i_isolate(); |
1314 HandleScope handles(isolate); | 1302 HandleScope handles(isolate); |
1315 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); | 1303 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1393 __ shl(rcx, Immediate(index.scale)); | 1381 __ shl(rcx, Immediate(index.scale)); |
1394 __ Set(r8, static_cast<intptr_t>(-x) << i); | 1382 __ Set(r8, static_cast<intptr_t>(-x) << i); |
1395 __ cmpq(rcx, r8); | 1383 __ cmpq(rcx, r8); |
1396 __ j(not_equal, exit); | 1384 __ j(not_equal, exit); |
1397 __ incq(rax); | 1385 __ incq(rax); |
1398 } | 1386 } |
1399 } | 1387 } |
1400 | 1388 |
1401 | 1389 |
1402 TEST(SmiIndex) { | 1390 TEST(SmiIndex) { |
1403 v8::internal::V8::Initialize(NULL); | 1391 i::V8::Initialize(NULL); |
1404 // Allocate an executable page of memory. | 1392 // Allocate an executable page of memory. |
1405 size_t actual_size; | 1393 size_t actual_size; |
1406 byte* buffer = | 1394 byte* buffer = |
1407 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 3, | 1395 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 3, |
1408 &actual_size, | 1396 &actual_size, |
1409 true)); | 1397 true)); |
1410 CHECK(buffer); | 1398 CHECK(buffer); |
1411 Isolate* isolate = CcTest::i_isolate(); | 1399 Isolate* isolate = CcTest::i_isolate(); |
1412 HandleScope handles(isolate); | 1400 HandleScope handles(isolate); |
1413 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); | 1401 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1463 __ Move(rdx, Smi::FromInt(y)); | 1451 __ Move(rdx, Smi::FromInt(y)); |
1464 __ xor_(rcx, Immediate(kSmiTagMask)); | 1452 __ xor_(rcx, Immediate(kSmiTagMask)); |
1465 __ xor_(rdx, Immediate(kSmiTagMask)); | 1453 __ xor_(rdx, Immediate(kSmiTagMask)); |
1466 __ SelectNonSmi(r9, rcx, rdx, &fail_ok); | 1454 __ SelectNonSmi(r9, rcx, rdx, &fail_ok); |
1467 __ jmp(exit); | 1455 __ jmp(exit); |
1468 __ bind(&fail_ok); | 1456 __ bind(&fail_ok); |
1469 } | 1457 } |
1470 | 1458 |
1471 | 1459 |
1472 TEST(SmiSelectNonSmi) { | 1460 TEST(SmiSelectNonSmi) { |
1473 v8::internal::V8::Initialize(NULL); | 1461 i::V8::Initialize(NULL); |
1474 // Allocate an executable page of memory. | 1462 // Allocate an executable page of memory. |
1475 size_t actual_size; | 1463 size_t actual_size; |
1476 byte* buffer = | 1464 byte* buffer = |
1477 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, | 1465 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, |
1478 &actual_size, | 1466 &actual_size, |
1479 true)); | 1467 true)); |
1480 CHECK(buffer); | 1468 CHECK(buffer); |
1481 Isolate* isolate = CcTest::i_isolate(); | 1469 Isolate* isolate = CcTest::i_isolate(); |
1482 HandleScope handles(isolate); | 1470 HandleScope handles(isolate); |
1483 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); | 1471 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1543 __ j(not_equal, exit); | 1531 __ j(not_equal, exit); |
1544 | 1532 |
1545 __ incq(rax); | 1533 __ incq(rax); |
1546 __ SmiAndConstant(rcx, rcx, Smi::FromInt(y)); | 1534 __ SmiAndConstant(rcx, rcx, Smi::FromInt(y)); |
1547 __ cmpq(r8, rcx); | 1535 __ cmpq(r8, rcx); |
1548 __ j(not_equal, exit); | 1536 __ j(not_equal, exit); |
1549 } | 1537 } |
1550 | 1538 |
1551 | 1539 |
1552 TEST(SmiAnd) { | 1540 TEST(SmiAnd) { |
1553 v8::internal::V8::Initialize(NULL); | 1541 i::V8::Initialize(NULL); |
1554 // Allocate an executable page of memory. | 1542 // Allocate an executable page of memory. |
1555 size_t actual_size; | 1543 size_t actual_size; |
1556 byte* buffer = | 1544 byte* buffer = |
1557 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, | 1545 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, |
1558 &actual_size, | 1546 &actual_size, |
1559 true)); | 1547 true)); |
1560 CHECK(buffer); | 1548 CHECK(buffer); |
1561 Isolate* isolate = CcTest::i_isolate(); | 1549 Isolate* isolate = CcTest::i_isolate(); |
1562 HandleScope handles(isolate); | 1550 HandleScope handles(isolate); |
1563 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); | 1551 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1625 __ j(not_equal, exit); | 1613 __ j(not_equal, exit); |
1626 | 1614 |
1627 __ incq(rax); | 1615 __ incq(rax); |
1628 __ SmiOrConstant(rcx, rcx, Smi::FromInt(y)); | 1616 __ SmiOrConstant(rcx, rcx, Smi::FromInt(y)); |
1629 __ cmpq(r8, rcx); | 1617 __ cmpq(r8, rcx); |
1630 __ j(not_equal, exit); | 1618 __ j(not_equal, exit); |
1631 } | 1619 } |
1632 | 1620 |
1633 | 1621 |
1634 TEST(SmiOr) { | 1622 TEST(SmiOr) { |
1635 v8::internal::V8::Initialize(NULL); | 1623 i::V8::Initialize(NULL); |
1636 // Allocate an executable page of memory. | 1624 // Allocate an executable page of memory. |
1637 size_t actual_size; | 1625 size_t actual_size; |
1638 byte* buffer = | 1626 byte* buffer = |
1639 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, | 1627 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, |
1640 &actual_size, | 1628 &actual_size, |
1641 true)); | 1629 true)); |
1642 CHECK(buffer); | 1630 CHECK(buffer); |
1643 Isolate* isolate = CcTest::i_isolate(); | 1631 Isolate* isolate = CcTest::i_isolate(); |
1644 HandleScope handles(isolate); | 1632 HandleScope handles(isolate); |
1645 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); | 1633 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1709 __ j(not_equal, exit); | 1697 __ j(not_equal, exit); |
1710 | 1698 |
1711 __ incq(rax); | 1699 __ incq(rax); |
1712 __ SmiXorConstant(rcx, rcx, Smi::FromInt(y)); | 1700 __ SmiXorConstant(rcx, rcx, Smi::FromInt(y)); |
1713 __ cmpq(r8, rcx); | 1701 __ cmpq(r8, rcx); |
1714 __ j(not_equal, exit); | 1702 __ j(not_equal, exit); |
1715 } | 1703 } |
1716 | 1704 |
1717 | 1705 |
1718 TEST(SmiXor) { | 1706 TEST(SmiXor) { |
1719 v8::internal::V8::Initialize(NULL); | 1707 i::V8::Initialize(NULL); |
1720 // Allocate an executable page of memory. | 1708 // Allocate an executable page of memory. |
1721 size_t actual_size; | 1709 size_t actual_size; |
1722 byte* buffer = | 1710 byte* buffer = |
1723 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, | 1711 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, |
1724 &actual_size, | 1712 &actual_size, |
1725 true)); | 1713 true)); |
1726 CHECK(buffer); | 1714 CHECK(buffer); |
1727 Isolate* isolate = CcTest::i_isolate(); | 1715 Isolate* isolate = CcTest::i_isolate(); |
1728 HandleScope handles(isolate); | 1716 HandleScope handles(isolate); |
1729 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); | 1717 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1777 __ j(not_equal, exit); | 1765 __ j(not_equal, exit); |
1778 | 1766 |
1779 __ incq(rax); | 1767 __ incq(rax); |
1780 __ SmiNot(rcx, rcx); | 1768 __ SmiNot(rcx, rcx); |
1781 __ cmpq(rcx, r8); | 1769 __ cmpq(rcx, r8); |
1782 __ j(not_equal, exit); | 1770 __ j(not_equal, exit); |
1783 } | 1771 } |
1784 | 1772 |
1785 | 1773 |
1786 TEST(SmiNot) { | 1774 TEST(SmiNot) { |
1787 v8::internal::V8::Initialize(NULL); | 1775 i::V8::Initialize(NULL); |
1788 // Allocate an executable page of memory. | 1776 // Allocate an executable page of memory. |
1789 size_t actual_size; | 1777 size_t actual_size; |
1790 byte* buffer = | 1778 byte* buffer = |
1791 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, | 1779 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, |
1792 &actual_size, | 1780 &actual_size, |
1793 true)); | 1781 true)); |
1794 CHECK(buffer); | 1782 CHECK(buffer); |
1795 Isolate* isolate = CcTest::i_isolate(); | 1783 Isolate* isolate = CcTest::i_isolate(); |
1796 HandleScope handles(isolate); | 1784 HandleScope handles(isolate); |
1797 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); | 1785 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1874 __ incq(rax); | 1862 __ incq(rax); |
1875 __ cmpq(rdx, r8); | 1863 __ cmpq(rdx, r8); |
1876 __ j(not_equal, exit); | 1864 __ j(not_equal, exit); |
1877 | 1865 |
1878 __ incq(rax); | 1866 __ incq(rax); |
1879 } | 1867 } |
1880 } | 1868 } |
1881 | 1869 |
1882 | 1870 |
1883 TEST(SmiShiftLeft) { | 1871 TEST(SmiShiftLeft) { |
1884 v8::internal::V8::Initialize(NULL); | 1872 i::V8::Initialize(NULL); |
1885 // Allocate an executable page of memory. | 1873 // Allocate an executable page of memory. |
1886 size_t actual_size; | 1874 size_t actual_size; |
1887 byte* buffer = | 1875 byte* buffer = |
1888 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 4, | 1876 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 4, |
1889 &actual_size, | 1877 &actual_size, |
1890 true)); | 1878 true)); |
1891 CHECK(buffer); | 1879 CHECK(buffer); |
1892 Isolate* isolate = CcTest::i_isolate(); | 1880 Isolate* isolate = CcTest::i_isolate(); |
1893 HandleScope handles(isolate); | 1881 HandleScope handles(isolate); |
1894 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); | 1882 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1981 __ cmpq(rcx, r11); | 1969 __ cmpq(rcx, r11); |
1982 __ j(not_equal, exit); | 1970 __ j(not_equal, exit); |
1983 | 1971 |
1984 __ addq(rax, Immediate(3)); | 1972 __ addq(rax, Immediate(3)); |
1985 } | 1973 } |
1986 } | 1974 } |
1987 } | 1975 } |
1988 | 1976 |
1989 | 1977 |
1990 TEST(SmiShiftLogicalRight) { | 1978 TEST(SmiShiftLogicalRight) { |
1991 v8::internal::V8::Initialize(NULL); | 1979 i::V8::Initialize(NULL); |
1992 // Allocate an executable page of memory. | 1980 // Allocate an executable page of memory. |
1993 size_t actual_size; | 1981 size_t actual_size; |
1994 byte* buffer = | 1982 byte* buffer = |
1995 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 3, | 1983 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 3, |
1996 &actual_size, | 1984 &actual_size, |
1997 true)); | 1985 true)); |
1998 CHECK(buffer); | 1986 CHECK(buffer); |
1999 Isolate* isolate = CcTest::i_isolate(); | 1987 Isolate* isolate = CcTest::i_isolate(); |
2000 HandleScope handles(isolate); | 1988 HandleScope handles(isolate); |
2001 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); | 1989 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2051 | 2039 |
2052 __ cmpq(rdx, r8); | 2040 __ cmpq(rdx, r8); |
2053 __ j(not_equal, exit); | 2041 __ j(not_equal, exit); |
2054 | 2042 |
2055 __ incq(rax); | 2043 __ incq(rax); |
2056 } | 2044 } |
2057 } | 2045 } |
2058 | 2046 |
2059 | 2047 |
2060 TEST(SmiShiftArithmeticRight) { | 2048 TEST(SmiShiftArithmeticRight) { |
2061 v8::internal::V8::Initialize(NULL); | 2049 i::V8::Initialize(NULL); |
2062 // Allocate an executable page of memory. | 2050 // Allocate an executable page of memory. |
2063 size_t actual_size; | 2051 size_t actual_size; |
2064 byte* buffer = | 2052 byte* buffer = |
2065 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 2, | 2053 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 2, |
2066 &actual_size, | 2054 &actual_size, |
2067 true)); | 2055 true)); |
2068 CHECK(buffer); | 2056 CHECK(buffer); |
2069 Isolate* isolate = CcTest::i_isolate(); | 2057 Isolate* isolate = CcTest::i_isolate(); |
2070 HandleScope handles(isolate); | 2058 HandleScope handles(isolate); |
2071 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); | 2059 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2116 __ incq(rax); | 2104 __ incq(rax); |
2117 __ PositiveSmiTimesPowerOfTwoToInteger64(rcx, rcx, power); | 2105 __ PositiveSmiTimesPowerOfTwoToInteger64(rcx, rcx, power); |
2118 __ cmpq(rdx, r8); | 2106 __ cmpq(rdx, r8); |
2119 __ j(not_equal, exit); | 2107 __ j(not_equal, exit); |
2120 __ incq(rax); | 2108 __ incq(rax); |
2121 } | 2109 } |
2122 } | 2110 } |
2123 | 2111 |
2124 | 2112 |
2125 TEST(PositiveSmiTimesPowerOfTwoToInteger64) { | 2113 TEST(PositiveSmiTimesPowerOfTwoToInteger64) { |
2126 v8::internal::V8::Initialize(NULL); | 2114 i::V8::Initialize(NULL); |
2127 // Allocate an executable page of memory. | 2115 // Allocate an executable page of memory. |
2128 size_t actual_size; | 2116 size_t actual_size; |
2129 byte* buffer = | 2117 byte* buffer = |
2130 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 4, | 2118 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 4, |
2131 &actual_size, | 2119 &actual_size, |
2132 true)); | 2120 true)); |
2133 CHECK(buffer); | 2121 CHECK(buffer); |
2134 Isolate* isolate = CcTest::i_isolate(); | 2122 Isolate* isolate = CcTest::i_isolate(); |
2135 HandleScope handles(isolate); | 2123 HandleScope handles(isolate); |
2136 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); | 2124 MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size)); |
(...skipping 20 matching lines...) Expand all Loading... |
2157 | 2145 |
2158 CodeDesc desc; | 2146 CodeDesc desc; |
2159 masm->GetCode(&desc); | 2147 masm->GetCode(&desc); |
2160 // Call the function from C++. | 2148 // Call the function from C++. |
2161 int result = FUNCTION_CAST<F0>(buffer)(); | 2149 int result = FUNCTION_CAST<F0>(buffer)(); |
2162 CHECK_EQ(0, result); | 2150 CHECK_EQ(0, result); |
2163 } | 2151 } |
2164 | 2152 |
2165 | 2153 |
2166 TEST(OperandOffset) { | 2154 TEST(OperandOffset) { |
2167 v8::internal::V8::Initialize(NULL); | 2155 i::V8::Initialize(NULL); |
2168 int data[256]; | 2156 int data[256]; |
2169 for (int i = 0; i < 256; i++) { data[i] = i * 0x01010101; } | 2157 for (int i = 0; i < 256; i++) { data[i] = i * 0x01010101; } |
2170 | 2158 |
2171 // Allocate an executable page of memory. | 2159 // Allocate an executable page of memory. |
2172 size_t actual_size; | 2160 size_t actual_size; |
2173 byte* buffer = | 2161 byte* buffer = |
2174 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 2, | 2162 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 2, |
2175 &actual_size, | 2163 &actual_size, |
2176 true)); | 2164 true)); |
2177 CHECK(buffer); | 2165 CHECK(buffer); |
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2515 CodeDesc desc; | 2503 CodeDesc desc; |
2516 masm->GetCode(&desc); | 2504 masm->GetCode(&desc); |
2517 // Call the function from C++. | 2505 // Call the function from C++. |
2518 int result = FUNCTION_CAST<F0>(buffer)(); | 2506 int result = FUNCTION_CAST<F0>(buffer)(); |
2519 CHECK_EQ(0, result); | 2507 CHECK_EQ(0, result); |
2520 } | 2508 } |
2521 | 2509 |
2522 | 2510 |
2523 | 2511 |
2524 #undef __ | 2512 #undef __ |
OLD | NEW |