Sur le forum "Coding" de dhs.nu, Peter se demandais à quoi pouvait bien
servir les instructions CHK et CHK2. Ces instructions ont l'air plus ou moins
inutiles aux yeux de beaucoup (dont je fais partie)... Et pourtant...
Leonard/OXG nous explique une utilité possible de ces instructions, notamment
pour réaliser une routine de clipping optimisée. Je cite:
I don't know that game code, but these intructions "may" be usefull for
special ultra-optimisation :-) Explain:
In my fast mandelbrot routine, I use the instruction TRAPV. TRAPV flush an
exeption if overflow flag is set. If not, it only takes 4 cyles. In a standard
mandelbrot set, you have to check an exit condition at each iteration, and
generally do 30 to 100 iterations before one and only exit. So using trapv
takes only 4 cycles per iterations, instead of 8 for a BVS branch.
Anyway, I don't know the CHK timing instruction but it may be 4 cycles if
CHK dn,dn exist. So in a loop where the exit condition does not occur very
often ( say a 2d dot clipping routine), CHK may be usefull. ( again, IF it
takes 4 cycles. If not, it's useless)
<lèche-bottes>
Ô maître Leonard, tu es grand !
</lèche-bottes>
Edit
Voici le détail de l'instruction CHK:
CHK - Check Against Bounds
This instruction checks its first operand against a data register's word
contents. If the data register contains less than zero or greater than its
first operand, a trap to the address specified by vector 6 occurs. Thus, CHK
can be used to ensure that an element of an array is neither below nor above
its boundaries. Syntax: CHK bounds, Dn where bounds is anything except an
address register. Flags affected: All flags are undefined after this
operation.
En français et en clair, cette instruction est effectivement toute adaptée
au clipping. L'instruction teste si le registre de données (apparemment la
seconde opérande) est inférieur à zéro ou bien supérieur au premier opérande,
si oui le 68000 va déclencher une interruption type CHK (vecteur en $18). Donc,
si le point ne doit pas être clippé, l'instruction consomme 12 cycles en tout,
mais s'il doit être clippé, c'est 44 cycles + le temps d'exécution de la
routine d'interruption + le RTE. Merci Leonard !