Revision f230a1cf deps/v8/test/cctest/test-macro-assembler-x64.cc

View differences:

deps/v8/test/cctest/test-macro-assembler-x64.cc
47 47
using v8::internal::OS;
48 48
using v8::internal::Operand;
49 49
using v8::internal::RelocInfo;
50
using v8::internal::Representation;
50 51
using v8::internal::Smi;
51 52
using v8::internal::SmiIndex;
52 53
using v8::internal::byte;
......
141 142

  
142 143
static void TestMoveSmi(MacroAssembler* masm, Label* exit, int id, Smi* value) {
143 144
  __ movl(rax, Immediate(id));
144
  __ Move(rcx, Smi::FromInt(0));
145
  __ Set(rdx, reinterpret_cast<intptr_t>(Smi::FromInt(0)));
145
  __ Move(rcx, value);
146
  __ Set(rdx, reinterpret_cast<intptr_t>(value));
146 147
  __ cmpq(rcx, rdx);
147 148
  __ j(not_equal, exit);
148 149
}
......
157 158
                                                   &actual_size,
158 159
                                                   true));
159 160
  CHECK(buffer);
160
  Isolate* isolate = Isolate::Current();
161
  Isolate* isolate = CcTest::i_isolate();
161 162
  HandleScope handles(isolate);
162 163
  MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size));
163 164
  MacroAssembler* masm = &assembler;  // Create a pointer for the __ macro.
......
246 247
                                      &actual_size,
247 248
                                      true));
248 249
  CHECK(buffer);
249
  Isolate* isolate = Isolate::Current();
250
  Isolate* isolate = CcTest::i_isolate();
250 251
  HandleScope handles(isolate);
251 252
  MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size));
252 253

  
......
297 298
                                                 &actual_size,
298 299
                                                 true));
299 300
  CHECK(buffer);
300
  Isolate* isolate = Isolate::Current();
301
  Isolate* isolate = CcTest::i_isolate();
301 302
  HandleScope handles(isolate);
302 303
  MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size));
303 304

  
......
426 427
                                                 &actual_size,
427 428
                                                 true));
428 429
  CHECK(buffer);
429
  Isolate* isolate = Isolate::Current();
430
  Isolate* isolate = CcTest::i_isolate();
430 431
  HandleScope handles(isolate);
431 432
  MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size));
432 433

  
......
471 472
                                                   &actual_size,
472 473
                                                   true));
473 474
  CHECK(buffer);
474
  Isolate* isolate = Isolate::Current();
475
  Isolate* isolate = CcTest::i_isolate();
475 476
  HandleScope handles(isolate);
476 477
  MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size));
477 478

  
......
720 721
                                      &actual_size,
721 722
                                      true));
722 723
  CHECK(buffer);
723
  Isolate* isolate = Isolate::Current();
724
  Isolate* isolate = CcTest::i_isolate();
724 725
  HandleScope handles(isolate);
725 726
  MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size));
