* src/SDCCast.c (decorateType): fixed previouse immature commit, added optimisation
[fw/sdcc] / src / ds390 / gen.h
index d641b5746de5652c42eeeff82c8b4e77d62fce16..907b9601a08970d8758278245c1d1c5006029213 100644 (file)
 #ifndef SDCCGEN51_H
 #define SDCCGEN51_H
 
-enum {
+enum
+  {
     AOP_LIT = 1,
-    AOP_REG, AOP_DIR, 
-    AOP_DPTR, AOP_DPTR2, AOP_R0,AOP_R1,
-    AOP_STK ,AOP_IMMD, AOP_STR,
-    AOP_CRY, AOP_ACC };
+    AOP_REG, AOP_DIR,
+    AOP_DPTR, AOP_DPTR2, AOP_R0, AOP_R1,
+    AOP_STK, AOP_IMMD, AOP_STR,
+    AOP_CRY, AOP_ACC, AOP_DPTRn, AOP_DUMMY
+  };
 
 /* type asmop : a homogenised type for 
    all the different spaces an operand can be
    in */
-typedef struct asmop {
-    
-    short type ;  /* can have values
-                    AOP_LIT    -  operand is a literal value
-                    AOP_REG    -  is in registers
-                    AOP_DIR    -  direct just a name
-                    AOP_DPTR   -  dptr contains address of operand
-                    AOP_DPTR2  -  dptr2 contains address of operand (DS80C390 only).
-                    AOP_R0/R1  -  r0/r1 contains address of operand               
-                    AOP_STK    -  should be pushed on stack this
-                                  can happen only for the result
-                    AOP_IMMD   -  immediate value for eg. remateriazable 
-                    AOP_CRY    -  carry contains the value of this
-                    AOP_STR    -  array of strings
-                    AOP_ACC    -  result is in the acc:b pair
-                 */
-    short coff ;  /* current offset */
-    short size ;  /* total size */
-    unsigned code :1 ;         /* is in Code space */
-    unsigned paged:1 ;         /* in paged memory  */
-    unsigned freed:1 ;         /* already freed    */
-    union {
-       value *aop_lit ;       /* if literal */
-       regs  *aop_reg[4];     /* array of registers */
-       char  *aop_dir ;       /* if direct  */
-       regs  *aop_ptr ;       /* either -> to r0 or r1 */
-       char  *aop_immd;       /* if immediate others are implied */    
-       int    aop_stk ;       /* stack offset when AOP_STK */
-       char  *aop_str[4];     /* just a string array containing the location */
-    } aopu;
-} asmop;
+typedef struct asmop
+  {
 
-void gen390Code (iCode *);
+    short type;                        /* can have values
+                                  AOP_LIT    -  operand is a literal value
+                                  AOP_REG    -  is in registers
+                                  AOP_DIR    -  direct just a name
+                                  AOP_DPTR   -  dptr contains address of operand
+                                  AOP_DPTR2  -  dptr2 contains address of operand (DS80C390 only).
+                                  AOP_R0/R1  -  r0/r1 contains address of operand               
+                                  AOP_STK    -  should be pushed on stack this
+                                  can happen only for the result
+                                  AOP_IMMD   -  immediate value for eg. remateriazable 
+                                  AOP_CRY    -  carry contains the value of this
+                                  AOP_STR    -  array of strings
+                                  AOP_ACC    -  result is in the acc:b pair
+                                  AOP_DPTRn  -  is in dptr(n)
+                                  AOP_DUMMY  -  read as 0, discard writes
+                                */
+    short coff;                        /* current offset */
+    short size;                        /* total size */
+    unsigned code:1;           /* is in Code space */
+    unsigned paged:1;          /* in paged memory  */
+    unsigned freed:1;          /* already freed    */
+    union
+      {
+       short dptr;             /* if AOP_DPTRn */
+       value *aop_lit;         /* if literal */
+       regs *aop_reg[4];       /* array of registers */
+       char *aop_dir;          /* if direct  */
+       regs *aop_ptr;          /* either -> to r0 or r1 */
+       struct {
+               int  from_cast_remat;   /* cast remat created this : immd2 field used for highest order*/
+               char *aop_immd1;        /* if immediate others are implied */
+               char *aop_immd2;        /* cast remat will generate this   */
+       } aop_immd;
+       int aop_stk;            /* stack offset when AOP_STK */
+       char *aop_str[5];       /* just a string array containing the location */
+      }
+    aopu;
+  }
+asmop;
 
-extern unsigned fReturnSize_390;
+void gen390Code (iCode *);
+void ds390_emitDebuggerSymbol (char *);
 
 #endif