Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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_MIPS) | 6 #if defined(TARGET_ARCH_MIPS) |
| 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 ASSEMBLER_TEST_GENERATE(Simple, assembler) { | |
| 18 __ LoadImmediate(V0, 42); | |
| 19 __ jr(RA); | |
| 20 } | |
| 21 | |
| 22 | |
| 23 ASSEMBLER_TEST_RUN(Simple, test) { | |
| 24 typedef int (*SimpleCode)(); | |
| 25 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 26 } | |
| 27 | |
| 17 | 28 |
| 18 ASSEMBLER_TEST_GENERATE(Addiu, assembler) { | 29 ASSEMBLER_TEST_GENERATE(Addiu, assembler) { |
| 19 __ addiu(V0, ZR, Immediate(42)); | 30 __ addiu(V0, ZR, Immediate(42)); |
| 20 __ jr(RA); | 31 __ jr(RA); |
| 21 } | 32 } |
| 22 | 33 |
| 23 | 34 |
| 24 ASSEMBLER_TEST_RUN(Addiu, test) { | 35 ASSEMBLER_TEST_RUN(Addiu, test) { |
| 25 typedef int (*SimpleCode)(); | 36 typedef int (*SimpleCode)(); |
| 26 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 37 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 315 __ jr(RA); | 326 __ jr(RA); |
| 316 } | 327 } |
| 317 | 328 |
| 318 | 329 |
| 319 ASSEMBLER_TEST_RUN(Lui, test) { | 330 ASSEMBLER_TEST_RUN(Lui, test) { |
| 320 typedef int (*SimpleCode)(); | 331 typedef int (*SimpleCode)(); |
| 321 EXPECT_EQ(42 << 16, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 332 EXPECT_EQ(42 << 16, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 322 } | 333 } |
| 323 | 334 |
| 324 | 335 |
| 325 ASSEMBLER_TEST_GENERATE(Simple, assembler) { | 336 ASSEMBLER_TEST_GENERATE(Sll, assembler) { |
| 337 __ LoadImmediate(R1, 21); | |
| 338 __ sll(V0, R1, 1); | |
| 339 __ jr(RA); | |
| 340 } | |
| 341 | |
| 342 | |
| 343 ASSEMBLER_TEST_RUN(Sll, test) { | |
| 344 typedef int (*SimpleCode)(); | |
| 345 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 346 } | |
| 347 | |
| 348 | |
| 349 ASSEMBLER_TEST_GENERATE(Srl, assembler) { | |
| 350 __ LoadImmediate(R1, 84); | |
| 351 __ srl(V0, R1, 1); | |
| 352 __ jr(RA); | |
| 353 } | |
| 354 | |
| 355 | |
| 356 ASSEMBLER_TEST_RUN(Srl, test) { | |
| 357 typedef int (*SimpleCode)(); | |
| 358 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 359 } | |
| 360 | |
| 361 | |
| 362 ASSEMBLER_TEST_GENERATE(LShifting, assembler) { | |
| 363 __ LoadImmediate(R1, 1); | |
| 364 __ sll(R1, R1, 31); | |
| 365 __ srl(V0, R1, 31); | |
| 366 __ jr(RA); | |
| 367 } | |
| 368 | |
| 369 | |
| 370 ASSEMBLER_TEST_RUN(LShifting, test) { | |
| 371 typedef int (*SimpleCode)(); | |
| 372 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 373 } | |
| 374 | |
| 375 | |
| 376 ASSEMBLER_TEST_GENERATE(RShifting, assembler) { | |
| 377 __ LoadImmediate(R1, 1); | |
| 378 __ sll(R1, R1, 31); | |
| 379 __ sra(V0, R1, 31); | |
| 380 __ jr(RA); | |
| 381 } | |
| 382 | |
| 383 | |
| 384 ASSEMBLER_TEST_RUN(RShifting, test) { | |
| 385 typedef int (*SimpleCode)(); | |
| 386 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 387 } | |
| 388 | |
| 389 | |
| 390 ASSEMBLER_TEST_GENERATE(Sllv, assembler) { | |
| 391 __ LoadImmediate(R1, 21); | |
| 392 __ LoadImmediate(R2, 1); | |
| 393 __ sllv(V0, R1, R2); | |
| 394 __ jr(RA); | |
| 395 } | |
| 396 | |
| 397 | |
| 398 ASSEMBLER_TEST_RUN(Sllv, test) { | |
| 399 typedef int (*SimpleCode)(); | |
| 400 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 401 } | |
| 402 | |
| 403 | |
| 404 ASSEMBLER_TEST_GENERATE(Srlv, assembler) { | |
| 405 __ LoadImmediate(R1, 84); | |
| 406 __ LoadImmediate(R2, 1); | |
| 407 __ srlv(V0, R1, R2); | |
| 408 __ jr(RA); | |
| 409 } | |
| 410 | |
| 411 | |
| 412 ASSEMBLER_TEST_RUN(Srlv, test) { | |
| 413 typedef int (*SimpleCode)(); | |
| 414 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 415 } | |
| 416 | |
| 417 | |
| 418 ASSEMBLER_TEST_GENERATE(LShiftingV, assembler) { | |
| 419 __ LoadImmediate(R1, 1); | |
| 420 __ LoadImmediate(R2, 31); | |
| 421 __ sllv(R1, R1, R2); | |
| 422 __ srlv(V0, R1, R2); | |
| 423 __ jr(RA); | |
| 424 } | |
| 425 | |
| 426 | |
| 427 ASSEMBLER_TEST_RUN(LShiftingV, test) { | |
| 428 typedef int (*SimpleCode)(); | |
| 429 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 430 } | |
| 431 | |
| 432 | |
| 433 ASSEMBLER_TEST_GENERATE(RShiftingV, assembler) { | |
| 434 __ LoadImmediate(R1, 1); | |
| 435 __ LoadImmediate(R2, 31); | |
| 436 __ sllv(R1, R1, R2); | |
| 437 __ srav(V0, R1, R2); | |
| 438 __ jr(RA); | |
| 439 } | |
| 440 | |
| 441 | |
| 442 ASSEMBLER_TEST_RUN(RShiftingV, test) { | |
| 443 typedef int (*SimpleCode)(); | |
| 444 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 445 } | |
| 446 | |
| 447 | |
| 448 ASSEMBLER_TEST_GENERATE(Mult_pos, assembler) { | |
| 449 __ LoadImmediate(R1, 6); | |
| 450 __ LoadImmediate(R2, 7); | |
| 451 __ mult(R1, R2); | |
| 452 __ mflo(V0); | |
| 453 __ jr(RA); | |
| 454 } | |
| 455 | |
| 456 | |
| 457 ASSEMBLER_TEST_RUN(Mult_pos, test) { | |
| 458 typedef int (*SimpleCode)(); | |
| 459 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 460 } | |
| 461 | |
| 462 | |
| 463 ASSEMBLER_TEST_GENERATE(Mult_neg, assembler) { | |
| 464 __ LoadImmediate(R1, -6); | |
| 465 __ LoadImmediate(R2, 7); | |
| 466 __ mult(R1, R2); | |
| 467 __ mflo(V0); | |
| 468 __ jr(RA); | |
| 469 } | |
| 470 | |
| 471 | |
| 472 ASSEMBLER_TEST_RUN(Mult_neg, test) { | |
| 473 typedef int (*SimpleCode)(); | |
| 474 EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 475 } | |
| 476 | |
| 477 | |
| 478 ASSEMBLER_TEST_GENERATE(Mult_neg_hi, assembler) { | |
| 479 __ LoadImmediate(R1, -6); | |
| 480 __ LoadImmediate(R2, 7); | |
| 481 __ mult(R1, R2); | |
| 482 __ mfhi(V0); | |
| 483 __ jr(RA); | |
| 484 } | |
| 485 | |
| 486 | |
| 487 ASSEMBLER_TEST_RUN(Mult_neg_hi, test) { | |
| 488 typedef int (*SimpleCode)(); | |
| 489 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 490 } | |
| 491 | |
| 492 | |
| 493 ASSEMBLER_TEST_GENERATE(Multu_lo, assembler) { | |
| 494 __ LoadImmediate(R1, 6); | |
| 495 __ LoadImmediate(R2, 7); | |
| 496 __ multu(R1, R2); | |
| 497 __ mflo(V0); | |
| 498 __ jr(RA); | |
| 499 } | |
| 500 | |
| 501 | |
| 502 ASSEMBLER_TEST_RUN(Multu_lo, test) { | |
| 503 typedef int (*SimpleCode)(); | |
| 504 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 505 } | |
| 506 | |
| 507 | |
| 508 ASSEMBLER_TEST_GENERATE(Multu_hi, assembler) { | |
| 509 __ LoadImmediate(R1, 65536); | |
| 510 __ LoadImmediate(R2, 65536); | |
| 511 __ multu(R1, R2); | |
| 512 __ mfhi(V0); | |
| 513 __ jr(RA); | |
| 514 } | |
| 515 | |
| 516 | |
| 517 ASSEMBLER_TEST_RUN(Multu_hi, test) { | |
| 518 typedef int (*SimpleCode)(); | |
| 519 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 520 } | |
| 521 | |
| 522 | |
| 523 ASSEMBLER_TEST_GENERATE(Subu, assembler) { | |
| 524 __ LoadImmediate(R1, 737); | |
| 525 __ LoadImmediate(R2, 695); | |
| 526 __ subu(V0, R1, R2); | |
| 527 __ jr(RA); | |
| 528 } | |
| 529 | |
| 530 | |
| 531 ASSEMBLER_TEST_RUN(Subu, test) { | |
| 532 typedef int (*SimpleCode)(); | |
| 533 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 534 } | |
| 535 | |
| 536 | |
| 537 ASSEMBLER_TEST_GENERATE(Or, assembler) { | |
| 538 __ LoadImmediate(R1, 34); | |
| 539 __ LoadImmediate(R2, 8); | |
| 540 __ or_(V0, R1, R2); | |
| 541 __ jr(RA); | |
| 542 } | |
| 543 | |
| 544 | |
| 545 ASSEMBLER_TEST_RUN(Or, test) { | |
| 546 typedef int (*SimpleCode)(); | |
| 547 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 548 } | |
| 549 | |
| 550 | |
| 551 ASSEMBLER_TEST_GENERATE(Nor, assembler) { | |
| 552 __ LoadImmediate(R1, -47); | |
| 553 __ LoadImmediate(R2, -60); | |
| 554 __ nor(V0, R1, R2); | |
| 555 __ jr(RA); | |
| 556 } | |
| 557 | |
| 558 | |
| 559 ASSEMBLER_TEST_RUN(Nor, test) { | |
| 560 typedef int (*SimpleCode)(); | |
| 561 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 562 } | |
| 563 | |
| 564 | |
| 565 ASSEMBLER_TEST_GENERATE(Xor, assembler) { | |
| 566 __ LoadImmediate(R1, 51); | |
| 567 __ LoadImmediate(R2, 25); | |
| 568 __ xor_(V0, R1, R2); | |
| 569 __ jr(RA); | |
| 570 } | |
| 571 | |
| 572 | |
| 573 ASSEMBLER_TEST_RUN(Xor, test) { | |
| 574 typedef int (*SimpleCode)(); | |
| 575 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 576 } | |
| 577 | |
| 578 | |
| 579 ASSEMBLER_TEST_GENERATE(Slt, assembler) { | |
| 580 __ LoadImmediate(R1, -1); | |
| 581 __ LoadImmediate(R2, 0); | |
| 582 __ slt(V0, R1, R2); | |
| 583 __ jr(RA); | |
| 584 } | |
| 585 | |
| 586 | |
| 587 ASSEMBLER_TEST_RUN(Slt, test) { | |
| 588 typedef int (*SimpleCode)(); | |
| 589 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 590 } | |
| 591 | |
| 592 | |
| 593 ASSEMBLER_TEST_GENERATE(Sltu, assembler) { | |
| 594 __ LoadImmediate(R1, -1); | |
| 595 __ LoadImmediate(R2, 0); | |
| 596 __ sltu(V0, R1, R2); | |
| 597 __ jr(RA); | |
| 598 } | |
| 599 | |
| 600 | |
| 601 ASSEMBLER_TEST_RUN(Sltu, test) { | |
| 602 typedef int (*SimpleCode)(); | |
| 603 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 604 } | |
| 605 | |
| 606 | |
| 607 ASSEMBLER_TEST_GENERATE(Movz, assembler) { | |
| 608 __ LoadImmediate(R1, 42); | |
| 609 __ LoadImmediate(R2, 23); | |
| 610 __ slt(R3, R1, R2); | |
| 611 __ movz(V0, R1, R3); | |
| 612 __ jr(RA); | |
| 613 } | |
| 614 | |
| 615 | |
| 616 ASSEMBLER_TEST_RUN(Movz, test) { | |
| 617 typedef int (*SimpleCode)(); | |
| 618 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 619 } | |
| 620 | |
| 621 | |
| 622 ASSEMBLER_TEST_GENERATE(Movn, assembler) { | |
| 623 __ LoadImmediate(R1, 42); | |
| 624 __ LoadImmediate(R2, 23); | |
| 625 __ slt(R3, R2, R1); | |
| 626 __ movn(V0, R1, R3); | |
| 627 __ jr(RA); | |
| 628 } | |
| 629 | |
| 630 | |
| 631 ASSEMBLER_TEST_RUN(Movn, test) { | |
| 632 typedef int (*SimpleCode)(); | |
| 633 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 634 } | |
| 635 | |
| 636 | |
| 637 ASSEMBLER_TEST_GENERATE(Jr_delay, assembler) { | |
| 326 __ jr(RA); | 638 __ jr(RA); |
| 327 __ delay_slot()->ori(V0, ZR, Immediate(42)); | 639 __ delay_slot()->ori(V0, ZR, Immediate(42)); |
| 328 } | 640 } |
| 329 | 641 |
| 330 | 642 |
| 331 ASSEMBLER_TEST_RUN(Simple, test) { | 643 ASSEMBLER_TEST_RUN(Jr_delay, test) { |
| 644 typedef int (*SimpleCode)(); | |
| 645 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | |
| 646 } | |
| 647 | |
| 648 | |
| 649 ASSEMBLER_TEST_GENERATE(Jalr_delay, assembler) { | |
| 650 __ Mov(R2, RA); | |
|
Ivan Posva
2013/03/21 00:08:06
__ Mov will not compile.
zra
2013/03/21 15:49:08
Whoops! Still getting the hang of all this =)
| |
| 651 __ jalr(R2, RA); | |
| 652 __ delay_slot()->ori(V0, ZR, Immediate(42)); | |
| 653 } | |
| 654 | |
| 655 | |
| 656 ASSEMBLER_TEST_RUN(Jalr_delay, test) { | |
| 332 typedef int (*SimpleCode)(); | 657 typedef int (*SimpleCode)(); |
| 333 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 658 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); |
| 334 } | 659 } |
| 335 | 660 |
| 336 } // namespace dart | 661 } // namespace dart |
| 337 | 662 |
| 338 #endif // defined TARGET_ARCH_MIPS | 663 #endif // defined TARGET_ARCH_MIPS |
| OLD | NEW |