Page 2 of 2
Re: 68000 programming optimization tips? (for speed)
Posted: Wed Apr 19, 2017 8:22 pm
by GManiac
By the way, a lot of people ignore Scc commands (ST, SF, Sxx), but they are pretty useful to calculate complex boolean expressions (with addition of NOT, AND, OR, EOR) rather than doing a massive branching.
Re: 68000 programming optimization tips? (for speed)
Posted: Thu Apr 20, 2017 9:50 pm
by Sik
Can confirm, once I was looking at the pathfinding code in Star Chaser and ran into a SHS instruction and was wondering what the heck was going on because of how uncommon it is. (pretty ironic since I wrote that code...)
These days I'm exploiting Scc a lot for quickly getting 0/1 values from a condition (Scc followed by AND). Or just outright 0/-1 (no AND) if I just want a boolean to be used later.
Re: 68000 programming optimization tips? (for speed)
Posted: Fri Apr 21, 2017 10:53 am
by Natsumi
also it can be very useful for something like this;
Code: Select all
.cloop tst.b (a1)+ ; check if entry is null
seq d2 ; if is, set d2 to $FF
add.b d2,d3 ; and then subtract 1 from total count if so
dbf d1,.cloop ; loop til all cards are checked
Over branching conditionally, this actually saves 4 cycles per loop. Quite nifty optimization since this loop is ran many times over.
Re: 68000 programming optimization tips? (for speed)
Posted: Sat Apr 22, 2017 12:35 am
by Sik
Not to mention the part where you avoid an extra label just for the branch. The best kind of optimizations are those that also make the code look cleaner =O) (like using MOVEP instead of bit shifting for generating VDP commands for DMA)
Re: 68000 programming optimization tips? (for speed)
Posted: Mon Jul 09, 2018 5:43 am
by Miquel
Sik wrote: ↑Thu Apr 20, 2017 9:50 pm
These days I'm exploiting Scc a lot for quickly getting 0/1 values from a condition (Scc followed by AND). Or just outright 0/-1 (no AND) if I just want a boolean to be used later.
Or just do a: "neg.b" to get the appropriate value.
Hard to remember all those 68k tricks
Re: 68000 programming optimization tips? (for speed)
Posted: Mon Jul 09, 2018 7:35 am
by Sik
The Scc instructions only come in byte size so if I want a word or long result I actually need to use AND if I want 1 instead of -1 (I mean, I could use EXT and NEG together, but it's not better and takes up more lines of code).
EDIT: also using AND you can get other values like 2 or 4. Convenient for offsets :v
Re: 68000 programming optimization tips? (for speed)
Posted: Wed Jul 11, 2018 9:40 am
by Miquel
You are right
Re: 68000 programming optimization tips? (for speed)
Posted: Mon Aug 13, 2018 4:52 am
by gasega68k
I don't know if this should be called programmig optimization or programming trick, but is someting that I did recently to quick save/restore X flag:
Code: Select all
subx.b d0,d0 ;set d0 to $ff if X is set, otherwise 0
then to restore X flag:
This can also work with subx.w, add.w, in this case d0 will be set to $ffff, or 0.
Re: 68000 programming optimization tips? (for speed)
Posted: Sun Aug 19, 2018 6:09 pm
by Stef
I rarely need to save X but neat way of doing it
Re: 68000 programming optimization tips? (for speed)
Posted: Mon Aug 27, 2018 9:32 am
by flamewing
Speaking of X, there is a neat thing you can do with it:
Code: Select all
add.w d0,d0
subx.w d1,d1
negx.w d0
addx.w d1,d1
The result: d1 = sign(d0).
You can also use subx and addx to compute the min, max, and minmax of 2 numbers, but it is slower than the branch versions (but might be useful if you need the functions to run in constant time).
Re: 68000 programming optimization tips? (for speed)
Posted: Tue Aug 28, 2018 2:58 pm
by Stef
what sign(x) is intended to return ? 1 if signed, 0 if not ?
Re: 68000 programming optimization tips? (for speed)
Posted: Tue Aug 28, 2018 8:49 pm
by Sik
I think it's meant to return -1, 0 or +1. At least that's what sign functions usually do.
Still trying to get my head around it, mind you (mainly the NEGX).
Re: 68000 programming optimization tips? (for speed)
Posted: Wed Aug 29, 2018 10:49 am
by flamewing
Sik wrote: ↑Tue Aug 28, 2018 8:49 pm
I think it's meant to return -1, 0 or +1. At least that's what sign functions usually do.
You guessed right.
Sik wrote: ↑Tue Aug 28, 2018 8:49 pm
Still trying to get my head around it, mind you (mainly the NEGX).
It's only purpose is to set X if d0 was nonzero. Note that subx d1,d1 preserves X, which is important for the next if d0 started out as $8000.
Re: 68000 programming optimization tips? (for speed)
Posted: Sat Jan 04, 2020 12:56 pm
by Miquel
The most stupid optimization, but useful since can be done in lot of occasions:
Code: Select all
move.b 0xA10001, d0
and.b #0xF , d0
Optimized:
Code: Select all
moveq.l #0xF, d0
and.b 0xA10001, d0
There is a difference: it clears the 3 upper bytes, which perhaps is what you need.
Also works with other bit operations.