726 727

  
......
751 752
}
752 753

  
753 754

  
754

  
755

  
756 755
static void SmiAddTest(MacroAssembler* masm,
757 756
                       Label* exit,
758 757
                       int id,
......
802 801
}
803 802

  
804 803

  
804
static void SmiAddOverflowTest(MacroAssembler* masm,
805
                               Label* exit,
806
                               int id,
807
                               int x) {
808
  // Adds a Smi to x so that the addition overflows.
809
  ASSERT(x != 0);  // Can't overflow by adding a Smi.
810
  int y_max = (x > 0) ? (Smi::kMaxValue + 0) : (Smi::kMinValue - x - 1);
811
  int y_min = (x > 0) ? (Smi::kMaxValue - x + 1) : (Smi::kMinValue + 0);
812

  
813
  __ movl(rax, Immediate(id));
814
  __ Move(rcx, Smi::FromInt(x));
815
  __ movq(r11, rcx);  // Store original Smi value of x in r11.
816
  __ Move(rdx, Smi::FromInt(y_min));
817
  {
818
    Label overflow_ok;
819
    __ SmiAdd(r9, rcx, rdx, &overflow_ok);
820
    __ jmp(exit);
821
    __ bind(&overflow_ok);
822
    __ incq(rax);
823
    __ cmpq(rcx, r11);
824
    __ j(not_equal, exit);
825
  }
826

  
827
  {
828
    Label overflow_ok;
829
    __ incq(rax);
830
    __ SmiAdd(rcx, rcx, rdx, &overflow_ok);
831
    __ jmp(exit);
832
    __ bind(&overflow_ok);
833
    __ incq(rax);
834
    __ cmpq(rcx, r11);
835
    __ j(not_equal, exit);
836
  }
837

  
838
  __ movq(rcx, r11);
839
  {
840
    Label overflow_ok;
841
    __ incq(rax);
842
    __ SmiAddConstant(r9, rcx, Smi::FromInt(y_min), &overflow_ok);
843
    __ jmp(exit);
844
    __ bind(&overflow_ok);
845
    __ incq(rax);
846
    __ cmpq(rcx, r11);
847
    __ j(not_equal, exit);
848
  }
849

  
850
  {
851
    Label overflow_ok;
852
    __ incq(rax);
853
    __ SmiAddConstant(rcx, rcx, Smi::FromInt(y_min), &overflow_ok);
854
    __ jmp(exit);
855
    __ bind(&overflow_ok);
856
    __ incq(rax);
857
    __ cmpq(rcx, r11);
858
    __ j(not_equal, exit);
859
  }
860

  
861
  __ Move(rdx, Smi::FromInt(y_max));
862

  
863
  {
864
    Label overflow_ok;
865
    __ incq(rax);
866
    __ SmiAdd(r9, rcx, rdx, &overflow_ok);
867
    __ jmp(exit);
868
    __ bind(&overflow_ok);
869
    __ incq(rax);
870
    __ cmpq(rcx, r11);
871
    __ j(not_equal, exit);
872
  }
873

  
874
  {
875
    Label overflow_ok;
876
    __ incq(rax);
877
    __ SmiAdd(rcx, rcx, rdx, &overflow_ok);
878
    __ jmp(exit);
879
    __ bind(&overflow_ok);
880
    __ incq(rax);
881
    __ cmpq(rcx, r11);
882
    __ j(not_equal, exit);
883
  }
884

  
885
  __ movq(rcx, r11);
886
  {
887
    Label overflow_ok;
888
    __ incq(rax);
889
    __ SmiAddConstant(r9, rcx, Smi::FromInt(y_max), &overflow_ok);
890
    __ jmp(exit);
891
    __ bind(&overflow_ok);
892
    __ incq(rax);
893
    __ cmpq(rcx, r11);
894
    __ j(not_equal, exit);
895
  }
896

  
897
  {
898
    Label overflow_ok;
899
    __ incq(rax);
900
    __ SmiAddConstant(rcx, rcx, Smi::FromInt(y_max), &overflow_ok);
901
    __ jmp(exit);
902
    __ bind(&overflow_ok);
903
    __ incq(rax);
904
    __ cmpq(rcx, r11);
905
    __ j(not_equal, exit);
906
  }
907
}
908

  
909

  
805 910
TEST(SmiAdd) {
806 911
  v8::internal::V8::Initialize(NULL);
807 912
  // Allocate an executable page of memory.
808 913
  size_t actual_size;
809
  byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize,
810
                                                 &actual_size,
811
                                                 true));
914
  byte* buffer =
915
      static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 2,
916
                                      &actual_size,
917
                                      true));
812 918
  CHECK(buffer);
813
  Isolate* isolate = Isolate::Current();
919
  Isolate* isolate = CcTest::i_isolate();
814 920
  HandleScope handles(isolate);
815 921
  MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size));
816 922

  
......
829 935
  SmiAddTest(masm, &exit, 0x70, Smi::kMaxValue, -5);
830 936
  SmiAddTest(masm, &exit, 0x80, Smi::kMaxValue, Smi::kMinValue);
831 937

  
938
  SmiAddOverflowTest(masm, &exit, 0x90, -1);
939
  SmiAddOverflowTest(masm, &exit, 0xA0, 1);
