1package types
2
3// ================================================================
4// Bitwise NOT
5
6func bitwise_not_i_i(input1 *Mlrval) *Mlrval {
7	return MlrvalPointerFromInt(^input1.intval)
8}
9
10var bitwise_not_dispositions = [MT_DIM]UnaryFunc{
11	/*ERROR  */ _erro1,
12	/*ABSENT */ _absn1,
13	/*VOID   */ _void1,
14	/*STRING */ _erro1,
15	/*INT    */ bitwise_not_i_i,
16	/*FLOAT  */ _erro1,
17	/*BOOL   */ _erro1,
18	/*ARRAY  */ _absn1,
19	/*MAP    */ _absn1,
20}
21
22func MlrvalBitwiseNOT(input1 *Mlrval) *Mlrval {
23	return bitwise_not_dispositions[input1.mvtype](input1)
24}
25
26// ================================================================
27// Bit-count
28// https://en.wikipedia.org/wiki/Hamming_weight
29
30const _m01 uint64 = 0x5555555555555555
31const _m02 uint64 = 0x3333333333333333
32const _m04 uint64 = 0x0f0f0f0f0f0f0f0f
33const _m08 uint64 = 0x00ff00ff00ff00ff
34const _m16 uint64 = 0x0000ffff0000ffff
35const _m32 uint64 = 0x00000000ffffffff
36
37func bitcount_i_i(input1 *Mlrval) *Mlrval {
38	a := uint64(input1.intval)
39	a = (a & _m01) + ((a >> 1) & _m01)
40	a = (a & _m02) + ((a >> 2) & _m02)
41	a = (a & _m04) + ((a >> 4) & _m04)
42	a = (a & _m08) + ((a >> 8) & _m08)
43	a = (a & _m16) + ((a >> 16) & _m16)
44	a = (a & _m32) + ((a >> 32) & _m32)
45	return MlrvalPointerFromInt(int(a))
46}
47
48var bitcount_dispositions = [MT_DIM]UnaryFunc{
49	/*ERROR  */ _erro1,
50	/*ABSENT */ _absn1,
51	/*VOID   */ _void1,
52	/*STRING */ _erro1,
53	/*INT    */ bitcount_i_i,
54	/*FLOAT  */ _erro1,
55	/*BOOL   */ _erro1,
56	/*ARRAY  */ _absn1,
57	/*MAP    */ _absn1,
58}
59
60func MlrvalBitCount(input1 *Mlrval) *Mlrval {
61	return bitcount_dispositions[input1.mvtype](input1)
62}
63
64// ================================================================
65// Bitwise AND
66
67func bitwise_and_i_ii(input1, input2 *Mlrval) *Mlrval {
68	return MlrvalPointerFromInt(input1.intval & input2.intval)
69}
70
71var bitwise_and_dispositions = [MT_DIM][MT_DIM]BinaryFunc{
72	//           ERROR  ABSENT VOID   STRING INT    FLOAT  BOOL ARRAY MAP
73	/*ERROR  */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn},
74	/*ABSENT */ {_erro, _absn, _absn, _erro, _2___, _erro, _erro, _absn, _absn},
75	/*VOID   */ {_erro, _absn, _void, _erro, _void, _void, _erro, _absn, _absn},
76	/*STRING */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn},
77	/*INT    */ {_erro, _1___, _void, _erro, bitwise_and_i_ii, _erro, _erro, _absn, _absn},
78	/*FLOAT  */ {_erro, _erro, _void, _erro, _erro, _erro, _erro, _absn, _absn},
79	/*BOOL   */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn},
80	/*ARRAY  */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn},
81	/*MAP    */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn},
82}
83
84func MlrvalBitwiseAND(input1, input2 *Mlrval) *Mlrval {
85	return bitwise_and_dispositions[input1.mvtype][input2.mvtype](input1, input2)
86}
87
88// ----------------------------------------------------------------
89// Bitwise OR
90
91func bitwise_or_i_ii(input1, input2 *Mlrval) *Mlrval {
92	return MlrvalPointerFromInt(input1.intval | input2.intval)
93}
94
95var bitwise_or_dispositions = [MT_DIM][MT_DIM]BinaryFunc{
96	//           ERROR  ABSENT VOID   STRING INT    FLOAT  BOOL ARRAY MAP
97	/*ERROR  */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn},
98	/*ABSENT */ {_erro, _absn, _absn, _erro, _2___, _erro, _erro, _absn, _absn},
99	/*VOID   */ {_erro, _absn, _void, _erro, _void, _void, _erro, _absn, _absn},
100	/*STRING */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn},
101	/*INT    */ {_erro, _1___, _void, _erro, bitwise_or_i_ii, _erro, _erro, _absn, _absn},
102	/*FLOAT  */ {_erro, _erro, _void, _erro, _erro, _erro, _erro, _absn, _absn},
103	/*BOOL   */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn},
104	/*ARRAY  */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn},
105	/*MAP    */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn},
106}
107
108func MlrvalBitwiseOR(input1, input2 *Mlrval) *Mlrval {
109	return bitwise_or_dispositions[input1.mvtype][input2.mvtype](input1, input2)
110}
111
112// ----------------------------------------------------------------
113// Bitwise XOR
114
115func bitwise_xor_i_ii(input1, input2 *Mlrval) *Mlrval {
116	return MlrvalPointerFromInt(input1.intval ^ input2.intval)
117}
118
119var bitwise_xor_dispositions = [MT_DIM][MT_DIM]BinaryFunc{
120	//           ERROR  ABSENT VOID   STRING INT    FLOAT  BOOL ARRAY MAP
121	/*ERROR  */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn},
122	/*ABSENT */ {_erro, _absn, _absn, _erro, _2___, _erro, _erro, _absn, _absn},
123	/*VOID   */ {_erro, _absn, _void, _erro, _void, _void, _erro, _absn, _absn},
124	/*STRING */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn},
125	/*INT    */ {_erro, _1___, _void, _erro, bitwise_xor_i_ii, _erro, _erro, _absn, _absn},
126	/*FLOAT  */ {_erro, _erro, _void, _erro, _erro, _erro, _erro, _absn, _absn},
127	/*BOOL   */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn},
128	/*ARRAY  */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn},
129	/*MAP    */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn},
130}
131
132func MlrvalBitwiseXOR(input1, input2 *Mlrval) *Mlrval {
133	return bitwise_xor_dispositions[input1.mvtype][input2.mvtype](input1, input2)
134}
135
136// ----------------------------------------------------------------
137// Left shift
138
139func lsh_i_ii(input1, input2 *Mlrval) *Mlrval {
140	return MlrvalPointerFromInt(input1.intval << uint64(input2.intval))
141}
142
143var left_shift_dispositions = [MT_DIM][MT_DIM]BinaryFunc{
144	//           ERROR  ABSENT VOID   STRING INT    FLOAT  BOOL ARRAY MAP
145	/*ERROR  */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn},
146	/*ABSENT */ {_erro, _absn, _absn, _erro, _2___, _erro, _erro, _absn, _absn},
147	/*VOID   */ {_erro, _absn, _void, _erro, _void, _void, _erro, _absn, _absn},
148	/*STRING */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn},
149	/*INT    */ {_erro, _1___, _void, _erro, lsh_i_ii, _erro, _erro, _absn, _absn},
150	/*FLOAT  */ {_erro, _erro, _void, _erro, _erro, _erro, _erro, _absn, _absn},
151	/*BOOL   */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn},
152	/*ARRAY  */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn},
153	/*MAP    */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn},
154}
155
156func MlrvalLeftShift(input1, input2 *Mlrval) *Mlrval {
157	return left_shift_dispositions[input1.mvtype][input2.mvtype](input1, input2)
158}
159
160// ----------------------------------------------------------------
161// Signed right shift
162
163func srsh_i_ii(input1, input2 *Mlrval) *Mlrval {
164	return MlrvalPointerFromInt(input1.intval >> uint64(input2.intval))
165}
166
167var signed_right_shift_dispositions = [MT_DIM][MT_DIM]BinaryFunc{
168	//           ERROR  ABSENT VOID   STRING INT    FLOAT  BOOL ARRAY MAP
169	/*ERROR  */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn},
170	/*ABSENT */ {_erro, _absn, _absn, _erro, _2___, _erro, _erro, _absn, _absn},
171	/*VOID   */ {_erro, _absn, _void, _erro, _void, _void, _erro, _absn, _absn},
172	/*STRING */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn},
173	/*INT    */ {_erro, _1___, _void, _erro, srsh_i_ii, _erro, _erro, _absn, _absn},
174	/*FLOAT  */ {_erro, _erro, _void, _erro, _erro, _erro, _erro, _absn, _absn},
175	/*BOOL   */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn},
176	/*ARRAY  */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn},
177	/*MAP    */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn},
178}
179
180func MlrvalSignedRightShift(input1, input2 *Mlrval) *Mlrval {
181	return signed_right_shift_dispositions[input1.mvtype][input2.mvtype](input1, input2)
182}
183
184// ----------------------------------------------------------------
185// Unsigned right shift
186
187func ursh_i_ii(input1, input2 *Mlrval) *Mlrval {
188	var ua uint64 = uint64(input1.intval)
189	var ub uint64 = uint64(input2.intval)
190	var uc = ua >> ub
191	return MlrvalPointerFromInt(int(uc))
192}
193
194var unsigned_right_shift_dispositions = [MT_DIM][MT_DIM]BinaryFunc{
195	//           ERROR  ABSENT VOID   STRING INT    FLOAT  BOOL ARRAY MAP
196	/*ERROR  */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn},
197	/*ABSENT */ {_erro, _absn, _absn, _erro, _2___, _erro, _erro, _absn, _absn},
198	/*VOID   */ {_erro, _absn, _void, _erro, _void, _void, _erro, _absn, _absn},
199	/*STRING */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn},
200	/*INT    */ {_erro, _1___, _void, _erro, ursh_i_ii, _erro, _erro, _absn, _absn},
201	/*FLOAT  */ {_erro, _erro, _void, _erro, _erro, _erro, _erro, _absn, _absn},
202	/*BOOL   */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn},
203	/*ARRAY  */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn},
204	/*MAP    */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn},
205}
206
207func MlrvalUnsignedRightShift(input1, input2 *Mlrval) *Mlrval {
208	return unsigned_right_shift_dispositions[input1.mvtype][input2.mvtype](input1, input2)
209}
210