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