From e5d922335ee69b525d9f8356e674fb9cc49ff83c Mon Sep 17 00:00:00 2001
From: Jessica Hamilton <jessica.l.hamilton@gmail.com>
Date: Sat, 3 May 2014 11:55:08 +1200
Subject: [PATCH] Replace arch-dependent integer byteswap routines with gcc
builtins
---
headers/os/support/ByteOrder.h | 35 ++++++++++++++++-------------------
1 file changed, 16 insertions(+), 19 deletions(-)
diff --git a/headers/os/support/ByteOrder.h b/headers/os/support/ByteOrder.h
index 96e9961..a0cde4a 100644
a
|
b
|
typedef enum {
|
34 | 34 | /* always swap macros */ |
35 | 35 | #define B_SWAP_DOUBLE(arg) __swap_double(arg) |
36 | 36 | #define B_SWAP_FLOAT(arg) __swap_float(arg) |
37 | | #define B_SWAP_INT64(arg) __swap_int64(arg) |
38 | | #define B_SWAP_INT32(arg) __swap_int32(arg) |
39 | | #define B_SWAP_INT16(arg) __swap_int16(arg) |
| 37 | #define B_SWAP_INT64(arg) __builtin_bswap64(arg) |
| 38 | #define B_SWAP_INT32(arg) __builtin_bswap32(arg) |
| 39 | #define B_SWAP_INT16(arg) __builtin_bswap16(arg) |
40 | 40 | |
41 | 41 | #if BYTE_ORDER == __LITTLE_ENDIAN |
42 | 42 | /* Host is little endian */ |
… |
… |
typedef enum {
|
61 | 61 | /* Host native to big endian */ |
62 | 62 | #define B_HOST_TO_BENDIAN_DOUBLE(arg) __swap_double(arg) |
63 | 63 | #define B_HOST_TO_BENDIAN_FLOAT(arg) __swap_float(arg) |
64 | | #define B_HOST_TO_BENDIAN_INT64(arg) __swap_int64(arg) |
65 | | #define B_HOST_TO_BENDIAN_INT32(arg) __swap_int32(arg) |
66 | | #define B_HOST_TO_BENDIAN_INT16(arg) __swap_int16(arg) |
| 64 | #define B_HOST_TO_BENDIAN_INT64(arg) __builtin_bswap64(arg) |
| 65 | #define B_HOST_TO_BENDIAN_INT32(arg) __builtin_bswap32(arg) |
| 66 | #define B_HOST_TO_BENDIAN_INT16(arg) __builtin_bswap16(arg) |
67 | 67 | |
68 | 68 | /* Big endian to host native */ |
69 | 69 | #define B_BENDIAN_TO_HOST_DOUBLE(arg) __swap_double(arg) |
70 | 70 | #define B_BENDIAN_TO_HOST_FLOAT(arg) __swap_float(arg) |
71 | | #define B_BENDIAN_TO_HOST_INT64(arg) __swap_int64(arg) |
72 | | #define B_BENDIAN_TO_HOST_INT32(arg) __swap_int32(arg) |
73 | | #define B_BENDIAN_TO_HOST_INT16(arg) __swap_int16(arg) |
| 71 | #define B_BENDIAN_TO_HOST_INT64(arg) __builtin_bswap64(arg) |
| 72 | #define B_BENDIAN_TO_HOST_INT32(arg) __builtin_bswap32(arg) |
| 73 | #define B_BENDIAN_TO_HOST_INT16(arg) __builtin_bswap16(arg) |
74 | 74 | |
75 | 75 | #else /* BYTE_ORDER */ |
76 | 76 | /* Host is big endian */ |
… |
… |
typedef enum {
|
81 | 81 | /* Host native to little endian */ |
82 | 82 | #define B_HOST_TO_LENDIAN_DOUBLE(arg) __swap_double(arg) |
83 | 83 | #define B_HOST_TO_LENDIAN_FLOAT(arg) __swap_float(arg) |
84 | | #define B_HOST_TO_LENDIAN_INT64(arg) __swap_int64(arg) |
85 | | #define B_HOST_TO_LENDIAN_INT32(arg) __swap_int32(arg) |
86 | | #define B_HOST_TO_LENDIAN_INT16(arg) __swap_int16(arg) |
| 84 | #define B_HOST_TO_LENDIAN_INT64(arg) __builtin_bswap64(arg) |
| 85 | #define B_HOST_TO_LENDIAN_INT32(arg) __builtin_bswap32(arg) |
| 86 | #define B_HOST_TO_LENDIAN_INT16(arg) __builtin_bswap16(arg) |
87 | 87 | |
88 | 88 | /* Little endian to host native */ |
89 | 89 | #define B_LENDIAN_TO_HOST_DOUBLE(arg) __swap_double(arg) |
90 | 90 | #define B_LENDIAN_TO_HOST_FLOAT(arg) __swap_float(arg) |
91 | | #define B_LENDIAN_TO_HOST_INT64(arg) __swap_int64(arg) |
92 | | #define B_LENDIAN_TO_HOST_INT32(arg) __swap_int32(arg) |
93 | | #define B_LENDIAN_TO_HOST_INT16(arg) __swap_int16(arg) |
| 91 | #define B_LENDIAN_TO_HOST_INT64(arg) __builtin_bswap64(arg) |
| 92 | #define B_LENDIAN_TO_HOST_INT32(arg) __builtin_bswap32(arg) |
| 93 | #define B_LENDIAN_TO_HOST_INT16(arg) __builtin_bswap16(arg) |
94 | 94 | |
95 | 95 | /* Host native to big endian */ |
96 | 96 | #define B_HOST_TO_BENDIAN_DOUBLE(arg) (double)(arg) |
… |
… |
typedef enum {
|
111 | 111 | |
112 | 112 | #ifdef __cplusplus |
113 | 113 | extern "C" { |
114 | | #endif |
| 114 | #endif |
115 | 115 | |
116 | 116 | extern status_t swap_data(type_code type, void *data, size_t length, |
117 | 117 | swap_action action); |
… |
… |
extern bool is_type_swapped(type_code type);
|
121 | 121 | /* Private implementations */ |
122 | 122 | extern double __swap_double(double arg); |
123 | 123 | extern float __swap_float(float arg); |
124 | | extern uint64 __swap_int64(uint64 arg); |
125 | | extern uint32 __swap_int32(uint32 arg); |
126 | | extern uint16 __swap_int16(uint16 arg); |
127 | 124 | |
128 | 125 | #ifdef __cplusplus |
129 | 126 | } |