WSAA: make the WSAA macros contain their own buffer
[nasm/nasm.git] / wsaa.h
blobb3364890c55680bb7e9af570a3329424399deb37
1 #ifndef NASM_WSAA_H
2 #define NASM_WSAA_H
4 #include "compiler.h"
5 #include "nasmlib.h"
7 /* XXX: only LITTLE_ENDIAN is actually needed here. The way these
8 macros is written, it does not require that unaligned references
9 are permitted. */
10 #if X86_MEMORY
12 #define WSAACHAR(s,v) \
13 do { \
14 uint8_t _wsb_v = (v); \
15 saa_wbytes(s, &_wsb_v, 1); \
16 } while (0)
18 #define WSAASHORT(s,v) \
19 do { \
20 uint16_t _wss_v = (v); \
21 saa_wbytes(s, &_wss_v, 2); \
22 } while (0)
24 #define WSAALONG(s,v) \
25 do { \
26 uint32_t _wsl_v = (v); \
27 saa_wbytes(s, &_wsl_v, 4); \
28 } while (0)
30 #define WSAADLONG(s,v) \
31 do { \
32 uint64_t _wsq_v = (v); \
33 saa_wbytes(s, &_wsq_v, 8); \
34 } while (0)
36 #else /* !X86_MEMORY */
38 #define WSAACHAR(s,v) \
39 do { \
40 uint8_t _wsb_v = (v); \
41 saa_wbytes(s, &_wsb_v, 1); \
42 } while (0)
44 #define WSAASHORT(s,v) \
45 do { \
46 uint16_t _wss_v = (v); \
47 uint8_t _wss_p[2]; \
48 _wss_p[0] = _wss_v; \
49 _wss_p[1] = _wss_v >> 8; \
50 saa_wbytes(s, _wss_p, 2); \
51 } while (0)
53 #define WSAALONG(s,v) \
54 do { \
55 uint32_t _wsl_v = (v); \
56 uint8_t _wsl_p[4]; \
57 _wsl_p[0] = _wsl_v; \
58 _wsl_p[1] = _wsl_v >> 8; \
59 _wsl_p[2] = _wsl_v >> 16; \
60 _wsl_p[3] = _wsl_v >> 24; \
61 saa_wbytes(s, _wsl_p, 4); \
62 } while (0)
64 #define WSAADLONG(s,v) \
65 do { \
66 uint64_t _wsq_v = (v); \
67 uint8_t _wsq_p[8]; \
68 _wsq_p[0] = _wsq_v; \
69 _wsq_p[1] = _wsq_v >> 8; \
70 _wsq_p[2] = _wsq_v >> 16; \
71 _wsq_p[3] = _wsq_v >> 24; \
72 _wsq_p[4] = _wsq_v >> 32; \
73 _wsq_p[5] = _wsq_v >> 40; \
74 _wsq_p[6] = _wsq_v >> 48; \
75 _wsq_p[7] = _wsq_v >> 56; \
76 saa_wbytes(s, _wsq_p, 8); \
77 } while (0)
79 #endif
81 #endif /* NASM_WSAA_H */