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

Reply via email to