Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(267)

Side by Side Diff: runtime/vm/assembler_x64_test.cc

Issue 12260026: Add support for object pool (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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"
11 #include "vm/virtual_memory.h" 11 #include "vm/virtual_memory.h"
12 12
13 namespace dart { 13 namespace dart {
14 14
15 #define __ assembler-> 15 #define __ assembler->
16 16
17 17
18 ASSEMBLER_TEST_GENERATE(ReadArgument, assembler) { 18 ASSEMBLER_TEST_GENERATE(ReadArgument, assembler) {
19 __ pushq(RDI); // First argument is passed in register rdi. 19 __ pushq(RDI); // First argument is passed in register rdi.
20 __ movq(RAX, Address(RSP, 0)); 20 __ movq(RAX, Address(RSP, 0));
21 __ popq(RDX); 21 __ popq(RDX);
22 __ ret(); 22 __ ret();
23 } 23 }
24 24
25 25
26 ASSEMBLER_TEST_RUN(ReadArgument, entry) { 26 ASSEMBLER_TEST_RUN(ReadArgument, test) {
27 typedef int64_t (*ReadArgumentCode)(int64_t n); 27 typedef int64_t (*ReadArgumentCode)(int64_t n);
28 ReadArgumentCode id = reinterpret_cast<ReadArgumentCode>(entry); 28 ReadArgumentCode id = reinterpret_cast<ReadArgumentCode>(test->entry());
29 EXPECT_EQ(42, id(42)); 29 EXPECT_EQ(42, id(42));
30 EXPECT_EQ(87, id(87)); 30 EXPECT_EQ(87, id(87));
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));
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 __ movq(RAX, Address(R12, R13, TIMES_2, 256 * kWordSize)); 196 __ movq(RAX, Address(R12, R13, TIMES_2, 256 * kWordSize));
197 197
198 __ movq(RAX, Address(R13, RBP, TIMES_2, 256 * kWordSize)); 198 __ movq(RAX, Address(R13, RBP, TIMES_2, 256 * kWordSize));
199 __ movq(RAX, Address(R13, RAX, TIMES_2, 256 * kWordSize)); 199 __ movq(RAX, Address(R13, RAX, TIMES_2, 256 * kWordSize));
200 __ movq(RAX, Address(R13, R10, TIMES_2, 256 * kWordSize)); 200 __ movq(RAX, Address(R13, R10, TIMES_2, 256 * kWordSize));
201 __ movq(RAX, Address(R13, R12, TIMES_2, 256 * kWordSize)); 201 __ movq(RAX, Address(R13, R12, TIMES_2, 256 * kWordSize));
202 __ movq(RAX, Address(R13, R13, TIMES_2, 256 * kWordSize)); 202 __ movq(RAX, Address(R13, R13, TIMES_2, 256 * kWordSize));
203 } 203 }
204 204
205 205
206 ASSEMBLER_TEST_RUN(AddressingModes, entry) { 206 ASSEMBLER_TEST_RUN(AddressingModes, test) {
207 // 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.
208 } 208 }
209 209
210 210
211 ASSEMBLER_TEST_GENERATE(JumpAroundCrash, assembler) { 211 ASSEMBLER_TEST_GENERATE(JumpAroundCrash, assembler) {
212 Label done; 212 Label done;
213 // Make sure all the condition jumps work. 213 // Make sure all the condition jumps work.
214 for (Condition condition = OVERFLOW; 214 for (Condition condition = OVERFLOW;
215 condition <= GREATER; 215 condition <= GREATER;
216 condition = static_cast<Condition>(condition + 1)) { 216 condition = static_cast<Condition>(condition + 1)) {
217 __ j(condition, &done); 217 __ j(condition, &done);
218 } 218 }
219 // This isn't strictly necessary, but we do an unconditional 219 // This isn't strictly necessary, but we do an unconditional
220 // jump around the crashing code anyway. 220 // jump around the crashing code anyway.
221 __ jmp(&done); 221 __ jmp(&done);
222 222
223 // Be sure to skip this crashing code. 223 // Be sure to skip this crashing code.
224 __ movq(RAX, Immediate(0)); 224 __ movq(RAX, Immediate(0));
225 __ movq(Address(RAX, 0), RAX); 225 __ movq(Address(RAX, 0), RAX);
226 226
227 __ Bind(&done); 227 __ Bind(&done);
228 __ ret(); 228 __ ret();
229 } 229 }
230 230
231 231
232 ASSEMBLER_TEST_RUN(JumpAroundCrash, entry) { 232 ASSEMBLER_TEST_RUN(JumpAroundCrash, test) {
233 Instr* instr = Instr::At(entry); 233 Instr* instr = Instr::At(test->entry());
234 EXPECT(!instr->IsBreakPoint()); 234 EXPECT(!instr->IsBreakPoint());
235 typedef void (*JumpAroundCrashCode)(); 235 typedef void (*JumpAroundCrashCode)();
236 reinterpret_cast<JumpAroundCrashCode>(entry)(); 236 reinterpret_cast<JumpAroundCrashCode>(test->entry())();
237 } 237 }
238 238
239 239
240 ASSEMBLER_TEST_GENERATE(SimpleLoop, assembler) { 240 ASSEMBLER_TEST_GENERATE(SimpleLoop, assembler) {
241 __ movq(RAX, Immediate(0)); 241 __ movq(RAX, Immediate(0));
242 __ movq(RCX, Immediate(0)); 242 __ movq(RCX, Immediate(0));
243 Label loop; 243 Label loop;
244 __ Bind(&loop); 244 __ Bind(&loop);
245 __ addq(RAX, Immediate(2)); 245 __ addq(RAX, Immediate(2));
246 __ incq(RCX); 246 __ incq(RCX);
247 __ cmpq(RCX, Immediate(87)); 247 __ cmpq(RCX, Immediate(87));
248 __ j(LESS, &loop); 248 __ j(LESS, &loop);
249 __ ret(); 249 __ ret();
250 } 250 }
251 251
252 252
253 ASSEMBLER_TEST_RUN(SimpleLoop, entry) { 253 ASSEMBLER_TEST_RUN(SimpleLoop, test) {
254 typedef int (*SimpleLoopCode)(); 254 typedef int (*SimpleLoopCode)();
255 EXPECT_EQ(2 * 87, reinterpret_cast<SimpleLoopCode>(entry)()); 255 EXPECT_EQ(2 * 87, reinterpret_cast<SimpleLoopCode>(test->entry())());
256 } 256 }
257 257
258 258
259 ASSEMBLER_TEST_GENERATE(Increment, assembler) { 259 ASSEMBLER_TEST_GENERATE(Increment, assembler) {
260 __ movq(RAX, Immediate(0)); 260 __ movq(RAX, Immediate(0));
261 __ pushq(RAX); 261 __ pushq(RAX);
262 __ incl(Address(RSP, 0)); 262 __ incl(Address(RSP, 0));
263 __ incq(Address(RSP, 0)); 263 __ incq(Address(RSP, 0));
264 __ movq(RCX, Address(RSP, 0)); 264 __ movq(RCX, Address(RSP, 0));
265 __ incq(RCX); 265 __ incq(RCX);
266 __ popq(RAX); 266 __ popq(RAX);
267 __ movq(RAX, RCX); 267 __ movq(RAX, RCX);
268 __ ret(); 268 __ ret();
269 } 269 }
270 270
271 271
272 ASSEMBLER_TEST_RUN(Increment, entry) { 272 ASSEMBLER_TEST_RUN(Increment, test) {
273 typedef int (*IncrementCode)(); 273 typedef int (*IncrementCode)();
274 EXPECT_EQ(3, reinterpret_cast<IncrementCode>(entry)()); 274 EXPECT_EQ(3, reinterpret_cast<IncrementCode>(test->entry())());
275 } 275 }
276 276
277 277
278 ASSEMBLER_TEST_GENERATE(IncrementLong, assembler) { 278 ASSEMBLER_TEST_GENERATE(IncrementLong, assembler) {
279 __ movq(RAX, Immediate(0xffffffff)); 279 __ movq(RAX, Immediate(0xffffffff));
280 __ pushq(RAX); 280 __ pushq(RAX);
281 __ incq(Address(RSP, 0)); 281 __ incq(Address(RSP, 0));
282 __ movq(RCX, Address(RSP, 0)); 282 __ movq(RCX, Address(RSP, 0));
283 __ incq(RCX); 283 __ incq(RCX);
284 __ popq(RAX); 284 __ popq(RAX);
285 __ movq(RAX, RCX); 285 __ movq(RAX, RCX);
286 __ ret(); 286 __ ret();
287 } 287 }
288 288
289 289
290 ASSEMBLER_TEST_RUN(IncrementLong, entry) { 290 ASSEMBLER_TEST_RUN(IncrementLong, test) {
291 typedef int64_t (*IncrementCodeLong)(); 291 typedef int64_t (*IncrementCodeLong)();
292 EXPECT_EQ(0x100000001, reinterpret_cast<IncrementCodeLong>(entry)()); 292 EXPECT_EQ(0x100000001, reinterpret_cast<IncrementCodeLong>(test->entry())());
293 } 293 }
294 294
295 295
296 ASSEMBLER_TEST_GENERATE(Decrement, assembler) { 296 ASSEMBLER_TEST_GENERATE(Decrement, assembler) {
297 __ movq(RAX, Immediate(3)); 297 __ movq(RAX, Immediate(3));
298 __ pushq(RAX); 298 __ pushq(RAX);
299 __ decl(Address(RSP, 0)); 299 __ decl(Address(RSP, 0));
300 __ decq(Address(RSP, 0)); 300 __ decq(Address(RSP, 0));
301 __ movq(RCX, Address(RSP, 0)); 301 __ movq(RCX, Address(RSP, 0));
302 __ decq(RCX); 302 __ decq(RCX);
303 __ popq(RAX); 303 __ popq(RAX);
304 __ movq(RAX, RCX); 304 __ movq(RAX, RCX);
305 __ ret(); 305 __ ret();
306 } 306 }
307 307
308 308
309 ASSEMBLER_TEST_RUN(Decrement, entry) { 309 ASSEMBLER_TEST_RUN(Decrement, test) {
310 typedef int (*DecrementCode)(); 310 typedef int (*DecrementCode)();
311 EXPECT_EQ(0, reinterpret_cast<DecrementCode>(entry)()); 311 EXPECT_EQ(0, reinterpret_cast<DecrementCode>(test->entry())());
312 } 312 }
313 313
314 314
315 ASSEMBLER_TEST_GENERATE(DecrementLong, assembler) { 315 ASSEMBLER_TEST_GENERATE(DecrementLong, assembler) {
316 __ movq(RAX, Immediate(0x100000001)); 316 __ movq(RAX, Immediate(0x100000001));
317 __ pushq(RAX); 317 __ pushq(RAX);
318 __ decq(Address(RSP, 0)); 318 __ decq(Address(RSP, 0));
319 __ movq(RCX, Address(RSP, 0)); 319 __ movq(RCX, Address(RSP, 0));
320 __ decq(RCX); 320 __ decq(RCX);
321 __ popq(RAX); 321 __ popq(RAX);
322 __ movq(RAX, RCX); 322 __ movq(RAX, RCX);
323 __ ret(); 323 __ ret();
324 } 324 }
325 325
326 326
327 ASSEMBLER_TEST_RUN(DecrementLong, entry) { 327 ASSEMBLER_TEST_RUN(DecrementLong, test) {
328 typedef int64_t (*DecrementCodeLong)(); 328 typedef int64_t (*DecrementCodeLong)();
329 EXPECT_EQ(0xffffffff, reinterpret_cast<DecrementCodeLong>(entry)()); 329 EXPECT_EQ(0xffffffff, reinterpret_cast<DecrementCodeLong>(test->entry())());
330 } 330 }
331 331
332 332
333 ASSEMBLER_TEST_GENERATE(SignedMultiply, assembler) { 333 ASSEMBLER_TEST_GENERATE(SignedMultiply, assembler) {
334 __ movl(RAX, Immediate(2)); 334 __ movl(RAX, Immediate(2));
335 __ movl(RCX, Immediate(4)); 335 __ movl(RCX, Immediate(4));
336 __ imull(RAX, RCX); 336 __ imull(RAX, RCX);
337 __ imull(RAX, Immediate(1000)); 337 __ imull(RAX, Immediate(1000));
338 __ ret(); 338 __ ret();
339 } 339 }
340 340
341 341
342 ASSEMBLER_TEST_RUN(SignedMultiply, entry) { 342 ASSEMBLER_TEST_RUN(SignedMultiply, test) {
343 typedef int (*SignedMultiply)(); 343 typedef int (*SignedMultiply)();
344 EXPECT_EQ(8000, reinterpret_cast<SignedMultiply>(entry)()); 344 EXPECT_EQ(8000, reinterpret_cast<SignedMultiply>(test->entry())());
345 } 345 }
346 346
347 347
348 ASSEMBLER_TEST_GENERATE(SignedMultiply64, assembler) { 348 ASSEMBLER_TEST_GENERATE(SignedMultiply64, assembler) {
349 __ pushq(R15); // Callee saved. 349 __ pushq(R15); // Callee saved.
350 __ movq(RAX, Immediate(2)); 350 __ movq(RAX, Immediate(2));
351 __ movq(RCX, Immediate(4)); 351 __ movq(RCX, Immediate(4));
352 __ imulq(RAX, RCX); 352 __ imulq(RAX, RCX);
353 353
354 __ movq(R8, Immediate(2)); 354 __ movq(R8, Immediate(2));
355 __ movq(R9, Immediate(4)); 355 __ movq(R9, Immediate(4));
356 __ pushq(R9); 356 __ pushq(R9);
357 __ imulq(R8, Address(RSP, 0)); 357 __ imulq(R8, Address(RSP, 0));
358 __ popq(R9); 358 __ popq(R9);
359 __ addq(RAX, R8); 359 __ addq(RAX, R8);
360 360
361 __ movq(R10, Immediate(2)); 361 __ movq(R10, Immediate(2));
362 __ movq(R11, Immediate(4)); 362 __ movq(R11, Immediate(4));
363 __ imulq(R10, R11); 363 __ imulq(R10, R11);
364 __ addq(RAX, R10); 364 __ addq(RAX, R10);
365 365
366 __ movq(R15, Immediate(2)); 366 __ movq(R15, Immediate(2));
367 __ imulq(R15, Immediate(4)); 367 __ imulq(R15, Immediate(4));
368 __ addq(RAX, R15); 368 __ addq(RAX, R15);
369 __ popq(R15); 369 __ popq(R15);
370 __ ret(); 370 __ ret();
371 } 371 }
372 372
373 373
374 ASSEMBLER_TEST_RUN(SignedMultiply64, entry) { 374 ASSEMBLER_TEST_RUN(SignedMultiply64, test) {
375 typedef int64_t (*SignedMultiply64)(); 375 typedef int64_t (*SignedMultiply64)();
376 EXPECT_EQ(32, reinterpret_cast<SignedMultiply64>(entry)()); 376 EXPECT_EQ(32, reinterpret_cast<SignedMultiply64>(test->entry())());
377 } 377 }
378 378
379 379
380 static const int64_t kLargeConstant = 0x1234567887654321; 380 static const int64_t kLargeConstant = 0x1234567887654321;
381 static const int64_t kAnotherLargeConstant = 987654321987654321LL; 381 static const int64_t kAnotherLargeConstant = 987654321987654321LL;
382 static const int64_t kProductLargeConstants = 0x5bbb29a7f52fbbd1; 382 static const int64_t kProductLargeConstants = 0x5bbb29a7f52fbbd1;
383 383
384 384
385 ASSEMBLER_TEST_GENERATE(SignedMultiplyLong, assembler) { 385 ASSEMBLER_TEST_GENERATE(SignedMultiplyLong, assembler) {
386 Label done; 386 Label done;
387 __ movq(RAX, Immediate(kLargeConstant)); 387 __ movq(RAX, Immediate(kLargeConstant));
388 __ movq(RCX, Immediate(kAnotherLargeConstant)); 388 __ movq(RCX, Immediate(kAnotherLargeConstant));
389 __ imulq(RAX, RCX); 389 __ imulq(RAX, RCX);
390 __ imulq(RCX, Immediate(kLargeConstant)); 390 __ imulq(RCX, Immediate(kLargeConstant));
391 __ cmpq(RAX, RCX); 391 __ cmpq(RAX, RCX);
392 __ j(EQUAL, &done); 392 __ j(EQUAL, &done);
393 __ int3(); 393 __ int3();
394 __ Bind(&done); 394 __ Bind(&done);
395 __ ret(); 395 __ ret();
396 } 396 }
397 397
398 398
399 ASSEMBLER_TEST_RUN(SignedMultiplyLong, entry) { 399 ASSEMBLER_TEST_RUN(SignedMultiplyLong, test) {
400 typedef int64_t (*SignedMultiplyLong)(); 400 typedef int64_t (*SignedMultiplyLong)();
401 EXPECT_EQ(kProductLargeConstants, 401 EXPECT_EQ(kProductLargeConstants,
402 reinterpret_cast<SignedMultiplyLong>(entry)()); 402 reinterpret_cast<SignedMultiplyLong>(test->entry())());
403 } 403 }
404 404
405 405
406 ASSEMBLER_TEST_GENERATE(OverflowSignedMultiply, assembler) { 406 ASSEMBLER_TEST_GENERATE(OverflowSignedMultiply, assembler) {
407 __ movl(RDX, Immediate(0)); 407 __ movl(RDX, Immediate(0));
408 __ movl(RAX, Immediate(0x0fffffff)); 408 __ movl(RAX, Immediate(0x0fffffff));
409 __ movl(RCX, Immediate(0x0fffffff)); 409 __ movl(RCX, Immediate(0x0fffffff));
410 __ imull(RAX, RCX); 410 __ imull(RAX, RCX);
411 __ imull(RAX, RDX); 411 __ imull(RAX, RDX);
412 __ ret(); 412 __ ret();
413 } 413 }
414 414
415 415
416 ASSEMBLER_TEST_RUN(OverflowSignedMultiply, entry) { 416 ASSEMBLER_TEST_RUN(OverflowSignedMultiply, test) {
417 typedef int (*OverflowSignedMultiply)(); 417 typedef int (*OverflowSignedMultiply)();
418 EXPECT_EQ(0, reinterpret_cast<OverflowSignedMultiply>(entry)()); 418 EXPECT_EQ(0, reinterpret_cast<OverflowSignedMultiply>(test->entry())());
419 } 419 }
420 420
421 421
422 ASSEMBLER_TEST_GENERATE(SignedMultiply1, assembler) { 422 ASSEMBLER_TEST_GENERATE(SignedMultiply1, assembler) {
423 __ movl(RDX, Immediate(2)); 423 __ movl(RDX, Immediate(2));
424 __ movl(RCX, Immediate(4)); 424 __ movl(RCX, Immediate(4));
425 __ imull(RDX, RCX); 425 __ imull(RDX, RCX);
426 __ imull(RDX, Immediate(1000)); 426 __ imull(RDX, Immediate(1000));
427 __ movl(RAX, RDX); 427 __ movl(RAX, RDX);
428 __ ret(); 428 __ ret();
429 } 429 }
430 430
431 431
432 ASSEMBLER_TEST_RUN(SignedMultiply1, entry) { 432 ASSEMBLER_TEST_RUN(SignedMultiply1, test) {
433 typedef int (*SignedMultiply1)(); 433 typedef int (*SignedMultiply1)();
434 EXPECT_EQ(8000, reinterpret_cast<SignedMultiply1>(entry)()); 434 EXPECT_EQ(8000, reinterpret_cast<SignedMultiply1>(test->entry())());
435 } 435 }
436 436
437 437
438 ASSEMBLER_TEST_GENERATE(SignedMultiply2, assembler) { 438 ASSEMBLER_TEST_GENERATE(SignedMultiply2, assembler) {
439 __ pushq(R15); // Callee saved. 439 __ pushq(R15); // Callee saved.
440 __ movl(R15, Immediate(2)); 440 __ movl(R15, Immediate(2));
441 __ imull(R15, Immediate(1000)); 441 __ imull(R15, Immediate(1000));
442 __ movl(RAX, R15); 442 __ movl(RAX, R15);
443 __ popq(R15); 443 __ popq(R15);
444 __ ret(); 444 __ ret();
445 } 445 }
446 446
447 447
448 ASSEMBLER_TEST_RUN(SignedMultiply2, entry) { 448 ASSEMBLER_TEST_RUN(SignedMultiply2, test) {
449 typedef int (*SignedMultiply2)(); 449 typedef int (*SignedMultiply2)();
450 EXPECT_EQ(2000, reinterpret_cast<SignedMultiply2>(entry)()); 450 EXPECT_EQ(2000, reinterpret_cast<SignedMultiply2>(test->entry())());
451 } 451 }
452 452
453 453
454 ASSEMBLER_TEST_GENERATE(SignedDivide, assembler) { 454 ASSEMBLER_TEST_GENERATE(SignedDivide, assembler) {
455 __ movl(RAX, Immediate(-87)); 455 __ movl(RAX, Immediate(-87));
456 __ movl(RDX, Immediate(123)); 456 __ movl(RDX, Immediate(123));
457 __ cdq(); 457 __ cdq();
458 __ movl(RCX, Immediate(42)); 458 __ movl(RCX, Immediate(42));
459 __ idivl(RCX); 459 __ idivl(RCX);
460 __ ret(); 460 __ ret();
461 } 461 }
462 462
463 463
464 ASSEMBLER_TEST_RUN(SignedDivide, entry) { 464 ASSEMBLER_TEST_RUN(SignedDivide, test) {
465 typedef int32_t (*SignedDivide)(); 465 typedef int32_t (*SignedDivide)();
466 EXPECT_EQ(-87 / 42, reinterpret_cast<SignedDivide>(entry)()); 466 EXPECT_EQ(-87 / 42, reinterpret_cast<SignedDivide>(test->entry())());
467 } 467 }
468 468
469 469
470 ASSEMBLER_TEST_GENERATE(SignedDivideLong, assembler) { 470 ASSEMBLER_TEST_GENERATE(SignedDivideLong, assembler) {
471 __ movq(RAX, Immediate(kLargeConstant)); 471 __ movq(RAX, Immediate(kLargeConstant));
472 __ movq(RDX, Immediate(123)); 472 __ movq(RDX, Immediate(123));
473 __ cqo(); // Clear RDX. 473 __ cqo(); // Clear RDX.
474 __ movq(RCX, Immediate(42)); 474 __ movq(RCX, Immediate(42));
475 __ idivq(RCX); 475 __ idivq(RCX);
476 __ ret(); 476 __ ret();
477 } 477 }
478 478
479 479
480 ASSEMBLER_TEST_RUN(SignedDivideLong, entry) { 480 ASSEMBLER_TEST_RUN(SignedDivideLong, test) {
481 typedef int64_t (*SignedDivideLong)(); 481 typedef int64_t (*SignedDivideLong)();
482 EXPECT_EQ(kLargeConstant / 42, reinterpret_cast<SignedDivideLong>(entry)()); 482 EXPECT_EQ(kLargeConstant / 42,
483 reinterpret_cast<SignedDivideLong>(test->entry())());
483 } 484 }
484 485
485 486
486 ASSEMBLER_TEST_GENERATE(Negate, assembler) { 487 ASSEMBLER_TEST_GENERATE(Negate, assembler) {
487 __ movl(RCX, Immediate(42)); 488 __ movl(RCX, Immediate(42));
488 __ negl(RCX); 489 __ negl(RCX);
489 __ movl(RAX, RCX); 490 __ movl(RAX, RCX);
490 __ ret(); 491 __ ret();
491 } 492 }
492 493
493 494
494 ASSEMBLER_TEST_RUN(Negate, entry) { 495 ASSEMBLER_TEST_RUN(Negate, test) {
495 typedef int (*Negate)(); 496 typedef int (*Negate)();
496 EXPECT_EQ(-42, reinterpret_cast<Negate>(entry)()); 497 EXPECT_EQ(-42, reinterpret_cast<Negate>(test->entry())());
497 } 498 }
498 499
499 500
500 ASSEMBLER_TEST_GENERATE(MoveExtend, assembler) { 501 ASSEMBLER_TEST_GENERATE(MoveExtend, assembler) {
501 __ movq(RDX, Immediate(0xffff)); 502 __ movq(RDX, Immediate(0xffff));
502 __ movzxb(RAX, RDX); // RAX = 0xff 503 __ movzxb(RAX, RDX); // RAX = 0xff
503 __ movsxw(R8, RDX); // R8 = -1 504 __ movsxw(R8, RDX); // R8 = -1
504 __ movzxw(RCX, RDX); // RCX = 0xffff 505 __ movzxw(RCX, RDX); // RCX = 0xffff
505 __ addq(R8, RCX); 506 __ addq(R8, RCX);
506 __ addq(RAX, R8); 507 __ addq(RAX, R8);
507 __ ret(); 508 __ ret();
508 } 509 }
509 510
510 511
511 ASSEMBLER_TEST_RUN(MoveExtend, entry) { 512 ASSEMBLER_TEST_RUN(MoveExtend, test) {
512 typedef int (*MoveExtend)(); 513 typedef int (*MoveExtend)();
513 EXPECT_EQ(0xff - 1 + 0xffff, reinterpret_cast<MoveExtend>(entry)()); 514 EXPECT_EQ(0xff - 1 + 0xffff, reinterpret_cast<MoveExtend>(test->entry())());
514 } 515 }
515 516
516 517
517 ASSEMBLER_TEST_GENERATE(MoveExtendMemory, assembler) { 518 ASSEMBLER_TEST_GENERATE(MoveExtendMemory, assembler) {
518 __ movq(RDX, Immediate(0x123456781234ffff)); 519 __ movq(RDX, Immediate(0x123456781234ffff));
519 520
520 __ pushq(RDX); 521 __ pushq(RDX);
521 __ movzxb(RAX, Address(RSP, 0)); // RAX = 0xff 522 __ movzxb(RAX, Address(RSP, 0)); // RAX = 0xff
522 __ movsxw(R8, Address(RSP, 0)); // R8 = -1 523 __ movsxw(R8, Address(RSP, 0)); // R8 = -1
523 __ movzxw(RCX, Address(RSP, 0)); // RCX = 0xffff 524 __ movzxw(RCX, Address(RSP, 0)); // RCX = 0xffff
524 __ addq(RSP, Immediate(kWordSize)); 525 __ addq(RSP, Immediate(kWordSize));
525 526
526 __ addq(R8, RCX); 527 __ addq(R8, RCX);
527 __ addq(RAX, R8); 528 __ addq(RAX, R8);
528 __ ret(); 529 __ ret();
529 } 530 }
530 531
531 532
532 ASSEMBLER_TEST_RUN(MoveExtendMemory, entry) { 533 ASSEMBLER_TEST_RUN(MoveExtendMemory, test) {
533 typedef int (*MoveExtendMemory)(); 534 typedef int (*MoveExtendMemory)();
534 EXPECT_EQ(0xff - 1 + 0xffff, reinterpret_cast<MoveExtendMemory>(entry)()); 535 EXPECT_EQ(0xff - 1 + 0xffff,
536 reinterpret_cast<MoveExtendMemory>(test->entry())());
535 } 537 }
536 538
537 539
538 ASSEMBLER_TEST_GENERATE(MoveWord, assembler) { 540 ASSEMBLER_TEST_GENERATE(MoveWord, assembler) {
539 __ xorq(RAX, RAX); 541 __ xorq(RAX, RAX);
540 __ pushq(Immediate(0)); 542 __ pushq(Immediate(0));
541 __ movq(RAX, RSP); 543 __ movq(RAX, RSP);
542 __ movq(RCX, Immediate(-1)); 544 __ movq(RCX, Immediate(-1));
543 __ movw(Address(RAX, 0), RCX); 545 __ movw(Address(RAX, 0), RCX);
544 __ movzxw(RAX, Address(RAX, 0)); // RAX = 0xffff 546 __ movzxw(RAX, Address(RAX, 0)); // RAX = 0xffff
545 __ addq(RSP, Immediate(kWordSize)); 547 __ addq(RSP, Immediate(kWordSize));
546 __ ret(); 548 __ ret();
547 } 549 }
548 550
549 551
550 ASSEMBLER_TEST_RUN(MoveWord, entry) { 552 ASSEMBLER_TEST_RUN(MoveWord, test) {
551 typedef int (*MoveWord)(); 553 typedef int (*MoveWord)();
552 EXPECT_EQ(0xffff, reinterpret_cast<MoveWord>(entry)()); 554 EXPECT_EQ(0xffff, reinterpret_cast<MoveWord>(test->entry())());
553 } 555 }
554 556
555 557
556 ASSEMBLER_TEST_GENERATE(MoveWordRex, assembler) { 558 ASSEMBLER_TEST_GENERATE(MoveWordRex, assembler) {
557 __ pushq(Immediate(0)); 559 __ pushq(Immediate(0));
558 __ movq(R8, RSP); 560 __ movq(R8, RSP);
559 __ movq(R9, Immediate(-1)); 561 __ movq(R9, Immediate(-1));
560 __ movw(Address(R8, 0), R9); 562 __ movw(Address(R8, 0), R9);
561 __ movzxw(R8, Address(R8, 0)); // 0xffff 563 __ movzxw(R8, Address(R8, 0)); // 0xffff
562 __ xorq(RAX, RAX); 564 __ xorq(RAX, RAX);
563 __ addq(RAX, R8); // RAX = 0xffff 565 __ addq(RAX, R8); // RAX = 0xffff
564 __ addq(RSP, Immediate(kWordSize)); 566 __ addq(RSP, Immediate(kWordSize));
565 __ ret(); 567 __ ret();
566 } 568 }
567 569
568 570
569 ASSEMBLER_TEST_RUN(MoveWordRex, entry) { 571 ASSEMBLER_TEST_RUN(MoveWordRex, test) {
570 typedef int (*MoveWordRex)(); 572 typedef int (*MoveWordRex)();
571 EXPECT_EQ(0xffff, reinterpret_cast<MoveWordRex>(entry)()); 573 EXPECT_EQ(0xffff, reinterpret_cast<MoveWordRex>(test->entry())());
572 } 574 }
573 575
574 576
575 ASSEMBLER_TEST_GENERATE(Bitwise, assembler) { 577 ASSEMBLER_TEST_GENERATE(Bitwise, assembler) {
576 __ movl(RCX, Immediate(42)); 578 __ movl(RCX, Immediate(42));
577 __ xorl(RCX, RCX); 579 __ xorl(RCX, RCX);
578 __ orl(RCX, Immediate(256)); 580 __ orl(RCX, Immediate(256));
579 __ movl(RAX, Immediate(4)); 581 __ movl(RAX, Immediate(4));
580 __ orl(RCX, RAX); 582 __ orl(RCX, RAX);
581 __ movl(RAX, Immediate(0xfff0)); 583 __ movl(RAX, Immediate(0xfff0));
582 __ andl(RCX, RAX); 584 __ andl(RCX, RAX);
583 __ movl(RAX, Immediate(1)); 585 __ movl(RAX, Immediate(1));
584 __ orl(RCX, RAX); 586 __ orl(RCX, RAX);
585 __ movl(RAX, RCX); 587 __ movl(RAX, RCX);
586 __ ret(); 588 __ ret();
587 } 589 }
588 590
589 591
590 ASSEMBLER_TEST_RUN(Bitwise, entry) { 592 ASSEMBLER_TEST_RUN(Bitwise, test) {
591 typedef int (*Bitwise)(); 593 typedef int (*Bitwise)();
592 EXPECT_EQ(256 + 1, reinterpret_cast<Bitwise>(entry)()); 594 EXPECT_EQ(256 + 1, reinterpret_cast<Bitwise>(test->entry())());
593 } 595 }
594 596
595 597
596 ASSEMBLER_TEST_GENERATE(Bitwise64, assembler) { 598 ASSEMBLER_TEST_GENERATE(Bitwise64, assembler) {
597 Label error; 599 Label error;
598 __ movq(RAX, Immediate(42)); 600 __ movq(RAX, Immediate(42));
599 __ pushq(RAX); 601 __ pushq(RAX);
600 __ xorq(RAX, Address(RSP, 0)); 602 __ xorq(RAX, Address(RSP, 0));
601 __ popq(RCX); 603 __ popq(RCX);
602 __ cmpq(RAX, Immediate(0)); 604 __ cmpq(RAX, Immediate(0));
(...skipping 21 matching lines...) Expand all
624 __ xorq(RCX, Immediate(0)); 626 __ xorq(RCX, Immediate(0));
625 __ popq(RAX); 627 __ popq(RAX);
626 __ movq(RAX, RCX); 628 __ movq(RAX, RCX);
627 __ ret(); 629 __ ret();
628 __ Bind(&error); 630 __ Bind(&error);
629 __ movq(RAX, Immediate(-1)); 631 __ movq(RAX, Immediate(-1));
630 __ ret(); 632 __ ret();
631 } 633 }
632 634
633 635
634 ASSEMBLER_TEST_RUN(Bitwise64, entry) { 636 ASSEMBLER_TEST_RUN(Bitwise64, test) {
635 typedef int (*Bitwise64)(); 637 typedef int (*Bitwise64)();
636 EXPECT_EQ(256 + 1, reinterpret_cast<Bitwise64>(entry)()); 638 EXPECT_EQ(256 + 1, reinterpret_cast<Bitwise64>(test->entry())());
637 } 639 }
638 640
639 641
640 ASSEMBLER_TEST_GENERATE(LogicalOps, assembler) { 642 ASSEMBLER_TEST_GENERATE(LogicalOps, assembler) {
641 Label donetest1; 643 Label donetest1;
642 __ movl(RAX, Immediate(4)); 644 __ movl(RAX, Immediate(4));
643 __ andl(RAX, Immediate(2)); 645 __ andl(RAX, Immediate(2));
644 __ cmpl(RAX, Immediate(0)); 646 __ cmpl(RAX, Immediate(0));
645 __ j(EQUAL, &donetest1); 647 __ j(EQUAL, &donetest1);
646 // Be sure to skip this crashing code. 648 // Be sure to skip this crashing code.
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
826 // Be sure to skip this crashing code. 828 // Be sure to skip this crashing code.
827 __ movl(RAX, Immediate(0)); 829 __ movl(RAX, Immediate(0));
828 __ movl(Address(RAX, 0), RAX); 830 __ movl(Address(RAX, 0), RAX);
829 __ Bind(&donetest13a); 831 __ Bind(&donetest13a);
830 832
831 __ movl(RAX, Immediate(0)); 833 __ movl(RAX, Immediate(0));
832 __ ret(); 834 __ ret();
833 } 835 }
834 836
835 837
836 ASSEMBLER_TEST_RUN(LogicalOps, entry) { 838 ASSEMBLER_TEST_RUN(LogicalOps, test) {
837 typedef int (*LogicalOpsCode)(); 839 typedef int (*LogicalOpsCode)();
838 EXPECT_EQ(0, reinterpret_cast<LogicalOpsCode>(entry)()); 840 EXPECT_EQ(0, reinterpret_cast<LogicalOpsCode>(test->entry())());
839 } 841 }
840 842
841 843
842 ASSEMBLER_TEST_GENERATE(LogicalOps64, assembler) { 844 ASSEMBLER_TEST_GENERATE(LogicalOps64, assembler) {
843 Label donetest1; 845 Label donetest1;
844 __ movq(RAX, Immediate(4)); 846 __ movq(RAX, Immediate(4));
845 __ andq(RAX, Immediate(2)); 847 __ andq(RAX, Immediate(2));
846 __ cmpq(RAX, Immediate(0)); 848 __ cmpq(RAX, Immediate(0));
847 __ j(EQUAL, &donetest1); 849 __ j(EQUAL, &donetest1);
848 __ int3(); 850 __ int3();
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
1016 __ j(EQUAL, &donetest15); 1018 __ j(EQUAL, &donetest15);
1017 __ int3(); 1019 __ int3();
1018 __ Bind(&donetest15); 1020 __ Bind(&donetest15);
1019 __ popq(R15); // Callee saved. 1021 __ popq(R15); // Callee saved.
1020 1022
1021 __ movq(RAX, Immediate(0)); 1023 __ movq(RAX, Immediate(0));
1022 __ ret(); 1024 __ ret();
1023 } 1025 }
1024 1026
1025 1027
1026 ASSEMBLER_TEST_RUN(LogicalOps64, entry) { 1028 ASSEMBLER_TEST_RUN(LogicalOps64, test) {
1027 typedef int (*LogicalOpsCode)(); 1029 typedef int (*LogicalOpsCode)();
1028 EXPECT_EQ(0, reinterpret_cast<LogicalOpsCode>(entry)()); 1030 EXPECT_EQ(0, reinterpret_cast<LogicalOpsCode>(test->entry())());
1029 } 1031 }
1030 1032
1031 1033
1032 ASSEMBLER_TEST_GENERATE(LogicalTestL, assembler) { 1034 ASSEMBLER_TEST_GENERATE(LogicalTestL, assembler) {
1033 Label donetest1; 1035 Label donetest1;
1034 __ movl(RAX, Immediate(4)); 1036 __ movl(RAX, Immediate(4));
1035 __ movl(RCX, Immediate(2)); 1037 __ movl(RCX, Immediate(2));
1036 __ testl(RAX, RCX); 1038 __ testl(RAX, RCX);
1037 __ j(EQUAL, &donetest1); 1039 __ j(EQUAL, &donetest1);
1038 // Be sure to skip this crashing code. 1040 // Be sure to skip this crashing code.
(...skipping 27 matching lines...) Expand all
1066 // Be sure to skip this crashing code. 1068 // Be sure to skip this crashing code.
1067 __ movl(RAX, Immediate(0)); 1069 __ movl(RAX, Immediate(0));
1068 __ movl(Address(RAX, 0), RAX); 1070 __ movl(Address(RAX, 0), RAX);
1069 __ Bind(&donetest4); 1071 __ Bind(&donetest4);
1070 1072
1071 __ movl(RAX, Immediate(0)); 1073 __ movl(RAX, Immediate(0));
1072 __ ret(); 1074 __ ret();
1073 } 1075 }
1074 1076
1075 1077
1076 ASSEMBLER_TEST_RUN(LogicalTestL, entry) { 1078 ASSEMBLER_TEST_RUN(LogicalTestL, test) {
1077 typedef int (*LogicalTestCode)(); 1079 typedef int (*LogicalTestCode)();
1078 EXPECT_EQ(0, reinterpret_cast<LogicalTestCode>(entry)()); 1080 EXPECT_EQ(0, reinterpret_cast<LogicalTestCode>(test->entry())());
1079 } 1081 }
1080 1082
1081 1083
1082 ASSEMBLER_TEST_GENERATE(LogicalTestQ, assembler) { 1084 ASSEMBLER_TEST_GENERATE(LogicalTestQ, assembler) {
1083 Label donetest1; 1085 Label donetest1;
1084 __ movq(RAX, Immediate(4)); 1086 __ movq(RAX, Immediate(4));
1085 __ movq(RCX, Immediate(2)); 1087 __ movq(RCX, Immediate(2));
1086 __ testq(RAX, RCX); 1088 __ testq(RAX, RCX);
1087 __ j(EQUAL, &donetest1); 1089 __ j(EQUAL, &donetest1);
1088 // Be sure to skip this crashing code. 1090 // Be sure to skip this crashing code.
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1134 // Be sure to skip this crashing code. 1136 // Be sure to skip this crashing code.
1135 __ movq(RAX, Immediate(0)); 1137 __ movq(RAX, Immediate(0));
1136 __ movq(Address(RAX, 0), RAX); 1138 __ movq(Address(RAX, 0), RAX);
1137 __ Bind(&donetest6); 1139 __ Bind(&donetest6);
1138 1140
1139 __ movq(RAX, Immediate(0)); 1141 __ movq(RAX, Immediate(0));
1140 __ ret(); 1142 __ ret();
1141 } 1143 }
1142 1144
1143 1145
1144 ASSEMBLER_TEST_RUN(LogicalTestQ, entry) { 1146 ASSEMBLER_TEST_RUN(LogicalTestQ, test) {
1145 typedef int (*LogicalTestCode)(); 1147 typedef int (*LogicalTestCode)();
1146 EXPECT_EQ(0, reinterpret_cast<LogicalTestCode>(entry)()); 1148 EXPECT_EQ(0, reinterpret_cast<LogicalTestCode>(test->entry())());
1147 } 1149 }
1148 1150
1149 1151
1150 ASSEMBLER_TEST_GENERATE(CompareSwapEQ, assembler) { 1152 ASSEMBLER_TEST_GENERATE(CompareSwapEQ, assembler) {
1151 __ movq(RAX, Immediate(0)); 1153 __ movq(RAX, Immediate(0));
1152 __ pushq(RAX); 1154 __ pushq(RAX);
1153 __ movq(RAX, Immediate(4)); 1155 __ movq(RAX, Immediate(4));
1154 __ movq(RCX, Immediate(0)); 1156 __ movq(RCX, Immediate(0));
1155 __ movq(Address(RSP, 0), RAX); 1157 __ movq(Address(RSP, 0), RAX);
1156 __ lock_cmpxchgq(Address(RSP, 0), RCX); 1158 __ lock_cmpxchgq(Address(RSP, 0), RCX);
1157 __ popq(RAX); 1159 __ popq(RAX);
1158 __ ret(); 1160 __ ret();
1159 } 1161 }
1160 1162
1161 1163
1162 ASSEMBLER_TEST_RUN(CompareSwapEQ, entry) { 1164 ASSEMBLER_TEST_RUN(CompareSwapEQ, test) {
1163 typedef int (*CompareSwapEQCode)(); 1165 typedef int (*CompareSwapEQCode)();
1164 EXPECT_EQ(0, reinterpret_cast<CompareSwapEQCode>(entry)()); 1166 EXPECT_EQ(0, reinterpret_cast<CompareSwapEQCode>(test->entry())());
1165 } 1167 }
1166 1168
1167 1169
1168 ASSEMBLER_TEST_GENERATE(CompareSwapNEQ, assembler) { 1170 ASSEMBLER_TEST_GENERATE(CompareSwapNEQ, assembler) {
1169 __ movq(RAX, Immediate(0)); 1171 __ movq(RAX, Immediate(0));
1170 __ pushq(RAX); 1172 __ pushq(RAX);
1171 __ movq(RAX, Immediate(2)); 1173 __ movq(RAX, Immediate(2));
1172 __ movq(RCX, Immediate(4)); 1174 __ movq(RCX, Immediate(4));
1173 __ movq(Address(RSP, 0), RCX); 1175 __ movq(Address(RSP, 0), RCX);
1174 __ lock_cmpxchgq(Address(RSP, 0), RCX); 1176 __ lock_cmpxchgq(Address(RSP, 0), RCX);
1175 __ popq(RAX); 1177 __ popq(RAX);
1176 __ ret(); 1178 __ ret();
1177 } 1179 }
1178 1180
1179 1181
1180 ASSEMBLER_TEST_RUN(CompareSwapNEQ, entry) { 1182 ASSEMBLER_TEST_RUN(CompareSwapNEQ, test) {
1181 typedef int (*CompareSwapNEQCode)(); 1183 typedef int (*CompareSwapNEQCode)();
1182 EXPECT_EQ(4, reinterpret_cast<CompareSwapNEQCode>(entry)()); 1184 EXPECT_EQ(4, reinterpret_cast<CompareSwapNEQCode>(test->entry())());
1183 } 1185 }
1184 1186
1185 1187
1186 ASSEMBLER_TEST_GENERATE(Exchange, assembler) { 1188 ASSEMBLER_TEST_GENERATE(Exchange, assembler) {
1187 __ movq(RAX, Immediate(kLargeConstant)); 1189 __ movq(RAX, Immediate(kLargeConstant));
1188 __ movq(RDX, Immediate(kAnotherLargeConstant)); 1190 __ movq(RDX, Immediate(kAnotherLargeConstant));
1189 __ xchgq(RAX, RDX); 1191 __ xchgq(RAX, RDX);
1190 __ subq(RAX, RDX); 1192 __ subq(RAX, RDX);
1191 __ ret(); 1193 __ ret();
1192 } 1194 }
1193 1195
1194 1196
1195 ASSEMBLER_TEST_RUN(Exchange, entry) { 1197 ASSEMBLER_TEST_RUN(Exchange, test) {
1196 typedef int64_t (*Exchange)(); 1198 typedef int64_t (*Exchange)();
1197 EXPECT_EQ(kAnotherLargeConstant - kLargeConstant, 1199 EXPECT_EQ(kAnotherLargeConstant - kLargeConstant,
1198 reinterpret_cast<Exchange>(entry)()); 1200 reinterpret_cast<Exchange>(test->entry())());
1199 } 1201 }
1200 1202
1201 1203
1202 ASSEMBLER_TEST_GENERATE(LargeConstant, assembler) { 1204 ASSEMBLER_TEST_GENERATE(LargeConstant, assembler) {
1203 __ movq(RAX, Immediate(kLargeConstant)); 1205 __ movq(RAX, Immediate(kLargeConstant));
1204 __ ret(); 1206 __ ret();
1205 } 1207 }
1206 1208
1207 1209
1208 ASSEMBLER_TEST_RUN(LargeConstant, entry) { 1210 ASSEMBLER_TEST_RUN(LargeConstant, test) {
1209 typedef int64_t (*LargeConstantCode)(); 1211 typedef int64_t (*LargeConstantCode)();
1210 EXPECT_EQ(kLargeConstant, reinterpret_cast<LargeConstantCode>(entry)()); 1212 EXPECT_EQ(kLargeConstant,
1213 reinterpret_cast<LargeConstantCode>(test->entry())());
1211 } 1214 }
1212 1215
1213 1216
1214 static int ComputeStackSpaceReservation(int needed, int fixed) { 1217 static int ComputeStackSpaceReservation(int needed, int fixed) {
1215 static const int kFrameAlignment = OS::ActivationFrameAlignment(); 1218 static const int kFrameAlignment = OS::ActivationFrameAlignment();
1216 return (kFrameAlignment > 0) 1219 return (kFrameAlignment > 0)
1217 ? Utils::RoundUp(needed + fixed, kFrameAlignment) - fixed 1220 ? Utils::RoundUp(needed + fixed, kFrameAlignment) - fixed
1218 : needed; 1221 : needed;
1219 } 1222 }
1220 1223
(...skipping 18 matching lines...) Expand all
1239 __ AddImmediate(RSP, Immediate(space)); 1242 __ AddImmediate(RSP, Immediate(space));
1240 space = ComputeStackSpaceReservation(0, 8); 1243 space = ComputeStackSpaceReservation(0, 8);
1241 __ AddImmediate(RSP, Immediate(-space)); 1244 __ AddImmediate(RSP, Immediate(-space));
1242 __ movl(RDI, RAX); 1245 __ movl(RDI, RAX);
1243 __ call(&call2); 1246 __ call(&call2);
1244 __ AddImmediate(RSP, Immediate(space)); 1247 __ AddImmediate(RSP, Immediate(space));
1245 __ ret(); 1248 __ ret();
1246 } 1249 }
1247 1250
1248 1251
1249 ASSEMBLER_TEST_RUN(CallSimpleLeaf, entry) { 1252 ASSEMBLER_TEST_RUN(CallSimpleLeaf, test) {
1250 typedef int (*CallSimpleLeafCode)(); 1253 typedef int (*CallSimpleLeafCode)();
1251 EXPECT_EQ(42 + 87, reinterpret_cast<CallSimpleLeafCode>(entry)()); 1254 EXPECT_EQ(42 + 87, reinterpret_cast<CallSimpleLeafCode>(test->entry())());
1252 } 1255 }
1253 1256
1254 1257
1255 ASSEMBLER_TEST_GENERATE(JumpSimpleLeaf, assembler) { 1258 ASSEMBLER_TEST_GENERATE(JumpSimpleLeaf, assembler) {
1256 ExternalLabel call1("LeafReturn42", reinterpret_cast<uword>(LeafReturn42)); 1259 ExternalLabel call1("LeafReturn42", reinterpret_cast<uword>(LeafReturn42));
1257 Label L; 1260 Label L;
1258 int space = ComputeStackSpaceReservation(0, 8); 1261 int space = ComputeStackSpaceReservation(0, 8);
1259 __ AddImmediate(RSP, Immediate(-space)); 1262 __ AddImmediate(RSP, Immediate(-space));
1260 __ call(&L); 1263 __ call(&L);
1261 __ AddImmediate(RSP, Immediate(space)); 1264 __ AddImmediate(RSP, Immediate(space));
1262 __ ret(); 1265 __ ret();
1263 __ Bind(&L); 1266 __ Bind(&L);
1264 __ jmp(&call1); 1267 __ jmp(&call1);
1265 } 1268 }
1266 1269
1267 1270
1268 ASSEMBLER_TEST_RUN(JumpSimpleLeaf, entry) { 1271 ASSEMBLER_TEST_RUN(JumpSimpleLeaf, test) {
1269 typedef int (*JumpSimpleLeafCode)(); 1272 typedef int (*JumpSimpleLeafCode)();
1270 EXPECT_EQ(42, reinterpret_cast<JumpSimpleLeafCode>(entry)()); 1273 EXPECT_EQ(42, reinterpret_cast<JumpSimpleLeafCode>(test->entry())());
1271 } 1274 }
1272 1275
1273 1276
1274 ASSEMBLER_TEST_GENERATE(SingleFPMoves, assembler) { 1277 ASSEMBLER_TEST_GENERATE(SingleFPMoves, assembler) {
1275 __ movq(RAX, Immediate(bit_cast<int32_t, float>(234.0f))); 1278 __ movq(RAX, Immediate(bit_cast<int32_t, float>(234.0f)));
1276 __ movd(XMM0, RAX); 1279 __ movd(XMM0, RAX);
1277 __ movss(XMM1, XMM0); 1280 __ movss(XMM1, XMM0);
1278 __ movss(XMM2, XMM1); 1281 __ movss(XMM2, XMM1);
1279 __ movss(XMM3, XMM2); 1282 __ movss(XMM3, XMM2);
1280 __ movss(XMM4, XMM3); 1283 __ movss(XMM4, XMM3);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1319 __ movss(XMM3, XMM4); 1322 __ movss(XMM3, XMM4);
1320 __ movss(XMM2, XMM3); 1323 __ movss(XMM2, XMM3);
1321 __ movss(XMM1, XMM2); 1324 __ movss(XMM1, XMM2);
1322 __ movss(XMM0, XMM1); 1325 __ movss(XMM0, XMM1);
1323 __ popq(RAX); 1326 __ popq(RAX);
1324 __ popq(R15); // Callee saved. 1327 __ popq(R15); // Callee saved.
1325 __ ret(); 1328 __ ret();
1326 } 1329 }
1327 1330
1328 1331
1329 ASSEMBLER_TEST_RUN(SingleFPMoves, entry) { 1332 ASSEMBLER_TEST_RUN(SingleFPMoves, test) {
1330 typedef float (*SingleFPMovesCode)(); 1333 typedef float (*SingleFPMovesCode)();
1331 EXPECT_EQ(234, reinterpret_cast<SingleFPMovesCode>(entry)()); 1334 EXPECT_EQ(234, reinterpret_cast<SingleFPMovesCode>(test->entry())());
1332 } 1335 }
1333 1336
1334 1337
1335 ASSEMBLER_TEST_GENERATE(SingleFPMoves2, assembler) { 1338 ASSEMBLER_TEST_GENERATE(SingleFPMoves2, assembler) {
1336 __ movq(RAX, Immediate(bit_cast<int32_t, float>(234.0f))); 1339 __ movq(RAX, Immediate(bit_cast<int32_t, float>(234.0f)));
1337 __ movd(XMM0, RAX); 1340 __ movd(XMM0, RAX);
1338 __ movd(XMM8, RAX); 1341 __ movd(XMM8, RAX);
1339 __ movss(XMM1, XMM8); 1342 __ movss(XMM1, XMM8);
1340 __ pushq(RAX); 1343 __ pushq(RAX);
1341 __ movq(Address(RSP, 0), Immediate(0)); 1344 __ movq(Address(RSP, 0), Immediate(0));
1342 __ movss(XMM0, Address(RSP, 0)); 1345 __ movss(XMM0, Address(RSP, 0));
1343 __ movss(Address(RSP, 0), XMM1); 1346 __ movss(Address(RSP, 0), XMM1);
1344 __ movss(XMM0, Address(RSP, 0)); 1347 __ movss(XMM0, Address(RSP, 0));
1345 __ movq(Address(RSP, 0), Immediate(0)); 1348 __ movq(Address(RSP, 0), Immediate(0));
1346 __ movss(XMM9, XMM8); 1349 __ movss(XMM9, XMM8);
1347 __ movss(Address(RSP, 0), XMM9); 1350 __ movss(Address(RSP, 0), XMM9);
1348 __ movss(XMM8, Address(RSP, 0)); 1351 __ movss(XMM8, Address(RSP, 0));
1349 __ movss(XMM0, XMM8); 1352 __ movss(XMM0, XMM8);
1350 __ popq(RAX); 1353 __ popq(RAX);
1351 __ ret(); 1354 __ ret();
1352 } 1355 }
1353 1356
1354 1357
1355 ASSEMBLER_TEST_RUN(SingleFPMoves2, entry) { 1358 ASSEMBLER_TEST_RUN(SingleFPMoves2, test) {
1356 typedef float (*SingleFPMoves2Code)(); 1359 typedef float (*SingleFPMoves2Code)();
1357 EXPECT_EQ(234, reinterpret_cast<SingleFPMoves2Code>(entry)()); 1360 EXPECT_EQ(234, reinterpret_cast<SingleFPMoves2Code>(test->entry())());
1358 } 1361 }
1359 1362
1360 1363
1361 ASSEMBLER_TEST_GENERATE(SingleFPOperations, assembler) { 1364 ASSEMBLER_TEST_GENERATE(SingleFPOperations, assembler) {
1362 __ pushq(RBX); 1365 __ pushq(RBX);
1363 __ pushq(RCX); 1366 __ pushq(RCX);
1364 __ movq(RBX, Immediate(bit_cast<int32_t, float>(12.3f))); 1367 __ movq(RBX, Immediate(bit_cast<int32_t, float>(12.3f)));
1365 __ movd(XMM0, RBX); 1368 __ movd(XMM0, RBX);
1366 __ movd(XMM8, RBX); 1369 __ movd(XMM8, RBX);
1367 __ movq(RCX, Immediate(bit_cast<int32_t, float>(3.4f))); 1370 __ movq(RCX, Immediate(bit_cast<int32_t, float>(3.4f)));
1368 __ movd(XMM1, RCX); 1371 __ movd(XMM1, RCX);
1369 __ movd(XMM9, RCX); 1372 __ movd(XMM9, RCX);
1370 __ addss(XMM0, XMM1); // 15.7f 1373 __ addss(XMM0, XMM1); // 15.7f
1371 __ mulss(XMM0, XMM1); // 53.38f 1374 __ mulss(XMM0, XMM1); // 53.38f
1372 __ subss(XMM0, XMM1); // 49.98f 1375 __ subss(XMM0, XMM1); // 49.98f
1373 __ divss(XMM0, XMM1); // 14.7f 1376 __ divss(XMM0, XMM1); // 14.7f
1374 __ addss(XMM8, XMM9); // 15.7f 1377 __ addss(XMM8, XMM9); // 15.7f
1375 __ mulss(XMM8, XMM9); // 53.38f 1378 __ mulss(XMM8, XMM9); // 53.38f
1376 __ subss(XMM8, XMM9); // 49.98f 1379 __ subss(XMM8, XMM9); // 49.98f
1377 __ divss(XMM8, XMM9); // 14.7f 1380 __ divss(XMM8, XMM9); // 14.7f
1378 __ subss(XMM0, XMM8); // 0.0f 1381 __ subss(XMM0, XMM8); // 0.0f
1379 __ popq(RCX); 1382 __ popq(RCX);
1380 __ popq(RBX); 1383 __ popq(RBX);
1381 __ ret(); 1384 __ ret();
1382 } 1385 }
1383 1386
1384 1387
1385 ASSEMBLER_TEST_RUN(SingleFPOperations, entry) { 1388 ASSEMBLER_TEST_RUN(SingleFPOperations, test) {
1386 typedef float (*SingleFPOperationsCode)(); 1389 typedef float (*SingleFPOperationsCode)();
1387 float res = reinterpret_cast<SingleFPOperationsCode>(entry)(); 1390 float res = reinterpret_cast<SingleFPOperationsCode>(test->entry())();
1388 EXPECT_FLOAT_EQ(0.0f, res, 0.001f); 1391 EXPECT_FLOAT_EQ(0.0f, res, 0.001f);
1389 } 1392 }
1390 1393
1391 ASSEMBLER_TEST_GENERATE(PackedFPOperations, assembler) { 1394 ASSEMBLER_TEST_GENERATE(PackedFPOperations, assembler) {
1392 __ movq(RAX, Immediate(bit_cast<int32_t, float>(12.3f))); 1395 __ movq(RAX, Immediate(bit_cast<int32_t, float>(12.3f)));
1393 __ movd(XMM10, RAX); 1396 __ movd(XMM10, RAX);
1394 __ shufps(XMM10, XMM10, Immediate(0x0)); 1397 __ shufps(XMM10, XMM10, Immediate(0x0));
1395 __ movq(RAX, Immediate(bit_cast<int32_t, float>(3.4f))); 1398 __ movq(RAX, Immediate(bit_cast<int32_t, float>(3.4f)));
1396 __ movd(XMM9, RAX); 1399 __ movd(XMM9, RAX);
1397 __ shufps(XMM9, XMM9, Immediate(0x0)); 1400 __ shufps(XMM9, XMM9, Immediate(0x0));
1398 __ addps(XMM10, XMM9); // 15.7f 1401 __ addps(XMM10, XMM9); // 15.7f
1399 __ mulps(XMM10, XMM9); // 53.38f 1402 __ mulps(XMM10, XMM9); // 53.38f
1400 __ subps(XMM10, XMM9); // 49.98f 1403 __ subps(XMM10, XMM9); // 49.98f
1401 __ divps(XMM10, XMM9); // 14.7f 1404 __ divps(XMM10, XMM9); // 14.7f
1402 __ movaps(XMM0, XMM10); 1405 __ movaps(XMM0, XMM10);
1403 __ shufps(XMM0, XMM0, Immediate(0x55)); // Copy second lane into all 4 lanes. 1406 __ shufps(XMM0, XMM0, Immediate(0x55)); // Copy second lane into all 4 lanes.
1404 __ ret(); 1407 __ ret();
1405 } 1408 }
1406 1409
1407 1410
1408 ASSEMBLER_TEST_RUN(PackedFPOperations, entry) { 1411 ASSEMBLER_TEST_RUN(PackedFPOperations, test) {
1409 typedef float (*PackedFPOperationsCode)(); 1412 typedef float (*PackedFPOperationsCode)();
1410 float res = reinterpret_cast<PackedFPOperationsCode>(entry)(); 1413 float res = reinterpret_cast<PackedFPOperationsCode>(test->entry())();
1411 EXPECT_FLOAT_EQ(14.7f, res, 0.001f); 1414 EXPECT_FLOAT_EQ(14.7f, res, 0.001f);
1412 } 1415 }
1413 1416
1414 1417
1415 ASSEMBLER_TEST_GENERATE(PackedFPOperations2, assembler) { 1418 ASSEMBLER_TEST_GENERATE(PackedFPOperations2, assembler) {
1416 __ movq(RAX, Immediate(bit_cast<int32_t, float>(4.0f))); 1419 __ movq(RAX, Immediate(bit_cast<int32_t, float>(4.0f)));
1417 __ movd(XMM0, RAX); 1420 __ movd(XMM0, RAX);
1418 __ shufps(XMM0, XMM0, Immediate(0x0)); 1421 __ shufps(XMM0, XMM0, Immediate(0x0));
1419 1422
1420 __ movaps(XMM11, XMM0); // Copy XMM0 1423 __ movaps(XMM11, XMM0); // Copy XMM0
1421 __ reciprocalps(XMM11); // 0.25 1424 __ reciprocalps(XMM11); // 0.25
1422 __ sqrtps(XMM11); // 0.5 1425 __ sqrtps(XMM11); // 0.5
1423 __ rsqrtps(XMM0); // ~0.5 1426 __ rsqrtps(XMM0); // ~0.5
1424 __ subps(XMM0, XMM11); // ~0.0 1427 __ subps(XMM0, XMM11); // ~0.0
1425 __ shufps(XMM0, XMM0, Immediate(0x00)); // Copy second lane into all 4 lanes. 1428 __ shufps(XMM0, XMM0, Immediate(0x00)); // Copy second lane into all 4 lanes.
1426 __ ret(); 1429 __ ret();
1427 } 1430 }
1428 1431
1429 1432
1430 ASSEMBLER_TEST_RUN(PackedFPOperations2, entry) { 1433 ASSEMBLER_TEST_RUN(PackedFPOperations2, test) {
1431 typedef float (*PackedFPOperations2Code)(); 1434 typedef float (*PackedFPOperations2Code)();
1432 float res = reinterpret_cast<PackedFPOperations2Code>(entry)(); 1435 float res = reinterpret_cast<PackedFPOperations2Code>(test->entry())();
1433 EXPECT_FLOAT_EQ(0.0f, res, 0.001f); 1436 EXPECT_FLOAT_EQ(0.0f, res, 0.001f);
1434 } 1437 }
1435 1438
1436 1439
1437 ASSEMBLER_TEST_GENERATE(PackedCompareEQ, assembler) { 1440 ASSEMBLER_TEST_GENERATE(PackedCompareEQ, assembler) {
1438 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); 1441 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f)));
1439 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); 1442 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f)));
1440 __ cmppseq(XMM0, XMM1); 1443 __ cmppseq(XMM0, XMM1);
1441 __ pushq(RAX); 1444 __ pushq(RAX);
1442 __ movss(Address(RSP, 0), XMM0); 1445 __ movss(Address(RSP, 0), XMM0);
1443 __ popq(RAX); 1446 __ popq(RAX);
1444 __ ret(); 1447 __ ret();
1445 } 1448 }
1446 1449
1447 1450
1448 ASSEMBLER_TEST_RUN(PackedCompareEQ, entry) { 1451 ASSEMBLER_TEST_RUN(PackedCompareEQ, test) {
1449 typedef uint32_t (*PackedCompareEQCode)(); 1452 typedef uint32_t (*PackedCompareEQCode)();
1450 uint32_t res = reinterpret_cast<PackedCompareEQCode>(entry)(); 1453 uint32_t res = reinterpret_cast<PackedCompareEQCode>(test->entry())();
1451 EXPECT_EQ(static_cast<uword>(0x0), res); 1454 EXPECT_EQ(static_cast<uword>(0x0), res);
1452 } 1455 }
1453 1456
1454 1457
1455 ASSEMBLER_TEST_GENERATE(PackedCompareNEQ, assembler) { 1458 ASSEMBLER_TEST_GENERATE(PackedCompareNEQ, assembler) {
1456 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); 1459 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f)));
1457 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); 1460 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f)));
1458 __ cmppsneq(XMM0, XMM1); 1461 __ cmppsneq(XMM0, XMM1);
1459 __ pushq(RAX); 1462 __ pushq(RAX);
1460 __ movss(Address(RSP, 0), XMM0); 1463 __ movss(Address(RSP, 0), XMM0);
1461 __ popq(RAX); 1464 __ popq(RAX);
1462 __ ret(); 1465 __ ret();
1463 } 1466 }
1464 1467
1465 1468
1466 ASSEMBLER_TEST_RUN(PackedCompareNEQ, entry) { 1469 ASSEMBLER_TEST_RUN(PackedCompareNEQ, test) {
1467 typedef uint32_t (*PackedCompareNEQCode)(); 1470 typedef uint32_t (*PackedCompareNEQCode)();
1468 uint32_t res = reinterpret_cast<PackedCompareNEQCode>(entry)(); 1471 uint32_t res = reinterpret_cast<PackedCompareNEQCode>(test->entry())();
1469 EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res); 1472 EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res);
1470 } 1473 }
1471 1474
1472 1475
1473 ASSEMBLER_TEST_GENERATE(PackedCompareLT, assembler) { 1476 ASSEMBLER_TEST_GENERATE(PackedCompareLT, assembler) {
1474 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); 1477 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f)));
1475 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); 1478 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f)));
1476 __ cmppslt(XMM0, XMM1); 1479 __ cmppslt(XMM0, XMM1);
1477 __ pushq(RAX); 1480 __ pushq(RAX);
1478 __ movss(Address(RSP, 0), XMM0); 1481 __ movss(Address(RSP, 0), XMM0);
1479 __ popq(RAX); 1482 __ popq(RAX);
1480 __ ret(); 1483 __ ret();
1481 } 1484 }
1482 1485
1483 1486
1484 ASSEMBLER_TEST_RUN(PackedCompareLT, entry) { 1487 ASSEMBLER_TEST_RUN(PackedCompareLT, test) {
1485 typedef uint32_t (*PackedCompareLTCode)(); 1488 typedef uint32_t (*PackedCompareLTCode)();
1486 uint32_t res = reinterpret_cast<PackedCompareLTCode>(entry)(); 1489 uint32_t res = reinterpret_cast<PackedCompareLTCode>(test->entry())();
1487 EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res); 1490 EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res);
1488 } 1491 }
1489 1492
1490 1493
1491 ASSEMBLER_TEST_GENERATE(PackedCompareLE, assembler) { 1494 ASSEMBLER_TEST_GENERATE(PackedCompareLE, assembler) {
1492 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); 1495 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f)));
1493 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); 1496 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f)));
1494 __ cmppsle(XMM0, XMM1); 1497 __ cmppsle(XMM0, XMM1);
1495 __ pushq(RAX); 1498 __ pushq(RAX);
1496 __ movss(Address(RSP, 0), XMM0); 1499 __ movss(Address(RSP, 0), XMM0);
1497 __ popq(RAX); 1500 __ popq(RAX);
1498 __ ret(); 1501 __ ret();
1499 } 1502 }
1500 1503
1501 1504
1502 ASSEMBLER_TEST_RUN(PackedCompareLE, entry) { 1505 ASSEMBLER_TEST_RUN(PackedCompareLE, test) {
1503 typedef uint32_t (*PackedCompareLECode)(); 1506 typedef uint32_t (*PackedCompareLECode)();
1504 uint32_t res = reinterpret_cast<PackedCompareLECode>(entry)(); 1507 uint32_t res = reinterpret_cast<PackedCompareLECode>(test->entry())();
1505 EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res); 1508 EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res);
1506 } 1509 }
1507 1510
1508 1511
1509 ASSEMBLER_TEST_GENERATE(PackedCompareNLT, assembler) { 1512 ASSEMBLER_TEST_GENERATE(PackedCompareNLT, assembler) {
1510 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); 1513 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f)));
1511 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); 1514 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f)));
1512 __ cmppsnlt(XMM0, XMM1); 1515 __ cmppsnlt(XMM0, XMM1);
1513 __ pushq(RAX); 1516 __ pushq(RAX);
1514 __ movss(Address(RSP, 0), XMM0); 1517 __ movss(Address(RSP, 0), XMM0);
1515 __ popq(RAX); 1518 __ popq(RAX);
1516 __ ret(); 1519 __ ret();
1517 } 1520 }
1518 1521
1519 1522
1520 ASSEMBLER_TEST_RUN(PackedCompareNLT, entry) { 1523 ASSEMBLER_TEST_RUN(PackedCompareNLT, test) {
1521 typedef uint32_t (*PackedCompareNLTCode)(); 1524 typedef uint32_t (*PackedCompareNLTCode)();
1522 uint32_t res = reinterpret_cast<PackedCompareNLTCode>(entry)(); 1525 uint32_t res = reinterpret_cast<PackedCompareNLTCode>(test->entry())();
1523 EXPECT_EQ(static_cast<uword>(0x0), res); 1526 EXPECT_EQ(static_cast<uword>(0x0), res);
1524 } 1527 }
1525 1528
1526 1529
1527 ASSEMBLER_TEST_GENERATE(PackedCompareNLE, assembler) { 1530 ASSEMBLER_TEST_GENERATE(PackedCompareNLE, assembler) {
1528 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); 1531 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f)));
1529 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); 1532 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f)));
1530 __ cmppsnle(XMM0, XMM1); 1533 __ cmppsnle(XMM0, XMM1);
1531 __ pushq(RAX); 1534 __ pushq(RAX);
1532 __ movss(Address(RSP, 0), XMM0); 1535 __ movss(Address(RSP, 0), XMM0);
1533 __ popq(RAX); 1536 __ popq(RAX);
1534 __ ret(); 1537 __ ret();
1535 } 1538 }
1536 1539
1537 1540
1538 ASSEMBLER_TEST_RUN(PackedCompareNLE, entry) { 1541 ASSEMBLER_TEST_RUN(PackedCompareNLE, test) {
1539 typedef uint32_t (*PackedCompareNLECode)(); 1542 typedef uint32_t (*PackedCompareNLECode)();
1540 uint32_t res = reinterpret_cast<PackedCompareNLECode>(entry)(); 1543 uint32_t res = reinterpret_cast<PackedCompareNLECode>(test->entry())();
1541 EXPECT_EQ(static_cast<uword>(0x0), res); 1544 EXPECT_EQ(static_cast<uword>(0x0), res);
1542 } 1545 }
1543 1546
1544 1547
1545 ASSEMBLER_TEST_GENERATE(PackedNegate, assembler) { 1548 ASSEMBLER_TEST_GENERATE(PackedNegate, assembler) {
1546 __ movl(RAX, Immediate(bit_cast<int32_t, float>(12.3f))); 1549 __ movl(RAX, Immediate(bit_cast<int32_t, float>(12.3f)));
1547 __ movd(XMM0, RAX); 1550 __ movd(XMM0, RAX);
1548 __ shufps(XMM0, XMM0, Immediate(0x0)); 1551 __ shufps(XMM0, XMM0, Immediate(0x0));
1549 __ negateps(XMM0); 1552 __ negateps(XMM0);
1550 __ shufps(XMM0, XMM0, Immediate(0xAA)); // Copy third lane into all 4 lanes. 1553 __ shufps(XMM0, XMM0, Immediate(0xAA)); // Copy third lane into all 4 lanes.
1551 __ ret(); 1554 __ ret();
1552 } 1555 }
1553 1556
1554 1557
1555 ASSEMBLER_TEST_RUN(PackedNegate, entry) { 1558 ASSEMBLER_TEST_RUN(PackedNegate, test) {
1556 typedef float (*PackedNegateCode)(); 1559 typedef float (*PackedNegateCode)();
1557 float res = reinterpret_cast<PackedNegateCode>(entry)(); 1560 float res = reinterpret_cast<PackedNegateCode>(test->entry())();
1558 EXPECT_FLOAT_EQ(-12.3f, res, 0.001f); 1561 EXPECT_FLOAT_EQ(-12.3f, res, 0.001f);
1559 } 1562 }
1560 1563
1561 1564
1562 ASSEMBLER_TEST_GENERATE(PackedAbsolute, assembler) { 1565 ASSEMBLER_TEST_GENERATE(PackedAbsolute, assembler) {
1563 __ movl(RAX, Immediate(bit_cast<int32_t, float>(-15.3f))); 1566 __ movl(RAX, Immediate(bit_cast<int32_t, float>(-15.3f)));
1564 __ movd(XMM0, RAX); 1567 __ movd(XMM0, RAX);
1565 __ shufps(XMM0, XMM0, Immediate(0x0)); 1568 __ shufps(XMM0, XMM0, Immediate(0x0));
1566 __ absps(XMM0); 1569 __ absps(XMM0);
1567 __ shufps(XMM0, XMM0, Immediate(0xAA)); // Copy third lane into all 4 lanes. 1570 __ shufps(XMM0, XMM0, Immediate(0xAA)); // Copy third lane into all 4 lanes.
1568 __ ret(); 1571 __ ret();
1569 } 1572 }
1570 1573
1571 1574
1572 ASSEMBLER_TEST_RUN(PackedAbsolute, entry) { 1575 ASSEMBLER_TEST_RUN(PackedAbsolute, test) {
1573 typedef float (*PackedAbsoluteCode)(); 1576 typedef float (*PackedAbsoluteCode)();
1574 float res = reinterpret_cast<PackedAbsoluteCode>(entry)(); 1577 float res = reinterpret_cast<PackedAbsoluteCode>(test->entry())();
1575 EXPECT_FLOAT_EQ(15.3f, res, 0.001f); 1578 EXPECT_FLOAT_EQ(15.3f, res, 0.001f);
1576 } 1579 }
1577 1580
1578 1581
1579 ASSEMBLER_TEST_GENERATE(PackedSetWZero, assembler) { 1582 ASSEMBLER_TEST_GENERATE(PackedSetWZero, assembler) {
1580 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(12.3f))); 1583 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(12.3f)));
1581 __ zerowps(XMM0); 1584 __ zerowps(XMM0);
1582 __ shufps(XMM0, XMM0, Immediate(0xFF)); // Copy the W lane which is now 0.0. 1585 __ shufps(XMM0, XMM0, Immediate(0xFF)); // Copy the W lane which is now 0.0.
1583 __ ret(); 1586 __ ret();
1584 } 1587 }
1585 1588
1586 1589
1587 ASSEMBLER_TEST_RUN(PackedSetWZero, entry) { 1590 ASSEMBLER_TEST_RUN(PackedSetWZero, test) {
1588 typedef float (*PackedSetWZeroCode)(); 1591 typedef float (*PackedSetWZeroCode)();
1589 float res = reinterpret_cast<PackedSetWZeroCode>(entry)(); 1592 float res = reinterpret_cast<PackedSetWZeroCode>(test->entry())();
1590 EXPECT_FLOAT_EQ(0.0f, res, 0.001f); 1593 EXPECT_FLOAT_EQ(0.0f, res, 0.001f);
1591 } 1594 }
1592 1595
1593 1596
1594 ASSEMBLER_TEST_GENERATE(PackedMin, assembler) { 1597 ASSEMBLER_TEST_GENERATE(PackedMin, assembler) {
1595 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); 1598 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f)));
1596 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); 1599 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f)));
1597 __ minps(XMM0, XMM1); 1600 __ minps(XMM0, XMM1);
1598 __ ret(); 1601 __ ret();
1599 } 1602 }
1600 1603
1601 1604
1602 ASSEMBLER_TEST_RUN(PackedMin, entry) { 1605 ASSEMBLER_TEST_RUN(PackedMin, test) {
1603 typedef float (*PackedMinCode)(); 1606 typedef float (*PackedMinCode)();
1604 float res = reinterpret_cast<PackedMinCode>(entry)(); 1607 float res = reinterpret_cast<PackedMinCode>(test->entry())();
1605 EXPECT_FLOAT_EQ(2.0f, res, 0.001f); 1608 EXPECT_FLOAT_EQ(2.0f, res, 0.001f);
1606 } 1609 }
1607 1610
1608 1611
1609 ASSEMBLER_TEST_GENERATE(PackedMax, assembler) { 1612 ASSEMBLER_TEST_GENERATE(PackedMax, assembler) {
1610 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); 1613 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f)));
1611 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); 1614 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f)));
1612 __ maxps(XMM0, XMM1); 1615 __ maxps(XMM0, XMM1);
1613 __ ret(); 1616 __ ret();
1614 } 1617 }
1615 1618
1616 1619
1617 ASSEMBLER_TEST_RUN(PackedMax, entry) { 1620 ASSEMBLER_TEST_RUN(PackedMax, test) {
1618 typedef float (*PackedMaxCode)(); 1621 typedef float (*PackedMaxCode)();
1619 float res = reinterpret_cast<PackedMaxCode>(entry)(); 1622 float res = reinterpret_cast<PackedMaxCode>(test->entry())();
1620 EXPECT_FLOAT_EQ(4.0f, res, 0.001f); 1623 EXPECT_FLOAT_EQ(4.0f, res, 0.001f);
1621 } 1624 }
1622 1625
1623 1626
1624 ASSEMBLER_TEST_GENERATE(PackedLogicalOr, assembler) { 1627 ASSEMBLER_TEST_GENERATE(PackedLogicalOr, assembler) {
1625 static const struct ALIGN16 { 1628 static const struct ALIGN16 {
1626 uint32_t a; 1629 uint32_t a;
1627 uint32_t b; 1630 uint32_t b;
1628 uint32_t c; 1631 uint32_t c;
1629 uint32_t d; 1632 uint32_t d;
(...skipping 11 matching lines...) Expand all
1641 __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant2))); 1644 __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant2)));
1642 __ movups(XMM1, Address(RAX, 0)); 1645 __ movups(XMM1, Address(RAX, 0));
1643 __ orps(XMM0, XMM1); 1646 __ orps(XMM0, XMM1);
1644 __ pushq(RAX); 1647 __ pushq(RAX);
1645 __ movss(Address(RSP, 0), XMM0); 1648 __ movss(Address(RSP, 0), XMM0);
1646 __ popq(RAX); 1649 __ popq(RAX);
1647 __ ret(); 1650 __ ret();
1648 } 1651 }
1649 1652
1650 1653
1651 ASSEMBLER_TEST_RUN(PackedLogicalOr, entry) { 1654 ASSEMBLER_TEST_RUN(PackedLogicalOr, test) {
1652 typedef uint32_t (*PackedLogicalOrCode)(); 1655 typedef uint32_t (*PackedLogicalOrCode)();
1653 uint32_t res = reinterpret_cast<PackedLogicalOrCode>(entry)(); 1656 uint32_t res = reinterpret_cast<PackedLogicalOrCode>(test->entry())();
1654 EXPECT_EQ(0xFFFFFFFF, res); 1657 EXPECT_EQ(0xFFFFFFFF, res);
1655 } 1658 }
1656 1659
1657 1660
1658 ASSEMBLER_TEST_GENERATE(PackedLogicalAnd, assembler) { 1661 ASSEMBLER_TEST_GENERATE(PackedLogicalAnd, assembler) {
1659 static const struct ALIGN16 { 1662 static const struct ALIGN16 {
1660 uint32_t a; 1663 uint32_t a;
1661 uint32_t b; 1664 uint32_t b;
1662 uint32_t c; 1665 uint32_t c;
1663 uint32_t d; 1666 uint32_t d;
(...skipping 10 matching lines...) Expand all
1674 __ movups(XMM0, Address(RAX, 0)); 1677 __ movups(XMM0, Address(RAX, 0));
1675 __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant2))); 1678 __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant2)));
1676 __ andps(XMM0, Address(RAX, 0)); 1679 __ andps(XMM0, Address(RAX, 0));
1677 __ pushq(RAX); 1680 __ pushq(RAX);
1678 __ movss(Address(RSP, 0), XMM0); 1681 __ movss(Address(RSP, 0), XMM0);
1679 __ popq(RAX); 1682 __ popq(RAX);
1680 __ ret(); 1683 __ ret();
1681 } 1684 }
1682 1685
1683 1686
1684 ASSEMBLER_TEST_RUN(PackedLogicalAnd, entry) { 1687 ASSEMBLER_TEST_RUN(PackedLogicalAnd, test) {
1685 typedef uint32_t (*PackedLogicalAndCode)(); 1688 typedef uint32_t (*PackedLogicalAndCode)();
1686 uint32_t res = reinterpret_cast<PackedLogicalAndCode>(entry)(); 1689 uint32_t res = reinterpret_cast<PackedLogicalAndCode>(test->entry())();
1687 EXPECT_EQ(static_cast<uword>(0x0000F000), res); 1690 EXPECT_EQ(static_cast<uword>(0x0000F000), res);
1688 } 1691 }
1689 1692
1690 1693
1691 ASSEMBLER_TEST_GENERATE(PackedLogicalNot, assembler) { 1694 ASSEMBLER_TEST_GENERATE(PackedLogicalNot, assembler) {
1692 static const struct ALIGN16 { 1695 static const struct ALIGN16 {
1693 uint32_t a; 1696 uint32_t a;
1694 uint32_t b; 1697 uint32_t b;
1695 uint32_t c; 1698 uint32_t c;
1696 uint32_t d; 1699 uint32_t d;
1697 } constant1 = 1700 } constant1 =
1698 { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; 1701 { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
1699 __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant1))); 1702 __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant1)));
1700 __ movups(XMM9, Address(RAX, 0)); 1703 __ movups(XMM9, Address(RAX, 0));
1701 __ notps(XMM9); 1704 __ notps(XMM9);
1702 __ movaps(XMM0, XMM9); 1705 __ movaps(XMM0, XMM9);
1703 __ pushq(RAX); 1706 __ pushq(RAX);
1704 __ movss(Address(RSP, 0), XMM0); 1707 __ movss(Address(RSP, 0), XMM0);
1705 __ popq(RAX); 1708 __ popq(RAX);
1706 __ ret(); 1709 __ ret();
1707 } 1710 }
1708 1711
1709 1712
1710 ASSEMBLER_TEST_RUN(PackedLogicalNot, entry) { 1713 ASSEMBLER_TEST_RUN(PackedLogicalNot, test) {
1711 typedef uint32_t (*PackedLogicalNotCode)(); 1714 typedef uint32_t (*PackedLogicalNotCode)();
1712 uint32_t res = reinterpret_cast<PackedLogicalNotCode>(entry)(); 1715 uint32_t res = reinterpret_cast<PackedLogicalNotCode>(test->entry())();
1713 EXPECT_EQ(static_cast<uword>(0x0), res); 1716 EXPECT_EQ(static_cast<uword>(0x0), res);
1714 } 1717 }
1715 1718
1716 ASSEMBLER_TEST_GENERATE(DoubleFPMoves, assembler) { 1719 ASSEMBLER_TEST_GENERATE(DoubleFPMoves, assembler) {
1717 __ movq(RAX, Immediate(bit_cast<int64_t, double>(1024.67))); 1720 __ movq(RAX, Immediate(bit_cast<int64_t, double>(1024.67)));
1718 __ pushq(R15); // Callee saved. 1721 __ pushq(R15); // Callee saved.
1719 __ pushq(RAX); 1722 __ pushq(RAX);
1720 __ movsd(XMM0, Address(RSP, 0)); 1723 __ movsd(XMM0, Address(RSP, 0));
1721 __ movsd(XMM1, XMM0); 1724 __ movsd(XMM1, XMM0);
1722 __ movsd(XMM2, XMM1); 1725 __ movsd(XMM2, XMM1);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1761 __ movaps(XMM3, XMM4); 1764 __ movaps(XMM3, XMM4);
1762 __ movaps(XMM2, XMM3); 1765 __ movaps(XMM2, XMM3);
1763 __ movaps(XMM1, XMM2); 1766 __ movaps(XMM1, XMM2);
1764 __ movaps(XMM0, XMM1); 1767 __ movaps(XMM0, XMM1);
1765 __ popq(RAX); 1768 __ popq(RAX);
1766 __ popq(R15); // Callee saved. 1769 __ popq(R15); // Callee saved.
1767 __ ret(); 1770 __ ret();
1768 } 1771 }
1769 1772
1770 1773
1771 ASSEMBLER_TEST_RUN(DoubleFPMoves, entry) { 1774 ASSEMBLER_TEST_RUN(DoubleFPMoves, test) {
1772 typedef double (*DoubleFPMovesCode)(); 1775 typedef double (*DoubleFPMovesCode)();
1773 EXPECT_FLOAT_EQ(1024.67, reinterpret_cast<DoubleFPMovesCode>(entry)(), 0.001); 1776 EXPECT_FLOAT_EQ(1024.67,
1777 reinterpret_cast<DoubleFPMovesCode>(test->entry())(), 0.001);
1774 } 1778 }
1775 1779
1776 1780
1777 ASSEMBLER_TEST_GENERATE(DoubleFPOperations, assembler) { 1781 ASSEMBLER_TEST_GENERATE(DoubleFPOperations, assembler) {
1778 __ movq(RAX, Immediate(bit_cast<int64_t, double>(12.3))); 1782 __ movq(RAX, Immediate(bit_cast<int64_t, double>(12.3)));
1779 __ pushq(RAX); 1783 __ pushq(RAX);
1780 __ movsd(XMM0, Address(RSP, 0)); 1784 __ movsd(XMM0, Address(RSP, 0));
1781 __ movsd(XMM8, Address(RSP, 0)); 1785 __ movsd(XMM8, Address(RSP, 0));
1782 __ movq(RAX, Immediate(bit_cast<int64_t, double>(3.4))); 1786 __ movq(RAX, Immediate(bit_cast<int64_t, double>(3.4)));
1783 __ movq(Address(RSP, 0), RAX); 1787 __ movq(Address(RSP, 0), RAX);
1784 __ movsd(XMM12, Address(RSP, 0)); 1788 __ movsd(XMM12, Address(RSP, 0));
1785 __ addsd(XMM8, XMM12); // 15.7 1789 __ addsd(XMM8, XMM12); // 15.7
1786 __ mulsd(XMM8, XMM12); // 53.38 1790 __ mulsd(XMM8, XMM12); // 53.38
1787 __ subsd(XMM8, XMM12); // 49.98 1791 __ subsd(XMM8, XMM12); // 49.98
1788 __ divsd(XMM8, XMM12); // 14.7 1792 __ divsd(XMM8, XMM12); // 14.7
1789 __ sqrtsd(XMM8, XMM8); // 3.834 1793 __ sqrtsd(XMM8, XMM8); // 3.834
1790 __ movsd(XMM1, Address(RSP, 0)); 1794 __ movsd(XMM1, Address(RSP, 0));
1791 __ addsd(XMM0, XMM1); // 15.7 1795 __ addsd(XMM0, XMM1); // 15.7
1792 __ mulsd(XMM0, XMM1); // 53.38 1796 __ mulsd(XMM0, XMM1); // 53.38
1793 __ subsd(XMM0, XMM1); // 49.98 1797 __ subsd(XMM0, XMM1); // 49.98
1794 __ divsd(XMM0, XMM1); // 14.7 1798 __ divsd(XMM0, XMM1); // 14.7
1795 __ sqrtsd(XMM0, XMM0); // 3.834057902 1799 __ sqrtsd(XMM0, XMM0); // 3.834057902
1796 __ addsd(XMM0, XMM8); // 7.6681 1800 __ addsd(XMM0, XMM8); // 7.6681
1797 __ popq(RAX); 1801 __ popq(RAX);
1798 __ ret(); 1802 __ ret();
1799 } 1803 }
1800 1804
1801 1805
1802 ASSEMBLER_TEST_RUN(DoubleFPOperations, entry) { 1806 ASSEMBLER_TEST_RUN(DoubleFPOperations, test) {
1803 typedef double (*SingleFPOperationsCode)(); 1807 typedef double (*SingleFPOperationsCode)();
1804 double res = reinterpret_cast<SingleFPOperationsCode>(entry)(); 1808 double res = reinterpret_cast<SingleFPOperationsCode>(test->entry())();
1805 EXPECT_FLOAT_EQ(7.668, res, 0.001); 1809 EXPECT_FLOAT_EQ(7.668, res, 0.001);
1806 } 1810 }
1807 1811
1808 1812
1809 ASSEMBLER_TEST_GENERATE(Int32ToDoubleConversion, assembler) { 1813 ASSEMBLER_TEST_GENERATE(Int32ToDoubleConversion, assembler) {
1810 __ movl(RDX, Immediate(6)); 1814 __ movl(RDX, Immediate(6));
1811 __ cvtsi2sd(XMM0, RDX); 1815 __ cvtsi2sd(XMM0, RDX);
1812 __ movl(RDX, Immediate(8)); 1816 __ movl(RDX, Immediate(8));
1813 __ cvtsi2sd(XMM8, RDX); 1817 __ cvtsi2sd(XMM8, RDX);
1814 __ subsd(XMM0, XMM8); 1818 __ subsd(XMM0, XMM8);
1815 __ ret(); 1819 __ ret();
1816 } 1820 }
1817 1821
1818 1822
1819 ASSEMBLER_TEST_RUN(Int32ToDoubleConversion, entry) { 1823 ASSEMBLER_TEST_RUN(Int32ToDoubleConversion, test) {
1820 typedef double (*IntToDoubleConversionCode)(); 1824 typedef double (*IntToDoubleConversionCode)();
1821 double res = reinterpret_cast<IntToDoubleConversionCode>(entry)(); 1825 double res = reinterpret_cast<IntToDoubleConversionCode>(test->entry())();
1822 EXPECT_FLOAT_EQ(-2.0, res, 0.001); 1826 EXPECT_FLOAT_EQ(-2.0, res, 0.001);
1823 } 1827 }
1824 1828
1825 1829
1826 ASSEMBLER_TEST_GENERATE(Int64ToDoubleConversion, assembler) { 1830 ASSEMBLER_TEST_GENERATE(Int64ToDoubleConversion, assembler) {
1827 __ movq(RDX, Immediate(12LL << 32)); 1831 __ movq(RDX, Immediate(12LL << 32));
1828 __ cvtsi2sd(XMM0, RDX); 1832 __ cvtsi2sd(XMM0, RDX);
1829 __ movsd(XMM15, XMM0); // Move to high register 1833 __ movsd(XMM15, XMM0); // Move to high register
1830 __ addsd(XMM0, XMM0); // Stomp XMM0 1834 __ addsd(XMM0, XMM0); // Stomp XMM0
1831 __ movsd(XMM0, XMM15); // Move back to XMM0 1835 __ movsd(XMM0, XMM15); // Move back to XMM0
1832 __ ret(); 1836 __ ret();
1833 } 1837 }
1834 1838
1835 1839
1836 ASSEMBLER_TEST_RUN(Int64ToDoubleConversion, entry) { 1840 ASSEMBLER_TEST_RUN(Int64ToDoubleConversion, test) {
1837 typedef double (*Int64ToDoubleConversionCode)(); 1841 typedef double (*Int64ToDoubleConversionCode)();
1838 double res = reinterpret_cast<Int64ToDoubleConversionCode>(entry)(); 1842 double res = reinterpret_cast<Int64ToDoubleConversionCode>(test->entry())();
1839 EXPECT_FLOAT_EQ(static_cast<double>(12LL << 32), res, 0.001); 1843 EXPECT_FLOAT_EQ(static_cast<double>(12LL << 32), res, 0.001);
1840 } 1844 }
1841 1845
1842 1846
1843 ASSEMBLER_TEST_GENERATE(DoubleToInt64Conversion, assembler) { 1847 ASSEMBLER_TEST_GENERATE(DoubleToInt64Conversion, assembler) {
1844 __ movq(RAX, Immediate(bit_cast<int64_t, double>(12.3))); 1848 __ movq(RAX, Immediate(bit_cast<int64_t, double>(12.3)));
1845 __ pushq(RAX); 1849 __ pushq(RAX);
1846 __ movsd(XMM9, Address(RSP, 0)); 1850 __ movsd(XMM9, Address(RSP, 0));
1847 __ movsd(XMM6, Address(RSP, 0)); 1851 __ movsd(XMM6, Address(RSP, 0));
1848 __ popq(RAX); 1852 __ popq(RAX);
1849 __ cvttsd2siq(R10, XMM6); 1853 __ cvttsd2siq(R10, XMM6);
1850 __ cvttsd2siq(RDX, XMM6); 1854 __ cvttsd2siq(RDX, XMM6);
1851 __ cvttsd2siq(R10, XMM9); 1855 __ cvttsd2siq(R10, XMM9);
1852 __ cvttsd2siq(RDX, XMM9); 1856 __ cvttsd2siq(RDX, XMM9);
1853 __ subq(RDX, R10); 1857 __ subq(RDX, R10);
1854 __ movq(RAX, RDX); 1858 __ movq(RAX, RDX);
1855 __ ret(); 1859 __ ret();
1856 } 1860 }
1857 1861
1858 1862
1859 ASSEMBLER_TEST_RUN(DoubleToInt64Conversion, entry) { 1863 ASSEMBLER_TEST_RUN(DoubleToInt64Conversion, test) {
1860 typedef int64_t (*DoubleToInt64ConversionCode)(); 1864 typedef int64_t (*DoubleToInt64ConversionCode)();
1861 int64_t res = reinterpret_cast<DoubleToInt64ConversionCode>(entry)(); 1865 int64_t res = reinterpret_cast<DoubleToInt64ConversionCode>(test->entry())();
1862 EXPECT_EQ(0, res); 1866 EXPECT_EQ(0, res);
1863 } 1867 }
1864 1868
1865 1869
1866 ASSEMBLER_TEST_GENERATE(TestObjectCompare, assembler) { 1870 ASSEMBLER_TEST_GENERATE(TestObjectCompare, assembler) {
1867 ObjectStore* object_store = Isolate::Current()->object_store(); 1871 ObjectStore* object_store = Isolate::Current()->object_store();
1868 const Object& obj = Object::ZoneHandle(object_store->smi_class()); 1872 const Object& obj = Object::ZoneHandle(object_store->smi_class());
1869 Label fail; 1873 Label fail;
1870 __ LoadObject(RAX, obj); 1874 __ LoadObject(RAX, obj);
1871 __ CompareObject(RAX, obj); 1875 __ CompareObject(RAX, obj);
(...skipping 16 matching lines...) Expand all
1888 __ CompareObject(RCX, smi); 1892 __ CompareObject(RCX, smi);
1889 __ j(NOT_EQUAL, &fail); 1893 __ j(NOT_EQUAL, &fail);
1890 __ movl(RAX, Immediate(1)); // OK 1894 __ movl(RAX, Immediate(1)); // OK
1891 __ ret(); 1895 __ ret();
1892 __ Bind(&fail); 1896 __ Bind(&fail);
1893 __ movl(RAX, Immediate(0)); // Fail. 1897 __ movl(RAX, Immediate(0)); // Fail.
1894 __ ret(); 1898 __ ret();
1895 } 1899 }
1896 1900
1897 1901
1898 ASSEMBLER_TEST_RUN(TestObjectCompare, entry) { 1902 ASSEMBLER_TEST_RUN(TestObjectCompare, test) {
1899 typedef bool (*TestObjectCompare)(); 1903 typedef bool (*TestObjectCompare)();
1900 bool res = reinterpret_cast<TestObjectCompare>(entry)(); 1904 bool res = reinterpret_cast<TestObjectCompare>(test->entry())();
1901 EXPECT_EQ(true, res); 1905 EXPECT_EQ(true, res);
1902 } 1906 }
1903 1907
1904 1908
1905 ASSEMBLER_TEST_GENERATE(TestNop, assembler) { 1909 ASSEMBLER_TEST_GENERATE(TestNop, assembler) {
1906 __ nop(1); 1910 __ nop(1);
1907 __ nop(2); 1911 __ nop(2);
1908 __ nop(3); 1912 __ nop(3);
1909 __ nop(4); 1913 __ nop(4);
1910 __ nop(5); 1914 __ nop(5);
1911 __ nop(6); 1915 __ nop(6);
1912 __ nop(7); 1916 __ nop(7);
1913 __ nop(8); 1917 __ nop(8);
1914 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size. 1918 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size.
1915 __ ret(); 1919 __ ret();
1916 } 1920 }
1917 1921
1918 1922
1919 ASSEMBLER_TEST_RUN(TestNop, entry) { 1923 ASSEMBLER_TEST_RUN(TestNop, test) {
1920 typedef int (*TestNop)(); 1924 typedef int (*TestNop)();
1921 int res = reinterpret_cast<TestNop>(entry)(); 1925 int res = reinterpret_cast<TestNop>(test->entry())();
1922 EXPECT_EQ(36, res); // 36 nop bytes emitted. 1926 EXPECT_EQ(36, res); // 36 nop bytes emitted.
1923 } 1927 }
1924 1928
1925 1929
1926 ASSEMBLER_TEST_GENERATE(TestAlign0, assembler) { 1930 ASSEMBLER_TEST_GENERATE(TestAlign0, assembler) {
1927 __ Align(4, 0); 1931 __ Align(4, 0);
1928 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size. 1932 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size.
1929 __ ret(); 1933 __ ret();
1930 } 1934 }
1931 1935
1932 1936
1933 ASSEMBLER_TEST_RUN(TestAlign0, entry) { 1937 ASSEMBLER_TEST_RUN(TestAlign0, test) {
1934 typedef int (*TestAlign0)(); 1938 typedef int (*TestAlign0)();
1935 int res = reinterpret_cast<TestAlign0>(entry)(); 1939 int res = reinterpret_cast<TestAlign0>(test->entry())();
1936 EXPECT_EQ(0, res); // 0 bytes emitted. 1940 EXPECT_EQ(0, res); // 0 bytes emitted.
1937 } 1941 }
1938 1942
1939 1943
1940 ASSEMBLER_TEST_GENERATE(TestAlign1, assembler) { 1944 ASSEMBLER_TEST_GENERATE(TestAlign1, assembler) {
1941 __ nop(1); 1945 __ nop(1);
1942 __ Align(4, 0); 1946 __ Align(4, 0);
1943 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size. 1947 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size.
1944 __ ret(); 1948 __ ret();
1945 } 1949 }
1946 1950
1947 1951
1948 ASSEMBLER_TEST_RUN(TestAlign1, entry) { 1952 ASSEMBLER_TEST_RUN(TestAlign1, test) {
1949 typedef int (*TestAlign1)(); 1953 typedef int (*TestAlign1)();
1950 int res = reinterpret_cast<TestAlign1>(entry)(); 1954 int res = reinterpret_cast<TestAlign1>(test->entry())();
1951 EXPECT_EQ(4, res); // 4 bytes emitted. 1955 EXPECT_EQ(4, res); // 4 bytes emitted.
1952 } 1956 }
1953 1957
1954 1958
1955 ASSEMBLER_TEST_GENERATE(TestAlign1Offset1, assembler) { 1959 ASSEMBLER_TEST_GENERATE(TestAlign1Offset1, assembler) {
1956 __ nop(1); 1960 __ nop(1);
1957 __ Align(4, 1); 1961 __ Align(4, 1);
1958 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size. 1962 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size.
1959 __ ret(); 1963 __ ret();
1960 } 1964 }
1961 1965
1962 1966
1963 ASSEMBLER_TEST_RUN(TestAlign1Offset1, entry) { 1967 ASSEMBLER_TEST_RUN(TestAlign1Offset1, test) {
1964 typedef int (*TestAlign1Offset1)(); 1968 typedef int (*TestAlign1Offset1)();
1965 int res = reinterpret_cast<TestAlign1Offset1>(entry)(); 1969 int res = reinterpret_cast<TestAlign1Offset1>(test->entry())();
1966 EXPECT_EQ(3, res); // 3 bytes emitted. 1970 EXPECT_EQ(3, res); // 3 bytes emitted.
1967 } 1971 }
1968 1972
1969 1973
1970 ASSEMBLER_TEST_GENERATE(TestAlignLarge, assembler) { 1974 ASSEMBLER_TEST_GENERATE(TestAlignLarge, assembler) {
1971 __ nop(1); 1975 __ nop(1);
1972 __ Align(16, 0); 1976 __ Align(16, 0);
1973 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size. 1977 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size.
1974 __ ret(); 1978 __ ret();
1975 } 1979 }
1976 1980
1977 1981
1978 ASSEMBLER_TEST_RUN(TestAlignLarge, entry) { 1982 ASSEMBLER_TEST_RUN(TestAlignLarge, test) {
1979 typedef int (*TestAlignLarge)(); 1983 typedef int (*TestAlignLarge)();
1980 int res = reinterpret_cast<TestAlignLarge>(entry)(); 1984 int res = reinterpret_cast<TestAlignLarge>(test->entry())();
1981 EXPECT_EQ(16, res); // 16 bytes emitted. 1985 EXPECT_EQ(16, res); // 16 bytes emitted.
1982 } 1986 }
1983 1987
1984 1988
1985 ASSEMBLER_TEST_GENERATE(TestAdds, assembler) { 1989 ASSEMBLER_TEST_GENERATE(TestAdds, assembler) {
1986 __ movq(RAX, Immediate(4)); 1990 __ movq(RAX, Immediate(4));
1987 __ pushq(RAX); 1991 __ pushq(RAX);
1988 __ addq(Address(RSP, 0), Immediate(5)); 1992 __ addq(Address(RSP, 0), Immediate(5));
1989 // TOS: 9 1993 // TOS: 9
1990 __ addq(Address(RSP, 0), Immediate(-2)); 1994 __ addq(Address(RSP, 0), Immediate(-2));
1991 // TOS: 7 1995 // TOS: 7
1992 __ movq(RCX, Immediate(3)); 1996 __ movq(RCX, Immediate(3));
1993 __ addq(Address(RSP, 0), RCX); 1997 __ addq(Address(RSP, 0), RCX);
1994 // TOS: 10 1998 // TOS: 10
1995 __ movq(RAX, Immediate(10)); 1999 __ movq(RAX, Immediate(10));
1996 __ addq(RAX, Address(RSP, 0)); 2000 __ addq(RAX, Address(RSP, 0));
1997 // RAX: 20 2001 // RAX: 20
1998 __ popq(RCX); 2002 __ popq(RCX);
1999 __ ret(); 2003 __ ret();
2000 } 2004 }
2001 2005
2002 2006
2003 ASSEMBLER_TEST_RUN(TestAdds, entry) { 2007 ASSEMBLER_TEST_RUN(TestAdds, test) {
2004 typedef int (*TestAdds)(); 2008 typedef int (*TestAdds)();
2005 int res = reinterpret_cast<TestAdds>(entry)(); 2009 int res = reinterpret_cast<TestAdds>(test->entry())();
2006 EXPECT_EQ(20, res); 2010 EXPECT_EQ(20, res);
2007 } 2011 }
2008 2012
2009 2013
2010 ASSEMBLER_TEST_GENERATE(TestNot, assembler) { 2014 ASSEMBLER_TEST_GENERATE(TestNot, assembler) {
2011 __ movq(RAX, Immediate(0xFFFFFFFF00000000)); 2015 __ movq(RAX, Immediate(0xFFFFFFFF00000000));
2012 __ notq(RAX); 2016 __ notq(RAX);
2013 __ ret(); 2017 __ ret();
2014 } 2018 }
2015 2019
2016 2020
2017 ASSEMBLER_TEST_RUN(TestNot, entry) { 2021 ASSEMBLER_TEST_RUN(TestNot, test) {
2018 typedef int (*TestNot)(); 2022 typedef int (*TestNot)();
2019 unsigned int res = reinterpret_cast<TestNot>(entry)(); 2023 unsigned int res = reinterpret_cast<TestNot>(test->entry())();
2020 EXPECT_EQ(0xFFFFFFFF, res); 2024 EXPECT_EQ(0xFFFFFFFF, res);
2021 } 2025 }
2022 2026
2023 2027
2024 ASSEMBLER_TEST_GENERATE(XorpdZeroing, assembler) { 2028 ASSEMBLER_TEST_GENERATE(XorpdZeroing, assembler) {
2025 __ pushq(RAX); 2029 __ pushq(RAX);
2026 __ movsd(Address(RSP, 0), XMM0); 2030 __ movsd(Address(RSP, 0), XMM0);
2027 __ xorpd(XMM0, Address(RSP, 0)); 2031 __ xorpd(XMM0, Address(RSP, 0));
2028 __ popq(RAX); 2032 __ popq(RAX);
2029 __ ret(); 2033 __ ret();
2030 } 2034 }
2031 2035
2032 2036
2033 ASSEMBLER_TEST_RUN(XorpdZeroing, entry) { 2037 ASSEMBLER_TEST_RUN(XorpdZeroing, test) {
2034 typedef double (*XorpdZeroingCode)(double d); 2038 typedef double (*XorpdZeroingCode)(double d);
2035 double res = reinterpret_cast<XorpdZeroingCode>(entry)(12.56e3); 2039 double res = reinterpret_cast<XorpdZeroingCode>(test->entry())(12.56e3);
2036 EXPECT_FLOAT_EQ(0.0, res, 0.0001); 2040 EXPECT_FLOAT_EQ(0.0, res, 0.0001);
2037 } 2041 }
2038 2042
2039 2043
2040 ASSEMBLER_TEST_GENERATE(XorpdZeroing2, assembler) { 2044 ASSEMBLER_TEST_GENERATE(XorpdZeroing2, assembler) {
2041 Label done; 2045 Label done;
2042 __ xorpd(XMM15, XMM15); 2046 __ xorpd(XMM15, XMM15);
2043 __ xorpd(XMM0, XMM0); 2047 __ xorpd(XMM0, XMM0);
2044 __ xorpd(XMM0, XMM15); 2048 __ xorpd(XMM0, XMM15);
2045 __ comisd(XMM0, XMM15); 2049 __ comisd(XMM0, XMM15);
2046 __ j(ZERO, &done); 2050 __ j(ZERO, &done);
2047 __ int3(); 2051 __ int3();
2048 __ Bind(&done); 2052 __ Bind(&done);
2049 __ ret(); 2053 __ ret();
2050 } 2054 }
2051 2055
2052 2056
2053 ASSEMBLER_TEST_RUN(XorpdZeroing2, entry) { 2057 ASSEMBLER_TEST_RUN(XorpdZeroing2, test) {
2054 typedef double (*XorpdZeroing2Code)(double d); 2058 typedef double (*XorpdZeroing2Code)(double d);
2055 double res = reinterpret_cast<XorpdZeroing2Code>(entry)(12.56e3); 2059 double res = reinterpret_cast<XorpdZeroing2Code>(test->entry())(12.56e3);
2056 EXPECT_FLOAT_EQ(0.0, res, 0.0001); 2060 EXPECT_FLOAT_EQ(0.0, res, 0.0001);
2057 } 2061 }
2058 2062
2059 2063
2060 ASSEMBLER_TEST_GENERATE(Pxor, assembler) { 2064 ASSEMBLER_TEST_GENERATE(Pxor, assembler) {
2061 __ pxor(XMM0, XMM0); 2065 __ pxor(XMM0, XMM0);
2062 __ ret(); 2066 __ ret();
2063 } 2067 }
2064 2068
2065 2069
2066 ASSEMBLER_TEST_RUN(Pxor, entry) { 2070 ASSEMBLER_TEST_RUN(Pxor, test) {
2067 typedef double (*PxorCode)(double d); 2071 typedef double (*PxorCode)(double d);
2068 double res = reinterpret_cast<PxorCode>(entry)(12.3456e3); 2072 double res = reinterpret_cast<PxorCode>(test->entry())(12.3456e3);
2069 EXPECT_FLOAT_EQ(0.0, res, 0.0); 2073 EXPECT_FLOAT_EQ(0.0, res, 0.0);
2070 } 2074 }
2071 2075
2072 2076
2073 ASSEMBLER_TEST_GENERATE(SquareRootDouble, assembler) { 2077 ASSEMBLER_TEST_GENERATE(SquareRootDouble, assembler) {
2074 __ sqrtsd(XMM0, XMM0); 2078 __ sqrtsd(XMM0, XMM0);
2075 __ ret(); 2079 __ ret();
2076 } 2080 }
2077 2081
2078 2082
2079 ASSEMBLER_TEST_RUN(SquareRootDouble, entry) { 2083 ASSEMBLER_TEST_RUN(SquareRootDouble, test) {
2080 typedef double (*SquareRootDoubleCode)(double d); 2084 typedef double (*SquareRootDoubleCode)(double d);
2081 const double kDoubleConst = .7; 2085 const double kDoubleConst = .7;
2082 double res = reinterpret_cast<SquareRootDoubleCode>(entry)(kDoubleConst); 2086 double res =
2087 reinterpret_cast<SquareRootDoubleCode>(test->entry())(kDoubleConst);
2083 EXPECT_FLOAT_EQ(sqrt(kDoubleConst), res, 0.0001); 2088 EXPECT_FLOAT_EQ(sqrt(kDoubleConst), res, 0.0001);
2084 } 2089 }
2085 2090
2086 2091
2087 // Called from assembler_test.cc. 2092 // Called from assembler_test.cc.
2088 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { 2093 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) {
2089 __ pushq(CTX); 2094 __ pushq(CTX);
2090 __ movq(CTX, RDI); 2095 __ movq(CTX, RDI);
2091 __ StoreIntoObject(RDX, 2096 __ StoreIntoObject(RDX,
2092 FieldAddress(RDX, GrowableObjectArray::data_offset()), 2097 FieldAddress(RDX, GrowableObjectArray::data_offset()),
2093 RSI); 2098 RSI);
2094 __ popq(CTX); 2099 __ popq(CTX);
2095 __ ret(); 2100 __ ret();
2096 } 2101 }
2097 2102
2098 2103
2099 ASSEMBLER_TEST_GENERATE(DoubleFPUStackMoves, assembler) { 2104 ASSEMBLER_TEST_GENERATE(DoubleFPUStackMoves, assembler) {
2100 int64_t l = bit_cast<int64_t, double>(1024.67); 2105 int64_t l = bit_cast<int64_t, double>(1024.67);
2101 __ movq(RAX, Immediate(l)); 2106 __ movq(RAX, Immediate(l));
2102 __ pushq(RAX); 2107 __ pushq(RAX);
2103 __ fldl(Address(RSP, 0)); 2108 __ fldl(Address(RSP, 0));
2104 __ movq(Address(RSP, 0), Immediate(0)); 2109 __ movq(Address(RSP, 0), Immediate(0));
2105 __ fstpl(Address(RSP, 0)); 2110 __ fstpl(Address(RSP, 0));
2106 __ popq(RAX); 2111 __ popq(RAX);
2107 __ ret(); 2112 __ ret();
2108 } 2113 }
2109 2114
2110 2115
2111 ASSEMBLER_TEST_RUN(DoubleFPUStackMoves, entry) { 2116 ASSEMBLER_TEST_RUN(DoubleFPUStackMoves, test) {
2112 typedef int64_t (*DoubleFPUStackMovesCode)(); 2117 typedef int64_t (*DoubleFPUStackMovesCode)();
2113 int64_t res = reinterpret_cast<DoubleFPUStackMovesCode>(entry)(); 2118 int64_t res = reinterpret_cast<DoubleFPUStackMovesCode>(test->entry())();
2114 EXPECT_FLOAT_EQ(1024.67, (bit_cast<double, int64_t>(res)), 0.001); 2119 EXPECT_FLOAT_EQ(1024.67, (bit_cast<double, int64_t>(res)), 0.001);
2115 } 2120 }
2116 2121
2117 2122
2118 ASSEMBLER_TEST_GENERATE(Sine, assembler) { 2123 ASSEMBLER_TEST_GENERATE(Sine, assembler) {
2119 __ pushq(RAX); 2124 __ pushq(RAX);
2120 __ movsd(Address(RSP, 0), XMM0); 2125 __ movsd(Address(RSP, 0), XMM0);
2121 __ fldl(Address(RSP, 0)); 2126 __ fldl(Address(RSP, 0));
2122 __ fsin(); 2127 __ fsin();
2123 __ fstpl(Address(RSP, 0)); 2128 __ fstpl(Address(RSP, 0));
2124 __ movsd(XMM0, Address(RSP, 0)); 2129 __ movsd(XMM0, Address(RSP, 0));
2125 __ popq(RAX); 2130 __ popq(RAX);
2126 __ ret(); 2131 __ ret();
2127 } 2132 }
2128 2133
2129 2134
2130 ASSEMBLER_TEST_RUN(Sine, entry) { 2135 ASSEMBLER_TEST_RUN(Sine, test) {
2131 typedef double (*SineCode)(double d); 2136 typedef double (*SineCode)(double d);
2132 const double kDoubleConst = 0.7; 2137 const double kDoubleConst = 0.7;
2133 double res = reinterpret_cast<SineCode>(entry)(kDoubleConst); 2138 double res = reinterpret_cast<SineCode>(test->entry())(kDoubleConst);
2134 EXPECT_FLOAT_EQ(sin(kDoubleConst), res, 0.0001); 2139 EXPECT_FLOAT_EQ(sin(kDoubleConst), res, 0.0001);
2135 } 2140 }
2136 2141
2137 2142
2138 ASSEMBLER_TEST_GENERATE(Cosine, assembler) { 2143 ASSEMBLER_TEST_GENERATE(Cosine, assembler) {
2139 __ pushq(RAX); 2144 __ pushq(RAX);
2140 __ movsd(Address(RSP, 0), XMM0); 2145 __ movsd(Address(RSP, 0), XMM0);
2141 __ fldl(Address(RSP, 0)); 2146 __ fldl(Address(RSP, 0));
2142 __ fcos(); 2147 __ fcos();
2143 __ fstpl(Address(RSP, 0)); 2148 __ fstpl(Address(RSP, 0));
2144 __ movsd(XMM0, Address(RSP, 0)); 2149 __ movsd(XMM0, Address(RSP, 0));
2145 __ popq(RAX); 2150 __ popq(RAX);
2146 __ ret(); 2151 __ ret();
2147 } 2152 }
2148 2153
2149 2154
2150 ASSEMBLER_TEST_RUN(Cosine, entry) { 2155 ASSEMBLER_TEST_RUN(Cosine, test) {
2151 typedef double (*CosineCode)(double f); 2156 typedef double (*CosineCode)(double f);
2152 const double kDoubleConst = 0.7; 2157 const double kDoubleConst = 0.7;
2153 double res = reinterpret_cast<CosineCode>(entry)(kDoubleConst); 2158 double res = reinterpret_cast<CosineCode>(test->entry())(kDoubleConst);
2154 EXPECT_FLOAT_EQ(cos(kDoubleConst), res, 0.0001); 2159 EXPECT_FLOAT_EQ(cos(kDoubleConst), res, 0.0001);
2155 } 2160 }
2156 2161
2157 2162
2158 ASSEMBLER_TEST_GENERATE(IntToDoubleConversion, assembler) { 2163 ASSEMBLER_TEST_GENERATE(IntToDoubleConversion, assembler) {
2159 __ movq(RDX, Immediate(6)); 2164 __ movq(RDX, Immediate(6));
2160 __ cvtsi2sd(XMM0, RDX); 2165 __ cvtsi2sd(XMM0, RDX);
2161 __ ret(); 2166 __ ret();
2162 } 2167 }
2163 2168
2164 2169
2165 ASSEMBLER_TEST_RUN(IntToDoubleConversion, entry) { 2170 ASSEMBLER_TEST_RUN(IntToDoubleConversion, test) {
2166 typedef double (*IntToDoubleConversionCode)(); 2171 typedef double (*IntToDoubleConversionCode)();
2167 double res = reinterpret_cast<IntToDoubleConversionCode>(entry)(); 2172 double res = reinterpret_cast<IntToDoubleConversionCode>(test->entry())();
2168 EXPECT_FLOAT_EQ(6.0, res, 0.001); 2173 EXPECT_FLOAT_EQ(6.0, res, 0.001);
2169 } 2174 }
2170 2175
2171 2176
2172 ASSEMBLER_TEST_GENERATE(IntToDoubleConversion2, assembler) { 2177 ASSEMBLER_TEST_GENERATE(IntToDoubleConversion2, assembler) {
2173 __ pushq(RDI); 2178 __ pushq(RDI);
2174 __ fildl(Address(RSP, 0)); 2179 __ fildl(Address(RSP, 0));
2175 __ fstpl(Address(RSP, 0)); 2180 __ fstpl(Address(RSP, 0));
2176 __ movsd(XMM0, Address(RSP, 0)); 2181 __ movsd(XMM0, Address(RSP, 0));
2177 __ popq(RAX); 2182 __ popq(RAX);
2178 __ ret(); 2183 __ ret();
2179 } 2184 }
2180 2185
2181 2186
2182 ASSEMBLER_TEST_RUN(IntToDoubleConversion2, entry) { 2187 ASSEMBLER_TEST_RUN(IntToDoubleConversion2, test) {
2183 typedef double (*IntToDoubleConversion2Code)(int i); 2188 typedef double (*IntToDoubleConversion2Code)(int i);
2184 double res = reinterpret_cast<IntToDoubleConversion2Code>(entry)(3); 2189 double res = reinterpret_cast<IntToDoubleConversion2Code>(test->entry())(3);
2185 EXPECT_FLOAT_EQ(3.0, res, 0.001); 2190 EXPECT_FLOAT_EQ(3.0, res, 0.001);
2186 } 2191 }
2187 2192
2188 ASSEMBLER_TEST_GENERATE(DoubleToDoubleTrunc, assembler) { 2193 ASSEMBLER_TEST_GENERATE(DoubleToDoubleTrunc, assembler) {
2189 __ roundsd(XMM0, XMM0, Assembler::kRoundToZero); 2194 __ roundsd(XMM0, XMM0, Assembler::kRoundToZero);
2190 __ ret(); 2195 __ ret();
2191 } 2196 }
2192 2197
2193 2198
2194 ASSEMBLER_TEST_RUN(DoubleToDoubleTrunc, entry) { 2199 ASSEMBLER_TEST_RUN(DoubleToDoubleTrunc, test) {
2195 typedef double (*DoubleToDoubleTruncCode)(double d); 2200 typedef double (*DoubleToDoubleTruncCode)(double d);
2196 double res = reinterpret_cast<DoubleToDoubleTruncCode>(entry)(12.3); 2201 double res = reinterpret_cast<DoubleToDoubleTruncCode>(test->entry())(12.3);
2197 EXPECT_EQ(12.0, res); 2202 EXPECT_EQ(12.0, res);
2198 res = reinterpret_cast<DoubleToDoubleTruncCode>(entry)(12.8); 2203 res = reinterpret_cast<DoubleToDoubleTruncCode>(test->entry())(12.8);
2199 EXPECT_EQ(12.0, res); 2204 EXPECT_EQ(12.0, res);
2200 res = reinterpret_cast<DoubleToDoubleTruncCode>(entry)(-12.3); 2205 res = reinterpret_cast<DoubleToDoubleTruncCode>(test->entry())(-12.3);
2201 EXPECT_EQ(-12.0, res); 2206 EXPECT_EQ(-12.0, res);
2202 res = reinterpret_cast<DoubleToDoubleTruncCode>(entry)(-12.8); 2207 res = reinterpret_cast<DoubleToDoubleTruncCode>(test->entry())(-12.8);
2203 EXPECT_EQ(-12.0, res); 2208 EXPECT_EQ(-12.0, res);
2204 } 2209 }
2205 2210
2206 2211
2207 ASSEMBLER_TEST_GENERATE(DoubleAbs, assembler) { 2212 ASSEMBLER_TEST_GENERATE(DoubleAbs, assembler) {
2208 __ DoubleAbs(XMM0); 2213 __ DoubleAbs(XMM0);
2209 __ ret(); 2214 __ ret();
2210 } 2215 }
2211 2216
2212 2217
2213 ASSEMBLER_TEST_RUN(DoubleAbs, entry) { 2218 ASSEMBLER_TEST_RUN(DoubleAbs, test) {
2214 typedef double (*DoubleAbsCode)(double d); 2219 typedef double (*DoubleAbsCode)(double d);
2215 double val = -12.45; 2220 double val = -12.45;
2216 double res = reinterpret_cast<DoubleAbsCode>(entry)(val); 2221 double res = reinterpret_cast<DoubleAbsCode>(test->entry())(val);
2217 EXPECT_FLOAT_EQ(-val, res, 0.001); 2222 EXPECT_FLOAT_EQ(-val, res, 0.001);
2218 val = 12.45; 2223 val = 12.45;
2219 res = reinterpret_cast<DoubleAbsCode>(entry)(val); 2224 res = reinterpret_cast<DoubleAbsCode>(test->entry())(val);
2220 EXPECT_FLOAT_EQ(val, res, 0.001); 2225 EXPECT_FLOAT_EQ(val, res, 0.001);
2221 } 2226 }
2222 2227
2223 2228
2224 ASSEMBLER_TEST_GENERATE(DoubleToDoubleRound, assembler) { 2229 ASSEMBLER_TEST_GENERATE(DoubleToDoubleRound, assembler) {
2225 __ DoubleRound(XMM0, XMM0, XMM1); 2230 __ DoubleRound(XMM0, XMM0, XMM1);
2226 __ ret(); 2231 __ ret();
2227 } 2232 }
2228 2233
2229 2234
2230 ASSEMBLER_TEST_RUN(DoubleToDoubleRound, entry) { 2235 ASSEMBLER_TEST_RUN(DoubleToDoubleRound, test) {
2231 typedef double (*DoubleToDoubleRoundCode)(double d); 2236 typedef double (*DoubleToDoubleRoundCode)(double d);
2232 double res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(12.3); 2237 double res = reinterpret_cast<DoubleToDoubleRoundCode>(test->entry())(12.3);
2233 EXPECT_EQ(12.0, res); 2238 EXPECT_EQ(12.0, res);
2234 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(12.8); 2239 res = reinterpret_cast<DoubleToDoubleRoundCode>(test->entry())(12.8);
2235 EXPECT_EQ(13.0, res); 2240 EXPECT_EQ(13.0, res);
2236 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(0.5); 2241 res = reinterpret_cast<DoubleToDoubleRoundCode>(test->entry())(0.5);
2237 EXPECT_EQ(1.0, res); 2242 EXPECT_EQ(1.0, res);
2238 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(-12.3); 2243 res = reinterpret_cast<DoubleToDoubleRoundCode>(test->entry())(-12.3);
2239 EXPECT_EQ(-12.0, res); 2244 EXPECT_EQ(-12.0, res);
2240 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(-12.8); 2245 res = reinterpret_cast<DoubleToDoubleRoundCode>(test->entry())(-12.8);
2241 EXPECT_EQ(-13.0, res); 2246 EXPECT_EQ(-13.0, res);
2242 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(-0.5); 2247 res = reinterpret_cast<DoubleToDoubleRoundCode>(test->entry())(-0.5);
2243 EXPECT_EQ(-1.0, res); 2248 EXPECT_EQ(-1.0, res);
2244 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(0.49999999999999994); 2249 res = reinterpret_cast<DoubleToDoubleRoundCode>(
2250 test->entry())(0.49999999999999994);
2245 EXPECT_EQ(0.0, res); 2251 EXPECT_EQ(0.0, res);
2246 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(-0.49999999999999994); 2252 res = reinterpret_cast<DoubleToDoubleRoundCode>(
2253 test->entry())(-0.49999999999999994);
2247 EXPECT_EQ(-0.0, res); 2254 EXPECT_EQ(-0.0, res);
2248 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(9007199254740991.0); 2255 res = reinterpret_cast<DoubleToDoubleRoundCode>(
2256 test->entry())(9007199254740991.0);
2249 EXPECT_EQ(9007199254740991.0, res); 2257 EXPECT_EQ(9007199254740991.0, res);
2250 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(-9007199254740991.0); 2258 res = reinterpret_cast<DoubleToDoubleRoundCode>(
2259 test->entry())(-9007199254740991.0);
2251 EXPECT_EQ(-9007199254740991.0, res); 2260 EXPECT_EQ(-9007199254740991.0, res);
2252 } 2261 }
2253 2262
2254 2263
2255 ASSEMBLER_TEST_GENERATE(ExtractSignBits, assembler) { 2264 ASSEMBLER_TEST_GENERATE(ExtractSignBits, assembler) {
2256 __ movmskpd(RAX, XMM0); 2265 __ movmskpd(RAX, XMM0);
2257 __ andq(RAX, Immediate(0x1)); 2266 __ andq(RAX, Immediate(0x1));
2258 __ ret(); 2267 __ ret();
2259 } 2268 }
2260 2269
2261 2270
2262 ASSEMBLER_TEST_RUN(ExtractSignBits, entry) { 2271 ASSEMBLER_TEST_RUN(ExtractSignBits, test) {
2263 typedef int (*ExtractSignBits)(double d); 2272 typedef int (*ExtractSignBits)(double d);
2264 int res = reinterpret_cast<ExtractSignBits>(entry)(1.0); 2273 int res = reinterpret_cast<ExtractSignBits>(test->entry())(1.0);
2265 EXPECT_EQ(0, res); 2274 EXPECT_EQ(0, res);
2266 res = reinterpret_cast<ExtractSignBits>(entry)(-1.0); 2275 res = reinterpret_cast<ExtractSignBits>(test->entry())(-1.0);
2267 EXPECT_EQ(1, res); 2276 EXPECT_EQ(1, res);
2268 res = reinterpret_cast<ExtractSignBits>(entry)(-0.0); 2277 res = reinterpret_cast<ExtractSignBits>(test->entry())(-0.0);
2269 EXPECT_EQ(1, res); 2278 EXPECT_EQ(1, res);
2270 } 2279 }
2271 2280
2272 } // namespace dart 2281 } // namespace dart
2273 2282
2274 #endif // defined TARGET_ARCH_X64 2283 #endif // defined TARGET_ARCH_X64
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698