123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- ; This test covers the behavior of 40-bit mode with various instructions.
- incdir "tests"
- include "dsp_base.inc"
- positive_value: EQU #0x1234
- negative_value: EQU #0x9876
- negative_imem_value_addr:
- CW negative_value
- ; DSPSpy doesn't pre-populating DMEM currently, so instead use these addresses to store values.
- positive_dmem_value_addr: EQU #0x100
- negative_dmem_value_addr: EQU #0x101
- readback_dmem_addr: EQU #0x102
- test_main:
- LRI $ar0, #positive_dmem_value_addr
- LRI $ar1, #negative_dmem_value_addr
- LRI $ar2, #negative_imem_value_addr
- LRI $ar3, #readback_dmem_addr
- LRI $ix0, #0
- LRI $ix1, #0
- LRI $ix2, #0
- LRI $ix3, #0
- LRI $ax0.h, #positive_value
- LRI $ax1.h, #negative_value
- SR @positive_dmem_value_addr, $ax0.h
- SR @negative_dmem_value_addr, $ax1.h
- LRI $cr, #(positive_dmem_value_addr / 256)
- SET40
- ; Instructions that perform sign-extension
- ; $acc0 should alternate between being positive and negative here
- ; (though none of these instructions update $sr)
- ; [1] ILRR (also ILRRD/ILRRI/ILRRN, not covered)
- ILRR $ac0.m, @$ar2 ; -
- CALL send_back
- ; [2] LR
- LR $ac0.m, @positive_dmem_value_addr ; +
- CALL send_back
- ; [3] LRI
- LRI $ac0.m, #negative_value ; -
- CALL send_back
- ; [4] LRIS
- LRIS $ac0.m, #42 ; +
- CALL send_back
- ; [5] LRR (also LRRD/LRRI/LRRN)
- LRR $ac0.m, @$ar1 ; -
- CALL send_back
- ; [6] LRS
- LRS $ac0.m, @(positive_dmem_value_addr & 0xff) ; +
- CALL send_back
- ; [7] MRR
- MRR $ac0.m, $ax1.h ; -
- CALL send_back
- ; [8] 'LN (and 'L, but 'LN lets us set $ix0 to not increment $ar0)
- NX'LN : $ac0.m, @$ar0 ; +
- CALL send_back
- ; Instructions that experience saturation
- ; $ax1.l should alternate between 0x8000 and 0x7fff.
- LRI $ac0.m, #0x4231
- LRI $ac0.h, #0x12 ; positive
- LRI $ac1.m, #0x2816
- LRI $ac1.h, #0x99 ; negative
- ; [9] MRR (again)
- MRR $ax1.l, $ac1.m ; -
- CALL send_back
- ; [10] SR
- SR @readback_dmem_addr, $ac0.m
- LR $ax1.l, @readback_dmem_addr ; +
- CALL send_back
- ; [11] SRRN (also SRR/SRRD/SRRI)
- SRRN @$ar3, $ac1.m
- LR $ax1.l, @readback_dmem_addr ; -
- CALL send_back
- ; [12] SRS
- SRS @(readback_dmem_addr & 0xff), $ac0.m
- LR $ax1.l, @readback_dmem_addr ; +
- CALL send_back
- ; [13] 'LSNM (also 'LS/'LSM/'LSN) - the $ax0.l read is not relevant
- NX'LSNM : $ax0.l, $ac1.m
- LR $ax1.l, @readback_dmem_addr ; -
- CALL send_back
- ; [14] 'MV
- NX'MV : $ax1.l, $ac0.m ; +
- CALL send_back
- ; [15] 'SLNM (also 'SL/'SLM/'SLN) - the $ax0.l read is not relevant
- ; Note that 'SL stores to @$ar0, while 'LS stores to @$ar3
- LRI $ar0, #readback_dmem_addr
- NX'SLNM : $ac1.m, $ax0.l
- LR $ax1.l, @readback_dmem_addr ; -
- CALL send_back
- LRI $ar0, #positive_dmem_value_addr
- ; [16] 'SN (also 'S)
- NX'SN : @$ar3, $ac0.m
- LR $ax1.l, @readback_dmem_addr ; +
- CALL send_back
- ; Instructions that are not affected
- ; [17] ADDI
- ADDI $ac0.m, #8
- CALL send_back
- ; [18] ADDIS
- ADDIS $ac0.m, #-8
- CALL send_back
- ; [19] ANDC
- ANDC $ac1.m, $ac0.m
- CALL send_back
- ; [20] ANDI
- ANDI $ac0.m, #0x6666
- CALL send_back
- ; [21] ANDR
- ANDR $ac0.m, $ax0.h
- CALL send_back
- ; [22] ORC
- ORC $ac0.m, $ac1.m
- CALL send_back
- ; [23] ORI
- ORI $ac0.m, #0xfeed
- CALL send_back
- ; [24] ORR
- ORR $ac1.m, $ax0.h
- CALL send_back
- ; [25] NOT
- NOT $ac1.m
- CALL send_back
- ; [26] XORC
- XORC $ac0.m, $ac1.m
- CALL send_back
- ; [27] XORI
- XORI $ac0.m, #0x5555
- CALL send_back
- ; [28] XORR
- XORR $ac1.m, $ax1.h
- CALL send_back
- ; [29] MOVR always sign extends...
- MOVR $acc1, $ax0.h
- CALL send_back
- ; [30] ... even in SET16 mode
- SET16
- MOVR $acc1, $ax1.h
- CALL send_back
- SET40
- ; Shift instructions - do these see saturated $ac1.m?
- LRI $ac0.m, #positive_value
- LRI $ac1.m, #2
- LRI $ac1.h, #1
- ; [31] - for diffs only
- CALL send_back
- ; [32]
- LSRNR $acc0, $ac1.m
- CALL send_back
- ; [33] Shifts $acc0 by $ac1.m (in the other direction)
- LSRN
- CALL send_back
- ; Does LOOP experience saturation?
- CLR $acc0
- LRI $ac1.m, #0x1234
- LRI $ac1.h, #1
- ; [34] - for diffs only
- CALL send_back
- ; [35] LOOP
- LOOP $ac1.m
- INC $acc0
- CALL send_back
- LRI $ac1.h, #0x99
- ; [36] BLOOP
- BLOOP $ac1.m, bloop_last_ins
- INCM $ac0.m
- bloop_last_ins:
- NOP
- CALL send_back
- ; For the sake of clarity, the same LOOP/BLOOP calls in SET16 mode don't have saturation:
- SET16
- CLR $acc0
- LRI $ac1.m, #0x1234
- LRI $ac1.h, #1
- ; [37] - for diffs only
- CALL send_back
- ; [38] LOOP
- LOOP $ac1.m
- INC $acc0
- CALL send_back
- LRI $ac1.h, #0x99
- ; [39] BLOOP
- BLOOP $ac1.m, bloop2_last_ins
- INCM $ac0.m
- bloop2_last_ins:
- NOP
- CALL send_back
- ; We're done, DO NOT DELETE THIS LINE
- JMP end_of_test
|