The Dauug House Wright State University logo
Dauug|36 minicomputer documentation

Additive instructions

Opcode P/U Category Description
A user ALU: additive add
AC user ALU: additive add with carry
AW user ALU: additive add with wrap
AWC user ALU: additive add with wrap and carry
RS user ALU: additive reverse subtract
RSC user ALU: additive reverse subtract with carry
RSW user ALU: additive reverse subtract with wrap
RSWC user ALU: additive reverse subtract with wrap and carry
S user ALU: additive subtract
SC user ALU: additive subtract with carry
SW user ALU: additive subtract with wrap
SWC user ALU: additive subtract with wrap and carry

Preface

Unlike in conventional architectures, Dauug|36’s additive instructions are fully range checked, irrespective of signage. First, a T(emporal overrange) flag is cleared or set on the basis of whether or not the result fits. Second, a sticky R(ange) flag is set in the event T is set. The R flag remains set until it is cleared by the CRF (clear Range flag) instruction. This precludes the need to check flags after each instruction: checking can be deferred to the end of a long calculation.

Dauug|36 is able to determine whether an additive result fits, because its assembly language requires registers to be declared as unsigned or signed. Based on this, the correct opcode is chosen. For example, there are eight opcodes for A (add). The assembly syntax looks like this:

unsigned a c     (a and c are unsigned registers)
signed b         (b is a signed register)

c = a + b        (selects the A.usu variant of A)

Conventional architectures don’t need a reverse subtraction operation, because using ordinary subtraction with the operands switched would achieve the same effect. Dauug|36 is different, in that a register’s value may be different when used as a left operand vs. a right operand. This is the case today with the MHL series of fast multiplication instructions, and could be the case in the future if a hardware multiplier is added to the architecture.

A Add

Syntax
c = a + b
Register Signedness
Left unsigned or signed
Right unsigned or signed
Destination unsigned or signed
8 opcodes total
Flag Set if and only if
N a + b < 0
Z a + b = 0
T c cannot fit a + b
R T is set or R is already set

A (add) is the instruction for ordinary addition of 36-bit numbers. It does not have a carry input or carry output. It is fully range-checked, so the T and R flags will indicate when the sum does not fit in 36 bits.

The 36-bit unsigned and/or signed operand registers are extended into 38-bit signed quantities, which then are added to produce a 38-bit signed sum that will not overflow. The N and Z flags are set based on the original 38-bit sum. The 36 least significant bits of the sum are stored in the destination register, which may be signed or unsigned. Flags T and R are set if the full sum does not fit, otherwise T is cleared and R is left unchanged.

AC Add with carry

Syntax
c = a ++ b
Register Signedness
Left unsigned or signed
Right unsigned or signed
Destination unsigned or signed
8 opcodes total
Flag Set if and only if
N a + b + T < 0
Z a + b + T = 0
T c cannot fit a + b + T
R T is set or R is already set

AC (add with carry) is the final instruction for multiple-precision addition of integers larger than 36 bits. It uses the T flag as a carry input, but has no carry output. It is fully range-checked, so the T and R flags will indicate when the multiple-precision sum does not fit.

This instruction is preceded by AW for 72-bit addition, or by AWC for 108-bit and larger addition. It is never preceded by A, because A conflicts for range checking. The 36-bit unsigned and/or signed operand registers are extended into 38-bit signed quantities, which then are added along with the T flag to produce a 38-bit signed sum that will not overflow. The N and Z flags are set based on the original 38-bit sum. The 36 least significant bits of the sum are stored in the destination register, which may be signed or unsigned. Flags T and R are set if the full sum does not fit, otherwise T is cleared and R is left unchanged.

AW Add with wrap

Syntax
<wrap> c = a + b
Register Signedness
Left ignored
Right ignored
Destination ignored
1 opcode only
Flag Set if and only if
N never; flag is cleared
Z <unsigned> a + <unsigned> b = 0
T <unsigned> a + <unsigned> b ≥ 236
R flag does not change

AW (add with wrap) the first instruction for multiple-precision addition of integers larger than 36 bits. It has no carry input, and uses the T flag as a carry output. It does not require range checking and therefore has no effect on the R flag.

This instruction is followed by AC for 72-bit addition. For 108-bit and larger integers, it is followed by AWC.

The three registers are treated as unsigned without regard to how they are declared. The operands are added, and the 36 least significant bits of the sum are stored in the destination. Flag N is cleared. Flag Z will be set if the left and right operands are both zero, and cleared otherwise because the sum, however truncated, cannot truly be zero. Flag T is set if a carry is generated, and cleared otherwise. Flag R does not change.

AWC Add with wrap and carry

Syntax
<wrap> c = a ++ b
Register Signedness
Left ignored
Right ignored
Destination ignored
1 opcode only
Flag Set if and only if
N never; flag is cleared
Z <unsigned> a + <unsigned> b + T = 0
T <unsigned> a + <unsigned> b + T ≥ 236
R flag does not change

