Added support for "long double".
authorIsaac Dooley <idooley2@illinois.edu>
Sat, 3 Mar 2007 03:25:28 +0000 (03:25 +0000)
committerIsaac Dooley <idooley2@illinois.edu>
Sat, 3 Mar 2007 03:25:28 +0000 (03:25 +0000)
src/libs/ck-libs/idxl/idxl_layout.C
src/libs/ck-libs/idxl/idxlc.h

index 343699c021dc87dd5ef6e42588e67dffba52ef96..af1d8b08722f9c3a6a2b8dd61430e32f6292a4fe 100644 (file)
@@ -19,6 +19,7 @@ int IDXL_Layout::type_size(int dataType,const char *callingRoutine)
       case IDXL_INT : return sizeof(int);
       case IDXL_REAL : return sizeof(float);
       case IDXL_DOUBLE : return sizeof(double);
+      case IDXL_LONG_DOUBLE : return sizeof(long double); 
       case IDXL_INDEX_0 : return sizeof(int);
       case IDXL_INDEX_1 : return sizeof(int);
       default: IDXL_Abort(callingRoutine,"Expected an IDXL data type, but got %d",dataType);
@@ -33,6 +34,7 @@ const char *IDXL_Layout::type_name(int dataType,const char *callingRoutine)
       case IDXL_INT : return "IDXL_INT";
       case IDXL_REAL : return "IDXL_REAL";
       case IDXL_DOUBLE : return "IDXL_DOUBLE";
+      case IDXL_LONG_DOUBLE : return "IDXL_LONG_DOUBLE";
       case IDXL_INDEX_0 : return "IDXL_INDEX_0";
       case IDXL_INDEX_1 : return "IDXL_INDEX_1";
       default: break;
