1212
1313#include < string.h>
1414#include < limits.h>
15- #include < utility>
1615
1716#define BUFFER_ID 0xB0E4
1817
4948 THROW_AND_RETURN_IF_OOB (end <= end_max); \
5049 size_t length = end - start;
5150
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-
8451namespace node {
8552
8653// if true, all Buffer and SlowBuffer instances will automatically zero-fill
@@ -1204,23 +1171,7 @@ void Swap16(const FunctionCallbackInfo<Value>& args) {
12041171 Environment* env = Environment::GetCurrent (args);
12051172 THROW_AND_RETURN_UNLESS_BUFFER (env, args[0 ]);
12061173 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);
12241175 args.GetReturnValue ().Set (args[0 ]);
12251176}
12261177
@@ -1229,24 +1180,7 @@ void Swap32(const FunctionCallbackInfo<Value>& args) {
12291180 Environment* env = Environment::GetCurrent (args);
12301181 THROW_AND_RETURN_UNLESS_BUFFER (env, args[0 ]);
12311182 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);
12501184 args.GetReturnValue ().Set (args[0 ]);
12511185}
12521186
@@ -1255,26 +1189,7 @@ void Swap64(const FunctionCallbackInfo<Value>& args) {
12551189 Environment* env = Environment::GetCurrent (args);
12561190 THROW_AND_RETURN_UNLESS_BUFFER (env, args[0 ]);
12571191 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);
12781193 args.GetReturnValue ().Set (args[0 ]);
12791194}
12801195
0 commit comments