AWC (add with wrap and carry) is the intermediate instruction for multiple-precision addition of integers larger than 72 bits. It uses the T flag as a carry input and carry output. It does not require range checking and therefore has no effect on the R flag.

In 108-bit addition, this instruction is preceded by AW and followed by AC. For 144-bit and larger integers, it is preceded by AW or AWC and followed by AWC or AC depending on its position.

The three registers are treated as unsigned without regard to how they are declared. The operands are added along with the T flag, and the 36 least significant bits of the sum are stored in the destination. Flag N is cleared. Flag Z will be set if both operands and the incoming T flag are all zero, and cleared otherwise because the sum, however truncated, cannot truly be zero. Flag T is set if a carry is generated, and cleared otherwise. Flag R does not change.

RS Reverse subtract

Syntax
c = a ~- b
Register Signedness
Left unsigned or signed
Right unsigned or signed
Destination unsigned or signed
8 opcodes total
Flag Set if and only if
N ba < 0
Z ba = 0
T c cannot fit ba
R T is set or R is already set

RS (reverse subtract) is the instruction for reverse subtraction of 36-bit numbers. It does not have a borrow input or borrow output. It is fully range-checked, so the T and R flags will indicate when the difference does not fit in 36 bits.

The 36-bit unsigned and/or signed operand registers are extended into 38-bit signed quantities. The left operand is subtracted from the right to produce a 38-bit signed difference that will not overflow. The N and Z flags are set based on the original 38-bit difference. The 36 least significant bits of the difference are stored in the destination register, which may be signed or unsigned. Flags T and R are set if the full difference does not fit, otherwise T is cleared and R is left unchanged.

RSC Reverse subtract with carry

Syntax
c = a ~-- b

The syntax in the dissertation on page 410 is incorrect.

Register Signedness
Left unsigned or signed
Right unsigned or signed
Destination unsigned or signed
8 opcodes total
Flag Set if and only if
N baT < 0
Z baT = 0
T c cannot fit baT
R T is set or R is already set

RSC (reverse subtract with carry) is the final instruction for multiple-precision reverse subtraction of integers larger than 36 bits. It uses the T flag as a borrow input, but has no borrow output. It is fully range-checked, so the T and R flags will indicate when the multiple-precision difference does not fit.

This instruction is preceded by RSW for 72-bit reverse subtraction, or by RSWC for 108-bit and larger reverse subtraction. It is never preceded by RS, because RS conflicts for range checking.

The 36-bit unsigned and/or signed operand registers are extended into 38-bit signed quantities. The T flag and left operand are subtracted from the right to produce a 38-bit signed difference that will not overflow. The N and Z flags are set based on the original 38-bit difference. The 36 least significant bits of the difference are stored in the destination register, which may be signed or unsigned. Flags T and R are set if the full difference does not fit, otherwise T is cleared and R is left unchanged.

RSW Reverse subtract with wrap

Syntax
<wrap> c = a ~- b
Register Signedness
Left ignored
Right ignored
Destination ignored
1 opcode only
Flag Set if and only if
N <unsigned> b<unsigned> a < 0
Z <unsigned> b<unsigned> a = 0
T <unsigned> b<unsigned> a < 0
R flag does not change

RSW (reverse subtract with wrap) is the first instruction for multiple-precision reverse subtraction of integers larger than 36 bits. It has no borrow input, and uses the T flag as a borrow output.

It does not require range checking and therefore has no effect on the R flag. This instruction is followed by RSC for 72-bit reverse subtraction. For 108-bit and larger integers, it is followed by RSWC.

The three registers are treated as unsigned without regard to how they are declared. The left operand is subtracted from the right, and the 36-bit difference is stored in the destination. Flag Z will be set if the left and right operands are equal, and cleared otherwise. Flags N and T are set if a borrow is generated, and cleared otherwise. Flag R does not change.

The dissertation incorrectly states on page 411 that the T flag is also subtracted.

RSWC Reverse subtract with wrap and carry

Syntax
<wrap> c = a ~-- b

The syntax in the dissertation on page 412 is incorrect.

Register Signedness
Left unsigned or signed
Right unsigned or signed
Destination unsigned or signed
8 opcodes total
Flag Set if and only if
N <unsigned> b<unsigned> aT < 0
Z <unsigned> b<unsigned> aT = 0
T <unsigned> b<unsigned> aT < 0
R flag does not change

RSWC (reverse subtract with wrap and carry) is the intermediate instruction for multiple-precision reverse subtraction of integers larger than 72 bits. It uses the T flag as a borrow input and borrow output. It does not require range checking and therefore has no effect on the R flag.

