Skip to main content

DIVIDE

Divide the left operand by the right operand to calculate a quotient and optional remainder.

OpcodeBytesCyclesFormExample
$A5329DIVIDE I:_, {S_BYTE}DIVIDE I:4, 123
$A7329DIVIDE I:_, I:_DIVIDE I:4, I:8
$DC429DIVIDE I:_, {S_BYTE}, REMAINDER I:_DIVIDE I:4, 123, REMAINDER I:8
$DE429DIVIDE I:_, I:_, REMAINDER I:_DIVIDE I:4, I:8, REMAINDER I:12
Condition flagOutput
zero (ZF)If the quotient is zero, this flag is 1; otherwise it is 0.
negative (NF)If the signed quotient is a negative number, this flag is 1; otherwise it is 0.
overflow (OF)If the divisor is zero, this flag is 1; otherwise it is 0.
carry (CF)This flag is always 0.

Notes

  • Terminology: If we write A / B = Q, A is called the dividend, B is the divisor, and Q is the quotient. If the division is not exact, the remainder will be nonzero.

  • For example, DIVIDE I:4, I:8, REMAINDER I:12 divides I:4 (the dividend) by I:8 (the divisor), storing the quotient back into I:4. The remainder is stored in I:12.

  • The remainder's register will always be assigned after the quotient's register. This allows a modulus expression such as X <- X %% 123 to be compiled as DIVIDE I:4, 123, REMAINDER I:4 without need for a temporary register to discard the quotient.

  • If the divisor is zero, the quotient and remainder will always be zero.

  • To trap division-by-zero, you can use the FAIL IF OVERFLOW instruction.

Euclidean division

For historical reasons, most CPUs and programming languages such as C and Rust implement truncated division, where the remainder can be a negative number if the dividend is negative. Chombit's DIVIDE instruction performs truncated division by default. The Hybrix language's / and % operators are implemented this way.

Euclidean division ensures that the remainder is always a positive number. It is the most mathematically correct way to divide. This method is selected if an WITH EUCLID instruction immediately precedes the DIVIDE instruction. The Hybrix language's // and %% operators are implemented this way.

The table below illustrates the differences:

Truncated quotientTruncated remainder
17 / 5 = 317 % 5 = 2
-17 / 5 = -3-17 % 5 = -2
17 / -5 = -317 % -5 = 2
-17 / -5 = 3-17 % -5 = -2
Euclidean quotientEuclidean remainder
17 // 5 = 317 %% 5 = 2
-17 // 5 = -4-17 %% 5 = 3
17 // -5 = -317 %% -5 = 2
-17 // -5 = 4-17 %% -5 = 3