31 typedef unsigned long long int Uint64;
41 #pragma global noalias 44 #pragma cdir options -pvctl,nodep 47 #if defined(VPP) || defined(NECSX) 59 typedef long long int ll_t;
61 #define ALLOC(x,size) \ 62 { ll_t bytes = (ll_t)sizeof(*x) * (size); \ 63 bytes = (bytes < 1) ? 1 : bytes; \ 64 x = THEmalloc(bytes); \ 65 if (!x) { fprintf(stderr, \ 66 "malloc() of %s (%lld bytes) failed in file=%s, line=%d\n", \ 67 #x, bytes, __FILE__, __LINE__); RAISE(SIGABRT); } } 69 #define FREE(x) if (x) { THEfree(x); x = NULL; } 71 #define BITSUM(x) bitsum[x] += ((item >> x) & 1ull) 73 #define SIGNBIT64 0x8000000000000000ull 74 #define MASKALL64 0xFFFFFFFFFFFFFFFFull 75 #define ZEROALL64 0x0000000000000000ull 77 #define CVMGM(a,b,c) ( ((c) & SIGNBIT64) ? (a) : (b) ) 85 const int *Start_addr,
96 int index_adj = *Index_adj;
97 int addr = (*Start_addr) - 1;
101 Uchar alloc_data = 0;
106 if (method != SORT_R64 &&
107 method != SORT_I64 &&
108 method != SORT_U64 ) {
125 for (i=0; i<
n; i++) index[i] = i + index_adj;
131 alloc_data = ((inc > 1) || (method == SORT_R64));
132 if (alloc_data) ALLOC(data, n);
134 if (method == SORT_R64) {
135 for (i=0; i<
n; i++) {
136 Uint64 mask = CVMGM(MASKALL64, SIGNBIT64, Data[j]);
137 data[
i] = Data[j] ^
mask;
141 else if (method == SORT_I64) {
143 for (i=0; i<
n; i++) {
144 data[
i] ^= SIGNBIT64;
148 for (i=0; i<
n; i++) {
149 data[
i] = Data[j] ^ SIGNBIT64;
156 for (i=0; i<
n; i++) {
164 for (j=0; j<N64BITS; j++) bitsum[j] = 0;
166 for (i=0; i<
n; i++) {
169 BITSUM(0) ; BITSUM(1) ; BITSUM(2) ; BITSUM(3) ;
170 BITSUM(4) ; BITSUM(5) ; BITSUM(6) ; BITSUM(7) ;
171 BITSUM(8) ; BITSUM(9) ; BITSUM(10); BITSUM(11);
172 BITSUM(12); BITSUM(13); BITSUM(14); BITSUM(15);
173 BITSUM(16); BITSUM(17); BITSUM(18); BITSUM(19);
174 BITSUM(20); BITSUM(21); BITSUM(22); BITSUM(23);
175 BITSUM(24); BITSUM(25); BITSUM(26); BITSUM(27);
176 BITSUM(28); BITSUM(29); BITSUM(30); BITSUM(31);
177 BITSUM(32); BITSUM(33); BITSUM(34); BITSUM(35);
178 BITSUM(36); BITSUM(37); BITSUM(38); BITSUM(39);
179 BITSUM(40); BITSUM(41); BITSUM(42); BITSUM(43);
180 BITSUM(44); BITSUM(45); BITSUM(46); BITSUM(47);
181 BITSUM(48); BITSUM(49); BITSUM(50); BITSUM(51);
182 BITSUM(52); BITSUM(53); BITSUM(54); BITSUM(55);
183 BITSUM(56); BITSUM(57); BITSUM(58); BITSUM(59);
184 BITSUM(60); BITSUM(61); BITSUM(62); BITSUM(63);
190 for (j=0; j<N64BITS; j++) {
192 if (sum > 0 && sum < n) {
210 if ( (data[i1[i]-index_adj] & mask) == 0 ) i2[k++] = i1[i];
213 if ( (data[i1[i]-index_adj] & mask) ==
mask ) i2[k++] = i1[i];
217 int k1 = 0, k2 = n-
sum;
218 for (i=0; i<
n; i++) {
220 i2[value == 0 ? k1++ : k2++] = i1[
i];
222 if (k1 + sum != n || k2 != n) {
224 "***Programming error in rsort64_(): k1 + sum != n || k2 != n; k1=%d,k2=%d,sum=%d,n=%d\n",
234 if (copytmp)
for (i=0; i<
n; i++) index[i] = tmp[i];
238 if (!alloc_data && xorit && inc == 1) {
240 for (i=0; i<
n; i++) data[i] ^= SIGNBIT64;
243 if (alloc_data) FREE(data);
void rsort64_(const int *Mode, const int *N, const int *Inc, const int *Start_addr, Uint64 Data[], int index[], const int *Index_adj, int *retc)
unsigned long long int Uint64
intent(out) overrides sub arrays one Sort by the least significant key first sum(iindex(1:n))
unsigned long long int Uint64