Background
In two's complement arithmetics, if one wants to calculate a subtraction having only an adder that calculates
{cout,result}=full_adder(arg1,arg2,cin)
,
where cin
and cout
are incoming and outgoing carries, respectively, the way is to invert the second argument (a subtrahend) and to add extra one to the sum:
a-b = a + (~b) + 1
Using the full_adder()
as defined above, that would be:
{some_cout,result}=full_adder(a,~b,1)
The some_cout
is inverted borrow here: it is one when there were no borrow in ordinary subtraction of b
from a
and vice versa.
Next, that extra one could be actually an incoming borrow, which is also inverted: when it is one, a normal subtraction takes place, when it is zero, the result is 1 less:
{inv_borrowout,result}=full_adder(a,~b,inv_borrowin)
For those familiar with 6502 that is readily recognizable as the exact way the SBC instruction there works.
In more "conventional" architectures like 68000, Z80 or x86, the carries in subtraction are true borrows, that is, they get inverted before and after the addition with the inverted second argument. Extra inversion usually costs some logic, die space and worse timings.
Question
The one known member of 'inverted carries' architecture is 6502, the second known to me is ARM.
What CPU architecture was the first to optimize carries during subtraction by leaving them inverted? Were there any other adopters of such approach besides 6502 and ARM?