diff --git a/src/xpu_basetype.cu b/src/xpu_basetype.cu index 05590e91e..80921871d 100644 --- a/src/xpu_basetype.cu +++ b/src/xpu_basetype.cu @@ -152,7 +152,7 @@ PGSTROM_SQLTYPE_OPERATORS(bool,true,1,sizeof(bool)); xpu_##NAME##_t *result = (xpu_##NAME##_t *)__result; \ \ result->expr_ops = &xpu_##NAME##_ops; \ - result->value = *((const BASETYPE *)addr); \ + __FetchStore(result->value, (const BASETYPE *)addr); \ return true; \ } \ STATIC_FUNCTION(bool) \ diff --git a/src/xpu_common.h b/src/xpu_common.h index 4a8c7eb1e..ec33cd0a9 100644 --- a/src/xpu_common.h +++ b/src/xpu_common.h @@ -193,18 +193,37 @@ __runtime_file_name(const char *path) #define __FILE_NAME__ __runtime_file_name(__FILE__) #endif -#ifdef __CUDACC__ +#ifdef __cplusplus template INLINE_FUNCTION(T) __Fetch(const T *ptr) { T temp; + if ((sizeof(T) & (sizeof(T)-1)) == 0 && + (((uintptr_t)ptr) & (sizeof(T)-1)) == 0) + { + return *ptr; + } memcpy(&temp, ptr, sizeof(T)); - return temp; } +template +INLINE_FUNCTION(void) +__FetchStore(T &dest, const T *ptr) +{ + if ((sizeof(T) & (sizeof(T)-1)) == 0 && + (((uintptr_t)ptr) & (sizeof(T)-1)) == 0) + { + dest = *ptr; + } + else + { + memcpy(&dest, ptr, sizeof(T)); + } +} + template INLINE_FUNCTION(T) __volatileRead(const volatile T *ptr) @@ -212,8 +231,9 @@ __volatileRead(const volatile T *ptr) return *ptr; } -#else +#else /* __cplusplus */ #define __Fetch(PTR) (*(PTR)) +#define __FetchStore(DEST,PTR) do { (DEST) = *(PTR); } while(0) #define __volatileRead(PTR) (*(PTR)) #endif diff --git a/src/xpu_misclib.cu b/src/xpu_misclib.cu index d0c7409e0..3b17afc22 100644 --- a/src/xpu_misclib.cu +++ b/src/xpu_misclib.cu @@ -536,7 +536,7 @@ xpu_money_datum_heap_read(kern_context *kcxt, xpu_money_t *result = (xpu_money_t *)__result; result->expr_ops = &xpu_money_ops; - result->value = *((Cash *)addr); + __FetchStore(result->value, (Cash *)addr); return true; } diff --git a/src/xpu_timelib.cu b/src/xpu_timelib.cu index 2d9dff705..285ac37d4 100644 --- a/src/xpu_timelib.cu +++ b/src/xpu_timelib.cu @@ -68,7 +68,7 @@ xpu_date_datum_heap_read(kern_context *kcxt, xpu_date_t *result = (xpu_date_t *)__result; result->expr_ops = &xpu_date_ops; - result->value = *((const DateADT *)addr); + __FetchStore(result->value, (const DateADT *)addr); return true; } @@ -224,7 +224,7 @@ xpu_time_datum_heap_read(kern_context *kcxt, xpu_time_t *result = (xpu_time_t *)__result; result->expr_ops = &xpu_time_ops; - result->value = *((const TimeADT *)addr); + __FetchStore(result->value, (const TimeADT *)addr); return true; } @@ -517,7 +517,7 @@ xpu_timestamp_datum_heap_read(kern_context *kcxt, xpu_timestamp_t *result = (xpu_timestamp_t *)__result; result->expr_ops = &xpu_timestamp_ops; - result->value = *((int64_t *)addr); + __FetchStore(result->value, (int64_t *)addr); return true; } @@ -697,7 +697,7 @@ xpu_timestamptz_datum_heap_read(kern_context *kcxt, xpu_timestamptz_t *result = (xpu_timestamptz_t *)__result; result->expr_ops = &xpu_timestamptz_ops; - result->value = *((const TimestampTz *)addr); + __FetchStore(result->value, (const TimestampTz *)addr); return true; }