940
  SmiAddOverflowTest(masm, &exit, 0xB0, 1024);
941
  SmiAddOverflowTest(masm, &exit, 0xC0, Smi::kMaxValue);
942
  SmiAddOverflowTest(masm, &exit, 0xD0, -2);
943
  SmiAddOverflowTest(masm, &exit, 0xE0, -42000);
944
  SmiAddOverflowTest(masm, &exit, 0xF0, Smi::kMinValue);
945

  
832 946
  __ xor_(rax, rax);  // Success.
833 947
  __ bind(&exit);
834 948
  ExitCode(masm);
......
886 1000
  __ j(not_equal, exit);
887 1001
}
888 1002

  
1003

  
889 1004
static void SmiSubOverflowTest(MacroAssembler* masm,
890 1005
                               Label* exit,
891 1006
                               int id,
......
1001 1116
                                      &actual_size,
1002 1117
                                      true));
1003 1118
  CHECK(buffer);
1004
  Isolate* isolate = Isolate::Current();
1119
  Isolate* isolate = CcTest::i_isolate();
1005 1120
  HandleScope handles(isolate);
1006 1121
  MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size));
1007 1122

  
......
1092 1207
                                                 &actual_size,
1093 1208
                                                 true));
1094 1209
  CHECK(buffer);
1095
  Isolate* isolate = Isolate::Current();
1210
  Isolate* isolate = CcTest::i_isolate();
1096 1211
  HandleScope handles(isolate);
1097 1212
  MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size));
1098 1213

  
......
1199 1314
                                      &actual_size,
1200 1315
                                      true));
1201 1316
  CHECK(buffer);
1202
  Isolate* isolate = Isolate::Current();
1317
  Isolate* isolate = CcTest::i_isolate();
1203 1318
  HandleScope handles(isolate);
1204 1319
  MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size));
1205 1320

  
......
1310 1425
                                      &actual_size,
1311 1426
                                      true));
1312 1427
  CHECK(buffer);
1313
  Isolate* isolate = Isolate::Current();
1428
  Isolate* isolate = CcTest::i_isolate();
1314 1429
  HandleScope handles(isolate);
1315 1430
  MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size));
1316 1431

  
......
1408 1523
                                      &actual_size,
1409 1524
                                      true));
1410 1525
  CHECK(buffer);
1411
  Isolate* isolate = Isolate::Current();
1526
  Isolate* isolate = CcTest::i_isolate();
1412 1527
  HandleScope handles(isolate);
1413 1528
  MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size));
1414 1529

  
......
1478 1593
                                      &actual_size,
1479 1594
                                      true));
1480 1595
  CHECK(buffer);
1481
  Isolate* isolate = Isolate::Current();
1596
  Isolate* isolate = CcTest::i_isolate();
1482 1597
  HandleScope handles(isolate);
1483 1598
  MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size));
1484 1599

  
......
1558 1673
                                      &actual_size,
1559 1674
                                      true));
1560 1675
  CHECK(buffer);
1561
  Isolate* isolate = Isolate::Current();
1676
  Isolate* isolate = CcTest::i_isolate();
1562 1677
  HandleScope handles(isolate);
1563 1678
  MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size));
1564 1679

  
......
1640 1755
                                      &actual_size,
1641 1756
                                      true));
1642 1757
  CHECK(buffer);
1643
  Isolate* isolate = Isolate::Current();
1758
  Isolate* isolate = CcTest::i_isolate();
1644 1759
  HandleScope handles(isolate);
1645 1760
  MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size));
1646 1761

  
......
1724 1839
                                      &actual_size,
1725 1840
                                      true));
1726 1841
  CHECK(buffer);
1727
  Isolate* isolate = Isolate::Current();
1842
  Isolate* isolate = CcTest::i_isolate();
1728 1843
  HandleScope handles(isolate);
1729 1844
  MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size));
1730 1845

  
......
1792 1907
                                      &actual_size,
1793 1908
                                      true));
1794 1909
  CHECK(buffer);
1795
  Isolate* isolate = Isolate::Current();
1910
  Isolate* isolate = CcTest::i_isolate();
1796 1911
  HandleScope handles(isolate);
