| # 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" |