1212
1313#include < string.h>
1414#include < limits.h>
15- #include < utility>
1615
1716#define BUFFER_ID 0xB0E4
1817
5251#define BUFFER_MALLOC (length ) \
5352 zero_fill_all_buffers ? node::Calloc(length, 1 ) : node::Malloc(length)
5453
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-
8754namespace node {
8855
8956// if true, all Buffer and SlowBuffer instances will automatically zero-fill
@@ -1199,23 +1166,7 @@ void Swap16(const FunctionCallbackInfo<Value>& args) {
11991166 Environment* env = Environment::GetCurrent (args);
12001167 THROW_AND_RETURN_UNLESS_BUFFER (env, args[0 ]);
12011168 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);
12191170 args.GetReturnValue ().Set (args[0 ]);
12201171}
12211172
@@ -1224,24 +1175,7 @@ void Swap32(const FunctionCallbackInfo<Value>& args) {
12241175 Environment* env = Environment::GetCurrent (args);
12251176 THROW_AND_RETURN_UNLESS_BUFFER (env, args[0 ]);
12261177 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);
12451179 args.GetReturnValue ().Set (args[0 ]);
12461180}
12471181
@@ -1250,26 +1184,7 @@ void Swap64(const FunctionCallbackInfo<Value>& args) {
12501184 Environment* env = Environment::GetCurrent (args);
12511185 THROW_AND_RETURN_UNLESS_BUFFER (env, args[0 ]);
12521186 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);
12731188 args.GetReturnValue ().Set (args[0 ]);
12741189}
12751190
0 commit comments