On 14/09/2016 03:12, Kyle Owen wrote:
Need some more optimization fun? :) Vince and I were
working on some code
to add two signed 12 bit numbers and detect overflow, returning MAX_INT or
MIN_INT in AC in the case of overflow, or the sum in AC otherwise. Here's
what Vince came up with so far:
[ 29 words, 25 instructions, 13 instructions if obviously no overflow]
OK, here's my take on it. Not a huge saving, but 27 words, 23
instructions, 11 if no obvious overflow:
chkovf, 0 / entry point, stores return address
TAD ovfa / get first number
TAD ovfb / add the second
DCA ovfsum / save result
TAD ovfa / get first number again
RAL / save its sign bit
CLA RAR / now just the first sign bit in AC (and L=0)
TAD ovfb / add the second number, see if sign changes
SPA CLA / if result is positive, both were the same sign
JMP done / different signs, must be OK
/ both were same sign, so check for overflow (AC=0)
TAD ovfsum / get the addition result
RAL / save its sign bit
CLA RAR / now just the sign bit in AC, and L=0
TAD ovfa / add one of the operands, see if the sign changes
SMA CLA / if now negative, sign is different from operands
JMP done / positive = no overflow, no problem, done
/ fix for cases of overflow
CLA CLL CMA RAR / make 3777 (MAX INT)
DCA ovfsum / and save it
TAD ovfa / get the sign of correct result
SPA CLA / should it be negative?
ISZ ovfsum / if yes, 3777 -> 4000 (MIN INT)
CLA / really a NOP
done, TAD ovfsum / get the result
JMP I chkovf / fast return if all OK
ovfa, 0
ovfb, 0
ovfsum, 0
--
Pete
Pete Turnbull