12
12
13
13
#include < string.h>
14
14
#include < limits.h>
15
- #include < utility>
16
15
17
16
#define BUFFER_ID 0xB0E4
18
17
49
48
THROW_AND_RETURN_IF_OOB (end <= end_max); \
50
49
size_t length = end - start;
51
50
52
- #if defined(__GNUC__) || defined(__clang__)
53
- #define BSWAP_INTRINSIC_2 (x ) __builtin_bswap16(x)
54
- #define BSWAP_INTRINSIC_4 (x ) __builtin_bswap32(x)
55
- #define BSWAP_INTRINSIC_8 (x ) __builtin_bswap64(x)
56
- #elif defined(__linux__)
57
- #include < byteswap.h>
58
- #define BSWAP_INTRINSIC_2 (x ) bswap_16(x)
59
- #define BSWAP_INTRINSIC_4 (x ) bswap_32(x)
60
- #define BSWAP_INTRINSIC_8 (x ) bswap_64(x)
61
- #elif defined(_MSC_VER)
62
- #include < intrin.h>
63
- #define BSWAP_INTRINSIC_2 (x ) _byteswap_ushort(x);
64
- #define BSWAP_INTRINSIC_4 (x ) _byteswap_ulong(x);
65
- #define BSWAP_INTRINSIC_8 (x ) _byteswap_uint64(x);
66
- #else
67
- #define BSWAP_INTRINSIC_2 (x ) ((x) << 8 ) | ((x) >> 8 )
68
- #define BSWAP_INTRINSIC_4 (x ) \
69
- (((x) & 0xFF ) << 24 ) | \
70
- (((x) & 0xFF00 ) << 8 ) | \
71
- (((x) >> 8 ) & 0xFF00 ) | \
72
- (((x) >> 24 ) & 0xFF )
73
- #define BSWAP_INTRINSIC_8 (x ) \
74
- (((x) & 0xFF00000000000000ull ) >> 56 ) | \
75
- (((x) & 0x00FF000000000000ull ) >> 40 ) | \
76
- (((x) & 0x0000FF0000000000ull ) >> 24 ) | \
77
- (((x) & 0x000000FF00000000ull ) >> 8 ) | \
78
- (((x) & 0x00000000FF000000ull ) << 8 ) | \
79
- (((x) & 0x0000000000FF0000ull ) << 24 ) | \
80
- (((x) & 0x000000000000FF00ull ) << 40 ) | \
81
- (((x) & 0x00000000000000FFull ) << 56 )
82
- #endif
83
-
84
51
namespace node {
85
52
86
53
// if true, all Buffer and SlowBuffer instances will automatically zero-fill
@@ -1204,23 +1171,7 @@ void Swap16(const FunctionCallbackInfo<Value>& args) {
1204
1171
Environment* env = Environment::GetCurrent (args);
1205
1172
THROW_AND_RETURN_UNLESS_BUFFER (env, args[0 ]);
1206
1173
SPREAD_ARG (args[0 ], ts_obj);
1207
-
1208
- CHECK_EQ (ts_obj_length % 2 , 0 );
1209
-
1210
- int align = reinterpret_cast <uintptr_t >(ts_obj_data) % sizeof (uint16_t );
1211
-
1212
- if (align == 0 ) {
1213
- uint16_t * data16 = reinterpret_cast <uint16_t *>(ts_obj_data);
1214
- size_t len16 = ts_obj_length / 2 ;
1215
- for (size_t i = 0 ; i < len16; i++) {
1216
- data16[i] = BSWAP_INTRINSIC_2 (data16[i]);
1217
- }
1218
- } else {
1219
- for (size_t i = 0 ; i < ts_obj_length; i += 2 ) {
1220
- std::swap (ts_obj_data[i], ts_obj_data[i + 1 ]);
1221
- }
1222
- }
1223
-
1174
+ SwapBytes16 (ts_obj_data, ts_obj_length);
1224
1175
args.GetReturnValue ().Set (args[0 ]);
1225
1176
}
1226
1177
@@ -1229,24 +1180,7 @@ void Swap32(const FunctionCallbackInfo<Value>& args) {
1229
1180
Environment* env = Environment::GetCurrent (args);
1230
1181
THROW_AND_RETURN_UNLESS_BUFFER (env, args[0 ]);
1231
1182
SPREAD_ARG (args[0 ], ts_obj);
1232
-
1233
- CHECK_EQ (ts_obj_length % 4 , 0 );
1234
-
1235
- int align = reinterpret_cast <uintptr_t >(ts_obj_data) % sizeof (uint32_t );
1236
-
1237
- if (align == 0 ) {
1238
- uint32_t * data32 = reinterpret_cast <uint32_t *>(ts_obj_data);
1239
- size_t len32 = ts_obj_length / 4 ;
1240
- for (size_t i = 0 ; i < len32; i++) {
1241
- data32[i] = BSWAP_INTRINSIC_4 (data32[i]);
1242
- }
1243
- } else {
1244
- for (size_t i = 0 ; i < ts_obj_length; i += 4 ) {
1245
- std::swap (ts_obj_data[i], ts_obj_data[i + 3 ]);
1246
- std::swap (ts_obj_data[i + 1 ], ts_obj_data[i + 2 ]);
1247
- }
1248
- }
1249
-
1183
+ SwapBytes32 (ts_obj_data, ts_obj_length);
1250
1184
args.GetReturnValue ().Set (args[0 ]);
1251
1185
}
1252
1186
@@ -1255,26 +1189,7 @@ void Swap64(const FunctionCallbackInfo<Value>& args) {
1255
1189
Environment* env = Environment::GetCurrent (args);
1256
1190
THROW_AND_RETURN_UNLESS_BUFFER (env, args[0 ]);
1257
1191
SPREAD_ARG (args[0 ], ts_obj);
1258
-
1259
- CHECK_EQ (ts_obj_length % 8 , 0 );
1260
-
1261
- int align = reinterpret_cast <uintptr_t >(ts_obj_data) % sizeof (uint64_t );
1262
-
1263
- if (align == 0 ) {
1264
- uint64_t * data64 = reinterpret_cast <uint64_t *>(ts_obj_data);
1265
- size_t len32 = ts_obj_length / 8 ;
1266
- for (size_t i = 0 ; i < len32; i++) {
1267
- data64[i] = BSWAP_INTRINSIC_8 (data64[i]);
1268
- }
1269
- } else {
1270
- for (size_t i = 0 ; i < ts_obj_length; i += 8 ) {
1271
- std::swap (ts_obj_data[i], ts_obj_data[i + 7 ]);
1272
- std::swap (ts_obj_data[i + 1 ], ts_obj_data[i + 6 ]);
1273
- std::swap (ts_obj_data[i + 2 ], ts_obj_data[i + 5 ]);
1274
- std::swap (ts_obj_data[i + 3 ], ts_obj_data[i + 4 ]);
1275
- }
1276
- }
1277
-
1192
+ SwapBytes64 (ts_obj_data, ts_obj_length);
1278
1193
args.GetReturnValue ().Set (args[0 ]);
1279
1194
}
1280
1195
0 commit comments