In 108-bit reverse subtraction, this instruction is preceded by RSW and followed by RSC. For 144-bit and larger integers, it is preceded by RSW or RSWC and followed by RSWC or RSC depending on its position.

The three registers are treated as unsigned without regard to how they are declared. The T flag and left operand are subtracted from the right, and the 36-bit difference is stored in the destination. Flag Z will be set if the 36-bit difference is zero and no borrow is generated. Flags N and T are set if a borrow is generated, and cleared otherwise. Flag R does not change.

S Subtract

Syntax
c = a - b
Register Signedness
Left unsigned or signed
Right unsigned or signed
Destination unsigned or signed
8 opcodes total
Flag Set if and only if
N ab < 0
Z ab = 0
T c cannot fit ab
R T is set or R is already set

S (subtract) is the instruction for ordinary subtraction of 36-bit numbers. It does not have a borrow input or borrow output. It is fully range-checked, so the T and R flags will indicate when the difference does not fit in 36 bits.

The 36-bit unsigned and/or signed operand registers are extended into 38-bit signed quantities. The right operand is subtracted from the left to produce a 38-bit signed difference that will not overflow. The N and Z flags are set based on the original 38-bit difference. The 36 least significant bits of the difference are stored in the destination register, which may be signed or unsigned. Flags T and R are set if the full difference does not fit, otherwise T is cleared and R is left unchanged.

SC Subtract with carry

Syntax
c = a -- b

The syntax in the dissertation on page 414 is incorrect.

Register Signedness
Left unsigned or signed
Right unsigned or signed
Destination unsigned or signed
8 opcodes total
Flag Set if and only if
N abT < 0
Z abT = 0
T c cannot fit abT
R T is set or R is already set

SC (subtract with carry) is the final instruction for multiple-precision subtraction of integers larger than 36 bits. It uses the T flag as a borrow input, but has no borrow output. It is fully range-checked, so the T and R flags will indicate when the multiple-precision difference does not fit.

This instruction is preceded by SW for 72-bit subtraction, or by SWC for 108-bit and larger subtraction. It is never preceded by S, because S conflicts for range checking.

The 36-bit unsigned and/or signed operand registers are extended into 38-bit signed quantities. The T flag and right operand are subtracted from the left to produce a 38-bit signed difference that will not overflow. The N and Z flags are set based on the original 38-bit difference. The 36 least significant bits of the difference are stored in the destination register, which may be signed or unsigned. Flags T and R are set if the full difference does not fit, otherwise T is cleared and R is left unchanged.

SW Subtract with wrap

Syntax
<wrap> c = a - b
Register Signedness
Left ignored
Right ignored
Destination ignored
1 opcode only
Flag Set if and only if
N <unsigned> a<unsigned> b < 0
Z <unsigned> a<unsigned> b = 0
T <unsigned> a<unsigned> b < 0
R flag does not change

SW (subtract with wrap) is the first instruction for multiple-precision subtraction of integers larger than 36 bits. It has no borrow input, and uses the T flag as a borrow output. It does not require range checking and therefore has no effect on the R flag.

This instruction is followed by SC for 72-bit subtraction. For 108-bit and larger integers, it is followed by SWC.

The three registers are treated as unsigned without regard to how they are declared. The right operand is subtracted from the left, and the 36-bit difference is stored in the destination. Flag Z will be set if the left and right operands are equal, and cleared otherwise. Flags N and T are set if a borrow is generated, and cleared otherwise. Flag R does not change.

The dissertation incorrectly states on page 415 that the T flag is also subtracted.

SWC Subtract with wrap and carry

Syntax
<wrap> c = a -- b

The syntax in the dissertation on page 416 is incorrect.

Register Signedness
Left unsigned or signed
Right unsigned or signed
Destination unsigned or signed
8 opcodes total
Flag Set if and only if
N <unsigned> a<unsigned> bT < 0
Z <unsigned> a<unsigned> bT = 0
T <unsigned> a<unsigned> bT < 0
R flag does not change

SWC (subtract with wrap and carry) is the intermediate instruction for multiple-precision subtraction of integers larger than 72 bits. It uses the T flag as a borrow input and borrow output. It does not require range checking and therefore has no effect on the R flag.

In 108-bit subtraction, this instruction is preceded by SW and followed by SC. For 144-bit and larger integers, it is preceded by SW or SWC and followed by SWC or SC depending on its position.

The three registers are treated as unsigned without regard to how they are declared. The T flag and right operand are subtracted from the left, and the 36-bit difference is stored in the destination. Flag Z will be set if the 36-bit difference is zero and no borrow is generated. Flags N and T are set if a borrow is generated, and cleared otherwise. Flag R does not change.


Marc W. Abel
Computer Science and Engineering
College of Engineering and Computer Science
marc.abel@wright.edu
Without secure hardware, there is no secure software.
937-775-3016