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
52
51
#define BUFFER_MALLOC (length ) \
53
52
zero_fill_all_buffers ? node::Calloc(length, 1 ) : node::Malloc(length)
54
53
55
- #if defined(__GNUC__) || defined(__clang__)
56
- #define BSWAP_INTRINSIC_2 (x ) __builtin_bswap16(x)
57
- #define BSWAP_INTRINSIC_4 (x ) __builtin_bswap32(x)
58
- #define BSWAP_INTRINSIC_8 (x ) __builtin_bswap64(x)
59
- #elif defined(__linux__)
60
- #include < byteswap.h>
61
- #define BSWAP_INTRINSIC_2 (x ) bswap_16(x)
62
- #define BSWAP_INTRINSIC_4 (x ) bswap_32(x)
63
- #define BSWAP_INTRINSIC_8 (x ) bswap_64(x)
64
- #elif defined(_MSC_VER)
65
- #include < intrin.h>
66
- #define BSWAP_INTRINSIC_2 (x ) _byteswap_ushort(x);
67
- #define BSWAP_INTRINSIC_4 (x ) _byteswap_ulong(x);
68
- #define BSWAP_INTRINSIC_8 (x ) _byteswap_uint64(x);
69
- #else
70
- #define BSWAP_INTRINSIC_2 (x ) ((x) << 8 ) | ((x) >> 8 )
71
- #define BSWAP_INTRINSIC_4 (x ) \
72
- (((x) & 0xFF ) << 24 ) | \
73
- (((x) & 0xFF00 ) << 8 ) | \
74
- (((x) >> 8 ) & 0xFF00 ) | \
75
- (((x) >> 24 ) & 0xFF )
76
- #define BSWAP_INTRINSIC_8 (x ) \
77
- (((x) & 0xFF00000000000000ull ) >> 56 ) | \
78
- (((x) & 0x00FF000000000000ull ) >> 40 ) | \
79
- (((x) & 0x0000FF0000000000ull ) >> 24 ) | \
80
- (((x) & 0x000000FF00000000ull ) >> 8 ) | \
81
- (((x) & 0x00000000FF000000ull ) << 8 ) | \
82
- (((x) & 0x0000000000FF0000ull ) << 24 ) | \
83
- (((x) & 0x000000000000FF00ull ) << 40 ) | \
84
- (((x) & 0x00000000000000FFull ) << 56 )
85
- #endif
86
-
87
54
namespace node {
88
55
89
56
// if true, all Buffer and SlowBuffer instances will automatically zero-fill
@@ -1199,23 +1166,7 @@ void Swap16(const FunctionCallbackInfo<Value>& args) {
1199
1166
Environment* env = Environment::GetCurrent (args);
1200
1167
THROW_AND_RETURN_UNLESS_BUFFER (env, args[0 ]);
1201
1168
SPREAD_ARG (args[0 ], ts_obj);
1202
-
1203
- CHECK_EQ (ts_obj_length % 2 , 0 );
1204
-
1205
- int align = reinterpret_cast <uintptr_t >(ts_obj_data) % sizeof (uint16_t );
1206
-
1207
- if (align == 0 ) {
1208
- uint16_t * data16 = reinterpret_cast <uint16_t *>(ts_obj_data);
1209
- size_t len16 = ts_obj_length / 2 ;
1210
- for (size_t i = 0 ; i < len16; i++) {
1211
- data16[i] = BSWAP_INTRINSIC_2 (data16[i]);
1212
- }
1213
- } else {
1214
- for (size_t i = 0 ; i < ts_obj_length; i += 2 ) {
1215
- std::swap (ts_obj_data[i], ts_obj_data[i + 1 ]);
1216
- }
1217
- }
1218
-
1169
+ SwapBytes16 (ts_obj_data, ts_obj_length);
1219
1170
args.GetReturnValue ().Set (args[0 ]);
1220
1171
}
1221
1172
@@ -1224,24 +1175,7 @@ void Swap32(const FunctionCallbackInfo<Value>& args) {
1224
1175
Environment* env = Environment::GetCurrent (args);
1225
1176
THROW_AND_RETURN_UNLESS_BUFFER (env, args[0 ]);
1226
1177
SPREAD_ARG (args[0 ], ts_obj);
1227
-
1228
- CHECK_EQ (ts_obj_length % 4 , 0 );
1229
-
1230
- int align = reinterpret_cast <uintptr_t >(ts_obj_data) % sizeof (uint32_t );
1231
-
1232
- if (align == 0 ) {
1233
- uint32_t * data32 = reinterpret_cast <uint32_t *>(ts_obj_data);
1234
- size_t len32 = ts_obj_length / 4 ;
1235
- for (size_t i = 0 ; i < len32; i++) {
1236
- data32[i] = BSWAP_INTRINSIC_4 (data32[i]);
1237
- }
1238
- } else {
1239
- for (size_t i = 0 ; i < ts_obj_length; i += 4 ) {
1240
- std::swap (ts_obj_data[i], ts_obj_data[i + 3 ]);
1241
- std::swap (ts_obj_data[i + 1 ], ts_obj_data[i + 2 ]);
1242
- }
1243
- }
1244
-
1178
+ SwapBytes32 (ts_obj_data, ts_obj_length);
1245
1179
args.GetReturnValue ().Set (args[0 ]);
1246
1180
}
1247
1181
@@ -1250,26 +1184,7 @@ void Swap64(const FunctionCallbackInfo<Value>& args) {
1250
1184
Environment* env = Environment::GetCurrent (args);
1251
1185
THROW_AND_RETURN_UNLESS_BUFFER (env, args[0 ]);
1252
1186
SPREAD_ARG (args[0 ], ts_obj);
1253
-
1254
- CHECK_EQ (ts_obj_length % 8 , 0 );
1255
-
1256
- int align = reinterpret_cast <uintptr_t >(ts_obj_data) % sizeof (uint64_t );
1257
-
1258
- if (align == 0 ) {
1259
- uint64_t * data64 = reinterpret_cast <uint64_t *>(ts_obj_data);
1260
- size_t len32 = ts_obj_length / 8 ;
1261
- for (size_t i = 0 ; i < len32; i++) {
1262
- data64[i] = BSWAP_INTRINSIC_8 (data64[i]);
1263
- }
1264
- } else {
1265
- for (size_t i = 0 ; i < ts_obj_length; i += 8 ) {
1266
- std::swap (ts_obj_data[i], ts_obj_data[i + 7 ]);
1267
- std::swap (ts_obj_data[i + 1 ], ts_obj_data[i + 6 ]);
1268
- std::swap (ts_obj_data[i + 2 ], ts_obj_data[i + 5 ]);
1269
- std::swap (ts_obj_data[i + 3 ], ts_obj_data[i + 4 ]);
1270
- }
1271
- }
1272
-
1187
+ SwapBytes64 (ts_obj_data, ts_obj_length);
1273
1188
args.GetReturnValue ().Set (args[0 ]);
1274
1189
}
1275
1190
0 commit comments