|  | # check that basic insns work. | 
|  | # mach: ft32 | 
|  |  | 
|  | .include "testutils.inc" | 
|  |  | 
|  | start | 
|  |  | 
|  | ldk	  $r0,__PMSIZE | 
|  | EXPECT    $r0,0x00040000 | 
|  | ldk       $r0,__RAMSIZE | 
|  | EXPECT    $r0,0x00010000 | 
|  |  | 
|  | ldk     $r4,10 | 
|  | add     $r4,$r4,23 | 
|  | EXPECT  $r4,33 | 
|  |  | 
|  | # lda, sta | 
|  | .data | 
|  | tmp:    .long     0 | 
|  | .text | 
|  |  | 
|  | xor.l     $r0,$r0,$r0 | 
|  | EXPECT    $r0,0x00000000 | 
|  | xor.l     $r0,$r0,$r0 | 
|  | add.l     $r0,$r0,1 | 
|  | EXPECT    $r0,0x00000001 | 
|  |  | 
|  | ldk.l     $r0,0x4567 | 
|  | EXPECT    $r0,0x00004567 | 
|  |  | 
|  | lpm.l     $r0,k_12345678 | 
|  | EXPECT    $r0,0x12345678 | 
|  |  | 
|  | sta.l     tmp,$r0 | 
|  | lda.l     $r1,tmp | 
|  | EXPECT    $r1,0x12345678 | 
|  |  | 
|  | lda.b     $r1,tmp | 
|  | EXPECT    $r1,0x00000078 | 
|  |  | 
|  | lda.b     $r1,tmp+1 | 
|  | EXPECT    $r1,0x00000056 | 
|  |  | 
|  | lda.b     $r1,tmp+2 | 
|  | EXPECT    $r1,0x00000034 | 
|  |  | 
|  | lda.b     $r1,tmp+3 | 
|  | EXPECT    $r1,0x00000012 | 
|  |  | 
|  | sta.b     tmp+1,$r0 | 
|  | lda.l     $r1,tmp+0 | 
|  | EXPECT    $r1,0x12347878 | 
|  |  | 
|  | # immediate | 
|  | ldk.l     $r1,12 | 
|  | add.l     $r1,$r1,4 | 
|  | EXPECT    $r1,0x00000010 | 
|  | add.l     $r1,$r1,0x1ff | 
|  | EXPECT    $r1,0x0000020f | 
|  | add.l     $r1,$r1,-0x200 | 
|  | EXPECT    $r1,0x0000000f | 
|  |  | 
|  | # addk | 
|  | xor.l     $r1,$r0,$r0 | 
|  | add.l     $r2,$r1,127 | 
|  | EXPECT    $r2,0x0000007f | 
|  |  | 
|  | add.l     $r2,$r2,127 | 
|  | EXPECT    $r2,0x000000fe | 
|  |  | 
|  | add.l     $r2,$r2,-127 | 
|  | EXPECT    $r2,0x0000007f | 
|  |  | 
|  | add.l     $r2,$r2,-128 | 
|  | EXPECT    $r2,0xffffffff | 
|  |  | 
|  | add.l     $r2,$r2,1 | 
|  | EXPECT    $r2,0x00000000 | 
|  |  | 
|  | # mul | 
|  | ldk.l     $r1,100 | 
|  | ldk.l     $r2,77 | 
|  | mul.l     $r3,$r1,$r2 | 
|  | EXPECT    $r3,0x00001e14 | 
|  |  | 
|  | # 0x12345678 ** 2 = 0x14b66dc1df4d840L | 
|  | mul.l     $r3,$r0,$r0 | 
|  | EXPECT    $r3,0x1df4d840 | 
|  | muluh.l   $r3,$r0,$r0 | 
|  | EXPECT    $r3,0x014b66dc | 
|  |  | 
|  | # push and pop | 
|  | push.l    $r0 | 
|  | EXPECT    $sp,0x0000fffc | 
|  | ldi.l     $r3,$sp,0 | 
|  | EXPECT    $r3,0x12345678 | 
|  |  | 
|  | pop.l     $r4 | 
|  | EXPECT    $sp,0x00000000 | 
|  | EXPECT    $r4,0x12345678 | 
|  |  | 
|  | ldk.l     $r1,0x1111 | 
|  | push.l    $r1 | 
|  | ldk.l     $r1,0x2222 | 
|  | push.l    $r1 | 
|  | ldk.l     $r1,0x3333 | 
|  | push.l    $r1 | 
|  | ldk.l     $r1,0x4444 | 
|  | push.l    $r1 | 
|  | EXPECT    $sp,0x0000fff0 | 
|  | pop.l     $r1 | 
|  | EXPECT    $r1,0x00004444 | 
|  | pop.l     $r1 | 
|  | EXPECT    $r1,0x00003333 | 
|  | pop.l     $r1 | 
|  | EXPECT    $r1,0x00002222 | 
|  | pop.l     $r1 | 
|  | EXPECT    $r1,0x00001111 | 
|  |  | 
|  | # push and pop with $sp changes | 
|  | ldk.l     $r1,0xa111 | 
|  | push.l    $r1 | 
|  | sub.l     $sp,$sp,4 | 
|  | ldk.l     $r1,0xa222 | 
|  | push.l    $r1 | 
|  | add.l     $sp,$sp,-36 | 
|  | add.l     $sp,$sp,36 | 
|  | pop.l     $r1 | 
|  | EXPECT    $r1,0x0000a222 | 
|  | add.l     $sp,$sp,4 | 
|  | pop.l     $r1 | 
|  | EXPECT    $r1,0x0000a111 | 
|  |  | 
|  | # sti | 
|  | ldk.l     $r2,80 | 
|  | EXPECT    $r2,0x00000050 | 
|  | sti.l     $r2,0,$r0 | 
|  | lda.l     $r1,80 | 
|  | EXPECT    $r1,0x12345678 | 
|  |  | 
|  | ldk.l     $r3,0xF0 | 
|  | sti.b     $r2,0,$r3 | 
|  | lda.l     $r1,80 | 
|  | EXPECT    $r1,0x123456f0 | 
|  |  | 
|  | add.l     $r2,$r2,1 | 
|  | sti.l     $r2,0,$r0 | 
|  | sti.b     $r2,0,$r3 | 
|  | lda.l     $r1,80 | 
|  | EXPECT    $r1,0x1234f078 | 
|  |  | 
|  | add.l     $r2,$r2,1 | 
|  | sti.l     $r2,0,$r0 | 
|  | sti.b     $r2,0,$r3 | 
|  | lda.l     $r1,80 | 
|  | EXPECT    $r1,0x12f05678 | 
|  |  | 
|  | add.l     $r2,$r2,1 | 
|  | sti.l     $r2,0,$r0 | 
|  | sti.b     $r2,0,$r3 | 
|  | lda.l     $r1,80 | 
|  | EXPECT    $r1,0xf0345678 | 
|  |  | 
|  | ldk.l     $r2,80 | 
|  | sti.l     $r2,0,$r0 | 
|  | ldk.s     $r3,0xbeef | 
|  | sti.s     $r2,0,$r3 | 
|  | lda.l     $r1,80 | 
|  | EXPECT    $r1,0x1234beef | 
|  | add.l     $r2,$r2,2 | 
|  | sti.s     $r2,0,$r3 | 
|  | lda.l     $r1,80 | 
|  | EXPECT    $r1,0xbeefbeef | 
|  |  | 
|  | # lpmi | 
|  |  | 
|  | ldk.l     $r1,k_12345678 | 
|  | lpmi.l    $r2,$r1,0 | 
|  | EXPECT    $r2,0x12345678 | 
|  |  | 
|  | lpmi.b    $r2,$r1,0 | 
|  | EXPECT    $r2,0x00000078 | 
|  |  | 
|  | add.l     $r1,$r1,1 | 
|  | lpmi.b    $r2,$r1,0 | 
|  | EXPECT    $r2,0x00000056 | 
|  |  | 
|  | add.l     $r1,$r1,1 | 
|  | lpmi.b    $r2,$r1,0 | 
|  | EXPECT    $r2,0x00000034 | 
|  |  | 
|  | add.l     $r1,$r1,1 | 
|  | lpmi.b    $r2,$r1,0 | 
|  | EXPECT    $r2,0x00000012 | 
|  |  | 
|  | lpmi.l    $r2,$r1,4 | 
|  | EXPECT    $r2,0xabcdef01 | 
|  |  | 
|  | lpmi.l    $r2,$r1,-4 | 
|  | EXPECT    $r2,0x10111213 | 
|  |  | 
|  | lpmi.b    $r2,$r1,-4 | 
|  | EXPECT    $r2,0x00000010 | 
|  |  | 
|  | ldk.l     $r1,k_12345678 | 
|  | lpmi.s    $r2,$r1,0 | 
|  | EXPECT    $r2,0x00005678 | 
|  | lpmi.s    $r2,$r1,2 | 
|  | EXPECT    $r2,0x00001234 | 
|  | lpmi.b    $r2,$r1,6 | 
|  | EXPECT    $r2,0x000000cd | 
|  | lpmi.b    $r2,$r1,7 | 
|  | EXPECT    $r2,0x000000ab | 
|  | lpmi.b    $r2,$r1,-1 | 
|  | EXPECT    $r2,0x00000010 | 
|  | lpmi.s    $r2,$r1,-2 | 
|  | EXPECT    $r2,0x00001011 | 
|  |  | 
|  | ldk.l     $r1,k_12345678-127 | 
|  | lpmi.b    $r2,$r1,127 | 
|  | EXPECT    $r2,0x00000078 | 
|  |  | 
|  | ldk.l     $r1,k_12345678+128 | 
|  | lpmi.b    $r2,$r1,-128 | 
|  | EXPECT    $r2,0x00000078 | 
|  |  | 
|  | # shifts | 
|  |  | 
|  | lpm.l     $r0,k_12345678 | 
|  | ldk.l     $r2,4 | 
|  | ashl.l    $r1,$r0,$r2 | 
|  | EXPECT    $r1,0x23456780 | 
|  | lshr.l    $r1,$r0,$r2 | 
|  | EXPECT    $r1,0x01234567 | 
|  | ashr.l    $r1,$r0,$r2 | 
|  | EXPECT    $r1,0x01234567 | 
|  |  | 
|  | lpm.l     $r0,k_abcdef01 | 
|  | ashl.l    $r1,$r0,$r2 | 
|  | EXPECT    $r1,0xbcdef010 | 
|  | lshr.l    $r1,$r0,$r2 | 
|  | EXPECT    $r1,0x0abcdef0 | 
|  | ashr.l    $r1,$r0,$r2 | 
|  | EXPECT    $r1,0xfabcdef0 | 
|  |  | 
|  | # rotate right | 
|  |  | 
|  | lpm.l     $r0,k_12345678 | 
|  | ror.l     $r1,$r0,0 | 
|  | EXPECT    $r1,0x12345678 | 
|  | ror.l     $r1,$r0,12 | 
|  | EXPECT    $r1,0x67812345 | 
|  | ror.l     $r1,$r0,-4 | 
|  | EXPECT    $r1,0x23456781 | 
|  |  | 
|  | # jmpx | 
|  | ldk       $r28,0xaaaaa | 
|  | jmpx      0,$r28,1,failcase | 
|  | jmpx      1,$r28,0,failcase | 
|  | jmpx      2,$r28,1,failcase | 
|  | jmpx      3,$r28,0,failcase | 
|  | jmpx      4,$r28,1,failcase | 
|  | jmpx      5,$r28,0,failcase | 
|  | jmpx      6,$r28,1,failcase | 
|  | jmpx      7,$r28,0,failcase | 
|  | jmpx      8,$r28,1,failcase | 
|  | jmpx      9,$r28,0,failcase | 
|  | jmpx      10,$r28,1,failcase | 
|  | jmpx      11,$r28,0,failcase | 
|  | jmpx      12,$r28,1,failcase | 
|  | jmpx      13,$r28,0,failcase | 
|  | jmpx      14,$r28,1,failcase | 
|  | jmpx      15,$r28,0,failcase | 
|  | jmpx      16,$r28,1,failcase | 
|  | jmpx      17,$r28,0,failcase | 
|  | jmpx      18,$r28,1,failcase | 
|  | jmpx      19,$r28,0,failcase | 
|  |  | 
|  | move      $r29,$r28 | 
|  | ldk       $r28,0 | 
|  | jmpx      0,$r29,1,failcase | 
|  | jmpx      1,$r29,0,failcase | 
|  | jmpx      2,$r29,1,failcase | 
|  | jmpx      3,$r29,0,failcase | 
|  | jmpx      4,$r29,1,failcase | 
|  | jmpx      5,$r29,0,failcase | 
|  | jmpx      6,$r29,1,failcase | 
|  | jmpx      7,$r29,0,failcase | 
|  | jmpx      8,$r29,1,failcase | 
|  | jmpx      9,$r29,0,failcase | 
|  | jmpx      10,$r29,1,failcase | 
|  | jmpx      11,$r29,0,failcase | 
|  | jmpx      12,$r29,1,failcase | 
|  | jmpx      13,$r29,0,failcase | 
|  | jmpx      14,$r29,1,failcase | 
|  | jmpx      15,$r29,0,failcase | 
|  | jmpx      16,$r29,1,failcase | 
|  | jmpx      17,$r29,0,failcase | 
|  | jmpx      18,$r29,1,failcase | 
|  | jmpx      19,$r29,0,failcase | 
|  |  | 
|  | move      $r30,$r29 | 
|  | ldk       $r29,0 | 
|  | jmpx      0,$r30,1,failcase | 
|  | jmpx      1,$r30,0,failcase | 
|  | jmpx      2,$r30,1,failcase | 
|  | jmpx      3,$r30,0,failcase | 
|  | jmpx      4,$r30,1,failcase | 
|  | jmpx      5,$r30,0,failcase | 
|  | jmpx      6,$r30,1,failcase | 
|  | jmpx      7,$r30,0,failcase | 
|  | jmpx      8,$r30,1,failcase | 
|  | jmpx      9,$r30,0,failcase | 
|  | jmpx      10,$r30,1,failcase | 
|  | jmpx      11,$r30,0,failcase | 
|  | jmpx      12,$r30,1,failcase | 
|  | jmpx      13,$r30,0,failcase | 
|  | jmpx      14,$r30,1,failcase | 
|  | jmpx      15,$r30,0,failcase | 
|  | jmpx      16,$r30,1,failcase | 
|  | jmpx      17,$r30,0,failcase | 
|  | jmpx      18,$r30,1,failcase | 
|  | jmpx      19,$r30,0,failcase | 
|  |  | 
|  | # callx | 
|  | ldk       $r30,0xaaaaa | 
|  | callx     0,$r30,0,skip1 | 
|  | jmp       failcase | 
|  | callx     1,$r30,1,skip1 | 
|  | jmp       failcase | 
|  | callx     2,$r30,0,skip1 | 
|  | jmp       failcase | 
|  | callx     3,$r30,1,skip1 | 
|  | jmp       failcase | 
|  |  | 
|  | callx     0,$r30,1,skip1 | 
|  | ldk       $r30,0x123 | 
|  | EXPECT    $r30,0x123 | 
|  |  | 
|  | #define BIT(N,M)  ((((N) & 15) << 5) | (M)) | 
|  | # bextu | 
|  | bextu.l   $r1,$r0,(0<<5)|0 | 
|  | EXPECT    $r1,0x00005678 | 
|  | bextu.l   $r1,$r0,(4<<5)|0 | 
|  | EXPECT    $r1,0x00000008 | 
|  | bextu.l   $r1,$r0,(4<<5)|4 | 
|  | EXPECT    $r1,0x00000007 | 
|  | bextu.l   $r1,$r0,(4<<5)|28 | 
|  | EXPECT    $r1,0x00000001 | 
|  | bextu.l   $r1,$r0,(8<<5)|16 | 
|  | EXPECT    $r1,0x00000034 | 
|  | ldk.l     $r2,-1 | 
|  | bextu.l   $r1,$r2,(6<<5)|(3) | 
|  | EXPECT    $r1,0x0000003f | 
|  |  | 
|  | # bexts | 
|  | bexts.l   $r1,$r0,(8<<5)|0 | 
|  | EXPECT    $r1,0x00000078 | 
|  | bexts.l   $r1,$r0,(0<<5)|16 | 
|  | EXPECT    $r1,0x00001234 | 
|  | bexts.l   $r1,$r0,(4<<5)|0 | 
|  | EXPECT    $r1,0xfffffff8 | 
|  | # extract the '5' digit in widths 4-1 | 
|  | bexts.l   $r1,$r0,(4<<5)|12 | 
|  | EXPECT    $r1,0x00000005 | 
|  | bexts.l   $r1,$r0,(3<<5)|12 | 
|  | EXPECT    $r1,0xfffffffd | 
|  | bexts.l   $r1,$r0,(2<<5)|12 | 
|  | EXPECT    $r1,0x00000001 | 
|  | bexts.l   $r1,$r0,(1<<5)|12 | 
|  | EXPECT    $r1,0xffffffff | 
|  |  | 
|  | # btst | 
|  | # low four bits should be 0,0,0,1 | 
|  | btst.l    $r0,(1<<5)|0 | 
|  | jmpc      nz,failcase | 
|  | btst.l    $r0,(1<<5)|1 | 
|  | jmpc      nz,failcase | 
|  | btst.l    $r0,(1<<5)|2 | 
|  | jmpc      nz,failcase | 
|  | btst.l    $r0,(1<<5)|3 | 
|  | jmpc      z,failcase | 
|  |  | 
|  | # the 6 bit field starting at position 24 is positive | 
|  | btst.l    $r0,(6<<5)|24 | 
|  | jmpc      s,failcase | 
|  | # the 5 bit field starting at position 24 is negative | 
|  | btst.l    $r0,(5<<5)|24 | 
|  | jmpc      ns,failcase | 
|  |  | 
|  | EXPECT    $r0,0x12345678 | 
|  |  | 
|  | # bins | 
|  | bins.l    $r1,$r0,(8 << 5) | (0) | 
|  | EXPECT    $r1,0x12345600 | 
|  |  | 
|  | bins.l    $r1,$r0,(0 << 5) | (8) | 
|  | EXPECT    $r1,0x12000078 | 
|  |  | 
|  | ldk.l     $r1,(0xff << 10) | (8 << 5) | (8) | 
|  | bins.l    $r1,$r0,$r1 | 
|  | EXPECT    $r1,0x1234ff78 | 
|  |  | 
|  | call      litr1 | 
|  | .long     (0x8dd1 << 10) | (0 << 5) | (0) | 
|  | bins.l    $r1,$r0,$r1 | 
|  | EXPECT    $r1,0x12348dd1 | 
|  |  | 
|  | call      litr1 | 
|  | .long     (0x8dd1 << 10) | (0 << 5) | (16) | 
|  | bins.l    $r1,$r0,$r1 | 
|  | EXPECT    $r1,0x8dd15678 | 
|  |  | 
|  | ldk.l     $r1,(0xde << 10) | (8 << 5) | (0) | 
|  | bins.l    $r1,$r0,$r1 | 
|  | EXPECT    $r1,0x123456de | 
|  |  | 
|  | # ldl | 
|  | ldk.l     $r0,0 | 
|  | ldl.l     $r3,$r0,0 | 
|  | EXPECT    $r3,0x00000000 | 
|  | ldk.l     $r0,-1 | 
|  | ldl.l     $r3,$r0,-1 | 
|  | EXPECT    $r3,0xffffffff | 
|  | ldk.l     $r0,(0x12345678 >> 10) | 
|  | ldl.l     $r3,$r0,(0x12345678 & 0x3ff) | 
|  | EXPECT    $r3,0x12345678 | 
|  | ldk.l     $r0,(0xe2345678 >> 10) | 
|  | ldl.l     $r3,$r0,(0xe2345678 & 0x3ff) | 
|  | EXPECT    $r3,0xe2345678 | 
|  |  | 
|  | # flip | 
|  | ldk.l     $r0,0x0000001 | 
|  | flip.l    $r1,$r0,0 | 
|  | EXPECT    $r1,0x00000001 | 
|  |  | 
|  | lpm.l     $r0,k_12345678 | 
|  | flip.l    $r1,$r0,0 | 
|  | EXPECT    $r1,0x12345678 | 
|  | flip.l    $r1,$r0,24 | 
|  | EXPECT    $r1,0x78563412 | 
|  | flip.l    $r1,$r0,31 | 
|  | EXPECT    $r1,0x1e6a2c48 | 
|  |  | 
|  | # stack push pop | 
|  |  | 
|  | EXPECT    $sp,0x00000000 | 
|  | ldk.l     $r6,0x6666 | 
|  | push.l    $r6 | 
|  | or.l      $r0,$r0,$r0      # xxx | 
|  | EXPECT    $sp,0x0000fffc | 
|  | ldi.l     $r1,$sp,0 | 
|  | EXPECT    $r1,0x00006666 | 
|  | pop.l     $r1 | 
|  | EXPECT    $r1,0x00006666 | 
|  | EXPECT    $sp,0x00000000 | 
|  |  | 
|  | # call/return | 
|  | call      fowia | 
|  | push.l    $r1 | 
|  | call      fowia | 
|  | pop.l     $r2 | 
|  | sub.l     $r1,$r1,$r2 | 
|  | EXPECT    $r1,0x00000008 | 
|  |  | 
|  | # add,carry | 
|  |  | 
|  | ldk.l     $r0,0 | 
|  | ldk.l     $r1,0 | 
|  | call      add64 | 
|  | EXPECT    $r1,0x00000000 | 
|  | EXPECT    $r0,0x00000000 | 
|  |  | 
|  | lpm.l     $r0,k_abcdef01 | 
|  | lpm.l     $r1,k_abcdef01 | 
|  | call      add64 | 
|  | EXPECT    $r1,0x00000001 | 
|  | EXPECT    $r0,0x579bde02 | 
|  |  | 
|  | ldk.l     $r0,4 | 
|  | ldk.l     $r1,-5 | 
|  | call      add64 | 
|  | EXPECT    $r1,0x00000000 | 
|  | EXPECT    $r0,0xffffffff | 
|  |  | 
|  | ldk.l     $r0,5 | 
|  | ldk.l     $r1,-5 | 
|  | call      add64 | 
|  | EXPECT    $r1,0x00000001 | 
|  | EXPECT    $r0,0x00000000 | 
|  |  | 
|  | lpm.l     $r0,k_12345678 | 
|  | ldk.l     $r1,-1 | 
|  | call      add64 | 
|  | EXPECT    $r1,0x00000001 | 
|  | EXPECT    $r0,0x12345677 | 
|  |  | 
|  | ldk.l     $r0,-1 | 
|  | ldk.l     $r1,-1 | 
|  | call      add64 | 
|  | EXPECT    $r1,0x00000001 | 
|  | EXPECT    $r0,0xfffffffe | 
|  |  | 
|  | # inline literal | 
|  | call      lit | 
|  | .long     0xdecafbad | 
|  | EXPECT    $r0,0xdecafbad | 
|  |  | 
|  | ldk.l     $r1,0xee | 
|  | call      lit | 
|  | ldk.l     $r1,0xfe | 
|  | EXPECT    $r1,0x000000ee | 
|  |  | 
|  | call      lit | 
|  | .long     0x01020304 | 
|  | EXPECT    $r0,0x01020304 | 
|  |  | 
|  | call      lit | 
|  | .long     lit | 
|  | calli     $r0 | 
|  | .long     0xffaa55aa | 
|  | EXPECT    $r0,0xffaa55aa | 
|  |  | 
|  | # comparisons | 
|  | ldk.l     $r0,-100 | 
|  | ldk.l     $r1,100 | 
|  | cmp.l     $r0,$r1 | 
|  |  | 
|  | ldk.l     $r2,0 | 
|  | jmpc      lt,.c1 | 
|  | ldk.l     $r2,1 | 
|  | .c1: | 
|  | EXPECT    $r2,0x00000000 | 
|  |  | 
|  | ldk.l     $r2,0 | 
|  | jmpc      gt,.c2 | 
|  | ldk.l     $r2,1 | 
|  | .c2: | 
|  | EXPECT    $r2,0x00000001 | 
|  |  | 
|  | ldk.l     $r2,0 | 
|  | jmpc      a,.c3 | 
|  | ldk.l     $r2,1 | 
|  | .c3: | 
|  | EXPECT    $r2,0x00000000 | 
|  |  | 
|  | ldk.l     $r2,0 | 
|  | jmpc      b,.c4 | 
|  | ldk.l     $r2,1 | 
|  | .c4: | 
|  | EXPECT    $r2,0x00000001 | 
|  |  | 
|  | ldk.l     $r2,0 | 
|  | jmpc      be,.c5 | 
|  | ldk.l     $r2,1 | 
|  | .c5: | 
|  | EXPECT    $r2,0x00000001 | 
|  |  | 
|  | # 8-bit comparisons | 
|  | ldk.l     $r0,0x8fe | 
|  | ldk.l     $r1,0x708 | 
|  | cmp.b     $r0,$r1 | 
|  |  | 
|  | ldk.l     $r2,0 | 
|  | jmpc      lt,.8c1 | 
|  | ldk.l     $r2,1 | 
|  | .8c1: | 
|  | EXPECT    $r2,0x00000000 | 
|  |  | 
|  | ldk.l     $r2,0 | 
|  | jmpc      gt,.8c2 | 
|  | ldk.l     $r2,1 | 
|  | .8c2: | 
|  | EXPECT    $r2,0x00000001 | 
|  |  | 
|  | ldk.l     $r2,0 | 
|  | jmpc      a,.8c3 | 
|  | ldk.l     $r2,1 | 
|  | .8c3: | 
|  | EXPECT    $r2,0x00000000 | 
|  |  | 
|  | ldk.l     $r2,0 | 
|  | jmpc      b,.8c4 | 
|  | ldk.l     $r2,1 | 
|  | .8c4: | 
|  | EXPECT    $r2,0x00000001 | 
|  |  | 
|  | ldk.l     $r2,0 | 
|  | jmpc      be,.8c5 | 
|  | ldk.l     $r2,1 | 
|  | .8c5: | 
|  | EXPECT    $r2,0x00000001 | 
|  |  | 
|  | ldk.l     $r0,0x8aa | 
|  | ldk.l     $r1,0x7aa | 
|  | cmp.b     $r0,$r1 | 
|  |  | 
|  | ldk.l     $r2,0 | 
|  | jmpc      z,.8c6 | 
|  | ldk.l     $r2,1 | 
|  | .8c6: | 
|  | EXPECT    $r2,0x00000000 | 
|  |  | 
|  | ldk.b     $r0,1 | 
|  | ldk.b     $r2,0xe0 | 
|  | cmp.b     $r2,0x1c0 | 
|  | jmpc      a,.8c7 | 
|  | ldk.b     $r0,0 | 
|  | .8c7: | 
|  | EXPECT    $r0,0x00000001 | 
|  |  | 
|  | # conditional call | 
|  | cmp.l     $r0,$r0 | 
|  | callc     z,lit | 
|  | .long     0xccddeeff | 
|  | callc     nz,zr0 | 
|  | EXPECT    $r0,0xccddeeff | 
|  |  | 
|  | # modify return address | 
|  | ldk.l     $r0,0x66 | 
|  | call      skip1 | 
|  | ldk.l     $r0,0xAA | 
|  | EXPECT    $r0,0x00000066 | 
|  |  | 
|  | ldk.l     $r0,0x77 | 
|  | call      skip2 | 
|  | ldk.l     $r0,0xBB | 
|  | EXPECT    $r0,0x00000077 | 
|  |  | 
|  | # simple recursive function | 
|  | ldk.l     $r0,1 | 
|  | call      factorial | 
|  | EXPECT    $r0,0x00000001 | 
|  | ldk.l     $r0,2 | 
|  | call      factorial | 
|  | EXPECT    $r0,0x00000002 | 
|  | ldk.l     $r0,3 | 
|  | call      factorial | 
|  | EXPECT    $r0,0x00000006 | 
|  | ldk.l     $r0,4 | 
|  | call      factorial | 
|  | EXPECT    $r0,0x00000018 | 
|  | ldk.l     $r0,5 | 
|  | call      factorial | 
|  | EXPECT    $r0,0x00000078 | 
|  | ldk.l     $r0,6 | 
|  | call      factorial | 
|  | EXPECT    $r0,0x000002d0 | 
|  | ldk.l     $r0,7 | 
|  | call      factorial | 
|  | EXPECT    $r0,0x000013b0 | 
|  | ldk.l     $r0,12 | 
|  | call      factorial | 
|  | EXPECT    $r0,0x1c8cfc00 | 
|  |  | 
|  | # read sp after a call | 
|  | call      nullfunc | 
|  | EXPECT    $sp,0x00000000 | 
|  |  | 
|  | # CALLI->RETURN | 
|  | ldk.l     $r4,nullfunc | 
|  | calli     $r4 | 
|  | EXPECT    $sp,0x00000000 | 
|  |  | 
|  | # Link/unlink | 
|  | ldk.l     $r14,0x17566 | 
|  |  | 
|  | link      $r14,48 | 
|  | EXPECT    $r14,0x0000fffc | 
|  | sub.l     $sp,$sp,200 | 
|  | unlink    $r14 | 
|  | EXPECT    $r14,0x00017566 | 
|  |  | 
|  | # LINK->UNLINK | 
|  | link      $r14,48 | 
|  | unlink    $r14 | 
|  | EXPECT    $r14,0x00017566 | 
|  |  | 
|  | # LINK->JUMPI | 
|  | ldk.l     $r3,.here | 
|  | link      $r14,48 | 
|  | jmpi      $r3 | 
|  | jmp       failcase | 
|  | .here: | 
|  | unlink    $r14 | 
|  | EXPECT    $r14,0x00017566 | 
|  |  | 
|  | # LINK->RETURN | 
|  | # (This is a nonsense combination, but can still exericse it by | 
|  | # using a negative parameter for the link.  "link $r14,-4" leaves | 
|  | # $sp exactly unchanged.) | 
|  | ldk.l     $r0,.returnhere | 
|  | push.l    $r0 | 
|  | link      $r14,0xfffc | 
|  | return | 
|  | .returnhere: | 
|  | EXPECT    $sp,0x00000000 | 
|  |  | 
|  | # LPMI->CALLI | 
|  | ldk.l     $r0,k_abcdef01 | 
|  | ldk.l     $r1,increment | 
|  | lpmi.l    $r0,$r0,0 | 
|  | calli     $r1 | 
|  | EXPECT    $r0,0xabcdef02 | 
|  |  | 
|  | # STRLen | 
|  | lpm.l     $r4,str3 | 
|  | sta.l     tmp,$r4 | 
|  | ldk.l     $r0,tmp | 
|  | strlen.b  $r1,$r0 | 
|  | EXPECT    $r1,0x00000003 | 
|  | strlen.s  $r1,$r0 | 
|  | EXPECT    $r1,0x00000003 | 
|  | strlen.l  $r1,$r0 | 
|  | EXPECT    $r1,0x00000003 | 
|  |  | 
|  | ldk.l     $r4,0 | 
|  | sta.b     4,$r4 | 
|  | strlen.l  $r1,$r0 | 
|  | EXPECT    $r1,0x00000000 | 
|  |  | 
|  | ldk.l     $r4,-1 | 
|  | sta.l     4,$r4 | 
|  | lpm.l     $r4,str3 | 
|  | sta.l     8,$r4 | 
|  | strlen.l  $r1,$r0 | 
|  | EXPECT    $r1,0x00000007 | 
|  |  | 
|  | # MEMSet | 
|  | ldk.l     $r0,4 | 
|  | ldk.l     $r1,0xaa | 
|  | memset.s  $r0,$r1,8 | 
|  | ldk.l     $r1,0x55 | 
|  | memset.b  $r0,$r1,5 | 
|  | lda.l     $r0,4 | 
|  | EXPECT    $r0,0x55555555 | 
|  | lda.l     $r0,8 | 
|  | EXPECT    $r0,0xaaaaaa55 | 
|  |  | 
|  | # first cycle after mispredict | 
|  | ldk.l     $r0,3 | 
|  | cmp.l     $r0,$r0 | 
|  | jmpc      nz,failcase | 
|  | add.l     $r0,$r0,7 | 
|  | EXPECT    $r0,0x0000000a | 
|  | jmpc      nz,failcase | 
|  | push.l    $r0 | 
|  | EXPECT    $sp,0x0000fffc | 
|  | pop.l     $r0 | 
|  |  | 
|  | # $sp access after stall | 
|  | lpm.l     $r13,0 | 
|  | push.l    $r0 | 
|  | EXPECT    $sp,0x0000fffc | 
|  | pop.l     $r0 | 
|  |  | 
|  | push.l    $r0 | 
|  | add.l     $sp,$sp,-484 | 
|  | EXPECT    $sp,0x0000fe18 | 
|  | EXPECT    $sp,0x0000fe18 | 
|  | EXPECT    $sp,0x0000fe18 | 
|  | add.l     $sp,$sp,484 | 
|  | EXPECT    $sp,0x0000fffc | 
|  | pop.l     $r0 | 
|  |  | 
|  | # atomic exchange | 
|  | lpm.l     $r0,k_12345678 | 
|  | lpm.l     $r1,k_abcdef01 | 
|  | sta.l     100,$r1 | 
|  | exa.l     $r0,100 | 
|  | EXPECT    $r0,0xabcdef01 | 
|  | lda.l     $r0,100 | 
|  | EXPECT    $r0,0x12345678 | 
|  |  | 
|  | lpm.l     $r0,k_12345678 | 
|  | lpm.l     $r1,k_abcdef01 | 
|  | sta.l     144,$r1 | 
|  | ldk.l     $r7,20 | 
|  | exi.l     $r0,$r7,124 | 
|  | EXPECT    $r0,0xabcdef01 | 
|  | lda.l     $r0,144 | 
|  | EXPECT    $r0,0x12345678 | 
|  |  | 
|  | lpm.l     $r0,k_12345678 | 
|  | lpm.l     $r1,k_abcdef01 | 
|  | push      $r1 | 
|  | exi.l     $r0,$sp,0 | 
|  | EXPECT    $r0,0xabcdef01 | 
|  | pop.l     $r0 | 
|  | EXPECT    $r0,0x12345678 | 
|  |  | 
|  | # PM write port | 
|  | .equ    PM_UNLOCK,      0x1fc80 | 
|  | .equ    PM_ADDR,        0x1fc84 | 
|  | .equ    PM_DATA,        0x1fc88 | 
|  |  | 
|  | lpm.l     $r0,k_12345678 | 
|  | lpm.l     $r1,k_abcdef01 | 
|  | EXPECT    $r0,0x12345678 | 
|  | EXPECT    $r1,0xabcdef01 | 
|  | ldk.l     $r3,(0x1337f7d1 >> 10) | 
|  | ldl.l     $r3,$r3,(0x1337f7d1 & 0x3ff) | 
|  | EXPECT    $r3,0x1337f7d1 | 
|  | ldk	  $r4,k_12345678 | 
|  | sta.l     PM_ADDR,$r4 | 
|  |  | 
|  | # write while locked does nothing | 
|  | sta.l	  PM_DATA,$r1 | 
|  | sta.l	  PM_DATA,$r0 | 
|  | lpm.l     $r0,k_12345678 | 
|  | lpm.l     $r1,k_abcdef01 | 
|  | EXPECT    $r0,0x12345678 | 
|  | EXPECT    $r1,0xabcdef01 | 
|  |  | 
|  | # write while unlocked modifies program memory | 
|  | sta.l	  PM_UNLOCK,$r3 | 
|  | sta.l	  PM_DATA,$r1 | 
|  | sta.l	  PM_DATA,$r0 | 
|  | lpm.l     $r0,k_12345678 | 
|  | lpm.l     $r1,k_abcdef01 | 
|  | EXPECT    $r0,0xabcdef01 | 
|  | EXPECT    $r1,0x12345678 | 
|  |  | 
|  | # final stack check | 
|  | EXPECT    $sp,0x00000000 | 
|  |  | 
|  | PASS | 
|  |  | 
|  | # -------------------------------------------------- | 
|  |  | 
|  | skip1:          # skip the instruction after the call | 
|  | pop.l     $r1 | 
|  | add.l     $r1,$r1,4 | 
|  | push.l    $r1 | 
|  | return | 
|  |  | 
|  | skipparent:     # skip the instruction after the caller's call | 
|  | ldi.l     $r1,$sp,4 | 
|  | add.l     $r1,$r1,4 | 
|  | sti.l     $sp,4,$r1 | 
|  | return | 
|  | skip2: | 
|  | call      skipparent | 
|  | return | 
|  |  | 
|  | add64: | 
|  | addcc.l   $r0,$r1 | 
|  | add.l     $r0,$r0,$r1 | 
|  | ldk.l     $r1,0 | 
|  | jmpc      nc,.done | 
|  | ldk.l     $r1,1 | 
|  | .done: | 
|  | return | 
|  |  | 
|  | fowia:  # find out where I'm at | 
|  | ldi.l     $r1,$sp,0 | 
|  | return | 
|  |  | 
|  | lit:    # load literal to $r0 | 
|  | pop.l     $r14 | 
|  | lpmi.l    $r0,$r14,0 | 
|  | add.l     $r14,$r14,4 | 
|  | jmpi      $r14 | 
|  | zr0: | 
|  | ldk.l     $r0,0 | 
|  | return | 
|  | litr1: | 
|  | ldi.l     $r1,$sp,0 | 
|  | add.l     $r1,$r1,4 | 
|  | sti.l     $sp,0,$r1 | 
|  | lpmi.l    $r1,$r1,-4 | 
|  | return | 
|  |  | 
|  | factorial: | 
|  | ldk.l     $r1,1 | 
|  | cmp.l     $r0,$r1 | 
|  | jmpc      z,.factdone | 
|  | push.l    $r0 | 
|  | add.l     $r0,$r0,-1 | 
|  | call      factorial | 
|  | pop.l     $r1 | 
|  | mul.l     $r0,$r0,$r1 | 
|  | .factdone: | 
|  | return | 
|  |  | 
|  | nullfunc: | 
|  | return | 
|  |  | 
|  | increment: | 
|  | add.l     $r0,$r0,1 | 
|  | return | 
|  |  | 
|  | .long   0x10111213 | 
|  | k_12345678: | 
|  | .long   0x12345678 | 
|  | k_abcdef01: | 
|  | .long   0xabcdef01 | 
|  | str3: | 
|  | .string   "abc" |