1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
|
.data 16
ok:
.c "ok\n"
#define us12_i 0x1234
#define us7f_i 0x7ff7
#define us80_i 0x8008
#define usff_i 0xffff
#define ui12_i 0x01234567
#define ui7f_i 0x7f7ff7f7
#define ui80_i 0x80800808
#define uiff_i 0xffffffff
#define ul12_i 0x0123456789abcdef
#define ul7f_i 0x7f7f7f7ff7f7f7f7
#define ul80_i 0x8080808008080808
#define ulff_i 0xffffffffffffffff
#if __WORDSIZE == 32
# define xus12_i 0xffff1234
# define xus7f_i 0x10107ff7
# define xus80_i 0x81188008
# define xusff_i 0xeaaeffff
#else
# define xus12_i 0xffffffffffff1234
# define xus7f_i 0x1010100101017ff7
# define xus80_i 0x8181811818818008
# define xusff_i 0xeaeaeaaeaeaeffff
# define xui12_i 0xffffffff01234567
# define xui7f_i 0x101001017f7ff7f7
# define xui80_i 0x8181181880800808
# define xuiff_i 0xeaeaaeaeffffffff
#endif
#if __BYTE_ORDER == __LITTLE_ENDIAN
# define us12_o 0x3412
# define us7f_o 0xf77f
# define us80_o 0x0880
# define usff_o 0xffff
# define ui12_o 0x67452301
# define ui7f_o 0xf7f77f7f
# define ui80_o 0x08088080
# define uiff_o 0xffffffff
# define ul12_o 0xefcdab8967452301
# define ul7f_o 0xf7f7f7f77f7f7f7f
# define ul80_o 0x0808080880808080
# define ulff_o 0xffffffffffffffff
#else
# define us12_o us12_i
# define us7f_o us7f_i
# define us80_o us80_i
# define usff_o usff_i
# define ui12_o ui12_i
# define ui7f_o ui7f_i
# define ui80_o ui80_i
# define uiff_o uiff_i
# define ul12_o ul12_i
# define ul7f_o ul7f_i
# define ul80_o ul80_i
# define ulff_o ulff_i
#endif
#define HTON4(I, O, T, R0, R1) \
movi %R0 I \
htonr_##T %R1 %R0 \
beqi T##R0##R1##I %R1 O \
calli @abort \
T##R0##R1##I:
#define HTON3(T, R0, R1) \
HTON4(T##12_i, T##12_o, T, R0, R1) \
HTON4(x##T##12_i, T##12_o, T, R0, R1) \
HTON4(T##7f_i, T##7f_o, T, R0, R1) \
HTON4(x##T##7f_i, T##7f_o, T, R0, R1) \
HTON4(T##80_i, T##80_o, T, R0, R1) \
HTON4(x##T##80_i, T##80_o, T, R0, R1) \
HTON4(T##ff_i, T##ff_o, T, R0, R1) \
HTON4(x##T##ff_i, T##ff_o, T, R0, R1)
#define HTON3x(T, R0, R1) \
HTON4(T##12_i, T##12_o, T, R0, R1) \
HTON4(T##7f_i, T##7f_o, T, R0, R1) \
HTON4(T##80_i, T##80_o, T, R0, R1) \
HTON4(T##ff_i, T##ff_o, T, R0, R1)
#define HTON2(T, V0, V1, V2, R0, R1, R2) \
HTON3(T, V0, V0) \
HTON3(T, V0, V1) \
HTON3(T, V0, V2) \
HTON3(T, V0, R0) \
HTON3(T, V0, R1) \
HTON3(T, V0, R2) \
#define HTON2x(T, V0, V1, V2, R0, R1, R2) \
HTON3x(T, V0, V0) \
HTON3x(T, V0, V1) \
HTON3x(T, V0, V2) \
HTON3x(T, V0, R0) \
HTON3x(T, V0, R1) \
HTON3x(T, V0, R2) \
#define HTON1(T, V0, V1, V2, R0, R1, R2) \
HTON2(T, V0, V1, V2, R0, R1, R2) \
HTON2(T, V1, V2, R0, R1, R2, V0) \
HTON2(T, V2, R0, R1, R2, V0, V1) \
HTON2(T, R0, R1, R2, V0, V1, V2) \
HTON2(T, R1, R2, V0, V1, V2, R0) \
HTON2(T, R2, V0, V1, V2, R0, R1)
#define HTON1x(T, V0, V1, V2, R0, R1, R2) \
HTON2x(T, V0, V1, V2, R0, R1, R2) \
HTON2x(T, V1, V2, R0, R1, R2, V0) \
HTON2x(T, V2, R0, R1, R2, V0, V1) \
HTON2x(T, R0, R1, R2, V0, V1, V2) \
HTON2x(T, R1, R2, V0, V1, V2, R0) \
HTON2x(T, R2, V0, V1, V2, R0, R1)
#if __WORDSIZE == 32
# define HTON(V0, V1, V2, R0, R1, R2) \
HTON1(us, V0, V1, V2, R0, R1, R2) \
HTON1x(ui, V0, V1, V2, R0, R1, R2)
#else
# define HTON(V0, V1, V2, R0, R1, R2) \
HTON1(us, V0, V1, V2, R0, R1, R2) \
HTON1(ui, V0, V1, V2, R0, R1, R2) \
HTON1x(ul, V0, V1, V2, R0, R1, R2)
#endif
.code
prolog
/* simple sequence for easier disassembly reading and encoding check */
movi %r0 us12_i
htonr_us %r1 %r0
beqi us %r1 us12_o
calli @abort
us:
movi %r0 xus12_i
htonr_us %r1 %r0
beqi xus %r1 us12_o
calli @abort
xus:
movi %r0 ui12_i
htonr_ui %r1 %r0
beqi ui %r1 ui12_o
calli @abort
ui:
#if __WORDSIZE == 64
movi %r0 xui12_i
htonr_ui %r1 %r0
beqi xui %r1 ui12_o
calli @abort
xui:
movi %r0 ul12_i
htonr_ul %r1 %r0
beqi ul %r1 ul12_o
calli @abort
ul:
#endif
HTON(v0, v1, v2, r0, r1, r2)
// just to know did not abort
prepare
pushargi ok
ellipsis
finishi @printf
ret
epilog
|