SIMD, fmath, compiler directives

A grab bag of changes to OIIO headers, for some in-progress performance stuff I'm working on over in OSL land:

* Continued work on simd.h: more functionality (including abs, min, max, ceil, floor, floori, xor, shift left and right, transpose, unary minus, conversion, bitcasts), some special cases for SSE 3 and 4.x, some minor corrections and fixes (including bugs in int reduce_add and int4(float4)), more unit tests.

* Minor changes to bilerp and trilerp templates in fmath.h: change some (TYPE)val to TYPE(val), which is to get those templates working correctly for certain classes that have constructors but no obvious way to do casting. (Dual2<>, if you must know.)

* Additions to platform.h establishing macros that letting you declare functions as "pure" or "constant", not throwing exceptions, or that a function or variable is potentially unused (and should not warn). I'm still experimenting to understand under which conditions it's good to use these, but at least putting them in this central place makes it easy.





I think I see what's going on. I have been consulting various packages to double check my methods. I think I chose to make my cast-to-int to truncation, just like C would, but perhaps one of the packages uses rounding instead, and therefore their "floor" implementation for SSE <= 3 depended on that.