@@ -212,3 +212,154 @@ void outportd_statement(struct basic_ctx* ctx) {
212212 accept_or_return (NEWLINE , ctx );
213213 outl (port & 0xFFFF , value );
214214}
215+
216+ int64_t basic_bitor (struct basic_ctx * ctx )
217+ {
218+ PARAMS_START ;
219+ PARAMS_GET_ITEM (BIP_INT );
220+ int64_t op1 = intval ;
221+ PARAMS_GET_ITEM (BIP_INT );
222+ int64_t op2 = intval ;
223+ PARAMS_END ("BITOR" , -1 );
224+ return op1 | op2 ;
225+ }
226+
227+ int64_t basic_bitand (struct basic_ctx * ctx )
228+ {
229+ PARAMS_START ;
230+ PARAMS_GET_ITEM (BIP_INT );
231+ int64_t op1 = intval ;
232+ PARAMS_GET_ITEM (BIP_INT );
233+ int64_t op2 = intval ;
234+ PARAMS_END ("BITAND" , -1 );
235+ return op1 & op2 ;
236+ }
237+
238+ int64_t basic_bitnot (struct basic_ctx * ctx )
239+ {
240+ PARAMS_START ;
241+ PARAMS_GET_ITEM (BIP_INT );
242+ int64_t op1 = intval ;
243+ PARAMS_END ("BITNOT" , -1 );
244+ return ~op1 ;
245+ }
246+
247+ int64_t basic_biteor (struct basic_ctx * ctx )
248+ {
249+ PARAMS_START ;
250+ PARAMS_GET_ITEM (BIP_INT );
251+ int64_t op1 = intval ;
252+ PARAMS_GET_ITEM (BIP_INT );
253+ int64_t op2 = intval ;
254+ PARAMS_END ("BITEOR" , -1 );
255+ return op1 ^ op2 ;
256+ }
257+
258+ int64_t basic_bitnand (struct basic_ctx * ctx )
259+ {
260+ PARAMS_START ;
261+ PARAMS_GET_ITEM (BIP_INT );
262+ int64_t op1 = intval ;
263+ PARAMS_GET_ITEM (BIP_INT );
264+ int64_t op2 = intval ;
265+ PARAMS_END ("BITNAND" , -1 );
266+ return ~(op1 & op2 );
267+ }
268+
269+ int64_t basic_bitnor (struct basic_ctx * ctx )
270+ {
271+ PARAMS_START ;
272+ PARAMS_GET_ITEM (BIP_INT );
273+ int64_t op1 = intval ;
274+ PARAMS_GET_ITEM (BIP_INT );
275+ int64_t op2 = intval ;
276+ PARAMS_END ("BITNOR" , -1 );
277+ return ~(op1 | op2 );
278+ }
279+
280+ int64_t basic_bitxnor (struct basic_ctx * ctx )
281+ {
282+ PARAMS_START ;
283+ PARAMS_GET_ITEM (BIP_INT );
284+ int64_t op1 = intval ;
285+ PARAMS_GET_ITEM (BIP_INT );
286+ int64_t op2 = intval ;
287+ PARAMS_END ("BITXNOR" , -1 );
288+ return ~(op1 ^ op2 );
289+ }
290+
291+ int64_t basic_bitshl (struct basic_ctx * ctx )
292+ {
293+ PARAMS_START ;
294+ PARAMS_GET_ITEM (BIP_INT );
295+ int64_t val = intval ;
296+ PARAMS_GET_ITEM (BIP_INT );
297+ int64_t n = intval ;
298+ PARAMS_END ("BITSHL" , -1 );
299+
300+ uint64_t u = (uint64_t ) val ;
301+ if (n < 0 ) n = 0 ;
302+ if (n > 63 ) n = 63 ;
303+
304+ u = u << (unsigned )n ;
305+ return (int64_t ) u ;
306+ }
307+
308+ int64_t basic_bitshr (struct basic_ctx * ctx )
309+ {
310+ PARAMS_START ;
311+ PARAMS_GET_ITEM (BIP_INT );
312+ int64_t val = intval ;
313+ PARAMS_GET_ITEM (BIP_INT );
314+ int64_t n = intval ;
315+ PARAMS_END ("BITSHR" , -1 );
316+
317+ uint64_t u = (uint64_t ) val ; /* logical right shift */
318+ if (n < 0 ) n = 0 ;
319+ if (n > 63 ) n = 63 ;
320+
321+ u = u >> (unsigned )n ;
322+ return (int64_t ) u ;
323+ }
324+
325+ int64_t basic_bitrol (struct basic_ctx * ctx )
326+ {
327+ PARAMS_START ;
328+ PARAMS_GET_ITEM (BIP_INT );
329+ int64_t val = intval ;
330+ PARAMS_GET_ITEM (BIP_INT );
331+ int64_t n = intval ;
332+ PARAMS_GET_ITEM (BIP_INT );
333+ int64_t width = intval ;
334+ PARAMS_END ("BITROL" , -1 );
335+
336+ uint64_t w = (width <= 0 || width > 64 ) ? 64u : (uint64_t ) width ;
337+ uint64_t mask = (w == 64u ) ? ~0ULL : ((1ULL << w ) - 1ULL );
338+
339+ uint64_t k = (uint64_t ) ((n % (int64_t )w + (int64_t )w ) % (int64_t )w );
340+ uint64_t x = (uint64_t ) val & mask ;
341+
342+ uint64_t out = ((x << k ) | (x >> (w - k ))) & mask ;
343+ return (int64_t ) out ;
344+ }
345+
346+ int64_t basic_bitror (struct basic_ctx * ctx )
347+ {
348+ PARAMS_START ;
349+ PARAMS_GET_ITEM (BIP_INT );
350+ int64_t val = intval ;
351+ PARAMS_GET_ITEM (BIP_INT );
352+ int64_t n = intval ;
353+ PARAMS_GET_ITEM (BIP_INT );
354+ int64_t width = intval ;
355+ PARAMS_END ("BITROR" , -1 );
356+
357+ uint64_t w = (width <= 0 || width > 64 ) ? 64u : (uint64_t ) width ;
358+ uint64_t mask = (w == 64u ) ? ~0ULL : ((1ULL << w ) - 1ULL );
359+
360+ uint64_t k = (uint64_t ) ((n % (int64_t )w + (int64_t )w ) % (int64_t )w );
361+ uint64_t x = (uint64_t ) val & mask ;
362+
363+ uint64_t out = ((x >> k ) | (x << (w - k ))) & mask ;
364+ return (int64_t ) out ;
365+ }
0 commit comments