Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #pragma ident "@(#) libf/fio/setstride.c 92.2 06/21/99 10:37:55"
00039
00040 #include <fortran.h>
00041 #include <memory.h>
00042 #include <cray/nassert.h>
00043 #include <cray/portdefs.h>
00044 #if defined(__mips) || defined(_LITTLE_ENDIAN)
00045 struct eightby { int w[2]; };
00046 struct sixteenby { int w[4]; };
00047 struct thirtytwoby { int w[8]; };
00048 #else
00049 struct biword { long w[2]; };
00050
00051 struct quadword { long w[4]; };
00052 #endif
00053 #define BYTE unsigned char
00054
00055 #if defined(__mips) || defined(_LITTLE_ENDIAN)
00056 #define EIGHTBWORD struct eightby
00057 #define DOUBLEWORD struct sixteenby
00058 #define QUADWORD struct thirtytwoby
00059 #else
00060 #define WORD int64
00061 #ifdef _CRAYMPP
00062 #define DOUBLEWORD struct biword
00063 #elif !defined(_WORD32)
00064 #define DOUBLEWORD long double
00065 #else
00066 #define DOUBLEWORD long long
00067 #endif
00068
00069 #define QUADWORD struct quadword
00070 #endif
00071
00072 #define XFER_CASE(TYPE) \
00073 { \
00074 register TYPE datum; \
00075 TYPE *data; \
00076 datum = *(TYPE *)src; \
00077 data = (TYPE *)dest; \
00078 for (i = 0; i < count; i++) \
00079 data[i*inc] = datum; \
00080 } \
00081
00082
00083
00084
00085
00086
00087
00088
00089 void
00090 _set_stride(
00091 void *dest,
00092 void *src,
00093 long count,
00094 int elsize,
00095 long stride)
00096 {
00097 register int i;
00098 register long inc;
00099
00100
00101
00102 assert (dest != NULL);
00103 assert (src != NULL);
00104 assert (count > 0);
00105 assert (elsize > 0);
00106
00107 inc = stride / elsize;
00108
00109 switch (elsize) {
00110
00111 case 1:
00112 XFER_CASE(BYTE)
00113 break;
00114
00115 #ifdef _F_INT2
00116 case 2:
00117 XFER_CASE(short)
00118 break;
00119 #endif
00120
00121 #ifdef _F_INT4
00122 case 4:
00123 XFER_CASE(_f_int4)
00124 break;
00125 #endif
00126
00127 case 8:
00128 #if defined(__mips) || defined(_LITTLE_ENDIAN)
00129 XFER_CASE(EIGHTBWORD)
00130 #else
00131 XFER_CASE(_f_int8)
00132 #endif
00133 break;
00134
00135 case 16:
00136 XFER_CASE(DOUBLEWORD)
00137 break;
00138
00139 case 32:
00140 XFER_CASE(QUADWORD)
00141 break;
00142
00143 default:
00144 for (i = 0; i < count; i++)
00145 (void) memcpy((char *)dest + i*inc, src, elsize);
00146 }
00147
00148 return;
00149 }