assembler_rv32i_tests.cpp
1 #include <catch/catch.hpp> 2 3 #include <array> 4 #include <biscuit/assembler.hpp> 5 6 #include "assembler_test_utils.hpp" 7 8 using namespace biscuit; 9 10 TEST_CASE("ADD", "[rv32i]") { 11 uint32_t value = 0; 12 auto as = MakeAssembler32(value); 13 14 as.ADD(x7, x15, x31); 15 REQUIRE(value == 0x01F783B3); 16 17 as.RewindBuffer(); 18 19 as.ADD(x31, x31, x31); 20 REQUIRE(value == 0x01FF8FB3); 21 22 as.RewindBuffer(); 23 24 as.ADD(x0, x0, x0); 25 REQUIRE(value == 0x00000033); 26 } 27 28 TEST_CASE("ADDI", "[rv32i]") { 29 uint32_t value = 0; 30 auto as = MakeAssembler32(value); 31 32 as.ADDI(x15, x31, 1024); 33 REQUIRE(value == 0x400F8793); 34 35 as.RewindBuffer(); 36 37 as.ADDI(x15, x31, 2048); 38 REQUIRE(value == 0x800F8793); 39 40 as.RewindBuffer(); 41 42 as.ADDI(x15, x31, 4095); 43 REQUIRE(value == 0xFFFF8793); 44 } 45 46 TEST_CASE("AND", "[rv32i]") { 47 uint32_t value = 0; 48 auto as = MakeAssembler32(value); 49 50 as.AND(x7, x15, x31); 51 REQUIRE(value == 0x01F7F3B3); 52 53 as.RewindBuffer(); 54 55 as.AND(x31, x31, x31); 56 REQUIRE(value == 0x01FFFFB3); 57 58 as.RewindBuffer(); 59 60 as.AND(x0, x0, x0); 61 REQUIRE(value == 0x00007033); 62 } 63 64 TEST_CASE("ANDI", "[rv32i]") { 65 uint32_t value = 0; 66 auto as = MakeAssembler32(value); 67 68 as.ANDI(x15, x31, 1024); 69 REQUIRE(value == 0x400FF793); 70 71 as.RewindBuffer(); 72 73 as.ANDI(x15, x31, 2048); 74 REQUIRE(value == 0x800FF793); 75 76 as.RewindBuffer(); 77 78 as.ANDI(x15, x31, 4095); 79 REQUIRE(value == 0xFFFFF793); 80 } 81 82 TEST_CASE("AUIPC", "[rv32i]") { 83 uint32_t value = 0; 84 auto as = MakeAssembler32(value); 85 86 as.AUIPC(x31, -1); 87 REQUIRE(value == 0xFFFFFF97); 88 89 as.RewindBuffer(); 90 91 as.AUIPC(x31, 0); 92 REQUIRE(value == 0x00000F97); 93 94 as.RewindBuffer(); 95 96 as.AUIPC(x31, 0x00FF00FF); 97 REQUIRE(value == 0xF00FFF97); 98 } 99 100 TEST_CASE("BEQ", "[rv32i]") { 101 uint32_t value = 0; 102 auto as = MakeAssembler32(value); 103 104 as.BEQ(x15, x31, 2000); 105 REQUIRE(value == 0x7DF78863); 106 107 as.RewindBuffer(); 108 109 as.BEQ(x15, x31, -2); 110 REQUIRE(value == 0xFFF78FE3); 111 } 112 113 TEST_CASE("BGE", "[rv32i]") { 114 uint32_t value = 0; 115 auto as = MakeAssembler32(value); 116 117 as.BGE(x15, x31, 2000); 118 REQUIRE(value == 0x7DF7D863); 119 120 as.RewindBuffer(); 121 122 as.BGE(x15, x31, -2); 123 REQUIRE(value == 0xFFF7DFE3); 124 } 125 126 TEST_CASE("BGEU", "[rv32i]") { 127 uint32_t value = 0; 128 auto as = MakeAssembler32(value); 129 130 as.BGEU(x15, x31, 2000); 131 REQUIRE(value == 0x7DF7F863); 132 133 as.RewindBuffer(); 134 135 as.BGEU(x15, x31, -2); 136 REQUIRE(value == 0xFFF7FFE3); 137 } 138 139 TEST_CASE("BNE", "[rv32i]") { 140 uint32_t value = 0; 141 auto as = MakeAssembler32(value); 142 143 as.BNE(x15, x31, 2000); 144 REQUIRE(value == 0x7DF79863); 145 146 as.RewindBuffer(); 147 148 as.BNE(x15, x31, -2); 149 REQUIRE(value == 0xFFF79FE3); 150 } 151 152 TEST_CASE("BLT", "[rv32i]") { 153 uint32_t value = 0; 154 auto as = MakeAssembler32(value); 155 156 as.BLT(x15, x31, 2000); 157 REQUIRE(value == 0x7DF7C863); 158 159 as.RewindBuffer(); 160 161 as.BLT(x15, x31, -2); 162 REQUIRE(value == 0xFFF7CFE3); 163 } 164 165 TEST_CASE("BLTU", "[rv32i]") { 166 uint32_t value = 0; 167 auto as = MakeAssembler32(value); 168 169 as.BLTU(x15, x31, 2000); 170 REQUIRE(value == 0x7DF7E863); 171 172 as.RewindBuffer(); 173 174 as.BLTU(x15, x31, -2); 175 REQUIRE(value == 0xFFF7EFE3); 176 } 177 178 TEST_CASE("CALL", "[rv32i]") { 179 std::array<uint32_t, 2> vals{}; 180 auto as = MakeAssembler32(vals); 181 182 const auto compare_vals = [&vals](uint32_t val_1, uint32_t val_2) { 183 REQUIRE(vals[0] == val_1); 184 REQUIRE(vals[1] == val_2); 185 }; 186 187 as.CALL(-1); 188 compare_vals(0x00000097, 0xFFF080E7); 189 } 190 191 TEST_CASE("EBREAK", "[rv32i]") { 192 uint32_t value = 0; 193 auto as = MakeAssembler32(value); 194 195 as.EBREAK(); 196 REQUIRE(value == 0x00100073); 197 } 198 199 TEST_CASE("ECALL", "[rv32i]") { 200 uint32_t value = 0; 201 auto as = MakeAssembler32(value); 202 203 as.ECALL(); 204 REQUIRE(value == 0x00000073); 205 } 206 207 TEST_CASE("FENCE", "[rv32i]") { 208 uint32_t value = 0; 209 auto as = MakeAssembler32(value); 210 211 as.FENCE(FenceOrder::IORW, FenceOrder::IORW); 212 REQUIRE(value == 0x0FF0000F); 213 214 as.RewindBuffer(); 215 216 as.FENCETSO(); 217 REQUIRE(value == 0x8330000F); 218 219 as.RewindBuffer(); 220 221 as.FENCEI(); 222 REQUIRE(value == 0x0000100F); 223 } 224 225 TEST_CASE("JAL", "[rv32i]") { 226 uint32_t value = 0; 227 auto as = MakeAssembler32(value); 228 229 as.JAL(x31, 0xFFFFFFFF); 230 REQUIRE(value == 0xFFFFFFEF); 231 232 as.RewindBuffer(); 233 234 as.JAL(x31, 2000); 235 REQUIRE(value == 0x7D000FEF); 236 237 as.RewindBuffer(); 238 239 as.JAL(x31, 100000); 240 REQUIRE(value == 0x6A018FEF); 241 } 242 243 TEST_CASE("JALR", "[rv32i]") { 244 uint32_t value = 0; 245 auto as = MakeAssembler32(value); 246 247 as.JALR(x15, 1024, x31); 248 REQUIRE(value == 0x400F87E7); 249 250 as.RewindBuffer(); 251 252 as.JALR(x15, 1536, x31); 253 REQUIRE(value == 0x600F87E7); 254 255 as.RewindBuffer(); 256 257 as.JALR(x15, -1, x31); 258 REQUIRE(value == 0xFFFF87E7); 259 } 260 261 TEST_CASE("LB", "[rv32i]") { 262 uint32_t value = 0; 263 auto as = MakeAssembler32(value); 264 265 as.LB(x15, 1024, x31); 266 REQUIRE(value == 0x400F8783); 267 268 as.RewindBuffer(); 269 270 as.LB(x15, 1536, x31); 271 REQUIRE(value == 0x600F8783); 272 273 as.RewindBuffer(); 274 275 as.LB(x15, -1, x31); 276 REQUIRE(value == 0xFFFF8783); 277 } 278 279 TEST_CASE("LBU", "[rv32i]") { 280 uint32_t value = 0; 281 auto as = MakeAssembler32(value); 282 283 as.LBU(x15, 1024, x31); 284 REQUIRE(value == 0x400FC783); 285 286 as.RewindBuffer(); 287 288 as.LBU(x15, 1536, x31); 289 REQUIRE(value == 0x600FC783); 290 291 as.RewindBuffer(); 292 293 as.LBU(x15, -1, x31); 294 REQUIRE(value == 0xFFFFC783); 295 } 296 297 TEST_CASE("LH", "[rv32i]") { 298 uint32_t value = 0; 299 auto as = MakeAssembler32(value); 300 301 as.LH(x15, 1024, x31); 302 REQUIRE(value == 0x400F9783); 303 304 as.RewindBuffer(); 305 306 as.LH(x15, 1536, x31); 307 REQUIRE(value == 0x600F9783); 308 309 as.RewindBuffer(); 310 311 as.LH(x15, -1, x31); 312 REQUIRE(value == 0xFFFF9783); 313 } 314 315 TEST_CASE("LHU", "[rv32i]") { 316 uint32_t value = 0; 317 auto as = MakeAssembler32(value); 318 319 as.LHU(x15, 1024, x31); 320 REQUIRE(value == 0x400FD783); 321 322 as.RewindBuffer(); 323 324 as.LHU(x15, 1536, x31); 325 REQUIRE(value == 0x600FD783); 326 327 as.RewindBuffer(); 328 329 as.LHU(x15, -1, x31); 330 REQUIRE(value == 0xFFFFD783); 331 } 332 333 TEST_CASE("LI", "[rv32i]") { 334 std::array<uint32_t, 2> vals{}; 335 auto as = MakeAssembler32(vals); 336 337 const auto compare_vals = [&vals](uint32_t val_1, uint32_t val_2) { 338 REQUIRE(vals[0] == val_1); 339 REQUIRE(vals[1] == val_2); 340 }; 341 342 ///////// Single ADDI cases 343 344 as.LI(x1, 0); 345 // addi x1, x0, 0 346 compare_vals(0x00000093, 0x00000000); 347 as.RewindBuffer(); 348 vals = {}; 349 350 as.LI(x1, -1); 351 // addi x1, x0, -1 352 compare_vals(0xFFF00093, 0x00000000); 353 as.RewindBuffer(); 354 vals = {}; 355 356 as.LI(x1, 42); 357 // addi x1, x0, 42 358 compare_vals(0x02A00093, 0x000000000); 359 as.RewindBuffer(); 360 vals = {}; 361 362 as.LI(x1, 0x7ff); 363 // addi x1, x0, 2047 364 compare_vals(0x7FF00093, 0x00000000); 365 as.RewindBuffer(); 366 vals = {}; 367 368 ///////// Single LUI cases 369 370 as.LI(x1, 0x2A000); 371 // lui x1, 42 372 compare_vals(0x0002A0B7, 0x00000000); 373 as.RewindBuffer(); 374 vals = {}; 375 376 as.LI(x1, ~0xFFF); 377 // lui x1, -1 378 compare_vals(0xFFFFF0B7, 0x00000000); 379 as.RewindBuffer(); 380 vals = {}; 381 382 as.LI(x1, INT32_MIN); 383 // lui x1, -524288 384 compare_vals(0x800000B7, 0x00000000); 385 as.RewindBuffer(); 386 vals = {}; 387 388 ///////// Full LUI+ADDI cases 389 390 as.LI(x1, 0x11111111); 391 // lui x1, 69905 392 // addi x1, x1, 273 393 compare_vals(0x111110B7, 0x11108093); 394 as.RewindBuffer(); 395 vals = {}; 396 397 as.LI(x1, INT32_MAX); 398 // lui x1, -524288 399 // addi x1, x1, -1 400 compare_vals(0x800000B7, 0xFFF08093); 401 } 402 403 TEST_CASE("LUI", "[rv32i]") { 404 uint32_t value = 0; 405 auto as = MakeAssembler32(value); 406 407 as.LUI(x10, 0xFFFFFFFF); 408 REQUIRE(value == 0xFFFFF537); 409 410 as.RewindBuffer(); 411 412 as.LUI(x10, 0xFFF7FFFF); 413 REQUIRE(value == 0x7FFFF537); 414 415 as.RewindBuffer(); 416 417 as.LUI(x31, 0xFFFFFFFF); 418 REQUIRE(value == 0xFFFFFFB7); 419 } 420 421 TEST_CASE("LW", "[rv32i]") { 422 uint32_t value = 0; 423 auto as = MakeAssembler32(value); 424 425 as.LW(x15, 1024, x31); 426 REQUIRE(value == 0x400FA783); 427 428 as.RewindBuffer(); 429 430 as.LW(x15, 1536, x31); 431 REQUIRE(value == 0x600FA783); 432 433 as.RewindBuffer(); 434 435 as.LW(x15, -1, x31); 436 REQUIRE(value == 0xFFFFA783); 437 } 438 439 TEST_CASE("OR", "[rv32i]") { 440 uint32_t value = 0; 441 auto as = MakeAssembler32(value); 442 443 as.OR(x7, x15, x31); 444 REQUIRE(value == 0x01F7E3B3); 445 446 as.RewindBuffer(); 447 448 as.OR(x31, x31, x31); 449 REQUIRE(value == 0x01FFEFB3); 450 451 as.RewindBuffer(); 452 453 as.OR(x0, x0, x0); 454 REQUIRE(value == 0x00006033); 455 } 456 457 TEST_CASE("ORI", "[rv32i]") { 458 uint32_t value = 0; 459 auto as = MakeAssembler32(value); 460 461 as.ORI(x15, x31, 1024); 462 REQUIRE(value == 0x400FE793); 463 464 as.RewindBuffer(); 465 466 as.ORI(x15, x31, 2048); 467 REQUIRE(value == 0x800FE793); 468 469 as.RewindBuffer(); 470 471 as.ORI(x15, x31, 4095); 472 REQUIRE(value == 0xFFFFE793); 473 } 474 475 TEST_CASE("PAUSE", "[rv32i]") { 476 uint32_t value = 0; 477 auto as = MakeAssembler32(value); 478 479 as.PAUSE(); 480 REQUIRE(value == 0x0100000F); 481 } 482 483 TEST_CASE("SB", "[rv32i]") { 484 uint32_t value = 0; 485 auto as = MakeAssembler32(value); 486 487 as.SB(x31, 1024, x15); 488 REQUIRE(value == 0x41F78023); 489 490 as.RewindBuffer(); 491 492 as.SB(x31, 1536, x15); 493 REQUIRE(value == 0x61F78023); 494 495 as.RewindBuffer(); 496 497 as.SB(x31, -1, x15); 498 REQUIRE(value == 0xFFF78FA3); 499 } 500 501 TEST_CASE("SH", "[rv32i]") { 502 uint32_t value = 0; 503 auto as = MakeAssembler32(value); 504 505 as.SH(x31, 1024, x15); 506 REQUIRE(value == 0x41F79023); 507 508 as.RewindBuffer(); 509 510 as.SH(x31, 1536, x15); 511 REQUIRE(value == 0x61F79023); 512 513 as.RewindBuffer(); 514 515 as.SH(x31, -1, x15); 516 REQUIRE(value == 0xFFF79FA3); 517 } 518 519 TEST_CASE("SLL", "[rv32i]") { 520 uint32_t value = 0; 521 auto as = MakeAssembler32(value); 522 523 as.SLL(x7, x15, x31); 524 REQUIRE(value == 0x01F793B3); 525 526 as.RewindBuffer(); 527 528 as.SLL(x31, x31, x31); 529 REQUIRE(value == 0x01FF9FB3); 530 531 as.RewindBuffer(); 532 533 as.SLL(x0, x0, x0); 534 REQUIRE(value == 0x00001033); 535 } 536 537 TEST_CASE("SLLI", "[rv32i]") { 538 uint32_t value = 0; 539 auto as = MakeAssembler32(value); 540 541 as.SLLI(x31, x15, 10); 542 REQUIRE(value == 0x00A79F93); 543 544 as.RewindBuffer(); 545 546 as.SLLI(x31, x15, 20); 547 REQUIRE(value == 0x01479F93); 548 549 as.RewindBuffer(); 550 551 as.SLLI(x31, x15, 31); 552 REQUIRE(value == 0x01F79F93); 553 } 554 555 TEST_CASE("SLT", "[rv32i]") { 556 uint32_t value = 0; 557 auto as = MakeAssembler32(value); 558 559 as.SLT(x7, x15, x31); 560 REQUIRE(value == 0x01F7A3B3); 561 562 as.RewindBuffer(); 563 564 as.SLT(x31, x31, x31); 565 REQUIRE(value == 0x01FFAFB3); 566 567 as.RewindBuffer(); 568 569 as.SLT(x0, x0, x0); 570 REQUIRE(value == 0x00002033); 571 } 572 573 TEST_CASE("SLTI", "[rv32i]") { 574 uint32_t value = 0; 575 auto as = MakeAssembler32(value); 576 577 as.SLTI(x15, x31, 1024); 578 REQUIRE(value == 0x400FA793); 579 580 as.RewindBuffer(); 581 582 as.SLTI(x15, x31, -2048); 583 REQUIRE(value == 0x800FA793); 584 585 as.RewindBuffer(); 586 587 as.SLTI(x15, x31, -1); 588 REQUIRE(value == 0xFFFFA793); 589 } 590 591 TEST_CASE("SLTIU", "[rv32i]") { 592 uint32_t value = 0; 593 auto as = MakeAssembler32(value); 594 595 as.SLTIU(x15, x31, 1024); 596 REQUIRE(value == 0x400FB793); 597 598 as.RewindBuffer(); 599 600 as.SLTIU(x15, x31, -2048); 601 REQUIRE(value == 0x800FB793); 602 603 as.RewindBuffer(); 604 605 as.SLTIU(x15, x31, -1); 606 REQUIRE(value == 0xFFFFB793); 607 } 608 609 TEST_CASE("SLTU", "[rv32i]") { 610 uint32_t value = 0; 611 auto as = MakeAssembler32(value); 612 613 as.SLTU(x7, x15, x31); 614 REQUIRE(value == 0x01F7B3B3); 615 616 as.RewindBuffer(); 617 618 as.SLTU(x31, x31, x31); 619 REQUIRE(value == 0x01FFBFB3); 620 621 as.RewindBuffer(); 622 623 as.SLTU(x0, x0, x0); 624 REQUIRE(value == 0x00003033); 625 } 626 627 TEST_CASE("SRA", "[rv32i]") { 628 uint32_t value = 0; 629 auto as = MakeAssembler32(value); 630 631 as.SRA(x7, x15, x31); 632 REQUIRE(value == 0x41F7D3B3); 633 634 as.RewindBuffer(); 635 636 as.SRA(x31, x31, x31); 637 REQUIRE(value == 0x41FFDFB3); 638 639 as.RewindBuffer(); 640 641 as.SRA(x0, x0, x0); 642 REQUIRE(value == 0x40005033); 643 } 644 645 TEST_CASE("SRAI", "[rv32i]") { 646 uint32_t value = 0; 647 auto as = MakeAssembler32(value); 648 649 as.SRAI(x31, x15, 10); 650 REQUIRE(value == 0x40A7DF93); 651 652 as.RewindBuffer(); 653 654 as.SRAI(x31, x15, 20); 655 REQUIRE(value == 0x4147DF93); 656 657 as.RewindBuffer(); 658 659 as.SRAI(x31, x15, 31); 660 REQUIRE(value == 0x41F7DF93); 661 } 662 663 TEST_CASE("SRL", "[rv32i]") { 664 uint32_t value = 0; 665 auto as = MakeAssembler32(value); 666 667 as.SRL(x7, x15, x31); 668 REQUIRE(value == 0x01F7D3B3); 669 670 as.RewindBuffer(); 671 672 as.SRL(x31, x31, x31); 673 REQUIRE(value == 0x01FFDFB3); 674 675 as.RewindBuffer(); 676 677 as.SRL(x0, x0, x0); 678 REQUIRE(value == 0x00005033); 679 } 680 681 TEST_CASE("SRLI", "[rv32i]") { 682 uint32_t value = 0; 683 auto as = MakeAssembler32(value); 684 685 as.SRLI(x31, x15, 10); 686 REQUIRE(value == 0x00A7DF93); 687 688 as.RewindBuffer(); 689 690 as.SRLI(x31, x15, 20); 691 REQUIRE(value == 0x0147DF93); 692 693 as.RewindBuffer(); 694 695 as.SRLI(x31, x15, 31); 696 REQUIRE(value == 0x01F7DF93); 697 } 698 699 TEST_CASE("SUB", "[rv32i]") { 700 uint32_t value = 0; 701 auto as = MakeAssembler32(value); 702 703 as.SUB(x7, x15, x31); 704 REQUIRE(value == 0x41F783B3); 705 706 as.RewindBuffer(); 707 708 as.SUB(x31, x31, x31); 709 REQUIRE(value == 0x41FF8FB3); 710 711 as.RewindBuffer(); 712 713 as.SUB(x0, x0, x0); 714 REQUIRE(value == 0x40000033); 715 } 716 717 TEST_CASE("SW", "[rv32i]") { 718 uint32_t value = 0; 719 auto as = MakeAssembler32(value); 720 721 as.SW(x31, 1024, x15); 722 REQUIRE(value == 0x41F7A023); 723 724 as.RewindBuffer(); 725 726 as.SW(x31, 1536, x15); 727 REQUIRE(value == 0x61F7A023); 728 729 as.RewindBuffer(); 730 731 as.SW(x31, -1, x15); 732 REQUIRE(value == 0xFFF7AFA3); 733 } 734 735 TEST_CASE("XOR", "[rv32i]") { 736 uint32_t value = 0; 737 auto as = MakeAssembler32(value); 738 739 as.XOR(x7, x15, x31); 740 REQUIRE(value == 0x01F7C3B3); 741 742 as.RewindBuffer(); 743 744 as.XOR(x31, x31, x31); 745 REQUIRE(value == 0x01FFCFB3); 746 747 as.RewindBuffer(); 748 749 as.XOR(x0, x0, x0); 750 REQUIRE(value == 0x00004033); 751 } 752 753 TEST_CASE("XORI", "[rv32i]") { 754 uint32_t value = 0; 755 auto as = MakeAssembler32(value); 756 757 as.XORI(x15, x31, 1024); 758 REQUIRE(value == 0x400FC793); 759 760 as.RewindBuffer(); 761 762 as.XORI(x15, x31, 2048); 763 REQUIRE(value == 0x800FC793); 764 765 as.RewindBuffer(); 766 767 as.XORI(x15, x31, 4095); 768 REQUIRE(value == 0xFFFFC793); 769 }