LMMS
Loading...
Searching...
No Matches
glue_port.h
Go to the documentation of this file.
1#ifndef _EEL_GLUE_PORTABLE_H_
2#define _EEL_GLUE_PORTABLE_H_
3
4
5#define DECL_ASMFUNC(x)
6#define GLUE_JMP_TYPE int
7#define GLUE_JMP_SET_OFFSET(endOfInstruction,offset) (((GLUE_JMP_TYPE *)(endOfInstruction))[-1] = (offset))
8
9#define GLUE_MAX_FPSTACK_SIZE 64
10#define BIF_FPSTACKUSE(x) (0) // fp stack is not used within functions
11#define BIF_GETFPSTACKUSE(x) (1)
12
13enum {
16 EEL_BC_JMP_NC, // followed by GLUE_JMP_TYPE
19
21 EEL_BC_MOV_P1_DV, // followed by INT_PTR ptr
25
32
38
45
48
55
56
59
60#if NSEEL_LOOPFUNC_SUPPORT_MAXLEN > 0
61 EEL_BC_WHILE_SETUP,
62#endif
63
67
68
69
77
78
87
99
101
110
119
122
127
131
134
142
150
152
153};
154
155#define BC_DECL(x) static const EEL_BC_TYPE GLUE_##x[] = { EEL_BC_##x };
156#define BC_DECL_JMP(x) static const EEL_BC_TYPE GLUE_##x[1 + sizeof(GLUE_JMP_TYPE) / sizeof(EEL_BC_TYPE)] = { EEL_BC_##x };
157BC_DECL_JMP(JMP_NC)
158BC_DECL_JMP(JMP_IF_P1_Z)
159BC_DECL_JMP(JMP_IF_P1_NZ)
161BC_DECL(FXCH)
162BC_DECL(POP_FPSTACK)
163#define GLUE_POP_FPSTACK_SIZE sizeof(EEL_BC_TYPE)
164BC_DECL(PUSH_P1)
165BC_DECL(PUSH_P1PTR_AS_VALUE)
166BC_DECL(POP_FPSTACK_TOSTACK)
167BC_DECL(POP_FPSTACK_TO_WTP)
168BC_DECL(SET_P1_Z)
169BC_DECL(SET_P1_NZ)
170BC_DECL_JMP(LOOP_LOADCNT)
171
172BC_DECL_JMP(LOOP_END)
173
174#define GLUE_LOOP_BEGIN_SIZE 0
175#define GLUE_LOOP_BEGIN ((void*)"")
176#define GLUE_LOOP_CLAMPCNT_SIZE 0
177#define GLUE_LOOP_CLAMPCNT ((void*)"")
178
179#if NSEEL_LOOPFUNC_SUPPORT_MAXLEN > 0
180 BC_DECL(WHILE_SETUP)
181 #define GLUE_WHILE_SETUP_SIZE sizeof(GLUE_WHILE_SETUP)
182 BC_DECL_JMP(WHILE_END)
183#else
184 #define GLUE_WHILE_SETUP_SIZE 0
185 #define GLUE_WHILE_SETUP ((void *)"")
186 #define GLUE_WHILE_END_NOJUMP
187 BC_DECL(WHILE_END)
188#endif
189
190BC_DECL(WHILE_BEGIN);
191BC_DECL_JMP(WHILE_CHECK_RV)
192
193#define GLUE_MOV_PX_DIRECTVALUE_SIZE (sizeof(EEL_BC_TYPE) + sizeof(INT_PTR))
194#define GLUE_MOV_PX_DIRECTVALUE_TOSTACK_SIZE GLUE_MOV_PX_DIRECTVALUE_SIZE
195static void GLUE_MOV_PX_DIRECTVALUE_GEN(void *b, INT_PTR v, int wv)
196{
197 static const EEL_BC_TYPE tab[] = {
202 };
203 *(EEL_BC_TYPE *)b = tab[wv+1];
204 *(INT_PTR *) ((char *)b + sizeof(EEL_BC_TYPE)) = v;
205}
206
207#define GLUE_FUNC_ENTER_SIZE 0
208#define GLUE_FUNC_LEAVE_SIZE 0
209static const EEL_BC_TYPE GLUE_FUNC_ENTER[1]={-1};
210static const EEL_BC_TYPE GLUE_FUNC_LEAVE[1]={-1};
211
212static int GLUE_RESET_WTP(unsigned char *out, void *ptr)
213{
214 BC_DECL(_RESET_WTP)
215 if (out) memcpy(out,&GLUE__RESET_WTP,sizeof(GLUE__RESET_WTP));
216 if (out) *(void **) (out+sizeof(GLUE__RESET_WTP)) = ptr;
217 return sizeof(GLUE__RESET_WTP) + sizeof(void *);
218}
219
220#define GLUE_POP_PX_SIZE sizeof(EEL_BC_TYPE)
221static void GLUE_POP_PX(void *b, int wv)
222{
223 static const EEL_BC_TYPE tab[3] ={
227 };
228 *(EEL_BC_TYPE *)b = tab[wv];
229}
230
231#define GLUE_SET_PX_FROM_P1_SIZE sizeof(EEL_BC_TYPE)
232static void GLUE_SET_PX_FROM_P1(void *b, int wv)
233{
234 static const unsigned int tab[3]={
238 };
239 *(EEL_BC_TYPE *)b = tab[wv];
240}
241
242#define GLUE_MOVE_STACK_SIZE (sizeof(EEL_BC_TYPE) + sizeof(int))
243static void GLUE_MOVE_STACK(void *b, int amt)
244{
245 *(EEL_BC_TYPE *)b = EEL_BC_MOVE_STACK;
246 *(int *)(((EEL_BC_TYPE *)b)+1) = amt;
247}
248#define GLUE_STORE_P1_TO_STACK_AT_OFFS_SIZE(x) (sizeof(EEL_BC_TYPE) + sizeof(int))
249static void GLUE_STORE_P1_TO_STACK_AT_OFFS(void *b, int offs)
250{
251 *(EEL_BC_TYPE *)b = EEL_BC_STORE_P1_TO_STACK_AT_OFFS;
252 *(int *)(((EEL_BC_TYPE *)b)+1) = offs;
253}
254
255#define GLUE_MOVE_PX_STACKPTR_SIZE sizeof(EEL_BC_TYPE)
256static void GLUE_MOVE_PX_STACKPTR_GEN(void *b, int wv)
257{
258 static const EEL_BC_TYPE tab[3] = {
262 };
263 *(EEL_BC_TYPE *)b = tab[wv];
264}
265
266
267static int GLUE_POP_VALUE_TO_ADDR(unsigned char *buf, void *destptr)
268{
269 if (buf)
270 {
271 *(EEL_BC_TYPE *)buf = EEL_BC_POP_VALUE_TO_ADDR;
272 *(void **) (buf+sizeof(EEL_BC_TYPE)) = destptr;
273 }
274 return sizeof(EEL_BC_TYPE) + sizeof(void *);
275}
276
277static int GLUE_COPY_VALUE_AT_P1_TO_PTR(unsigned char *buf, void *destptr)
278{
279 if (buf)
280 {
281 *(EEL_BC_TYPE *)buf = EEL_BC_COPY_VALUE_AT_P1_TO_ADDR;
282 *(void **) (buf+sizeof(EEL_BC_TYPE)) = destptr;
283 }
284 return sizeof(EEL_BC_TYPE) + sizeof(void *);
285}
286
287
288
289
290static unsigned char *EEL_GLUE_set_immediate(void *_p, INT_PTR newv)
291{
292 int mv=5;
293 char *p=(char*)_p;
294 p+=sizeof(EEL_BC_TYPE);
295 while (*(INT_PTR*)p && mv-- > 0) p++;
296 if (!mv) return (unsigned char *)p;
297
298 *(INT_PTR *)p = newv;
299 return (unsigned char *) p + sizeof(INT_PTR) - sizeof(EEL_BC_TYPE);
300}
301
302#define GLUE_SET_PX_FROM_WTP_SIZE sizeof(EEL_BC_TYPE)
303static void GLUE_SET_PX_FROM_WTP(void *b, int wv)
304{
305 static const EEL_BC_TYPE tab[3]={
309 };
310 *(EEL_BC_TYPE *)b = tab[wv];
311}
312
313static int GLUE_POP_FPSTACK_TO_PTR(unsigned char *buf, void *destptr)
314{
315 if (buf)
316 {
317 *(EEL_BC_TYPE *)buf = EEL_BC_POP_FPSTACK_TO_PTR;
318 *(void **) (buf+sizeof(EEL_BC_TYPE)) = destptr;
319 }
320 return sizeof(EEL_BC_TYPE) + sizeof(void *);
321}
322
323 #define GLUE_PUSH_VAL_AT_PX_TO_FPSTACK_SIZE sizeof(EEL_BC_TYPE)
324 static void GLUE_PUSH_VAL_AT_PX_TO_FPSTACK(void *b, int wv)
325 {
326 static const EEL_BC_TYPE tab[3] = {
330 };
331 *(EEL_BC_TYPE *)b = tab[wv];
332 }
333
334#define GLUE_POP_FPSTACK_TO_WTP_TO_PX_SIZE (sizeof(GLUE_POP_FPSTACK_TO_WTP) + GLUE_SET_PX_FROM_WTP_SIZE)
335static void GLUE_POP_FPSTACK_TO_WTP_TO_PX(unsigned char *buf, int wv)
336{
337 GLUE_SET_PX_FROM_WTP(buf,wv);
339};
340
341static unsigned char GLUE_POP_STACK_TO_FPSTACK[1] = { 0 }; // todo
342
343#define GLUE_INLINE_LOOPS
344
345// end of bytecode glue, now for stubbage
346
347
348#define BC_DECL_OPCODESZ(n) (1 + ((n)*sizeof(INT_PTR))/sizeof(EEL_BC_TYPE))
349#define BC_DECLASM_N(x,y,n) static EEL_BC_TYPE nseel_asm_##x[1 + BC_DECL_OPCODESZ(n)]={BC_DECL_OPCODESZ(n),EEL_BC_##y };
350#define BC_DECLASM_N2(x,y,n) static EEL_BC_TYPE _asm_##x[1 + BC_DECL_OPCODESZ(n)]={BC_DECL_OPCODESZ(n),EEL_BC_##y };
351#define BC_DECLASM_N_EXPORT(x,y,n) EEL_BC_TYPE _asm_##x[1 + BC_DECL_OPCODESZ(n)]={BC_DECL_OPCODESZ(n),EEL_BC_##y };
352#define BC_DECLASM(x,y) BC_DECLASM_N(x,y,0)
353
354BC_DECLASM(band,NOP)
355BC_DECLASM(bor,NOP)
356
357BC_DECLASM(bnot,BNOT)
358BC_DECLASM(equal,EQUAL)
359BC_DECLASM(equal_exact,EQUAL_EXACT)
360BC_DECLASM(notequal_exact,NOTEQUAL_EXACT)
361BC_DECLASM(notequal,NOTEQUAL)
362BC_DECLASM(above,ABOVE)
363BC_DECLASM(beloweq,BELOWEQ)
364
365BC_DECLASM(add,ADD)
366BC_DECLASM(sub,SUB)
367BC_DECLASM(mul,MUL)
368BC_DECLASM(div,DIV)
369BC_DECLASM(and,AND)
370BC_DECLASM(or,OR)
371BC_DECLASM(or0,OR0)
372BC_DECLASM(xor,XOR)
373
374BC_DECLASM(add_op,ADD_OP)
375BC_DECLASM(sub_op,SUB_OP)
376BC_DECLASM(add_op_fast,ADD_OP_FAST)
377BC_DECLASM(sub_op_fast,SUB_OP_FAST)
378BC_DECLASM(mul_op,MUL_OP)
379BC_DECLASM(div_op,DIV_OP)
380BC_DECLASM(mul_op_fast,MUL_OP_FAST)
381BC_DECLASM(div_op_fast,DIV_OP_FAST)
382BC_DECLASM(and_op,AND_OP)
383BC_DECLASM(or_op,OR_OP)
384BC_DECLASM(xor_op,XOR_OP)
385
386BC_DECLASM(uminus,UMINUS)
387
388BC_DECLASM(assign,ASSIGN)
389BC_DECLASM(assign_fast,ASSIGN_FAST)
390BC_DECLASM(assign_fast_fromfp,ASSIGN_FAST_FROMFP)
391BC_DECLASM(assign_fromfp,ASSIGN_FROMFP)
392BC_DECLASM(mod,MOD)
393BC_DECLASM(mod_op,MOD_OP)
394BC_DECLASM(shr,SHR)
395BC_DECLASM(shl,SHL)
396BC_DECLASM(sqr,SQR)
397
400BC_DECLASM(min_fp,MIN_FP)
401BC_DECLASM(max_fp,MAX_FP)
403BC_DECLASM(sign,SIGN)
404BC_DECLASM(invsqrt,INVSQRT)
405BC_DECLASM(dbg_getstackptr,DBG_GETSTACKPTR)
406
407BC_DECLASM(booltofp,BOOLTOFP)
408BC_DECLASM(fptobool,FPTOBOOL)
409BC_DECLASM(fptobool_rev,FPTOBOOL_REV)
410
411BC_DECLASM_N(stack_push,USERSTACK_PUSH,3)
412BC_DECLASM_N(stack_pop,USERSTACK_POP,3)
413BC_DECLASM_N(stack_pop_fast,USERSTACK_POPFAST,3)
414BC_DECLASM_N(stack_peek,USERSTACK_PEEK,3)
415
416BC_DECLASM_N(stack_peek_int,USERSTACK_PEEK_INT,4)
417
418BC_DECLASM_N(stack_peek_top,USERSTACK_PEEK_TOP,1)
419BC_DECLASM_N(stack_exch,USERSTACK_EXCH,1)
420
421BC_DECLASM_N(fcall,FCALL,1)
422
423BC_DECLASM_N(1pdd,CFUNC_1PDD,1)
424BC_DECLASM_N(2pdd,CFUNC_2PDD,1)
425BC_DECLASM_N(2pdds,CFUNC_2PDDS,1)
426
427BC_DECLASM_N2(megabuf,MEGABUF,0)
428BC_DECLASM_N2(gmegabuf,GMEGABUF,2)
429
430BC_DECLASM_N_EXPORT(generic1parm,GENERIC1PARM,2)
431BC_DECLASM_N_EXPORT(generic2parm,GENERIC2PARM,2)
432BC_DECLASM_N_EXPORT(generic3parm,GENERIC3PARM,2)
433BC_DECLASM_N_EXPORT(generic1parm_retd,GENERIC1PARM_RETD,2)
434BC_DECLASM_N_EXPORT(generic2parm_retd,GENERIC2PARM_RETD,2)
435BC_DECLASM_N_EXPORT(generic2xparm_retd,GENERIC2XPARM_RETD,3)
436BC_DECLASM_N_EXPORT(generic3parm_retd,GENERIC3PARM_RETD,2)
437
438
439
440static void *GLUE_realAddress(void *fn, int *size)
441{
442 EEL_BC_TYPE *rd = (EEL_BC_TYPE *)fn;
443 *size = rd[0]*sizeof(EEL_BC_TYPE);
444 return rd+1;
445}
446
447#define EEL_BC_STACKSIZE (65536)
448
449// todo: check for stack overflows! we could determine if this is possible at compile time.
450#define EEL_BC_STACK_POP_SIZE 8
451#define EEL_BC_STACK_PUSH(type, val) (*(type *)(stackptr -= EEL_BC_STACK_POP_SIZE)) = (val)
452#define EEL_BC_STACK_POP() (stackptr += EEL_BC_STACK_POP_SIZE)
453
454#define EEL_BC_TRUE ((EEL_F*)(INT_PTR)1)
455
456
457
458
460{
461 char __stack[EEL_BC_STACKSIZE];
462 char *iptr = (char*)cp;
463 char *stackptr=__stack + EEL_BC_STACKSIZE;
464 EEL_F *p1 = NULL, *p2 = NULL, *p3 = NULL, *wtp = (EEL_F*)bp;
465#define fp_top (_fpstacktop[0])
466#define fp_top2 (_fpstacktop[-1])
467#define fp_push(x) *++_fpstacktop=(x)
468#define fp_pop() (*_fpstacktop--)
469#define fp_rewind(x) (_fpstacktop -= (x))
470
471 EEL_F fpstack[GLUE_MAX_FPSTACK_SIZE];
472 EEL_F *_fpstacktop=fpstack-1;
473 for (;;)
474 {
475 EEL_BC_TYPE inst = *(EEL_BC_TYPE *)iptr;
476 iptr += sizeof(EEL_BC_TYPE);
477 switch (inst)
478 {
479 case EEL_BC_FXCH:
480 {
481 EEL_F a = fp_top;
483 fp_top2=a;
484 }
485 break;
486 case EEL_BC_POP_FPSTACK: fp_rewind(1); break;
487 case EEL_BC_NOP: break;
488 case EEL_BC_RET:
489 if (EEL_BC_STACK_POP() > __stack+EEL_BC_STACKSIZE)
490 {
491 return;
492 }
493 iptr = *(void **)(stackptr - EEL_BC_STACK_POP_SIZE);
494 break;
495 case EEL_BC_JMP_NC:
496 iptr += sizeof(GLUE_JMP_TYPE)+*(GLUE_JMP_TYPE *)iptr;
497 break;
499 iptr += p1 ? sizeof(GLUE_JMP_TYPE) : sizeof(GLUE_JMP_TYPE)+*(GLUE_JMP_TYPE *)iptr;
500 break;
502 iptr += p1 ? sizeof(GLUE_JMP_TYPE)+*(GLUE_JMP_TYPE *)iptr : sizeof(GLUE_JMP_TYPE);
503 break;
505 fp_push(**(EEL_F **)iptr);
506 iptr += sizeof(void*);
507 break;
508 case EEL_BC_MOV_P1_DV:
509 p1 = *(void **)iptr;
510 iptr += sizeof(void*);
511 break;
512 case EEL_BC_MOV_P2_DV:
513 p2 = *(void **)iptr;
514 iptr += sizeof(void*);
515 break;
516 case EEL_BC_MOV_P3_DV:
517 p3 = *(void **)iptr;
518 iptr += sizeof(void*);
519 break;
521 wtp = *(void **)iptr;
522 iptr += sizeof(void*);
523 break;
524 case EEL_BC_PUSH_P1:
525 EEL_BC_STACK_PUSH(void *, p1);
526 break;
528 EEL_BC_STACK_PUSH(EEL_F, *p1);
529 break;
530 case EEL_BC_POP_P1:
531 p1 = *(EEL_F **) stackptr;
533 break;
534 case EEL_BC_POP_P2:
535 p2 = *(EEL_F **) stackptr;
537 break;
538 case EEL_BC_POP_P3:
539 p3 = *(EEL_F **) stackptr;
541 break;
543 **(EEL_F**)iptr = *(EEL_F *)stackptr;
545 iptr += sizeof(void*);
546 break;
548 stackptr += *(int *)iptr;
549 iptr += sizeof(int);
550 break;
552 *(void **) (stackptr + *(int *)iptr) = p1;
553 iptr += sizeof(int);
554 break;
556 p1 = (double *)stackptr;
557 break;
559 p2 = (double *)stackptr;
560 break;
562 p3 = (double *)stackptr;
563 break;
565 p2=p1;
566 break;
568 p3=p1;
569 break;
571 **(EEL_F **)iptr = *p1;
572 iptr += sizeof(void*);
573 break;
575 p1 = wtp;
576 break;
578 p2 = wtp;
579 break;
581 p3 = wtp;
582 break;
584 **((EEL_F **)iptr) = fp_pop();
585 iptr += sizeof(void *);
586 break;
588 EEL_BC_STACK_PUSH(EEL_F, fp_pop());
589 break;
591 fp_push(*p1);
592 break;
594 fp_push(*p2);
595 break;
597 fp_push(*p3);
598 break;
600 *wtp++ = fp_pop();
601 break;
602 case EEL_BC_SET_P1_Z:
603 p1=NULL;
604 break;
605 case EEL_BC_SET_P1_NZ:
606 p1 = EEL_BC_TRUE;
607 break;
608
610 if ((EEL_BC_STACK_PUSH(int, (int)fp_pop())) < 1)
611 {
613 iptr+= sizeof(GLUE_JMP_TYPE)+*(GLUE_JMP_TYPE *)iptr;
614 }
615 else
616 {
617 iptr += sizeof(GLUE_JMP_TYPE);
618#if NSEEL_LOOPFUNC_SUPPORT_MAXLEN > 0
619 if ((*(int *)stackptr) > NSEEL_LOOPFUNC_SUPPORT_MAXLEN) (*(int *)stackptr) = NSEEL_LOOPFUNC_SUPPORT_MAXLEN;
620#endif
621 EEL_BC_STACK_PUSH(void *, wtp);
622 }
623 break;
624 case EEL_BC_LOOP_END:
625 wtp = *(void **) (stackptr);
626 if (--(*(int *)(stackptr+EEL_BC_STACK_POP_SIZE)) <= 0)
627 {
628 stackptr += EEL_BC_STACK_POP_SIZE*2;
629 iptr += sizeof(GLUE_JMP_TYPE);
630 }
631 else
632 {
633 iptr += sizeof(GLUE_JMP_TYPE)+*(GLUE_JMP_TYPE *)iptr; // back to the start!
634 }
635 break;
636
637#if NSEEL_LOOPFUNC_SUPPORT_MAXLEN > 0
638 case EEL_BC_WHILE_SETUP:
640 break;
641#endif
643 EEL_BC_STACK_PUSH(void *, wtp);
644 break;
645 case EEL_BC_WHILE_END:
646 wtp = *(EEL_F **) stackptr;
648
649#if NSEEL_LOOPFUNC_SUPPORT_MAXLEN > 0
650 if (--(*(int *)stackptr) <= 0)
651 {
653 iptr += sizeof(GLUE_JMP_TYPE)+*(GLUE_JMP_TYPE *)iptr; // endpt
654 }
655 else
656 {
657 iptr += sizeof(GLUE_JMP_TYPE);
658 }
659#endif
660 break;
662 if (p1)
663 {
664 iptr += sizeof(GLUE_JMP_TYPE)+*(GLUE_JMP_TYPE *)iptr; // loop
665 }
666 else
667 {
668 // done
669#if NSEEL_LOOPFUNC_SUPPORT_MAXLEN > 0
671#endif
672 iptr += sizeof(GLUE_JMP_TYPE);
673 }
674 break;
675 case EEL_BC_BNOT:
676 p1 = p1 ? NULL : EEL_BC_TRUE;
677 break;
678 case EEL_BC_EQUAL:
680 fp_rewind(2);
681 break;
683 p1 = fp_top == fp_top2 ? EEL_BC_TRUE : NULL;
684 fp_rewind(2);
685 break;
686 case EEL_BC_NOTEQUAL:
687 p1 = fabs(fp_top - fp_top2) >= NSEEL_CLOSEFACTOR ? EEL_BC_TRUE : NULL;
688 fp_rewind(2);
689 break;
691 p1 = fp_top != fp_top2 ? EEL_BC_TRUE : NULL;
692 fp_rewind(2);
693 break;
694 case EEL_BC_ABOVE:
695 p1 = fp_top < fp_top2 ? EEL_BC_TRUE : NULL;
696 fp_rewind(2);
697 break;
698 case EEL_BC_BELOWEQ:
699 p1 = fp_top >= fp_top2 ? EEL_BC_TRUE : NULL;
700 fp_rewind(2);
701 break;
702
703 case EEL_BC_ADD:
704 fp_top2 += fp_top;
705 fp_rewind(1);
706 break;
707 case EEL_BC_SUB:
708 fp_top2 -= fp_top;
709 fp_rewind(1);
710 break;
711 case EEL_BC_MUL:
712 fp_top2 *= fp_top;
713 fp_rewind(1);
714 break;
715 case EEL_BC_DIV:
716 fp_top2 /= fp_top;
717 fp_rewind(1);
718 break;
719 case EEL_BC_AND:
720 fp_top2 = (EEL_F) (((WDL_INT64)fp_top) & (WDL_INT64)(fp_top2));
721 fp_rewind(1);
722 break;
723 case EEL_BC_OR:
724 fp_top2 = (EEL_F) (((WDL_INT64)fp_top) | (WDL_INT64)(fp_top2));
725 fp_rewind(1);
726 break;
727 case EEL_BC_OR0:
728 fp_top = (EEL_F) ((WDL_INT64)(fp_top));
729 break;
730 case EEL_BC_XOR:
731 fp_top2 = (EEL_F) (((WDL_INT64)fp_top) ^ (WDL_INT64)(fp_top2));
732 fp_rewind(1);
733 break;
734
735 case EEL_BC_ADD_OP:
736 *(p1 = p2) = denormal_filter_double2(*p2 + fp_pop());
737 break;
738 case EEL_BC_SUB_OP:
739 *(p1 = p2) = denormal_filter_double2(*p2 - fp_pop());
740 break;
742 *(p1 = p2) += fp_pop();
743 break;
745 *(p1 = p2) -= fp_pop();
746 break;
747 case EEL_BC_MUL_OP:
748 *(p1 = p2) = denormal_filter_double2(*p2 * fp_pop());
749 break;
750 case EEL_BC_DIV_OP:
751 *(p1 = p2) = denormal_filter_double2(*p2 / fp_pop());
752 break;
754 *(p1 = p2) *= fp_pop();
755 break;
757 *(p1 = p2) /= fp_pop();
758 break;
759 case EEL_BC_AND_OP:
760 p1 = p2;
761 *p2 = (EEL_F) (((WDL_INT64)*p2) & (WDL_INT64)fp_pop());
762 break;
763 case EEL_BC_OR_OP:
764 p1 = p2;
765 *p2 = (EEL_F) (((WDL_INT64)*p2) | (WDL_INT64)fp_pop());
766 break;
767 case EEL_BC_XOR_OP:
768 p1 = p2;
769 *p2 = (EEL_F) (((WDL_INT64)*p2) ^ (WDL_INT64)fp_pop());
770 break;
771 case EEL_BC_UMINUS:
772 fp_top = -fp_top;
773 break;
774 case EEL_BC_ASSIGN:
775 *p2 = denormal_filter_double2(*p1);
776 p1 = p2;
777 break;
779 *p2 = *p1;
780 p1 = p2;
781 break;
783 *p2 = fp_pop();
784 p1 = p2;
785 break;
788 p1 = p2;
789 break;
790 case EEL_BC_MOD:
791 {
792 int a = (int) (fp_pop());
793 fp_top = a ? (EEL_F) ((int)fp_top % a) : 0.0;
794 }
795 break;
796 case EEL_BC_MOD_OP:
797 {
798 int a = (int) (fp_pop());
799 *p2 = a ? (EEL_F) ((int)*p2 % a) : 0.0;
800 p1=p2;
801
802 }
803 break;
804 case EEL_BC_SHR:
805 fp_top2 = (EEL_F) (((int)fp_top2) >> (int)fp_top);
806 fp_rewind(1);
807 break;
808 case EEL_BC_SHL:
809 fp_top2 = (EEL_F) (((int)fp_top2) << (int)fp_top);
810 fp_rewind(1);
811 break;
812 case EEL_BC_SQR:
813 fp_top *= fp_top;
814 break;
815 case EEL_BC_MIN:
816 if (*p1 > *p2) p1 = p2;
817 break;
818 case EEL_BC_MAX:
819 if (*p1 < *p2) p1 = p2;
820 break;
821 case EEL_BC_MIN_FP:
822 {
823 EEL_F a=fp_pop();
824 if (a<fp_top) fp_top=a;
825 }
826 break;
827 case EEL_BC_MAX_FP:
828 {
829 EEL_F a=fp_pop();
830 if (a>fp_top) fp_top=a;
831 }
832 break;
833 case EEL_BC_ABS:
834 fp_top = fabs(fp_top);
835 break;
836 case EEL_BC_SIGN:
837 if (fp_top<0.0) fp_top=-1.0;
838 else if (fp_top>0.0) fp_top=1.0;
839 break;
841 fp_top = (int)(stackptr - __stack);
842 break;
843 case EEL_BC_INVSQRT:
844 {
845 float y = (float)fp_top;
846 int i = 0x5f3759df - ( (* (int *) &y) >> 1 );
847 y = *(float *) &i;
848 fp_top = y * ( 1.5F - ( (fp_top * 0.5) * y * y ) );
849 }
850 break;
851 case EEL_BC_FCALL:
852 {
853 char *newiptr = *(char **)iptr;
854 EEL_BC_STACK_PUSH(void *, (iptr += sizeof(void *)));
855 iptr = newiptr;
856 }
857 break;
858 case EEL_BC_BOOLTOFP:
859 fp_push(p1 ? 1.0 : 0.0);
860 break;
861 case EEL_BC_FPTOBOOL:
862 p1 = fabs(fp_pop()) >= NSEEL_CLOSEFACTOR ? EEL_BC_TRUE : NULL;
863 break;
865 p1 = fabs(fp_pop()) < NSEEL_CLOSEFACTOR ? EEL_BC_TRUE : NULL;
866 break;
867
869 {
870 double (*f)(double) = *(double (**)(double)) iptr;
871 fp_top = f(fp_top);
872 iptr += sizeof(void *);
873 }
874 break;
876 {
877 double (*f)(double,double) = *(double (**)(double,double))iptr;
879 fp_rewind(1);
880 iptr += sizeof(void *);
881 }
882 break;
884 {
885 double (*f)(double,double) = *(double (**)(double,double))iptr;
886 *p2 = f(*p2,fp_pop());
887 p1 = p2;
888 iptr += sizeof(void *);
889 }
890 break;
891
892 case EEL_BC_MEGABUF:
893 {
894 unsigned int idx=(unsigned int) (fp_pop() + NSEEL_CLOSEFACTOR);
895 EEL_F **f = (EEL_F **)rt,*f2;
897 (f2 + (idx&(NSEEL_RAM_ITEMSPERBLOCK-1))) :
898 __NSEEL_RAMAlloc((void*)rt,idx);
899 }
900 break;
901 case EEL_BC_GMEGABUF:
902 {
903 p1 = __NSEEL_RAMAllocGMEM(*(EEL_F ****)iptr,(int) (fp_pop() + NSEEL_CLOSEFACTOR));
904 iptr += sizeof(void *)*2; // also includes ptr to __NSEEL_RAMAllocGMEM, which we ignore
905 }
906 break;
908 {
909 EEL_F *(*f)(void *,EEL_F*) = *(EEL_F *(**)(void *, EEL_F *)) (iptr+sizeof(void *));
910 p1 = f(*(void **)iptr,p1);
911 iptr += sizeof(void *)*2;
912 }
913 break;
915 {
916 EEL_F *(*f)(void *,EEL_F*,EEL_F*) = *(EEL_F *(**)(void *, EEL_F *, EEL_F *)) (iptr+sizeof(void *));
917 p1 = f(*(void **)iptr,p2, p1);
918 iptr += sizeof(void *)*2;
919 }
920 break;
922 {
923 EEL_F *(*f)(void *,EEL_F*,EEL_F*,EEL_F*) = *(EEL_F *(**)(void *, EEL_F *, EEL_F *, EEL_F *)) (iptr+sizeof(void *));
924 p1 = f(*(void **)iptr,p3, p2, p1);
925 iptr += sizeof(void *)*2;
926 }
927 break;
929 {
930 EEL_F (*f)(void *,EEL_F*) = *(EEL_F (**)(void *, EEL_F *)) (iptr+sizeof(void *));
931 fp_push(f(*(void **)iptr,p1));
932 iptr += sizeof(void *)*2;
933 }
934 break;
936 {
937 EEL_F (*f)(void *,EEL_F*,EEL_F*) = *(EEL_F (**)(void *, EEL_F *, EEL_F *)) (iptr+sizeof(void *));
938 fp_push(f(*(void **)iptr,p2, p1));
939 iptr += sizeof(void *)*2;
940 }
941 break;
943 {
944 EEL_F (*f)(void *,void *,EEL_F*,EEL_F*) = *(EEL_F (**)(void *, void *, EEL_F *, EEL_F *)) (iptr+2*sizeof(void *));
945 fp_push(f(*(void **)iptr,((void **)iptr)[1],p2, p1));
946 iptr += sizeof(void *)*3;
947 }
948 break;
950 {
951 EEL_F (*f)(void *,EEL_F*,EEL_F*,EEL_F*) = *(EEL_F (**)(void *, EEL_F *, EEL_F *, EEL_F *)) (iptr+sizeof(void *));
952 fp_push(f(*(void **)iptr,p3, p2, p1));
953 iptr += sizeof(void *)*2;
954 }
955 break;
956
958 {
959 UINT_PTR *sptr = *(UINT_PTR **)iptr;
960 (*sptr) += 8;
961 (*sptr) &= *(UINT_PTR*)(iptr+sizeof(void *));
962 (*sptr) |= *(UINT_PTR*)(iptr+2*sizeof(void *));
963 *(EEL_F *)*sptr = *p1;
964 }
965 iptr += sizeof(void*)*3;
966 break;
968 {
969 UINT_PTR *sptr = *(UINT_PTR **)iptr;
970 *p1 = *(EEL_F *)*sptr;
971 (*sptr) -= 8;
972 (*sptr) &= *(UINT_PTR*)(iptr+sizeof(void *));
973 (*sptr) |= *(UINT_PTR*)(iptr+2*sizeof(void *));
974 }
975 iptr += sizeof(void*)*3;
976 break;
978 {
979 UINT_PTR *sptr = *(UINT_PTR **)iptr;
980 p1 = (EEL_F *)*sptr;
981 (*sptr) -= 8;
982 (*sptr) &= *(UINT_PTR*)(iptr+sizeof(void *));
983 (*sptr) |= *(UINT_PTR*)(iptr+2*sizeof(void *));
984 }
985 iptr += sizeof(void*)*3;
986 break;
988 {
989 UINT_PTR sptr = **(UINT_PTR **)iptr;
990 sptr -= sizeof(EEL_F) * (int)(fp_pop());
991 sptr &= *(UINT_PTR*)(iptr+sizeof(void *));
992 sptr |= *(UINT_PTR*)(iptr+2*sizeof(void *));
993 p1 = (EEL_F *)sptr;
994 }
995 iptr += sizeof(void*)*3;
996 break;
998 {
999 UINT_PTR sptr = **(UINT_PTR **)iptr;
1000 sptr -= *(UINT_PTR*)(iptr+sizeof(void*));
1001 sptr &= *(UINT_PTR*)(iptr+2*sizeof(void *));
1002 sptr |= *(UINT_PTR*)(iptr+3*sizeof(void *));
1003 p1 = (EEL_F *)sptr;
1004 }
1005 iptr += sizeof(void*)*4;
1006 break;
1008 p1 = **(EEL_F ***)iptr;
1009 iptr += sizeof(void*);
1010 break;
1012 {
1013 EEL_F *p=**(EEL_F ***)iptr;
1014 EEL_F a=*p;
1015 *p=*p1;
1016 *p1=a;
1017 }
1018 iptr += sizeof(void*);
1019 break;
1020 }
1021 }
1022#undef fp_top
1023#undef fp_top2
1024#undef fp_pop
1025#undef fp_push
1026};
1027
1028#endif
#define RET(cond)
#define NULL
Definition CarlaBridgeFormat.cpp:30
uint8_t a
Definition Spc_Cpu.h:141
float abs(const fft_t *freqs, off_t x)
Definition OscilGen.cpp:52
#define MOD(a)
Definition adler32.c:52
#define xor
int y
Definition inflate.c:1588
unsigned v[N_MAX]
Definition inflate.c:1584
register unsigned i
Definition inflate.c:1575
unsigned f
Definition inflate.c:1572
#define EQUAL
Definition deflate.c:157
static double WDL_DENORMAL_INLINE denormal_filter_double2(double a)
Definition denormal.h:109
#define GLUE_SET_PX_FROM_WTP_SIZE
Definition glue_aarch64.h:281
static void * GLUE_realAddress(void *fn, int *size)
Definition glue_aarch64.h:329
static const unsigned int GLUE_FUNC_LEAVE[1]
Definition glue_aarch64.h:106
static const unsigned int GLUE_POP_FPSTACK_TO_WTP[]
Definition glue_aarch64.h:308
#define GLUE_MAX_FPSTACK_SIZE
Definition glue_aarch64.h:50
static const unsigned int GLUE_FUNC_ENTER[2]
Definition glue_aarch64.h:104
#define GLUE_CALL_CODE(bp, cp, rt)
Definition glue_aarch64.h:217
INT_PTR INT_PTR rt
Definition glue_arm.h:222
static void GLUE_MOVE_STACK(void *b, int amt)
Definition glue_port.h:243
static void GLUE_SET_PX_FROM_WTP(void *b, int wv)
Definition glue_port.h:303
#define EEL_BC_TRUE
Definition glue_port.h:454
#define BC_DECL(x)
Definition glue_port.h:155
static void GLUE_POP_FPSTACK_TO_WTP_TO_PX(unsigned char *buf, int wv)
Definition glue_port.h:335
static void GLUE_MOV_PX_DIRECTVALUE_GEN(void *b, INT_PTR v, int wv)
Definition glue_port.h:195
#define GLUE_JMP_TYPE
Definition glue_port.h:6
#define fp_top
@ EEL_BC_SET_P1_FROM_WTP
Definition glue_port.h:42
@ EEL_BC_MOV_P1_DV
Definition glue_port.h:21
@ EEL_BC_STORE_P1_TO_STACK_AT_OFFS
Definition glue_port.h:34
@ EEL_BC_JMP_IF_P1_NZ
Definition glue_port.h:18
@ EEL_BC_GENERIC3PARM
Definition glue_port.h:137
@ EEL_BC_USERSTACK_PEEK_INT
Definition glue_port.h:147
@ EEL_BC_POP_VALUE_TO_ADDR
Definition glue_port.h:31
@ EEL_BC_GENERIC2PARM
Definition glue_port.h:136
@ EEL_BC_MIN_FP
Definition glue_port.h:114
@ EEL_BC_EQUAL_EXACT
Definition glue_port.h:72
@ EEL_BC_MOD
Definition glue_port.h:106
@ EEL_BC_COPY_VALUE_AT_P1_TO_ADDR
Definition glue_port.h:41
@ EEL_BC_CFUNC_1PDD
Definition glue_port.h:128
@ EEL_BC_JMP_NC
Definition glue_port.h:16
@ EEL_BC_DIV
Definition glue_port.h:82
@ EEL_BC_FCALL
Definition glue_port.h:123
@ EEL_BC_MOV_P3_DV
Definition glue_port.h:23
@ EEL_BC_POP_FPSTACK_TO_WTP
Definition glue_port.h:52
@ EEL_BC_DIV_OP_FAST
Definition glue_port.h:95
@ EEL_BC_SET_P1_NZ
Definition glue_port.h:54
@ EEL_BC_JMP_IF_P1_Z
Definition glue_port.h:17
@ EEL_BC_PUSH_VAL_AT_P1_TO_FPSTACK
Definition glue_port.h:49
@ EEL_BC_GMEGABUF
Definition glue_port.h:133
@ EEL_BC_CFUNC_2PDD
Definition glue_port.h:129
@ EEL_BC_GENERIC1PARM
Definition glue_port.h:135
@ EEL_BC_GENERIC3PARM_RETD
Definition glue_port.h:141
@ EEL_BC_MUL_OP_FAST
Definition glue_port.h:94
@ EEL_BC_GENERIC1PARM_RETD
Definition glue_port.h:138
@ EEL_BC_INVSQRT
Definition glue_port.h:118
@ EEL_BC_NOTEQUAL
Definition glue_port.h:73
@ EEL_BC_POP_FPSTACK
Definition glue_port.h:121
@ EEL_BC_EQUAL
Definition glue_port.h:71
@ EEL_BC_DBG_GETSTACKPTR
Definition glue_port.h:151
@ EEL_BC_NOTEQUAL_EXACT
Definition glue_port.h:74
@ EEL_BC_AND_OP
Definition glue_port.h:96
@ EEL_BC_RET
Definition glue_port.h:15
@ EEL_BC_MUL_OP
Definition glue_port.h:92
@ EEL_BC_ASSIGN_FAST
Definition glue_port.h:103
@ EEL_BC_POP_P2
Definition glue_port.h:29
@ EEL_BC_MOVE_STACK
Definition glue_port.h:33
@ EEL_BC_ADD
Definition glue_port.h:79
@ EEL_BC_USERSTACK_EXCH
Definition glue_port.h:149
@ EEL_BC_NOP
Definition glue_port.h:14
@ EEL_BC_AND
Definition glue_port.h:83
@ EEL_BC_OR0
Definition glue_port.h:85
@ EEL_BC_MOVE_STACKPTR_TO_P1
Definition glue_port.h:35
@ EEL_BC_SET_P3_FROM_P1
Definition glue_port.h:40
@ EEL_BC_GENERIC2XPARM_RETD
Definition glue_port.h:140
@ EEL_BC_ADD_OP
Definition glue_port.h:88
@ EEL_BC_MIN
Definition glue_port.h:112
@ EEL_BC_LOOP_LOADCNT
Definition glue_port.h:57
@ EEL_BC_FPTOBOOL
Definition glue_port.h:125
@ EEL_BC_FPTOBOOL_REV
Definition glue_port.h:126
@ EEL_BC_XOR_OP
Definition glue_port.h:98
@ EEL_BC_SHR
Definition glue_port.h:108
@ EEL_BC_ABOVE
Definition glue_port.h:75
@ EEL_BC_MOVE_STACKPTR_TO_P3
Definition glue_port.h:37
@ EEL_BC_USERSTACK_POP
Definition glue_port.h:144
@ EEL_BC_USERSTACK_PEEK
Definition glue_port.h:146
@ EEL_BC_CFUNC_2PDDS
Definition glue_port.h:130
@ EEL_BC_GENERIC2PARM_RETD
Definition glue_port.h:139
@ EEL_BC_SQR
Definition glue_port.h:111
@ EEL_BC_UMINUS
Definition glue_port.h:100
@ EEL_BC_ASSIGN_FROMFP
Definition glue_port.h:105
@ EEL_BC_SUB_OP_FAST
Definition glue_port.h:91
@ EEL_BC_SIGN
Definition glue_port.h:117
@ EEL_BC_LOOP_END
Definition glue_port.h:58
@ EEL_BC_FXCH
Definition glue_port.h:120
@ EEL_BC_MUL
Definition glue_port.h:81
@ EEL_BC_SET_P2_FROM_WTP
Definition glue_port.h:43
@ EEL_BC__RESET_WTP
Definition glue_port.h:24
@ EEL_BC_XOR
Definition glue_port.h:86
@ EEL_BC_USERSTACK_PEEK_TOP
Definition glue_port.h:148
@ EEL_BC_WHILE_CHECK_RV
Definition glue_port.h:66
@ EEL_BC_PUSH_P1
Definition glue_port.h:26
@ EEL_BC_SET_P2_FROM_P1
Definition glue_port.h:39
@ EEL_BC_MOD_OP
Definition glue_port.h:107
@ EEL_BC_PUSH_VAL_AT_P3_TO_FPSTACK
Definition glue_port.h:51
@ EEL_BC_WHILE_BEGIN
Definition glue_port.h:64
@ EEL_BC_POP_FPSTACK_TO_PTR
Definition glue_port.h:46
@ EEL_BC_USERSTACK_POPFAST
Definition glue_port.h:145
@ EEL_BC_MOV_P2_DV
Definition glue_port.h:22
@ EEL_BC_DIV_OP
Definition glue_port.h:93
@ EEL_BC_OR
Definition glue_port.h:84
@ EEL_BC_SUB_OP
Definition glue_port.h:89
@ EEL_BC_MEGABUF
Definition glue_port.h:132
@ EEL_BC_OR_OP
Definition glue_port.h:97
@ EEL_BC_SET_P3_FROM_WTP
Definition glue_port.h:44
@ EEL_BC_ADD_OP_FAST
Definition glue_port.h:90
@ EEL_BC_ASSIGN_FAST_FROMFP
Definition glue_port.h:104
@ EEL_BC_BELOWEQ
Definition glue_port.h:76
@ EEL_BC_ABS
Definition glue_port.h:116
@ EEL_BC_BNOT
Definition glue_port.h:70
@ EEL_BC_SUB
Definition glue_port.h:80
@ EEL_BC_POP_P3
Definition glue_port.h:30
@ EEL_BC_MOVE_STACKPTR_TO_P2
Definition glue_port.h:36
@ EEL_BC_POP_FPSTACK_TOSTACK
Definition glue_port.h:47
@ EEL_BC_PUSH_P1PTR_AS_VALUE
Definition glue_port.h:27
@ EEL_BC_MOV_FPTOP_DV
Definition glue_port.h:20
@ EEL_BC_BOOLTOFP
Definition glue_port.h:124
@ EEL_BC_ASSIGN
Definition glue_port.h:102
@ EEL_BC_SET_P1_Z
Definition glue_port.h:53
@ EEL_BC_SHL
Definition glue_port.h:109
@ EEL_BC_POP_P1
Definition glue_port.h:28
@ EEL_BC_PUSH_VAL_AT_P2_TO_FPSTACK
Definition glue_port.h:50
@ EEL_BC_MAX_FP
Definition glue_port.h:115
@ EEL_BC_WHILE_END
Definition glue_port.h:65
@ EEL_BC_MAX
Definition glue_port.h:113
@ EEL_BC_USERSTACK_PUSH
Definition glue_port.h:143
#define fp_pop()
static unsigned char GLUE_POP_STACK_TO_FPSTACK[1]
Definition glue_port.h:341
#define fp_rewind(x)
#define EEL_BC_STACKSIZE
Definition glue_port.h:447
static int GLUE_RESET_WTP(unsigned char *out, void *ptr)
Definition glue_port.h:212
static int GLUE_POP_VALUE_TO_ADDR(unsigned char *buf, void *destptr)
Definition glue_port.h:267
#define EEL_BC_STACK_POP()
Definition glue_port.h:452
static void GLUE_MOVE_PX_STACKPTR_GEN(void *b, int wv)
Definition glue_port.h:256
#define fp_push(x)
#define EEL_BC_STACK_PUSH(type, val)
Definition glue_port.h:451
#define EEL_BC_STACK_POP_SIZE
Definition glue_port.h:450
#define BC_DECL_JMP(x)
Definition glue_port.h:156
#define fp_top2
static void GLUE_STORE_P1_TO_STACK_AT_OFFS(void *b, int offs)
Definition glue_port.h:249
static void GLUE_POP_PX(void *b, int wv)
Definition glue_port.h:221
#define BC_DECLASM_N_EXPORT(x, y, n)
Definition glue_port.h:351
static int GLUE_POP_FPSTACK_TO_PTR(unsigned char *buf, void *destptr)
Definition glue_port.h:313
static unsigned char * EEL_GLUE_set_immediate(void *_p, INT_PTR newv)
Definition glue_port.h:290
#define BC_DECLASM(x, y)
Definition glue_port.h:352
#define BC_DECLASM_N2(x, y, n)
Definition glue_port.h:350
static void GLUE_PUSH_VAL_AT_PX_TO_FPSTACK(void *b, int wv)
Definition glue_port.h:324
static void GLUE_SET_PX_FROM_P1(void *b, int wv)
Definition glue_port.h:232
#define BC_DECLASM_N(x, y, n)
Definition glue_port.h:349
static int GLUE_COPY_VALUE_AT_P1_TO_PTR(unsigned char *buf, void *destptr)
Definition glue_port.h:277
float out
Definition lilv_test.c:1461
EEL_F *NSEEL_CGEN_CALL __NSEEL_RAMAlloc(EEL_F **blocks, unsigned int w)
Definition nseel-ram.c:139
EEL_F *NSEEL_CGEN_CALL __NSEEL_RAMAllocGMEM(EEL_F ***blocks, unsigned int w)
Definition nseel-ram.c:98
#define NSEEL_CLOSEFACTOR
Definition ns-eel-int.h:101
#define NSEEL_RAM_ITEMSPERBLOCK
Definition ns-eel.h:235
#define NSEEL_RAM_BLOCKS
Definition ns-eel.h:234
#define NSEEL_LOOPFUNC_SUPPORT_MAXLEN
Definition ns-eel.h:209
#define min(x, y)
Definition os.h:74
#define max(x, y)
Definition os.h:78
const char const char const char const char char * fn
Definition swell-functions.h:168
uintptr_t UINT_PTR
Definition swell-types.h:43
intptr_t INT_PTR
Definition swell-types.h:42
#define ABS(x)
Definition tap_reverb.h:116
uch * p
Definition crypt.c:594
memcpy(hh, h, RAND_HEAD_LEN)
b
Definition crypt.c:628
ulg size
Definition extract.c:2350
char * cp
Definition unix.c:513
typedef int(UZ_EXP MsgFn)()
#define MIN(a, b)
Definition unzpriv.h:2649
#define MAX(a, b)
Definition unzpriv.h:2646
long long WDL_INT64
Definition wdltypes.h:11