Changes: Christian Ullrich
- $Id: stack.h 5365 2006-09-06 10:56:43Z edwin $
+ $Id: stack.h 5367 2006-09-06 11:12:55Z edwin $
*/
} while (0)
-/*--------------------------------------------------*/
-/* STACK OPERATIONS MODELING */
-/*--------------------------------------------------*/
-
-/* The following macros are used to model the stack manipulations of
- * different kinds of instructions.
- *
- * These macros check the input stackdepth and they set the output
- * stackdepth and the output stack of the instruction (iptr->dst).
- *
- * These macros do *not* check for stack overflows!
- */
-
-#define PUSHCONST(s){NEWSTACKn(s,stackdepth);SETDST;stackdepth++;}
-#define LOAD(s,v,n) {NEWSTACK(s,v,n);SETDST;stackdepth++;}
-#define STORE(s) {REQUIRE_1;POP(s);SETDST;stackdepth--;}
-
-#define OP1_0(s) \
- do { \
- REQUIRE_1; \
- POP(s); \
- SETDST; \
- stackdepth--; \
- } while (0)
-
-#define OP1_0ANY \
- do { \
- REQUIRE_1; \
- POPANY; \
- SETDST; \
- stackdepth--; \
- } while (0)
-
-#define OP0_1(s) \
- do { \
- NEWSTACKn(s, stackdepth); \
- SETDST; \
- stackdepth++; \
- } while (0)
-
-#define OP1_1(s,d) \
- do { \
- REQUIRE_1; \
- POP(s); \
- NEWSTACKn(d, stackdepth - 1);\
- SETDST; \
- } while (0)
-
-#define OP2_0(s) \
- do { \
- REQUIRE_2; \
- POP(s); \
- POP(s); \
- SETDST; \
- stackdepth -= 2; \
- } while (0)
-
-#define OPTT2_0(t,b) \
- do { \
- REQUIRE_2; \
- POP(t); \
- POP(b); \
- SETDST; \
- stackdepth -= 2; \
- } while (0)
-
-#define OP2_1(s) \
- do { \
- REQUIRE_2; \
- POP(s); \
- POP(s); \
- NEWSTACKn(s, stackdepth - 2); \
- SETDST; \
- stackdepth--; \
- } while (0)
-
-#define OP2IAT_1(s) \
- do { \
- REQUIRE_2; \
- POP(TYPE_INT); \
- POP(TYPE_ADR); \
- NEWSTACKn(s, stackdepth - 2); \
- SETDST; \
- stackdepth--; \
- } while (0)
-
-#define OP2IT_1(s) \
- do { \
- REQUIRE_2; \
- POP(TYPE_INT); \
- POP(s); \
- NEWSTACKn(s, stackdepth - 2); \
- SETDST; \
- stackdepth--; \
- } while (0)
-
-#define OPTT2_1(s,d) \
- do { \
- REQUIRE_2; \
- POP(s); \
- POP(s); \
- NEWSTACKn(d, stackdepth - 2); \
- SETDST; \
- stackdepth--; \
- } while (0)
-
-#define OP2_2(s) \
- do { \
- REQUIRE_2; \
- POP(s); \
- POP(s); \
- NEWSTACKn(s, stackdepth - 2); \
- NEWSTACKn(s, stackdepth - 1); \
- SETDST; \
- } while (0)
-
-#define OP3TIA_0(s) \
- do { \
- REQUIRE_3; \
- POP(s); \
- POP(TYPE_INT); \
- POP(TYPE_ADR); \
- SETDST; \
- stackdepth -= 3; \
- } while (0)
-
-#define OP3_0(s) \
- do { \
- REQUIRE_3; \
- POP(s); \
- POP(s); \
- POP(s); \
- SETDST; \
- stackdepth -= 3; \
- } while (0)
-
-#define POPMANY(i) \
- do { \
- REQUIRE((i)); \
- stackdepth -= (i); \
- while(--(i) >= 0) { \
- POPANY; \
- } \
- SETDST; \
- } while (0)
-
-/* Do not copy Interface Stackslots over DUP! */
-#define DUP {REQUIRE_1; \
- if (CURKIND != STACKVAR) { \
- NEWSTACK(CURTYPE,CURKIND,curstack->varnum); \
- } else { \
- NEWSTACK(CURTYPE, TEMPVAR, stackdepth); \
- } \
- SETDST; stackdepth++;}
-#define SWAP {REQUIRE_2;COPY(curstack,new);POPANY;COPY(curstack,new+1);POPANY;\
- new[0].prev=curstack;new[1].prev=new;\
- curstack=new+1;new+=2;SETDST;}
-#define DUP_X1 {REQUIRE_2;COPY(curstack,new);COPY(curstack,new+2);POPANY;\
- COPY(curstack,new+1);POPANY;new[0].prev=curstack;\
- new[1].prev=new;new[2].prev=new+1;\
- curstack=new+2;new+=3;SETDST;stackdepth++;}
-#define DUP2_X1 {REQUIRE_3;COPY(curstack,new+1);COPY(curstack,new+4);POPANY;\
- COPY(curstack,new);COPY(curstack,new+3);POPANY;\
- COPY(curstack,new+2);POPANY;new[0].prev=curstack;\
- new[1].prev=new;new[2].prev=new+1;\
- new[3].prev=new+2;new[4].prev=new+3;\
- curstack=new+4;new+=5;SETDST;stackdepth+=2;}
-#define DUP_X2 {REQUIRE_3;COPY(curstack,new);COPY(curstack,new+3);POPANY;\
- COPY(curstack,new+2);POPANY;COPY(curstack,new+1);POPANY;\
- new[0].prev=curstack;new[1].prev=new;\
- new[2].prev=new+1;new[3].prev=new+2;\
- curstack=new+3;new+=4;SETDST;stackdepth++;}
-#define DUP2_X2 {REQUIRE_4;COPY(curstack,new+1);COPY(curstack,new+5);POPANY;\
- COPY(curstack,new);COPY(curstack,new+4);POPANY;\
- COPY(curstack,new+3);POPANY;COPY(curstack,new+2);POPANY;\
- new[0].prev=curstack;new[1].prev=new;\
- new[2].prev=new+1;new[3].prev=new+2;\
- new[4].prev=new+3;new[5].prev=new+4;\
- curstack=new+5;new+=6;SETDST;stackdepth+=2;}
-
-
/*--------------------------------------------------*/
/* MACROS FOR HANDLING BASIC BLOCKS */
/*--------------------------------------------------*/