Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 235 | 235 |
| 236 #define CHECK_EQUAL_FP64(expected, result) \ | 236 #define CHECK_EQUAL_FP64(expected, result) \ |
| 237 CHECK(EqualFP64(expected, &core, result)) | 237 CHECK(EqualFP64(expected, &core, result)) |
| 238 | 238 |
| 239 // Expected values for 128-bit comparisons are passed as two 64-bit values, | 239 // Expected values for 128-bit comparisons are passed as two 64-bit values, |
| 240 // where expected_h (high) is <127:64> and expected_l (low) is <63:0>. | 240 // where expected_h (high) is <127:64> and expected_l (low) is <63:0>. |
| 241 #define CHECK_EQUAL_128(expected_h, expected_l, result) \ | 241 #define CHECK_EQUAL_128(expected_h, expected_l, result) \ |
| 242 CHECK(Equal128(expected_h, expected_l, &core, result)) | 242 CHECK(Equal128(expected_h, expected_l, &core, result)) |
| 243 | 243 |
| 244 #ifdef DEBUG | 244 #ifdef DEBUG |
| 245 #define CHECK_LITERAL_POOL_SIZE(expected) \ | 245 #define CHECK_CONSTANT_POOL_SIZE(expected) \ |
| 246 CHECK((expected) == (__ LiteralPoolSize())) | 246 printf("constant pool size is: %d\n", __ GetConstantPoolEntriesSize()); \ |
|
Jarin
2017/06/13 14:21:55
Remove the printf?
georgia.kouveli
2017/06/14 09:46:09
Done.
| |
| 247 CHECK_EQ(expected, __ GetConstantPoolEntriesSize()) | |
| 247 #else | 248 #else |
| 248 #define CHECK_LITERAL_POOL_SIZE(expected) ((void)0) | 249 #define CHECK_CONSTANT_POOL_SIZE(expected) ((void)0) |
| 249 #endif | 250 #endif |
| 250 | 251 |
| 251 | 252 |
| 252 TEST(stack_ops) { | 253 TEST(stack_ops) { |
| 253 INIT_V8(); | 254 INIT_V8(); |
| 254 SETUP(); | 255 SETUP(); |
| 255 | 256 |
| 256 START(); | 257 START(); |
| 257 // save csp. | 258 // save csp. |
| 258 __ Mov(x29, csp); | 259 __ Mov(x29, csp); |
| (...skipping 6423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6682 CHECK_EQUAL_64(0x00000001, x3); | 6683 CHECK_EQUAL_64(0x00000001, x3); |
| 6683 CHECK_EQUAL_64(0x0100000000000000L, dst[4]); | 6684 CHECK_EQUAL_64(0x0100000000000000L, dst[4]); |
| 6684 CHECK_EQUAL_64(src_base, x17); | 6685 CHECK_EQUAL_64(src_base, x17); |
| 6685 CHECK_EQUAL_64(dst_base, x18); | 6686 CHECK_EQUAL_64(dst_base, x18); |
| 6686 CHECK_EQUAL_64(src_base + 16, x19); | 6687 CHECK_EQUAL_64(src_base + 16, x19); |
| 6687 CHECK_EQUAL_64(dst_base + 32, x20); | 6688 CHECK_EQUAL_64(dst_base + 32, x20); |
| 6688 | 6689 |
| 6689 TEARDOWN(); | 6690 TEARDOWN(); |
| 6690 } | 6691 } |
| 6691 | 6692 |
| 6693 TEST(ldr_pcrel_large_offset) { | |
| 6694 INIT_V8(); | |
| 6695 SETUP_SIZE(1 * MB); | |
| 6692 | 6696 |
| 6693 #if 0 // TODO(all) enable. | 6697 START(); |
| 6694 // TODO(rodolph): Adapt w16 Literal tests for RelocInfo. | 6698 |
| 6699 __ Ldr(x1, Immediate(0x1234567890abcdefUL)); | |
| 6700 | |
| 6701 { | |
| 6702 v8::internal::PatchingAssembler::BlockPoolsScope scope(&masm); | |
| 6703 int start = __ pc_offset(); | |
| 6704 while (__ pc_offset() - start < 600 * KB) { | |
| 6705 __ Nop(); | |
| 6706 } | |
| 6707 } | |
| 6708 | |
| 6709 __ Ldr(x2, Immediate(0x1234567890abcdefUL)); | |
| 6710 | |
| 6711 END(); | |
| 6712 | |
| 6713 RUN(); | |
| 6714 | |
| 6715 CHECK_EQUAL_64(0x1234567890abcdefUL, x1); | |
| 6716 CHECK_EQUAL_64(0x1234567890abcdefUL, x2); | |
| 6717 | |
| 6718 TEARDOWN(); | |
| 6719 } | |
| 6720 | |
| 6695 TEST(ldr_literal) { | 6721 TEST(ldr_literal) { |
| 6696 INIT_V8(); | 6722 INIT_V8(); |
| 6697 SETUP(); | 6723 SETUP(); |
| 6698 | 6724 |
| 6699 START(); | 6725 START(); |
| 6700 __ Ldr(x2, 0x1234567890abcdefUL); | 6726 __ Ldr(x2, Immediate(0x1234567890abcdefUL)); |
| 6701 __ Ldr(w3, 0xfedcba09); | |
| 6702 __ Ldr(d13, 1.234); | 6727 __ Ldr(d13, 1.234); |
| 6703 __ Ldr(s25, 2.5); | |
| 6704 END(); | 6728 END(); |
| 6705 | 6729 |
| 6706 RUN(); | 6730 RUN(); |
| 6707 | 6731 |
| 6708 CHECK_EQUAL_64(0x1234567890abcdefUL, x2); | 6732 CHECK_EQUAL_64(0x1234567890abcdefUL, x2); |
| 6709 CHECK_EQUAL_64(0xfedcba09, x3); | |
| 6710 CHECK_EQUAL_FP64(1.234, d13); | 6733 CHECK_EQUAL_FP64(1.234, d13); |
| 6711 CHECK_EQUAL_FP32(2.5, s25); | |
| 6712 | 6734 |
| 6713 TEARDOWN(); | 6735 TEARDOWN(); |
| 6714 } | 6736 } |
| 6715 | 6737 |
| 6738 #ifdef DEBUG | |
| 6739 // These tests rely on functions available in debug mode. | |
| 6740 enum LiteralPoolEmitOption { NoJumpRequired, JumpRequired }; | |
| 6716 | 6741 |
| 6717 static void LdrLiteralRangeHelper(ptrdiff_t range_, | 6742 static void LdrLiteralRangeHelper(int range_, LiteralPoolEmitOption option, |
| 6718 LiteralPoolEmitOption option, | |
| 6719 bool expect_dump) { | 6743 bool expect_dump) { |
| 6720 CHECK(range_ > 0); | 6744 CHECK_GT(range_, 0); |
| 6721 SETUP_SIZE(range_ + 1024); | 6745 SETUP_SIZE(range_ + 1024); |
| 6722 | 6746 |
| 6723 Label label_1, label_2; | 6747 Label label_1, label_2; |
| 6724 | 6748 |
| 6725 size_t range = static_cast<size_t>(range_); | 6749 size_t range = static_cast<size_t>(range_); |
| 6726 size_t code_size = 0; | 6750 size_t code_size = 0; |
| 6727 size_t pool_guard_size; | 6751 size_t pool_guard_size; |
| 6728 | 6752 |
| 6729 if (option == NoJumpRequired) { | 6753 if (option == NoJumpRequired) { |
| 6730 // Space for an explicit branch. | 6754 // Space for an explicit branch. |
| 6731 pool_guard_size = sizeof(Instr); | 6755 pool_guard_size = kInstructionSize; |
| 6732 } else { | 6756 } else { |
| 6733 pool_guard_size = 0; | 6757 pool_guard_size = 0; |
| 6734 } | 6758 } |
| 6735 | 6759 |
| 6736 START(); | 6760 START(); |
| 6737 // Force a pool dump so the pool starts off empty. | 6761 // Force a pool dump so the pool starts off empty. |
| 6738 __ EmitLiteralPool(JumpRequired); | 6762 __ CheckConstPool(true, true); |
| 6739 CHECK_LITERAL_POOL_SIZE(0); | 6763 CHECK_CONSTANT_POOL_SIZE(0); |
| 6740 | 6764 |
| 6741 __ Ldr(x0, 0x1234567890abcdefUL); | 6765 __ Ldr(x0, Immediate(0x1234567890abcdefUL)); |
| 6742 __ Ldr(w1, 0xfedcba09); | |
| 6743 __ Ldr(d0, 1.234); | 6766 __ Ldr(d0, 1.234); |
| 6744 __ Ldr(s1, 2.5); | 6767 CHECK_CONSTANT_POOL_SIZE(16); |
| 6745 CHECK_LITERAL_POOL_SIZE(4); | |
| 6746 | 6768 |
| 6747 code_size += 4 * sizeof(Instr); | 6769 code_size += 2 * kInstructionSize; |
| 6748 | 6770 |
| 6749 // Check that the requested range (allowing space for a branch over the pool) | 6771 // Check that the requested range (allowing space for a branch over the pool) |
| 6750 // can be handled by this test. | 6772 // can be handled by this test. |
| 6751 CHECK((code_size + pool_guard_size) <= range); | 6773 CHECK_LE(code_size + pool_guard_size, range); |
| 6752 | 6774 |
| 6753 // Emit NOPs up to 'range', leaving space for the pool guard. | 6775 // Emit NOPs up to 'range', leaving space for the pool guard. |
| 6754 while ((code_size + pool_guard_size) < range) { | 6776 while ((code_size + pool_guard_size + kInstructionSize) < range) { |
| 6755 __ Nop(); | 6777 __ Nop(); |
| 6756 code_size += sizeof(Instr); | 6778 code_size += kInstructionSize; |
| 6757 } | 6779 } |
| 6758 | 6780 |
| 6759 // Emit the guard sequence before the literal pool. | 6781 // Emit the guard sequence before the literal pool. |
| 6760 if (option == NoJumpRequired) { | 6782 if (option == NoJumpRequired) { |
| 6761 __ B(&label_1); | 6783 __ B(&label_1); |
| 6762 code_size += sizeof(Instr); | 6784 code_size += kInstructionSize; |
| 6763 } | 6785 } |
| 6764 | 6786 |
| 6765 CHECK(code_size == range); | 6787 // The next instruction will trigger pool emission when expect_dump is true. |
| 6766 CHECK_LITERAL_POOL_SIZE(4); | 6788 CHECK_EQ(code_size, range - kInstructionSize); |
| 6789 CHECK_CONSTANT_POOL_SIZE(16); | |
| 6767 | 6790 |
| 6768 // Possibly generate a literal pool. | 6791 // Possibly generate a literal pool. |
| 6769 __ CheckLiteralPool(option); | 6792 __ Nop(); |
| 6793 | |
| 6770 __ Bind(&label_1); | 6794 __ Bind(&label_1); |
| 6771 if (expect_dump) { | 6795 if (expect_dump) { |
| 6772 CHECK_LITERAL_POOL_SIZE(0); | 6796 CHECK_CONSTANT_POOL_SIZE(0); |
| 6773 } else { | 6797 } else { |
| 6774 CHECK_LITERAL_POOL_SIZE(4); | 6798 CHECK_CONSTANT_POOL_SIZE(16); |
| 6775 } | 6799 } |
| 6776 | 6800 |
| 6777 // Force a pool flush to check that a second pool functions correctly. | 6801 // Force a pool flush to check that a second pool functions correctly. |
| 6778 __ EmitLiteralPool(JumpRequired); | 6802 __ CheckConstPool(true, true); |
| 6779 CHECK_LITERAL_POOL_SIZE(0); | 6803 CHECK_CONSTANT_POOL_SIZE(0); |
| 6780 | 6804 |
| 6781 // These loads should be after the pool (and will require a new one). | 6805 // These loads should be after the pool (and will require a new one). |
| 6782 __ Ldr(x4, 0x34567890abcdef12UL); | 6806 __ Ldr(x4, Immediate(0x34567890abcdef12UL)); |
| 6783 __ Ldr(w5, 0xdcba09fe); | |
| 6784 __ Ldr(d4, 123.4); | 6807 __ Ldr(d4, 123.4); |
| 6785 __ Ldr(s5, 250.0); | 6808 CHECK_CONSTANT_POOL_SIZE(16); |
| 6786 CHECK_LITERAL_POOL_SIZE(4); | |
| 6787 END(); | 6809 END(); |
| 6788 | 6810 |
| 6789 RUN(); | 6811 RUN(); |
| 6790 | 6812 |
| 6791 // Check that the literals loaded correctly. | 6813 // Check that the literals loaded correctly. |
| 6792 CHECK_EQUAL_64(0x1234567890abcdefUL, x0); | 6814 CHECK_EQUAL_64(0x1234567890abcdefUL, x0); |
| 6793 CHECK_EQUAL_64(0xfedcba09, x1); | |
| 6794 CHECK_EQUAL_FP64(1.234, d0); | 6815 CHECK_EQUAL_FP64(1.234, d0); |
| 6795 CHECK_EQUAL_FP32(2.5, s1); | |
| 6796 CHECK_EQUAL_64(0x34567890abcdef12UL, x4); | 6816 CHECK_EQUAL_64(0x34567890abcdef12UL, x4); |
| 6797 CHECK_EQUAL_64(0xdcba09fe, x5); | |
| 6798 CHECK_EQUAL_FP64(123.4, d4); | 6817 CHECK_EQUAL_FP64(123.4, d4); |
| 6799 CHECK_EQUAL_FP32(250.0, s5); | |
| 6800 | 6818 |
| 6801 TEARDOWN(); | 6819 TEARDOWN(); |
| 6802 } | 6820 } |
| 6803 | 6821 |
| 6804 | |
| 6805 TEST(ldr_literal_range_1) { | 6822 TEST(ldr_literal_range_1) { |
| 6806 INIT_V8(); | 6823 INIT_V8(); |
| 6807 LdrLiteralRangeHelper(kRecommendedLiteralPoolRange, | 6824 LdrLiteralRangeHelper(MacroAssembler::GetApproxMaxDistToConstPool(), |
| 6808 NoJumpRequired, | 6825 NoJumpRequired, true); |
| 6809 true); | |
| 6810 } | 6826 } |
| 6811 | 6827 |
| 6812 | 6828 |
| 6813 TEST(ldr_literal_range_2) { | 6829 TEST(ldr_literal_range_2) { |
| 6814 INIT_V8(); | 6830 INIT_V8(); |
| 6815 LdrLiteralRangeHelper(kRecommendedLiteralPoolRange-sizeof(Instr), | 6831 LdrLiteralRangeHelper( |
| 6816 NoJumpRequired, | 6832 MacroAssembler::GetApproxMaxDistToConstPool() - kInstructionSize, |
| 6817 false); | 6833 NoJumpRequired, false); |
| 6818 } | 6834 } |
| 6819 | 6835 |
| 6820 | 6836 |
| 6821 TEST(ldr_literal_range_3) { | 6837 TEST(ldr_literal_range_3) { |
| 6822 INIT_V8(); | 6838 INIT_V8(); |
| 6823 LdrLiteralRangeHelper(2 * kRecommendedLiteralPoolRange, | 6839 LdrLiteralRangeHelper(MacroAssembler::GetCheckConstPoolInterval(), |
| 6824 JumpRequired, | 6840 JumpRequired, false); |
| 6825 true); | |
| 6826 } | 6841 } |
| 6827 | 6842 |
| 6828 | 6843 |
| 6829 TEST(ldr_literal_range_4) { | 6844 TEST(ldr_literal_range_4) { |
| 6830 INIT_V8(); | 6845 INIT_V8(); |
| 6831 LdrLiteralRangeHelper(2 * kRecommendedLiteralPoolRange-sizeof(Instr), | 6846 LdrLiteralRangeHelper( |
| 6832 JumpRequired, | 6847 MacroAssembler::GetCheckConstPoolInterval() - kInstructionSize, |
| 6833 false); | 6848 JumpRequired, false); |
| 6834 } | |
| 6835 | |
| 6836 | |
| 6837 TEST(ldr_literal_range_5) { | |
| 6838 INIT_V8(); | |
| 6839 LdrLiteralRangeHelper(kLiteralPoolCheckInterval, | |
| 6840 JumpRequired, | |
| 6841 false); | |
| 6842 } | |
| 6843 | |
| 6844 | |
| 6845 TEST(ldr_literal_range_6) { | |
| 6846 INIT_V8(); | |
| 6847 LdrLiteralRangeHelper(kLiteralPoolCheckInterval-sizeof(Instr), | |
| 6848 JumpRequired, | |
| 6849 false); | |
| 6850 } | 6849 } |
| 6851 #endif | 6850 #endif |
| 6852 | 6851 |
| 6853 TEST(add_sub_imm) { | 6852 TEST(add_sub_imm) { |
| 6854 INIT_V8(); | 6853 INIT_V8(); |
| 6855 SETUP(); | 6854 SETUP(); |
| 6856 | 6855 |
| 6857 START(); | 6856 START(); |
| 6858 __ Mov(x0, 0x0); | 6857 __ Mov(x0, 0x0); |
| 6859 __ Mov(x1, 0x1111); | 6858 __ Mov(x1, 0x1111); |
| (...skipping 8576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 15436 __ Mov(x0, 1); | 15435 __ Mov(x0, 1); |
| 15437 | 15436 |
| 15438 END(); | 15437 END(); |
| 15439 | 15438 |
| 15440 RUN(); | 15439 RUN(); |
| 15441 | 15440 |
| 15442 CHECK_EQUAL_64(0x1, x0); | 15441 CHECK_EQUAL_64(0x1, x0); |
| 15443 | 15442 |
| 15444 TEARDOWN(); | 15443 TEARDOWN(); |
| 15445 } | 15444 } |
| OLD | NEW |