Added tests for stdlib math functions.
[vvhitespace] / stdlib / math.pvvs
index 7bd73e5..3876c6e 100644 (file)
@@ -46,6 +46,17 @@ NTN                     | RTS
 @   abs(signed number)  <-- TOS
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTSSSTN              | Mark: 10001 (absolute value)
 @   abs(signed number)  <-- TOS
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTSSSTN              | Mark: 10001 (absolute value)
+
+@ Catch -(2^63) as a special case since its absolute value will overflow
+@ a twos-complement 64-bit word. Return zero as though the absolute value
+@ overflowed to the bottom of the non-negative integers rather than
+@ overflowing back to the most negative integer.
+SNS                     | DUP
+SSTTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSN | -(2^63)
+TSST                    | SUBTRACT
+NTSSSSTSSSTSSSSSSTSN    | BRZ > 00010001 00000010
+
+@ Handle all the other numbers.
 SNS                     | DUP
 NTTSSSTSSSTSSSSSSSSN    | BMI > 00010001 00000000
 NSNSSSTSSSTSSSSSSSTN    | JMP > 00010001 00000001
 SNS                     | DUP
 NTTSSSTSSSTSSSSSSSSN    | BMI > 00010001 00000000
 NSNSSSTSSSTSSSSSSSTN    | JMP > 00010001 00000001
@@ -55,22 +66,10 @@ TSSN                    | MULTIPLY
 NSSVSSSTSSSTSSSSSSSTN   | Mark: 00010001 00000001
 NTN                     | RTS
 
 NSSVSSSTSSSTSSSSSSSTN   | Mark: 00010001 00000001
 NTN                     | RTS
 
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@ Name:
-@   isnegative (1000001)
-@ Description:
-@   Returns 1 if 'number' is negative, 0 if positive.
-@ Call Stack:
-@   number  <-- TOS
-@ Return Stack:
-@   1 or 0  <-- TOS
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-NSSVTSSSSSTN            | Mark: 1000001 (isnegative)
-NTTSTSSSSSTSSSSSSSSN    | BMI > 01000001 00000000
+@ Special case: Push 0 and return.
+NSSVSSSTSSSTSSSSSSTSN   | Mark: 00010001 00000010
+SNN                     | DROP
 SSSSN                   | PUSH 0
 NTN                     | RTS
 SSSSN                   | PUSH 0
 NTN                     | RTS
-NSSVSTSSSSSTSSSSSSSSN   | Mark: 01000001 00000000
-SSSTN                   | PUSH 1
-NTN                     | RTS
 
 #endif
 
 #endif