aboutsummaryrefslogtreecommitdiff
path: root/deps/lightning/check/hton.tst
blob: fcaf147b4a3c1acf8c3ba0b3136e94ae9ff3ca23 (plain)
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