SIONlib  1.6.1
Scalable I/O library for parallel access to task-local files
sion_convert.c
Go to the documentation of this file.
1 /****************************************************************************
2 ** SIONLIB http://www.fz-juelich.de/jsc/sionlib **
3 *****************************************************************************
4 ** Copyright (c) 2008-2015 **
5 ** Forschungszentrum Juelich, Juelich Supercomputing Centre **
6 ** **
7 ** See the file COPYRIGHT in the package base directory for details **
8 ****************************************************************************/
9 
19 #include <stdlib.h>
20 #include <stdio.h>
21 #include <string.h>
22 #include <stdarg.h>
23 #include <assert.h>
24 
25 #include "sion.h"
26 #include "sion_debug.h"
27 
28 
36 void sion_swap(void *target, void *source, int size, int n, int aflag)
37 {
38  int i, j;
39  char tmp, *iptr, *optr;
40 
41  optr = target;
42  iptr = source;
43 
44  if (iptr == optr) {
45  if (!aflag)
46  return;
47  /*
48  * in-place swapping
49  * unroll loop for the common cases 2,4,8 Byte
50  *
51  */
52  DPRINTF((4, "vtools_swap: swapping %d x %d Bytes in place =%ld\n", n, size, (sion_int32) *iptr));
53 
54  switch (size) {
55  case 1:
56  /* nothing to do */
57  break;
58  case 2:
59  for (i = 0; i < n; i++) {
60  tmp = iptr[0];
61  iptr[0] = iptr[1];
62  iptr[1] = tmp;
63  iptr += 2;
64  }
65  break;
66  case 4:
67  for (i = 0; i < n; i++) {
68  tmp = iptr[0];
69  iptr[0] = iptr[3];
70  iptr[3] = tmp;
71 
72  tmp = iptr[1];
73  iptr[1] = iptr[2];
74  iptr[2] = tmp;
75 
76  iptr += 4;
77  }
78  break;
79  case 8:
80  for (i = 0; i < n; i++) {
81  tmp = iptr[0];
82  iptr[0] = iptr[7];
83  iptr[7] = tmp;
84 
85  tmp = iptr[1];
86  iptr[1] = iptr[6];
87  iptr[6] = tmp;
88 
89  tmp = iptr[2];
90  iptr[2] = iptr[5];
91  iptr[5] = tmp;
92 
93  tmp = iptr[3];
94  iptr[3] = iptr[4];
95  iptr[4] = tmp;
96 
97  iptr += 8;
98  }
99  break;
100  default:
101  for (i = 0; i < n; i++) {
102  for (j = 0; j < size / 2; j++) {
103  tmp = iptr[j];
104  iptr[j] = iptr[size - j - 1];
105  iptr[size - j - 1] = tmp;
106  }
107  iptr += size;
108  }
109  }
110  DPRINTF((4, "vtools_swap: swapped %d x %d Bytes in place =%ld\n", n, size, *optr));
111 
112  }
113  else {
114  if (aflag) {
115  memcpy(optr, iptr, size * n);
116  return;
117  }
118  /*
119  * swap into a different non-overlapping buffer
120  * unroll common cases again
121  */
122  DPRINTF((4, "vtools_swap: swapping %d x %d Bytes\n", n, size));
123 
124  switch (size) {
125  case 1:
126  memcpy(optr, iptr, size * n);
127  break;
128  case 2:
129  for (i = 0; i < n; i++) {
130  optr[0] = iptr[1];
131  optr[1] = iptr[0];
132 
133  iptr += 2;
134  optr += 2;
135  }
136  break;
137  case 4:
138  for (i = 0; i < n; i++) {
139  optr[0] = iptr[3];
140  optr[1] = iptr[2];
141  optr[2] = iptr[1];
142  optr[3] = iptr[0];
143 
144  iptr += 4;
145  optr += 4;
146  }
147  break;
148  case 8:
149  for (i = 0; i < n; i++) {
150  optr[0] = iptr[7];
151  optr[1] = iptr[6];
152  optr[2] = iptr[5];
153  optr[3] = iptr[4];
154  optr[4] = iptr[3];
155  optr[5] = iptr[2];
156  optr[6] = iptr[1];
157  optr[7] = iptr[0];
158 
159  iptr += 8;
160  optr += 8;
161  }
162  break;
163  default:
164  for (i = 0; i < n; i++) {
165  for (j = 0; j < size; j++) {
166  optr[j] = iptr[size - j - 1];
167  }
168  iptr += size;
169  optr += size;
170  }
171  }
172  }
173 }
void sion_swap(void *target, void *source, int size, int n, int aflag)
Definition: sion_convert.c:36