@@ -82,7 +84,8 @@ void gatherName(T *dest,const byte *src,const IDXL_Layout *srcLayout) { \
 template void gatherName(byte *dest,const byte *src,const IDXL_Layout *srcLayout); \
 template void gatherName(int *dest,const byte *src,const IDXL_Layout *srcLayout); \
 template void gatherName(float *dest,const byte *src,const IDXL_Layout *srcLayout); \
-template void gatherName(double *dest,const byte *src,const IDXL_Layout *srcLayout);
+template void gatherName(double *dest,const byte *src,const IDXL_Layout *srcLayout); \
+template void gatherName(long double *dest,const byte *src,const IDXL_Layout *srcLayout);
 
 oneToFn(sumOne,sumFn)
 oneToFn(prodOne,prodFn)
@@ -93,6 +96,8 @@ typedef void (*byteCombineFn)(byte *dest,const byte *src,const IDXL_Layout *srcL
 typedef void (*intCombineFn)(int *dest,const byte *src,const IDXL_Layout *srcLayout);
 typedef void (*floatCombineFn)(float *dest,const byte *src,const IDXL_Layout *srcLayout);
 typedef void (*doubleCombineFn)(double *dest,const byte *src,const IDXL_Layout *srcLayout);
+typedef void (*longDoubleCombineFn)(long double *dest,const byte *src,const IDXL_Layout *srcLayout);
+
 
 template<class T>
 inline void assignFn(int len,T *dest,T val) {
@@ -109,7 +114,8 @@ void reduction_initialize(const IDXL_Layout& dt, void *lhs, int op,const char *c
         case IDXL_INT : assignFn(dt.width,(int*)lhs, 0); break;
         case IDXL_REAL : assignFn(dt.width,(float*)lhs, (float)0.0); break;
         case IDXL_DOUBLE : assignFn(dt.width,(double*)lhs, 0.0); break;
-        default: IDXL_Abort(callingRoutine,"Invalid IDXL data type %d",dt.type);
+           case IDXL_LONG_DOUBLE : assignFn(dt.width,(long double*)lhs, 0.0L); break;
+           default: IDXL_Abort(callingRoutine,"Invalid IDXL data type %d",dt.type);
       }
       break;
     case IDXL_PROD:
@@ -118,6 +124,7 @@ void reduction_initialize(const IDXL_Layout& dt, void *lhs, int op,const char *c
         case IDXL_INT : assignFn(dt.width,(int*)lhs, 1); break;
         case IDXL_REAL : assignFn(dt.width,(float*)lhs, (float)1.0); break;
         case IDXL_DOUBLE : assignFn(dt.width,(double*)lhs, 1.0); break;
+        case IDXL_LONG_DOUBLE : assignFn(dt.width,(long double*)lhs, 1.0L); break;
       }
       break;
     case IDXL_MAX:
@@ -126,6 +133,7 @@ void reduction_initialize(const IDXL_Layout& dt, void *lhs, int op,const char *c
         case IDXL_INT : assignFn(dt.width,(int*)lhs, INT_MIN); break;
         case IDXL_REAL : assignFn(dt.width,(float*)lhs, (float)FLT_MIN); break;
         case IDXL_DOUBLE : assignFn(dt.width,(double*)lhs, DBL_MIN); break;
+        case IDXL_LONG_DOUBLE : assignFn(dt.width,(long double*)lhs, LDBL_MIN); break;
       }
       break;
     case IDXL_MIN:
@@ -134,6 +142,7 @@ void reduction_initialize(const IDXL_Layout& dt, void *lhs, int op,const char *c
         case IDXL_INT : assignFn(dt.width,(int*)lhs, INT_MAX); break;
         case IDXL_REAL : assignFn(dt.width,(float*)lhs, FLT_MAX); break;
         case IDXL_DOUBLE : assignFn(dt.width,(double*)lhs, DBL_MAX); break;
+        case IDXL_LONG_DOUBLE : assignFn(dt.width,(long double*)lhs, LDBL_MAX); break;
       }
       break;
     default: IDXL_Abort(callingRoutine,"Expected an IDXL reduction type, but got %d",op);
@@ -148,7 +157,8 @@ void reduction_initialize(const IDXL_Layout& dt, void *lhs, int op,const char *c
         case IDXL_INT : return (reduction_combine_fn)(intCombineFn)fn;\
         case IDXL_REAL : return (reduction_combine_fn)(floatCombineFn)fn;\
         case IDXL_DOUBLE : return (reduction_combine_fn)(doubleCombineFn)fn;\
-      }
+        case IDXL_LONG_DOUBLE : return (reduction_combine_fn)(longDoubleCombineFn)fn;\
+         }
 
 reduction_combine_fn reduction_combine(const IDXL_Layout& dt, int op,const char *callingRoutine)
 {
@@ -171,6 +181,7 @@ reduction_combine_fn reduction_combine(const IDXL_Layout& dt, int op,const char
         case IDXL_INT : fn args(int); break; \
         case IDXL_REAL : fn args(float); break; \
         case IDXL_DOUBLE : fn args(double); break; \
+        case IDXL_LONG_DOUBLE : fn args(long double); break; \
       }
 
 // Even more bizarre macro: pass typecast arguments for typical scatter/gather 
index 0a3bc2e2f415dd9af1686c21c51e8f9383df2615..4bc0663ad023b4090e3bde5f4e00dedb1e14fa5c 100644 (file)
@@ -80,7 +80,7 @@ int IDXL_Get_source(IDXL_t l,int localNo);
 #define IDXL_DOUBLE (IDXL_FIRST_DATATYPE+3)
 #define IDXL_INDEX_0 (IDXL_FIRST_DATATYPE+4) /*zero-based integer (c-style indexing) */
 #define IDXL_INDEX_1 (IDXL_FIRST_DATATYPE+5) /*one-based integer (Fortran-style indexing) */
-
+#define IDXL_LONG_DOUBLE (IDXL_FIRST_DATATYPE+6)
 
 /** An IDXL_Layout_t describes the in-memory layout of a user data array */
 typedef int IDXL_Layout_t;