OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/globals.h" | 5 #include "vm/globals.h" |
6 #if defined(TARGET_ARCH_X64) | 6 #if defined(TARGET_ARCH_X64) |
7 | 7 |
8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
9 #include "vm/os.h" | 9 #include "vm/os.h" |
10 #include "vm/unit_test.h" | 10 #include "vm/unit_test.h" |
(...skipping 20 matching lines...) Expand all Loading... |
31 static const int64_t kLargeConstant = 0x1234567812345678LL; | 31 static const int64_t kLargeConstant = 0x1234567812345678LL; |
32 EXPECT_EQ(kLargeConstant, id(kLargeConstant)); | 32 EXPECT_EQ(kLargeConstant, id(kLargeConstant)); |
33 } | 33 } |
34 | 34 |
35 | 35 |
36 ASSEMBLER_TEST_GENERATE(AddressingModes, assembler) { | 36 ASSEMBLER_TEST_GENERATE(AddressingModes, assembler) { |
37 __ movq(RAX, Address(RSP, 0)); | 37 __ movq(RAX, Address(RSP, 0)); |
38 __ movq(RAX, Address(RBP, 0)); | 38 __ movq(RAX, Address(RBP, 0)); |
39 __ movq(RAX, Address(RAX, 0)); | 39 __ movq(RAX, Address(RAX, 0)); |
40 __ movq(RAX, Address(R10, 0)); | 40 __ movq(RAX, Address(R10, 0)); |
| 41 __ movq(RAX, Address(R12, 0)); |
| 42 __ movq(RAX, Address(R13, 0)); |
41 __ movq(R10, Address(RAX, 0)); | 43 __ movq(R10, Address(RAX, 0)); |
42 | 44 |
43 __ movq(RAX, Address(RSP, kWordSize)); | 45 __ movq(RAX, Address(RSP, kWordSize)); |
44 __ movq(RAX, Address(RBP, kWordSize)); | 46 __ movq(RAX, Address(RBP, kWordSize)); |
45 __ movq(RAX, Address(RAX, kWordSize)); | 47 __ movq(RAX, Address(RAX, kWordSize)); |
46 __ movq(RAX, Address(R10, kWordSize)); | 48 __ movq(RAX, Address(R10, kWordSize)); |
| 49 __ movq(RAX, Address(R12, kWordSize)); |
| 50 __ movq(RAX, Address(R13, kWordSize)); |
47 | 51 |
48 __ movq(RAX, Address(RSP, -kWordSize)); | 52 __ movq(RAX, Address(RSP, -kWordSize)); |
49 __ movq(RAX, Address(RBP, -kWordSize)); | 53 __ movq(RAX, Address(RBP, -kWordSize)); |
50 __ movq(RAX, Address(RAX, -kWordSize)); | 54 __ movq(RAX, Address(RAX, -kWordSize)); |
51 __ movq(RAX, Address(R10, -kWordSize)); | 55 __ movq(RAX, Address(R10, -kWordSize)); |
| 56 __ movq(RAX, Address(R12, -kWordSize)); |
| 57 __ movq(RAX, Address(R13, -kWordSize)); |
52 | 58 |
53 __ movq(RAX, Address(RSP, 256 * kWordSize)); | 59 __ movq(RAX, Address(RSP, 256 * kWordSize)); |
54 __ movq(RAX, Address(RBP, 256 * kWordSize)); | 60 __ movq(RAX, Address(RBP, 256 * kWordSize)); |
55 __ movq(RAX, Address(RAX, 256 * kWordSize)); | 61 __ movq(RAX, Address(RAX, 256 * kWordSize)); |
56 __ movq(RAX, Address(R10, 256 * kWordSize)); | 62 __ movq(RAX, Address(R10, 256 * kWordSize)); |
| 63 __ movq(RAX, Address(R12, 256 * kWordSize)); |
| 64 __ movq(RAX, Address(R13, 256 * kWordSize)); |
57 | 65 |
58 __ movq(RAX, Address(RSP, -256 * kWordSize)); | 66 __ movq(RAX, Address(RSP, -256 * kWordSize)); |
59 __ movq(RAX, Address(RBP, -256 * kWordSize)); | 67 __ movq(RAX, Address(RBP, -256 * kWordSize)); |
60 __ movq(RAX, Address(RAX, -256 * kWordSize)); | 68 __ movq(RAX, Address(RAX, -256 * kWordSize)); |
61 __ movq(RAX, Address(R10, -256 * kWordSize)); | 69 __ movq(RAX, Address(R10, -256 * kWordSize)); |
| 70 __ movq(RAX, Address(R12, -256 * kWordSize)); |
| 71 __ movq(RAX, Address(R13, -256 * kWordSize)); |
62 | 72 |
63 __ movq(RAX, Address(RAX, TIMES_1)); | 73 __ movq(RAX, Address(RAX, TIMES_1, 0)); |
64 __ movq(RAX, Address(RAX, TIMES_2)); | 74 __ movq(RAX, Address(RAX, TIMES_2, 0)); |
65 __ movq(RAX, Address(RAX, TIMES_4)); | 75 __ movq(RAX, Address(RAX, TIMES_4, 0)); |
66 __ movq(RAX, Address(RAX, TIMES_8)); | 76 __ movq(RAX, Address(RAX, TIMES_8, 0)); |
67 | 77 |
68 __ movq(RAX, Address(RBP, TIMES_2)); | 78 __ movq(RAX, Address(RBP, TIMES_2, 0)); |
69 __ movq(RAX, Address(RAX, TIMES_2)); | 79 __ movq(RAX, Address(RAX, TIMES_2, 0)); |
70 __ movq(RAX, Address(R10, TIMES_2)); | 80 __ movq(RAX, Address(R10, TIMES_2, 0)); |
| 81 __ movq(RAX, Address(R12, TIMES_2, 0)); |
| 82 __ movq(RAX, Address(R13, TIMES_2, 0)); |
71 | 83 |
72 __ movq(RAX, Address(RBP, TIMES_2, kWordSize)); | 84 __ movq(RAX, Address(RBP, TIMES_2, kWordSize)); |
73 __ movq(RAX, Address(RAX, TIMES_2, kWordSize)); | 85 __ movq(RAX, Address(RAX, TIMES_2, kWordSize)); |
74 __ movq(RAX, Address(R10, TIMES_2, kWordSize)); | 86 __ movq(RAX, Address(R10, TIMES_2, kWordSize)); |
| 87 __ movq(RAX, Address(R12, TIMES_2, kWordSize)); |
| 88 __ movq(RAX, Address(R13, TIMES_2, kWordSize)); |
75 | 89 |
76 __ movq(RAX, Address(RBP, TIMES_2, 256 * kWordSize)); | 90 __ movq(RAX, Address(RBP, TIMES_2, 256 * kWordSize)); |
77 __ movq(RAX, Address(RAX, TIMES_2, 256 * kWordSize)); | 91 __ movq(RAX, Address(RAX, TIMES_2, 256 * kWordSize)); |
78 __ movq(RAX, Address(R10, TIMES_2, 256 * kWordSize)); | 92 __ movq(RAX, Address(R10, TIMES_2, 256 * kWordSize)); |
| 93 __ movq(RAX, Address(R12, TIMES_2, 256 * kWordSize)); |
| 94 __ movq(RAX, Address(R13, TIMES_2, 256 * kWordSize)); |
79 | 95 |
80 __ movq(RAX, Address(RAX, RBP, TIMES_2, 0)); | 96 __ movq(RAX, Address(RAX, RBP, TIMES_2, 0)); |
81 __ movq(RAX, Address(RAX, RAX, TIMES_2, 0)); | 97 __ movq(RAX, Address(RAX, RAX, TIMES_2, 0)); |
82 __ movq(RAX, Address(RAX, R10, TIMES_2, 0)); | 98 __ movq(RAX, Address(RAX, R10, TIMES_2, 0)); |
| 99 __ movq(RAX, Address(RAX, R12, TIMES_2, 0)); |
| 100 __ movq(RAX, Address(RAX, R13, TIMES_2, 0)); |
83 | 101 |
84 __ movq(RAX, Address(RBP, RBP, TIMES_2, 0)); | 102 __ movq(RAX, Address(RBP, RBP, TIMES_2, 0)); |
85 __ movq(RAX, Address(RBP, RAX, TIMES_2, 0)); | 103 __ movq(RAX, Address(RBP, RAX, TIMES_2, 0)); |
86 __ movq(RAX, Address(RBP, R10, TIMES_2, 0)); | 104 __ movq(RAX, Address(RBP, R10, TIMES_2, 0)); |
| 105 __ movq(RAX, Address(RBP, R12, TIMES_2, 0)); |
| 106 __ movq(RAX, Address(RBP, R13, TIMES_2, 0)); |
87 | 107 |
88 __ movq(RAX, Address(RSP, RBP, TIMES_2, 0)); | 108 __ movq(RAX, Address(RSP, RBP, TIMES_2, 0)); |
89 __ movq(RAX, Address(RSP, RAX, TIMES_2, 0)); | 109 __ movq(RAX, Address(RSP, RAX, TIMES_2, 0)); |
90 __ movq(RAX, Address(RSP, R10, TIMES_2, 0)); | 110 __ movq(RAX, Address(RSP, R10, TIMES_2, 0)); |
| 111 __ movq(RAX, Address(RSP, R12, TIMES_2, 0)); |
| 112 __ movq(RAX, Address(RSP, R13, TIMES_2, 0)); |
91 | 113 |
92 __ movq(RAX, Address(R10, RBP, TIMES_2, 0)); | 114 __ movq(RAX, Address(R10, RBP, TIMES_2, 0)); |
93 __ movq(RAX, Address(R10, RAX, TIMES_2, 0)); | 115 __ movq(RAX, Address(R10, RAX, TIMES_2, 0)); |
94 __ movq(RAX, Address(R10, R10, TIMES_2, 0)); | 116 __ movq(RAX, Address(R10, R10, TIMES_2, 0)); |
| 117 __ movq(RAX, Address(R10, R12, TIMES_2, 0)); |
| 118 __ movq(RAX, Address(R10, R13, TIMES_2, 0)); |
| 119 |
| 120 __ movq(RAX, Address(R12, RBP, TIMES_2, 0)); |
| 121 __ movq(RAX, Address(R12, RAX, TIMES_2, 0)); |
| 122 __ movq(RAX, Address(R12, R10, TIMES_2, 0)); |
| 123 __ movq(RAX, Address(R12, R12, TIMES_2, 0)); |
| 124 __ movq(RAX, Address(R12, R13, TIMES_2, 0)); |
| 125 |
| 126 __ movq(RAX, Address(R13, RBP, TIMES_2, 0)); |
| 127 __ movq(RAX, Address(R13, RAX, TIMES_2, 0)); |
| 128 __ movq(RAX, Address(R13, R10, TIMES_2, 0)); |
| 129 __ movq(RAX, Address(R13, R12, TIMES_2, 0)); |
| 130 __ movq(RAX, Address(R13, R13, TIMES_2, 0)); |
95 | 131 |
96 __ movq(RAX, Address(RAX, RBP, TIMES_2, kWordSize)); | 132 __ movq(RAX, Address(RAX, RBP, TIMES_2, kWordSize)); |
97 __ movq(RAX, Address(RAX, RAX, TIMES_2, kWordSize)); | 133 __ movq(RAX, Address(RAX, RAX, TIMES_2, kWordSize)); |
98 __ movq(RAX, Address(RAX, R10, TIMES_2, kWordSize)); | 134 __ movq(RAX, Address(RAX, R10, TIMES_2, kWordSize)); |
| 135 __ movq(RAX, Address(RAX, R12, TIMES_2, kWordSize)); |
| 136 __ movq(RAX, Address(RAX, R13, TIMES_2, kWordSize)); |
99 | 137 |
100 __ movq(RAX, Address(RBP, RBP, TIMES_2, kWordSize)); | 138 __ movq(RAX, Address(RBP, RBP, TIMES_2, kWordSize)); |
101 __ movq(RAX, Address(RBP, RAX, TIMES_2, kWordSize)); | 139 __ movq(RAX, Address(RBP, RAX, TIMES_2, kWordSize)); |
102 __ movq(RAX, Address(RBP, R10, TIMES_2, kWordSize)); | 140 __ movq(RAX, Address(RBP, R10, TIMES_2, kWordSize)); |
| 141 __ movq(RAX, Address(RBP, R12, TIMES_2, kWordSize)); |
| 142 __ movq(RAX, Address(RBP, R13, TIMES_2, kWordSize)); |
103 | 143 |
104 __ movq(RAX, Address(RSP, RBP, TIMES_2, kWordSize)); | 144 __ movq(RAX, Address(RSP, RBP, TIMES_2, kWordSize)); |
105 __ movq(RAX, Address(RSP, RAX, TIMES_2, kWordSize)); | 145 __ movq(RAX, Address(RSP, RAX, TIMES_2, kWordSize)); |
106 __ movq(RAX, Address(RSP, R10, TIMES_2, kWordSize)); | 146 __ movq(RAX, Address(RSP, R10, TIMES_2, kWordSize)); |
| 147 __ movq(RAX, Address(RSP, R12, TIMES_2, kWordSize)); |
| 148 __ movq(RAX, Address(RSP, R13, TIMES_2, kWordSize)); |
107 | 149 |
108 __ movq(RAX, Address(R10, RBP, TIMES_2, kWordSize)); | 150 __ movq(RAX, Address(R10, RBP, TIMES_2, kWordSize)); |
109 __ movq(RAX, Address(R10, RAX, TIMES_2, kWordSize)); | 151 __ movq(RAX, Address(R10, RAX, TIMES_2, kWordSize)); |
110 __ movq(RAX, Address(R10, R10, TIMES_2, kWordSize)); | 152 __ movq(RAX, Address(R10, R10, TIMES_2, kWordSize)); |
| 153 __ movq(RAX, Address(R10, R12, TIMES_2, kWordSize)); |
| 154 __ movq(RAX, Address(R10, R13, TIMES_2, kWordSize)); |
| 155 |
| 156 __ movq(RAX, Address(R12, RBP, TIMES_2, kWordSize)); |
| 157 __ movq(RAX, Address(R12, RAX, TIMES_2, kWordSize)); |
| 158 __ movq(RAX, Address(R12, R10, TIMES_2, kWordSize)); |
| 159 __ movq(RAX, Address(R12, R12, TIMES_2, kWordSize)); |
| 160 __ movq(RAX, Address(R12, R13, TIMES_2, kWordSize)); |
| 161 |
| 162 __ movq(RAX, Address(R13, RBP, TIMES_2, kWordSize)); |
| 163 __ movq(RAX, Address(R13, RAX, TIMES_2, kWordSize)); |
| 164 __ movq(RAX, Address(R13, R10, TIMES_2, kWordSize)); |
| 165 __ movq(RAX, Address(R13, R12, TIMES_2, kWordSize)); |
| 166 __ movq(RAX, Address(R13, R13, TIMES_2, kWordSize)); |
111 | 167 |
112 __ movq(RAX, Address(RAX, RBP, TIMES_2, 256 * kWordSize)); | 168 __ movq(RAX, Address(RAX, RBP, TIMES_2, 256 * kWordSize)); |
113 __ movq(RAX, Address(RAX, RAX, TIMES_2, 256 * kWordSize)); | 169 __ movq(RAX, Address(RAX, RAX, TIMES_2, 256 * kWordSize)); |
114 __ movq(RAX, Address(RAX, R10, TIMES_2, 256 * kWordSize)); | 170 __ movq(RAX, Address(RAX, R10, TIMES_2, 256 * kWordSize)); |
| 171 __ movq(RAX, Address(RAX, R12, TIMES_2, 256 * kWordSize)); |
| 172 __ movq(RAX, Address(RAX, R13, TIMES_2, 256 * kWordSize)); |
115 | 173 |
116 __ movq(RAX, Address(RBP, RBP, TIMES_2, 256 * kWordSize)); | 174 __ movq(RAX, Address(RBP, RBP, TIMES_2, 256 * kWordSize)); |
117 __ movq(RAX, Address(RBP, RAX, TIMES_2, 256 * kWordSize)); | 175 __ movq(RAX, Address(RBP, RAX, TIMES_2, 256 * kWordSize)); |
118 __ movq(RAX, Address(RBP, R10, TIMES_2, 256 * kWordSize)); | 176 __ movq(RAX, Address(RBP, R10, TIMES_2, 256 * kWordSize)); |
| 177 __ movq(RAX, Address(RBP, R12, TIMES_2, 256 * kWordSize)); |
| 178 __ movq(RAX, Address(RBP, R13, TIMES_2, 256 * kWordSize)); |
119 | 179 |
120 __ movq(RAX, Address(RSP, RBP, TIMES_2, 256 * kWordSize)); | 180 __ movq(RAX, Address(RSP, RBP, TIMES_2, 256 * kWordSize)); |
121 __ movq(RAX, Address(RSP, RAX, TIMES_2, 256 * kWordSize)); | 181 __ movq(RAX, Address(RSP, RAX, TIMES_2, 256 * kWordSize)); |
122 __ movq(RAX, Address(RSP, R10, TIMES_2, 256 * kWordSize)); | 182 __ movq(RAX, Address(RSP, R10, TIMES_2, 256 * kWordSize)); |
| 183 __ movq(RAX, Address(RSP, R12, TIMES_2, 256 * kWordSize)); |
| 184 __ movq(RAX, Address(RSP, R13, TIMES_2, 256 * kWordSize)); |
123 | 185 |
124 __ movq(RAX, Address(R10, RBP, TIMES_2, 256 * kWordSize)); | 186 __ movq(RAX, Address(R10, RBP, TIMES_2, 256 * kWordSize)); |
125 __ movq(RAX, Address(R10, RAX, TIMES_2, 256 * kWordSize)); | 187 __ movq(RAX, Address(R10, RAX, TIMES_2, 256 * kWordSize)); |
126 __ movq(RAX, Address(R10, R10, TIMES_2, 256 * kWordSize)); | 188 __ movq(RAX, Address(R10, R10, TIMES_2, 256 * kWordSize)); |
| 189 __ movq(RAX, Address(R10, R12, TIMES_2, 256 * kWordSize)); |
| 190 __ movq(RAX, Address(R10, R13, TIMES_2, 256 * kWordSize)); |
| 191 |
| 192 __ movq(RAX, Address(R12, RBP, TIMES_2, 256 * kWordSize)); |
| 193 __ movq(RAX, Address(R12, RAX, TIMES_2, 256 * kWordSize)); |
| 194 __ movq(RAX, Address(R12, R10, TIMES_2, 256 * kWordSize)); |
| 195 __ movq(RAX, Address(R12, R12, TIMES_2, 256 * kWordSize)); |
| 196 __ movq(RAX, Address(R12, R13, TIMES_2, 256 * kWordSize)); |
| 197 |
| 198 __ movq(RAX, Address(R13, RBP, TIMES_2, 256 * kWordSize)); |
| 199 __ movq(RAX, Address(R13, RAX, TIMES_2, 256 * kWordSize)); |
| 200 __ movq(RAX, Address(R13, R10, TIMES_2, 256 * kWordSize)); |
| 201 __ movq(RAX, Address(R13, R12, TIMES_2, 256 * kWordSize)); |
| 202 __ movq(RAX, Address(R13, R13, TIMES_2, 256 * kWordSize)); |
127 } | 203 } |
128 | 204 |
129 | 205 |
130 ASSEMBLER_TEST_RUN(AddressingModes, entry) { | 206 ASSEMBLER_TEST_RUN(AddressingModes, entry) { |
131 // Avoid running the code since it is constructed to lead to crashes. | 207 // Avoid running the code since it is constructed to lead to crashes. |
132 } | 208 } |
133 | 209 |
134 | 210 |
135 ASSEMBLER_TEST_GENERATE(JumpAroundCrash, assembler) { | 211 ASSEMBLER_TEST_GENERATE(JumpAroundCrash, assembler) { |
136 Label done; | 212 Label done; |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 __ ret(); | 338 __ ret(); |
263 } | 339 } |
264 | 340 |
265 | 341 |
266 ASSEMBLER_TEST_RUN(SignedMultiply, entry) { | 342 ASSEMBLER_TEST_RUN(SignedMultiply, entry) { |
267 typedef int (*SignedMultiply)(); | 343 typedef int (*SignedMultiply)(); |
268 EXPECT_EQ(8000, reinterpret_cast<SignedMultiply>(entry)()); | 344 EXPECT_EQ(8000, reinterpret_cast<SignedMultiply>(entry)()); |
269 } | 345 } |
270 | 346 |
271 | 347 |
| 348 ASSEMBLER_TEST_GENERATE(SignedMultiply64, assembler) { |
| 349 __ movq(RAX, Immediate(2)); |
| 350 __ movq(RCX, Immediate(4)); |
| 351 __ imulq(RAX, RCX); |
| 352 __ movq(R8, Immediate(2)); |
| 353 __ movq(R9, Immediate(4)); |
| 354 __ imulq(R8, R9); |
| 355 __ addq(RAX, R8); |
| 356 __ ret(); |
| 357 } |
| 358 |
| 359 |
| 360 ASSEMBLER_TEST_RUN(SignedMultiply64, entry) { |
| 361 typedef int64_t (*SignedMultiply64)(); |
| 362 EXPECT_EQ(16, reinterpret_cast<SignedMultiply64>(entry)()); |
| 363 } |
| 364 |
| 365 |
272 static const int64_t kLargeConstant = 0x1234567887654321; | 366 static const int64_t kLargeConstant = 0x1234567887654321; |
273 static const int64_t kAnotherLargeConstant = 987654321987654321LL; | 367 static const int64_t kAnotherLargeConstant = 987654321987654321LL; |
274 static const int64_t kProductLargeConstants = 0x5bbb29a7f52fbbd1; | 368 static const int64_t kProductLargeConstants = 0x5bbb29a7f52fbbd1; |
275 | 369 |
276 | 370 |
277 ASSEMBLER_TEST_GENERATE(SignedMultiplyLong, assembler) { | 371 ASSEMBLER_TEST_GENERATE(SignedMultiplyLong, assembler) { |
278 __ movq(RAX, Immediate(kLargeConstant)); | 372 __ movq(RAX, Immediate(kLargeConstant)); |
279 __ movq(RCX, Immediate(kAnotherLargeConstant)); | 373 __ movq(RCX, Immediate(kAnotherLargeConstant)); |
280 __ imulq(RAX, RCX); | 374 __ imulq(RAX, RCX); |
281 __ ret(); | 375 __ ret(); |
(...skipping 751 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1033 | 1127 |
1034 ASSEMBLER_TEST_RUN(TestObjectCompare, entry) { | 1128 ASSEMBLER_TEST_RUN(TestObjectCompare, entry) { |
1035 typedef bool (*TestObjectCompare)(); | 1129 typedef bool (*TestObjectCompare)(); |
1036 bool res = reinterpret_cast<TestObjectCompare>(entry)(); | 1130 bool res = reinterpret_cast<TestObjectCompare>(entry)(); |
1037 EXPECT_EQ(true, res); | 1131 EXPECT_EQ(true, res); |
1038 } | 1132 } |
1039 | 1133 |
1040 } // namespace dart | 1134 } // namespace dart |
1041 | 1135 |
1042 #endif // defined TARGET_ARCH_X64 | 1136 #endif // defined TARGET_ARCH_X64 |
OLD | NEW |