Topics: Wrap-around (modulo) arithmetic - Checked arithmetic and Removed support for Clang 4.0

New arithmetic instructions have been implemented for Viua. They should mostly work, but need further testing. However, the instructions implemented so far are not even a half of what is needed to fully support wrap-around, checked, and saturating arithmetic modes.

Wrap-around (modulo) arithmetic

Wrap-around arithmetic has been fully implemented for both signed and unsigned integers. Viua now provides wrapadd, wrapmul, and wrapdiv instructions.

The new instructions are tested for 8 bit integers, but should work for any other bit width (the algorithms are the same no matter what bit width is used for the integers).

Checked arithmetic

Viua now provides checked versions of addition, multiplication, and division for signed integers. There is no implementation yet for unsigned numbers, and division needs more testing.

Removed support for Clang 4.0

Compilation with Clang 4.0 was problematic. The version of libstdc++ that Clang 4 could understand it didn't include the headers (e.g. <optional>) required to compile Viua. But when the libstdc++ was updated - Clang 4 would no longer be able to compile the standard library, since it was missing support for class template argument deduction (I think).

This resulted in the support for compilation with Clang 4 being simply pulled, and the Clang 4.0 entry removed from CI build matrix.

This does not mean that Clang cannot be used to compile Viua at all. Clang 5 is a fine compiler and is able to understand all of Viua source code, and all the new C++ features used in newer libstdc++ versions. Viua is not guaranteed to compile under Clang 4 and below, but with Clang 5 and above you should not encounter any problems.