Tom Stellard d768ac0395 Add __CLC_ prefix to all macro definitions in headers
libclc was defining and undefing GENTYPE and several other macros with
common names in its header files.  This was preventing applications from
defining macros with identical names as command line arguments to the
compiler, because the definitions in the header files were masking the
macros defined as compiler arguements.

Reviewed-by: Aaron Watry <awatry@gmail.com>
llvm-svn: 185838
2013-07-08 17:27:02 +00:00

43 lines
1.6 KiB
C++

/**
* Not necessarily optimal... but it produces correct results (at least for int)
* If we're lucky, LLVM will recognize the pattern and produce rotate
* instructions:
* http://llvm.1065342.n5.nabble.com/rotate-td47679.html
*
* Eventually, someone should feel free to implement an llvm-specific version
*/
_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE rotate(__CLC_GENTYPE x, __CLC_GENTYPE n){
//Try to avoid extra work if someone's spinning the value through multiple
//full rotations
n = n % (__CLC_GENTYPE)__CLC_GENSIZE;
#ifdef __CLC_SCALAR
if (n > 0){
return (x << n) | (((__CLC_U_GENTYPE)x) >> (__CLC_GENSIZE - n));
} else if (n == 0){
return x;
} else {
return ( (((__CLC_U_GENTYPE)x) >> -n) | (x << (__CLC_GENSIZE + n)) );
}
#else
//XXX: There's a lot of __builtin_astype calls to cast everything to
// unsigned ... This should be improved so that if __CLC_GENTYPE==__CLC_U_GENTYPE, no
// casts are required.
__CLC_U_GENTYPE x_1 = __builtin_astype(x, __CLC_U_GENTYPE);
//XXX: Is (__CLC_U_GENTYPE >> S__CLC_GENTYPE) | (__CLC_U_GENTYPE << S__CLC_GENTYPE) legal?
// If so, then combine the amt and shifts into a single set of statements
__CLC_U_GENTYPE amt;
amt = (n < (__CLC_GENTYPE)0 ? __builtin_astype((__CLC_GENTYPE)0-n, __CLC_U_GENTYPE) : (__CLC_U_GENTYPE)0);
x_1 = (x_1 >> amt) | (x_1 << ((__CLC_U_GENTYPE)__CLC_GENSIZE - amt));
amt = (n < (__CLC_GENTYPE)0 ? (__CLC_U_GENTYPE)0 : __builtin_astype(n, __CLC_U_GENTYPE));
x_1 = (x_1 << amt) | (x_1 >> ((__CLC_U_GENTYPE)__CLC_GENSIZE - amt));
return __builtin_astype(x_1, __CLC_GENTYPE);
#endif
}