1797 1912
  MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size));
1798 1913

  
......
1889 2004
                                      &actual_size,
1890 2005
                                      true));
1891 2006
  CHECK(buffer);
1892
  Isolate* isolate = Isolate::Current();
2007
  Isolate* isolate = CcTest::i_isolate();
1893 2008
  HandleScope handles(isolate);
1894 2009
  MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size));
1895 2010

  
......
1996 2111
                                      &actual_size,
1997 2112
                                      true));
1998 2113
  CHECK(buffer);
1999
  Isolate* isolate = Isolate::Current();
2114
  Isolate* isolate = CcTest::i_isolate();
2000 2115
  HandleScope handles(isolate);
2001 2116
  MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size));
2002 2117

  
......
2066 2181
                                      &actual_size,
2067 2182
                                      true));
2068 2183
  CHECK(buffer);
2069
  Isolate* isolate = Isolate::Current();
2184
  Isolate* isolate = CcTest::i_isolate();
2070 2185
  HandleScope handles(isolate);
2071 2186
  MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size));
2072 2187

  
......
2131 2246
                                      &actual_size,
2132 2247
                                      true));
2133 2248
  CHECK(buffer);
2134
  Isolate* isolate = Isolate::Current();
2249
  Isolate* isolate = CcTest::i_isolate();
2135 2250
  HandleScope handles(isolate);
2136 2251
  MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size));
2137 2252

  
......
2175 2290
                                      &actual_size,
2176 2291
                                      true));
2177 2292
  CHECK(buffer);
2178
  Isolate* isolate = Isolate::Current();
2293
  Isolate* isolate = CcTest::i_isolate();
2179 2294
  HandleScope handles(isolate);
2180 2295
  MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size));
2181 2296

  
......
2520 2635
}
2521 2636

  
2522 2637

  
2638
TEST(LoadAndStoreWithRepresentation) {
2639
  v8::internal::V8::Initialize(NULL);
2640

  
2641
  // Allocate an executable page of memory.
2642
  size_t actual_size;
2643
  byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize,
2644
                                                 &actual_size,
2645
                                                 true));
2646
  CHECK(buffer);
2647
  Isolate* isolate = CcTest::i_isolate();
2648
  HandleScope handles(isolate);
2649
  MacroAssembler assembler(isolate, buffer, static_cast<int>(actual_size));
2650
  MacroAssembler* masm = &assembler;  // Create a pointer for the __ macro.
2651
  masm->set_allow_stub_calls(false);
2652
  EntryCode(masm);
2653
  __ subq(rsp, Immediate(1 * kPointerSize));
2654
  Label exit;
2655

  
2656
  // Test 1.
2657
  __ movq(rax, Immediate(1));  // Test number.
2658
  __ movq(Operand(rsp, 0 * kPointerSize), Immediate(0));
2659
  __ movq(rcx, Immediate(-1));
2660
  __ Store(Operand(rsp, 0 * kPointerSize), rcx, Representation::Byte());
2661
  __ movq(rcx, Operand(rsp, 0 * kPointerSize));
2662
  __ movl(rdx, Immediate(255));
2663
  __ cmpq(rcx, rdx);
2664
  __ j(not_equal, &exit);
2665
  __ Load(rdx, Operand(rsp, 0 * kPointerSize), Representation::Byte());
2666
  __ cmpq(rcx, rdx);
2667
  __ j(not_equal, &exit);
2668

  
2669
  // Test 2.
2670
  __ movq(rax, Immediate(2));  // Test number.
2671
  __ movq(Operand(rsp, 0 * kPointerSize), Immediate(0));
2672
  __ Set(rcx, V8_2PART_UINT64_C(0xdeadbeaf, 12345678));
2673
  __ Store(Operand(rsp, 0 * kPointerSize), rcx, Representation::Smi());
2674
  __ movq(rcx, Operand(rsp, 0 * kPointerSize));
2675
  __ Set(rdx, V8_2PART_UINT64_C(0xdeadbeaf, 12345678));
2676
  __ cmpq(rcx, rdx);
2677
  __ j(not_equal, &exit);
