Home | History | Annotate | Line # | Download | only in ft32
      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
     19 tmp:    .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 
    831 skip1:          # skip the instruction after the call
    832 	pop.l     $r1
    833 	add.l     $r1,$r1,4
    834 	push.l    $r1
    835 	return
    836 
    837 skipparent:     # 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
    842 skip2:
    843 	call      skipparent
    844 	return
    845 
    846 add64:
    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 
    855 fowia:  # find out where I'm at
    856 	ldi.l     $r1,$sp,0
    857 	return
    858 
    859 lit:    # load literal to $r0
    860 	pop.l     $r14
    861 	lpmi.l    $r0,$r14,0
    862 	add.l     $r14,$r14,4
    863 	jmpi      $r14
    864 zr0:
    865 	ldk.l     $r0,0
    866 	return
    867 litr1:
    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 
    874 factorial:
    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 
    886 nullfunc:
    887 	return
    888 
    889 increment:
    890 	add.l     $r0,$r0,1
    891 	return
    892 
    893 	.long   0x10111213
    894 k_12345678:
    895 	.long   0x12345678
    896 k_abcdef01:
    897 	.long   0xabcdef01
    898 str3:
    899 	.string   "abc"
    900