1# check that basic insns work. 2# mach: ft32 3 4.include "testutils.inc" 5 6 start 7 8 ldk $r0,__PMSIZE 9 EXPECT $r0,0x00040000 10 ldk $r0,__RAMSIZE 11 EXPECT $r0,0x00010000 12 13 ldk $r4,10 14 add $r4,$r4,23 15 EXPECT $r4,33 16 17# lda, sta 18 .data 19tmp: .long 0 20 .text 21 22 xor.l $r0,$r0,$r0 23 EXPECT $r0,0x00000000 24 xor.l $r0,$r0,$r0 25 add.l $r0,$r0,1 26 EXPECT $r0,0x00000001 27 28 ldk.l $r0,0x4567 29 EXPECT $r0,0x00004567 30 31 lpm.l $r0,k_12345678 32 EXPECT $r0,0x12345678 33 34 sta.l tmp,$r0 35 lda.l $r1,tmp 36 EXPECT $r1,0x12345678 37 38 lda.b $r1,tmp 39 EXPECT $r1,0x00000078 40 41 lda.b $r1,tmp+1 42 EXPECT $r1,0x00000056 43 44 lda.b $r1,tmp+2 45 EXPECT $r1,0x00000034 46 47 lda.b $r1,tmp+3 48 EXPECT $r1,0x00000012 49 50 sta.b tmp+1,$r0 51 lda.l $r1,tmp+0 52 EXPECT $r1,0x12347878 53 54# immediate 55 ldk.l $r1,12 56 add.l $r1,$r1,4 57 EXPECT $r1,0x00000010 58 add.l $r1,$r1,0x1ff 59 EXPECT $r1,0x0000020f 60 add.l $r1,$r1,-0x200 61 EXPECT $r1,0x0000000f 62 63# addk 64 xor.l $r1,$r0,$r0 65 add.l $r2,$r1,127 66 EXPECT $r2,0x0000007f 67 68 add.l $r2,$r2,127 69 EXPECT $r2,0x000000fe 70 71 add.l $r2,$r2,-127 72 EXPECT $r2,0x0000007f 73 74 add.l $r2,$r2,-128 75 EXPECT $r2,0xffffffff 76 77 add.l $r2,$r2,1 78 EXPECT $r2,0x00000000 79 80# mul 81 ldk.l $r1,100 82 ldk.l $r2,77 83 mul.l $r3,$r1,$r2 84 EXPECT $r3,0x00001e14 85 86 # 0x12345678 ** 2 = 0x14b66dc1df4d840L 87 mul.l $r3,$r0,$r0 88 EXPECT $r3,0x1df4d840 89 muluh.l $r3,$r0,$r0 90 EXPECT $r3,0x014b66dc 91 92# push and pop 93 push.l $r0 94 EXPECT $sp,0x0000fffc 95 ldi.l $r3,$sp,0 96 EXPECT $r3,0x12345678 97 98 pop.l $r4 99 EXPECT $sp,0x00000000 100 EXPECT $r4,0x12345678 101 102 ldk.l $r1,0x1111 103 push.l $r1 104 ldk.l $r1,0x2222 105 push.l $r1 106 ldk.l $r1,0x3333 107 push.l $r1 108 ldk.l $r1,0x4444 109 push.l $r1 110 EXPECT $sp,0x0000fff0 111 pop.l $r1 112 EXPECT $r1,0x00004444 113 pop.l $r1 114 EXPECT $r1,0x00003333 115 pop.l $r1 116 EXPECT $r1,0x00002222 117 pop.l $r1 118 EXPECT $r1,0x00001111 119 120# push and pop with $sp changes 121 ldk.l $r1,0xa111 122 push.l $r1 123 sub.l $sp,$sp,4 124 ldk.l $r1,0xa222 125 push.l $r1 126 add.l $sp,$sp,-36 127 add.l $sp,$sp,36 128 pop.l $r1 129 EXPECT $r1,0x0000a222 130 add.l $sp,$sp,4 131 pop.l $r1 132 EXPECT $r1,0x0000a111 133 134# sti 135 ldk.l $r2,80 136 EXPECT $r2,0x00000050 137 sti.l $r2,0,$r0 138 lda.l $r1,80 139 EXPECT $r1,0x12345678 140 141 ldk.l $r3,0xF0 142 sti.b $r2,0,$r3 143 lda.l $r1,80 144 EXPECT $r1,0x123456f0 145 146 add.l $r2,$r2,1 147 sti.l $r2,0,$r0 148 sti.b $r2,0,$r3 149 lda.l $r1,80 150 EXPECT $r1,0x1234f078 151 152 add.l $r2,$r2,1 153 sti.l $r2,0,$r0 154 sti.b $r2,0,$r3 155 lda.l $r1,80 156 EXPECT $r1,0x12f05678 157 158 add.l $r2,$r2,1 159 sti.l $r2,0,$r0 160 sti.b $r2,0,$r3 161 lda.l $r1,80 162 EXPECT $r1,0xf0345678 163 164 ldk.l $r2,80 165 sti.l $r2,0,$r0 166 ldk.s $r3,0xbeef 167 sti.s $r2,0,$r3 168 lda.l $r1,80 169 EXPECT $r1,0x1234beef 170 add.l $r2,$r2,2 171 sti.s $r2,0,$r3 172 lda.l $r1,80 173 EXPECT $r1,0xbeefbeef 174 175# lpmi 176 177 ldk.l $r1,k_12345678 178 lpmi.l $r2,$r1,0 179 EXPECT $r2,0x12345678 180 181 lpmi.b $r2,$r1,0 182 EXPECT $r2,0x00000078 183 184 add.l $r1,$r1,1 185 lpmi.b $r2,$r1,0 186 EXPECT $r2,0x00000056 187 188 add.l $r1,$r1,1 189 lpmi.b $r2,$r1,0 190 EXPECT $r2,0x00000034 191 192 add.l $r1,$r1,1 193 lpmi.b $r2,$r1,0 194 EXPECT $r2,0x00000012 195 196 lpmi.l $r2,$r1,4 197 EXPECT $r2,0xabcdef01 198 199 lpmi.l $r2,$r1,-4 200 EXPECT $r2,0x10111213 201 202 lpmi.b $r2,$r1,-4 203 EXPECT $r2,0x00000010 204 205 ldk.l $r1,k_12345678 206 lpmi.s $r2,$r1,0 207 EXPECT $r2,0x00005678 208 lpmi.s $r2,$r1,2 209 EXPECT $r2,0x00001234 210 lpmi.b $r2,$r1,6 211 EXPECT $r2,0x000000cd 212 lpmi.b $r2,$r1,7 213 EXPECT $r2,0x000000ab 214 lpmi.b $r2,$r1,-1 215 EXPECT $r2,0x00000010 216 lpmi.s $r2,$r1,-2 217 EXPECT $r2,0x00001011 218 219 ldk.l $r1,k_12345678-127 220 lpmi.b $r2,$r1,127 221 EXPECT $r2,0x00000078 222 223 ldk.l $r1,k_12345678+128 224 lpmi.b $r2,$r1,-128 225 EXPECT $r2,0x00000078 226 227# shifts 228 229 lpm.l $r0,k_12345678 230 ldk.l $r2,4 231 ashl.l $r1,$r0,$r2 232 EXPECT $r1,0x23456780 233 lshr.l $r1,$r0,$r2 234 EXPECT $r1,0x01234567 235 ashr.l $r1,$r0,$r2 236 EXPECT $r1,0x01234567 237 238 lpm.l $r0,k_abcdef01 239 ashl.l $r1,$r0,$r2 240 EXPECT $r1,0xbcdef010 241 lshr.l $r1,$r0,$r2 242 EXPECT $r1,0x0abcdef0 243 ashr.l $r1,$r0,$r2 244 EXPECT $r1,0xfabcdef0 245 246# rotate right 247 248 lpm.l $r0,k_12345678 249 ror.l $r1,$r0,0 250 EXPECT $r1,0x12345678 251 ror.l $r1,$r0,12 252 EXPECT $r1,0x67812345 253 ror.l $r1,$r0,-4 254 EXPECT $r1,0x23456781 255 256# jmpx 257 ldk $r28,0xaaaaa 258 jmpx 0,$r28,1,failcase 259 jmpx 1,$r28,0,failcase 260 jmpx 2,$r28,1,failcase 261 jmpx 3,$r28,0,failcase 262 jmpx 4,$r28,1,failcase 263 jmpx 5,$r28,0,failcase 264 jmpx 6,$r28,1,failcase 265 jmpx 7,$r28,0,failcase 266 jmpx 8,$r28,1,failcase 267 jmpx 9,$r28,0,failcase 268 jmpx 10,$r28,1,failcase 269 jmpx 11,$r28,0,failcase 270 jmpx 12,$r28,1,failcase 271 jmpx 13,$r28,0,failcase 272 jmpx 14,$r28,1,failcase 273 jmpx 15,$r28,0,failcase 274 jmpx 16,$r28,1,failcase 275 jmpx 17,$r28,0,failcase 276 jmpx 18,$r28,1,failcase 277 jmpx 19,$r28,0,failcase 278 279 move $r29,$r28 280 ldk $r28,0 281 jmpx 0,$r29,1,failcase 282 jmpx 1,$r29,0,failcase 283 jmpx 2,$r29,1,failcase 284 jmpx 3,$r29,0,failcase 285 jmpx 4,$r29,1,failcase 286 jmpx 5,$r29,0,failcase 287 jmpx 6,$r29,1,failcase 288 jmpx 7,$r29,0,failcase 289 jmpx 8,$r29,1,failcase 290 jmpx 9,$r29,0,failcase 291 jmpx 10,$r29,1,failcase 292 jmpx 11,$r29,0,failcase 293 jmpx 12,$r29,1,failcase 294 jmpx 13,$r29,0,failcase 295 jmpx 14,$r29,1,failcase 296 jmpx 15,$r29,0,failcase 297 jmpx 16,$r29,1,failcase 298 jmpx 17,$r29,0,failcase 299 jmpx 18,$r29,1,failcase 300 jmpx 19,$r29,0,failcase 301 302 move $r30,$r29 303 ldk $r29,0 304 jmpx 0,$r30,1,failcase 305 jmpx 1,$r30,0,failcase 306 jmpx 2,$r30,1,failcase 307 jmpx 3,$r30,0,failcase 308 jmpx 4,$r30,1,failcase 309 jmpx 5,$r30,0,failcase 310 jmpx 6,$r30,1,failcase 311 jmpx 7,$r30,0,failcase 312 jmpx 8,$r30,1,failcase 313 jmpx 9,$r30,0,failcase 314 jmpx 10,$r30,1,failcase 315 jmpx 11,$r30,0,failcase 316 jmpx 12,$r30,1,failcase 317 jmpx 13,$r30,0,failcase 318 jmpx 14,$r30,1,failcase 319 jmpx 15,$r30,0,failcase 320 jmpx 16,$r30,1,failcase 321 jmpx 17,$r30,0,failcase 322 jmpx 18,$r30,1,failcase 323 jmpx 19,$r30,0,failcase 324 325# callx 326 ldk $r30,0xaaaaa 327 callx 0,$r30,0,skip1 328 jmp failcase 329 callx 1,$r30,1,skip1 330 jmp failcase 331 callx 2,$r30,0,skip1 332 jmp failcase 333 callx 3,$r30,1,skip1 334 jmp failcase 335 336 callx 0,$r30,1,skip1 337 ldk $r30,0x123 338 EXPECT $r30,0x123 339 340#define BIT(N,M) ((((N) & 15) << 5) | (M)) 341# bextu 342 bextu.l $r1,$r0,(0<<5)|0 343 EXPECT $r1,0x00005678 344 bextu.l $r1,$r0,(4<<5)|0 345 EXPECT $r1,0x00000008 346 bextu.l $r1,$r0,(4<<5)|4 347 EXPECT $r1,0x00000007 348 bextu.l $r1,$r0,(4<<5)|28 349 EXPECT $r1,0x00000001 350 bextu.l $r1,$r0,(8<<5)|16 351 EXPECT $r1,0x00000034 352 ldk.l $r2,-1 353 bextu.l $r1,$r2,(6<<5)|(3) 354 EXPECT $r1,0x0000003f 355 356# bexts 357 bexts.l $r1,$r0,(8<<5)|0 358 EXPECT $r1,0x00000078 359 bexts.l $r1,$r0,(0<<5)|16 360 EXPECT $r1,0x00001234 361 bexts.l $r1,$r0,(4<<5)|0 362 EXPECT $r1,0xfffffff8 363 # extract the '5' digit in widths 4-1 364 bexts.l $r1,$r0,(4<<5)|12 365 EXPECT $r1,0x00000005 366 bexts.l $r1,$r0,(3<<5)|12 367 EXPECT $r1,0xfffffffd 368 bexts.l $r1,$r0,(2<<5)|12 369 EXPECT $r1,0x00000001 370 bexts.l $r1,$r0,(1<<5)|12 371 EXPECT $r1,0xffffffff 372 373# btst 374 # low four bits should be 0,0,0,1 375 btst.l $r0,(1<<5)|0 376 jmpc nz,failcase 377 btst.l $r0,(1<<5)|1 378 jmpc nz,failcase 379 btst.l $r0,(1<<5)|2 380 jmpc nz,failcase 381 btst.l $r0,(1<<5)|3 382 jmpc z,failcase 383 384 # the 6 bit field starting at position 24 is positive 385 btst.l $r0,(6<<5)|24 386 jmpc s,failcase 387 # the 5 bit field starting at position 24 is negative 388 btst.l $r0,(5<<5)|24 389 jmpc ns,failcase 390 391 EXPECT $r0,0x12345678 392 393# bins 394 bins.l $r1,$r0,(8 << 5) | (0) 395 EXPECT $r1,0x12345600 396 397 bins.l $r1,$r0,(0 << 5) | (8) 398 EXPECT $r1,0x12000078 399 400 ldk.l $r1,(0xff << 10) | (8 << 5) | (8) 401 bins.l $r1,$r0,$r1 402 EXPECT $r1,0x1234ff78 403 404 call litr1 405 .long (0x8dd1 << 10) | (0 << 5) | (0) 406 bins.l $r1,$r0,$r1 407 EXPECT $r1,0x12348dd1 408 409 call litr1 410 .long (0x8dd1 << 10) | (0 << 5) | (16) 411 bins.l $r1,$r0,$r1 412 EXPECT $r1,0x8dd15678 413 414 ldk.l $r1,(0xde << 10) | (8 << 5) | (0) 415 bins.l $r1,$r0,$r1 416 EXPECT $r1,0x123456de 417 418# ldl 419 ldk.l $r0,0 420 ldl.l $r3,$r0,0 421 EXPECT $r3,0x00000000 422 ldk.l $r0,-1 423 ldl.l $r3,$r0,-1 424 EXPECT $r3,0xffffffff 425 ldk.l $r0,(0x12345678 >> 10) 426 ldl.l $r3,$r0,(0x12345678 & 0x3ff) 427 EXPECT $r3,0x12345678 428 ldk.l $r0,(0xe2345678 >> 10) 429 ldl.l $r3,$r0,(0xe2345678 & 0x3ff) 430 EXPECT $r3,0xe2345678 431 432# flip 433 ldk.l $r0,0x0000001 434 flip.l $r1,$r0,0 435 EXPECT $r1,0x00000001 436 437 lpm.l $r0,k_12345678 438 flip.l $r1,$r0,0 439 EXPECT $r1,0x12345678 440 flip.l $r1,$r0,24 441 EXPECT $r1,0x78563412 442 flip.l $r1,$r0,31 443 EXPECT $r1,0x1e6a2c48 444 445# stack push pop 446 447 EXPECT $sp,0x00000000 448 ldk.l $r6,0x6666 449 push.l $r6 450 or.l $r0,$r0,$r0 # xxx 451 EXPECT $sp,0x0000fffc 452 ldi.l $r1,$sp,0 453 EXPECT $r1,0x00006666 454 pop.l $r1 455 EXPECT $r1,0x00006666 456 EXPECT $sp,0x00000000 457 458# call/return 459 call fowia 460 push.l $r1 461 call fowia 462 pop.l $r2 463 sub.l $r1,$r1,$r2 464 EXPECT $r1,0x00000008 465 466# add,carry 467 468 ldk.l $r0,0 469 ldk.l $r1,0 470 call add64 471 EXPECT $r1,0x00000000 472 EXPECT $r0,0x00000000 473 474 lpm.l $r0,k_abcdef01 475 lpm.l $r1,k_abcdef01 476 call add64 477 EXPECT $r1,0x00000001 478 EXPECT $r0,0x579bde02 479 480 ldk.l $r0,4 481 ldk.l $r1,-5 482 call add64 483 EXPECT $r1,0x00000000 484 EXPECT $r0,0xffffffff 485 486 ldk.l $r0,5 487 ldk.l $r1,-5 488 call add64 489 EXPECT $r1,0x00000001 490 EXPECT $r0,0x00000000 491 492 lpm.l $r0,k_12345678 493 ldk.l $r1,-1 494 call add64 495 EXPECT $r1,0x00000001 496 EXPECT $r0,0x12345677 497 498 ldk.l $r0,-1 499 ldk.l $r1,-1 500 call add64 501 EXPECT $r1,0x00000001 502 EXPECT $r0,0xfffffffe 503 504# inline literal 505 call lit 506 .long 0xdecafbad 507 EXPECT $r0,0xdecafbad 508 509 ldk.l $r1,0xee 510 call lit 511 ldk.l $r1,0xfe 512 EXPECT $r1,0x000000ee 513 514 call lit 515 .long 0x01020304 516 EXPECT $r0,0x01020304 517 518 call lit 519 .long lit 520 calli $r0 521 .long 0xffaa55aa 522 EXPECT $r0,0xffaa55aa 523 524# comparisons 525 ldk.l $r0,-100 526 ldk.l $r1,100 527 cmp.l $r0,$r1 528 529 ldk.l $r2,0 530 jmpc lt,.c1 531 ldk.l $r2,1 532.c1: 533 EXPECT $r2,0x00000000 534 535 ldk.l $r2,0 536 jmpc gt,.c2 537 ldk.l $r2,1 538.c2: 539 EXPECT $r2,0x00000001 540 541 ldk.l $r2,0 542 jmpc a,.c3 543 ldk.l $r2,1 544.c3: 545 EXPECT $r2,0x00000000 546 547 ldk.l $r2,0 548 jmpc b,.c4 549 ldk.l $r2,1 550.c4: 551 EXPECT $r2,0x00000001 552 553 ldk.l $r2,0 554 jmpc be,.c5 555 ldk.l $r2,1 556.c5: 557 EXPECT $r2,0x00000001 558 559# 8-bit comparisons 560 ldk.l $r0,0x8fe 561 ldk.l $r1,0x708 562 cmp.b $r0,$r1 563 564 ldk.l $r2,0 565 jmpc lt,.8c1 566 ldk.l $r2,1 567.8c1: 568 EXPECT $r2,0x00000000 569 570 ldk.l $r2,0 571 jmpc gt,.8c2 572 ldk.l $r2,1 573.8c2: 574 EXPECT $r2,0x00000001 575 576 ldk.l $r2,0 577 jmpc a,.8c3 578 ldk.l $r2,1 579.8c3: 580 EXPECT $r2,0x00000000 581 582 ldk.l $r2,0 583 jmpc b,.8c4 584 ldk.l $r2,1 585.8c4: 586 EXPECT $r2,0x00000001 587 588 ldk.l $r2,0 589 jmpc be,.8c5 590 ldk.l $r2,1 591.8c5: 592 EXPECT $r2,0x00000001 593 594 ldk.l $r0,0x8aa 595 ldk.l $r1,0x7aa 596 cmp.b $r0,$r1 597 598 ldk.l $r2,0 599 jmpc z,.8c6 600 ldk.l $r2,1 601.8c6: 602 EXPECT $r2,0x00000000 603 604 ldk.b $r0,1 605 ldk.b $r2,0xe0 606 cmp.b $r2,0x1c0 607 jmpc a,.8c7 608 ldk.b $r0,0 609.8c7: 610 EXPECT $r0,0x00000001 611 612# conditional call 613 cmp.l $r0,$r0 614 callc z,lit 615 .long 0xccddeeff 616 callc nz,zr0 617 EXPECT $r0,0xccddeeff 618 619# modify return address 620 ldk.l $r0,0x66 621 call skip1 622 ldk.l $r0,0xAA 623 EXPECT $r0,0x00000066 624 625 ldk.l $r0,0x77 626 call skip2 627 ldk.l $r0,0xBB 628 EXPECT $r0,0x00000077 629 630# simple recursive function 631 ldk.l $r0,1 632 call factorial 633 EXPECT $r0,0x00000001 634 ldk.l $r0,2 635 call factorial 636 EXPECT $r0,0x00000002 637 ldk.l $r0,3 638 call factorial 639 EXPECT $r0,0x00000006 640 ldk.l $r0,4 641 call factorial 642 EXPECT $r0,0x00000018 643 ldk.l $r0,5 644 call factorial 645 EXPECT $r0,0x00000078 646 ldk.l $r0,6 647 call factorial 648 EXPECT $r0,0x000002d0 649 ldk.l $r0,7 650 call factorial 651 EXPECT $r0,0x000013b0 652 ldk.l $r0,12 653 call factorial 654 EXPECT $r0,0x1c8cfc00 655 656# read sp after a call 657 call nullfunc 658 EXPECT $sp,0x00000000 659 660# CALLI->RETURN 661 ldk.l $r4,nullfunc 662 calli $r4 663 EXPECT $sp,0x00000000 664 665# Link/unlink 666 ldk.l $r14,0x17566 667 668 link $r14,48 669 EXPECT $r14,0x0000fffc 670 sub.l $sp,$sp,200 671 unlink $r14 672 EXPECT $r14,0x00017566 673 674# LINK->UNLINK 675 link $r14,48 676 unlink $r14 677 EXPECT $r14,0x00017566 678 679# LINK->JUMPI 680 ldk.l $r3,.here 681 link $r14,48 682 jmpi $r3 683 jmp failcase 684.here: 685 unlink $r14 686 EXPECT $r14,0x00017566 687 688# LINK->RETURN 689# (This is a nonsense combination, but can still exericse it by 690# using a negative parameter for the link. "link $r14,-4" leaves 691# $sp exactly unchanged.) 692 ldk.l $r0,.returnhere 693 push.l $r0 694 link $r14,0xfffc 695 return 696.returnhere: 697 EXPECT $sp,0x00000000 698 699# LPMI->CALLI 700 ldk.l $r0,k_abcdef01 701 ldk.l $r1,increment 702 lpmi.l $r0,$r0,0 703 calli $r1 704 EXPECT $r0,0xabcdef02 705 706# STRLen 707 lpm.l $r4,str3 708 sta.l tmp,$r4 709 ldk.l $r0,tmp 710 strlen.b $r1,$r0 711 EXPECT $r1,0x00000003 712 strlen.s $r1,$r0 713 EXPECT $r1,0x00000003 714 strlen.l $r1,$r0 715 EXPECT $r1,0x00000003 716 717 ldk.l $r4,0 718 sta.b 4,$r4 719 strlen.l $r1,$r0 720 EXPECT $r1,0x00000000 721 722 ldk.l $r4,-1 723 sta.l 4,$r4 724 lpm.l $r4,str3 725 sta.l 8,$r4 726 strlen.l $r1,$r0 727 EXPECT $r1,0x00000007 728 729# MEMSet 730 ldk.l $r0,4 731 ldk.l $r1,0xaa 732 memset.s $r0,$r1,8 733 ldk.l $r1,0x55 734 memset.b $r0,$r1,5 735 lda.l $r0,4 736 EXPECT $r0,0x55555555 737 lda.l $r0,8 738 EXPECT $r0,0xaaaaaa55 739 740# first cycle after mispredict 741 ldk.l $r0,3 742 cmp.l $r0,$r0 743 jmpc nz,failcase 744 add.l $r0,$r0,7 745 EXPECT $r0,0x0000000a 746 jmpc nz,failcase 747 push.l $r0 748 EXPECT $sp,0x0000fffc 749 pop.l $r0 750 751# $sp access after stall 752 lpm.l $r13,0 753 push.l $r0 754 EXPECT $sp,0x0000fffc 755 pop.l $r0 756 757 push.l $r0 758 add.l $sp,$sp,-484 759 EXPECT $sp,0x0000fe18 760 EXPECT $sp,0x0000fe18 761 EXPECT $sp,0x0000fe18 762 add.l $sp,$sp,484 763 EXPECT $sp,0x0000fffc 764 pop.l $r0 765 766# atomic exchange 767 lpm.l $r0,k_12345678 768 lpm.l $r1,k_abcdef01 769 sta.l 100,$r1 770 exa.l $r0,100 771 EXPECT $r0,0xabcdef01 772 lda.l $r0,100 773 EXPECT $r0,0x12345678 774 775 lpm.l $r0,k_12345678 776 lpm.l $r1,k_abcdef01 777 sta.l 144,$r1 778 ldk.l $r7,20 779 exi.l $r0,$r7,124 780 EXPECT $r0,0xabcdef01 781 lda.l $r0,144 782 EXPECT $r0,0x12345678 783 784 lpm.l $r0,k_12345678 785 lpm.l $r1,k_abcdef01 786 push $r1 787 exi.l $r0,$sp,0 788 EXPECT $r0,0xabcdef01 789 pop.l $r0 790 EXPECT $r0,0x12345678 791 792# PM write port 793 .equ PM_UNLOCK, 0x1fc80 794 .equ PM_ADDR, 0x1fc84 795 .equ PM_DATA, 0x1fc88 796 797 lpm.l $r0,k_12345678 798 lpm.l $r1,k_abcdef01 799 EXPECT $r0,0x12345678 800 EXPECT $r1,0xabcdef01 801 ldk.l $r3,(0x1337f7d1 >> 10) 802 ldl.l $r3,$r3,(0x1337f7d1 & 0x3ff) 803 EXPECT $r3,0x1337f7d1 804 ldk $r4,k_12345678 805 sta.l PM_ADDR,$r4 806 807 # write while locked does nothing 808 sta.l PM_DATA,$r1 809 sta.l PM_DATA,$r0 810 lpm.l $r0,k_12345678 811 lpm.l $r1,k_abcdef01 812 EXPECT $r0,0x12345678 813 EXPECT $r1,0xabcdef01 814 815 # write while unlocked modifies program memory 816 sta.l PM_UNLOCK,$r3 817 sta.l PM_DATA,$r1 818 sta.l PM_DATA,$r0 819 lpm.l $r0,k_12345678 820 lpm.l $r1,k_abcdef01 821 EXPECT $r0,0xabcdef01 822 EXPECT $r1,0x12345678 823 824# final stack check 825 EXPECT $sp,0x00000000 826 827 PASS 828 829# -------------------------------------------------- 830 831skip1: # skip the instruction after the call 832 pop.l $r1 833 add.l $r1,$r1,4 834 push.l $r1 835 return 836 837skipparent: # skip the instruction after the caller's call 838 ldi.l $r1,$sp,4 839 add.l $r1,$r1,4 840 sti.l $sp,4,$r1 841 return 842skip2: 843 call skipparent 844 return 845 846add64: 847 addcc.l $r0,$r1 848 add.l $r0,$r0,$r1 849 ldk.l $r1,0 850 jmpc nc,.done 851 ldk.l $r1,1 852.done: 853 return 854 855fowia: # find out where I'm at 856 ldi.l $r1,$sp,0 857 return 858 859lit: # load literal to $r0 860 pop.l $r14 861 lpmi.l $r0,$r14,0 862 add.l $r14,$r14,4 863 jmpi $r14 864zr0: 865 ldk.l $r0,0 866 return 867litr1: 868 ldi.l $r1,$sp,0 869 add.l $r1,$r1,4 870 sti.l $sp,0,$r1 871 lpmi.l $r1,$r1,-4 872 return 873 874factorial: 875 ldk.l $r1,1 876 cmp.l $r0,$r1 877 jmpc z,.factdone 878 push.l $r0 879 add.l $r0,$r0,-1 880 call factorial 881 pop.l $r1 882 mul.l $r0,$r0,$r1 883.factdone: 884 return 885 886nullfunc: 887 return 888 889increment: 890 add.l $r0,$r0,1 891 return 892 893 .long 0x10111213 894k_12345678: 895 .long 0x12345678 896k_abcdef01: 897 .long 0xabcdef01 898str3: 899 .string "abc" 900