2678
  __ Load(rdx, Operand(rsp, 0 * kPointerSize), Representation::Smi());
2679
  __ cmpq(rcx, rdx);
2680
  __ j(not_equal, &exit);
2681

  
2682
  // Test 3.
2683
  __ movq(rax, Immediate(3));  // Test number.
2684
  __ movq(Operand(rsp, 0 * kPointerSize), Immediate(0));
2685
  __ movq(rcx, Immediate(-1));
2686
  __ Store(Operand(rsp, 0 * kPointerSize), rcx, Representation::Integer32());
2687
  __ movq(rcx, Operand(rsp, 0 * kPointerSize));
2688
  __ movl(rdx, Immediate(-1));
2689
  __ cmpq(rcx, rdx);
2690
  __ j(not_equal, &exit);
2691
  __ Load(rdx, Operand(rsp, 0 * kPointerSize), Representation::Integer32());
2692
  __ cmpq(rcx, rdx);
2693
  __ j(not_equal, &exit);
2694

  
2695
  // Test 4.
2696
  __ movq(rax, Immediate(4));  // Test number.
2697
  __ movq(Operand(rsp, 0 * kPointerSize), Immediate(0));
2698
  __ movl(rcx, Immediate(0x44332211));
2699
  __ Store(Operand(rsp, 0 * kPointerSize), rcx, Representation::HeapObject());
2700
  __ movq(rcx, Operand(rsp, 0 * kPointerSize));
2701
  __ movl(rdx, Immediate(0x44332211));
2702
  __ cmpq(rcx, rdx);
2703
  __ j(not_equal, &exit);
2704
  __ Load(rdx, Operand(rsp, 0 * kPointerSize), Representation::HeapObject());
2705
  __ cmpq(rcx, rdx);
2706
  __ j(not_equal, &exit);
2707

  
2708
  // Test 5.
2709
  __ movq(rax, Immediate(5));  // Test number.
2710
  __ movq(Operand(rsp, 0 * kPointerSize), Immediate(0));
2711
  __ Set(rcx, V8_2PART_UINT64_C(0x12345678, deadbeaf));
2712
  __ Store(Operand(rsp, 0 * kPointerSize), rcx, Representation::Tagged());
2713
  __ movq(rcx, Operand(rsp, 0 * kPointerSize));
2714
  __ Set(rdx, V8_2PART_UINT64_C(0x12345678, deadbeaf));
2715
  __ cmpq(rcx, rdx);
2716
  __ j(not_equal, &exit);
2717
  __ Load(rdx, Operand(rsp, 0 * kPointerSize), Representation::Tagged());
2718
  __ cmpq(rcx, rdx);
2719
  __ j(not_equal, &exit);
2720

  
2721
  // Test 6.
2722
  __ movq(rax, Immediate(6));  // Test number.
2723
  __ movq(Operand(rsp, 0 * kPointerSize), Immediate(0));
2724
  __ Set(rcx, V8_2PART_UINT64_C(0x11223344, 55667788));
2725
  __ Store(Operand(rsp, 0 * kPointerSize), rcx, Representation::External());
2726
  __ movq(rcx, Operand(rsp, 0 * kPointerSize));
2727
  __ Set(rdx, V8_2PART_UINT64_C(0x11223344, 55667788));
2728
  __ cmpq(rcx, rdx);
2729
  __ j(not_equal, &exit);
2730
  __ Load(rdx, Operand(rsp, 0 * kPointerSize), Representation::External());
2731
  __ cmpq(rcx, rdx);
2732
  __ j(not_equal, &exit);
2733

  
2734
  __ xor_(rax, rax);  // Success.
2735
  __ bind(&exit);
2736
  __ addq(rsp, Immediate(1 * kPointerSize));
2737
  ExitCode(masm);
2738
  __ ret(0);
2739

  
2740
  CodeDesc desc;
2741
  masm->GetCode(&desc);
2742
  // Call the function from C++.
2743
  int result = FUNCTION_CAST<F0>(buffer)();
2744
  CHECK_EQ(0, result);
2745
}
2746

  
2523 2747

  
2524 2748
#undef __

Also available in: Unified diff