Give native function tracing its own flag variable
[cacao.git] / alpha / ngen.h
index 37a82a4ea9caf241da1faca8f37820791adc9401..e89d4349fdea54683f59d088b9bec292d073bec4 100644 (file)
@@ -1,4 +1,4 @@
-/***************************** alpha/ngen.h ************************************
+/* alpha/ngen.h ****************************************************************
 
        Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst
 
        Authors: Andreas  Krall      EMAIL: cacao@complang.tuwien.ac.at
                 Reinhard Grafl      EMAIL: cacao@complang.tuwien.ac.at
 
-       Last Change: 1998/08/10
+       Last Change: 1998/11/11
 
 *******************************************************************************/
 
-/************************ Preallocated registers ******************************/
+/* see also file calling.doc for explanation of calling conventions           */
+
+/* preallocated registers *****************************************************/
 
 /* integer registers */
   
 #define REG_RESULT      0    /* to deliver method results                     */ 
-#define REG_EXCEPTION          1    /* to throw an exception across method bounds    */
 
 #define REG_RA          26   /* return address                                */
 #define REG_PV          27   /* procedure vector, must be provided by caller  */
 #define REG_METHODPTR   28   /* pointer to the place from where the procedure */
                              /* vector has been fetched                       */
 #define REG_ITMP1       25   /* temporary register                            */
-#define REG_ITMP2       28   /* temporary register                            */
+#define REG_ITMP2       28   /* temporary register and method pointer         */
 #define REG_ITMP3       29   /* temporary register                            */
 
 #define REG_ITMP1_XPTR  25   /* exception pointer = temporary register 1      */
 
 #define REG_IFTMP       28   /* temporary integer and floating point register */
 
-/******************** register descripton - array *****************************/
+/* register descripton - array ************************************************/
 
-/* #define REG_RES   0         reserved register for OS or code generator */
-/* #define REG_RET   1         return value register */
-/* #define REG_EXC   2         exception value register */
-/* #define REG_SAV   3         (callee) saved register */
-/* #define REG_TMP   4         scratch temporary register (caller saved) */
-/* #define REG_ARG   5         argument register (caller saved) */
+/* #define REG_RES   0         reserved register for OS or code generator     */
+/* #define REG_RET   1         return value register                          */
+/* #define REG_EXC   2         exception value register (only old jit)        */
+/* #define REG_SAV   3         (callee) saved register                        */
+/* #define REG_TMP   4         scratch temporary register (caller saved)      */
+/* #define REG_ARG   5         argument register (caller saved)               */
 
 /* #define REG_END   -1        last entry in tables */
  
@@ -80,7 +81,7 @@ int nregdescfloat[] = {
 /* for use of reserved registers, see comment above */
 
 
-/*** parameter allocation mode ***/
+/* parameter allocation mode */
 
 int nreg_parammode = PARAMMODE_NUMBERED;  
 
@@ -91,14 +92,17 @@ int nreg_parammode = PARAMMODE_NUMBERED;
    */
 
 
-/************************** stackframe-infos **********************************/
+/* stackframe-infos ***********************************************************/
 
 int parentargs_base; /* offset in stackframe for the parameter from the caller*/
 
 /* -> see file 'calling.doc' */
 
 
-/******************** macros to create code ***********************************/
+/* macros to create code ******************************************************/
+
+#define REG   0
+#define CONST 1
 
 /* 3-address-operations: M_OP3
       op ..... opcode
@@ -107,8 +111,8 @@ int parentargs_base; /* offset in stackframe for the parameter from the caller*/
       b  ..... register number or constant integer source 2
       c  ..... register number destination
       const .. switch to use b as constant integer 
-                 (0 means: use b as register number)
-                 (1 means: use b as constant 8-bit-integer)
+                 (REG means: use b as register number)
+                 (CONST means: use b as constant 8-bit-integer)
 */      
 #define M_OP3(op,fu,a,b,c,const) \
        *(mcodeptr++) = ( (((s4)(op))<<26)|((a)<<21)|((b)<<(16-3*(const)))| \
@@ -142,7 +146,7 @@ int parentargs_base; /* offset in stackframe for the parameter from the caller*/
        *(mcodeptr++) = ( (((s4)(op))<<26)|((a)<<21)|((b)<<16)|((disp)&0xffff) )
 
 
-/***** macros for all used commands (see an Alpha-manual for description) *****/ 
+/* macros for all used commands (see an Alpha-manual for description) *********/ 
 
 #define M_LDA(a,b,disp)         M_MEM (0x08,a,b,disp)           /* low const  */
 #define M_LDAH(a,b,disp)        M_MEM (0x09,a,b,disp)           /* high const */
@@ -150,10 +154,12 @@ int parentargs_base; /* offset in stackframe for the parameter from the caller*/
 #define M_SLDU(a,b,disp)        M_MEM (0x0c,a,b,disp)           /* 16 load    */
 #define M_ILD(a,b,disp)         M_MEM (0x28,a,b,disp)           /* 32 load    */
 #define M_LLD(a,b,disp)         M_MEM (0x29,a,b,disp)           /* 64 load    */
+#define M_ALD(a,b,disp)         M_MEM (0x29,a,b,disp)           /* addr load  */
 #define M_BST(a,b,disp)         M_MEM (0x0e,a,b,disp)           /*  8 store   */
 #define M_SST(a,b,disp)         M_MEM (0x0d,a,b,disp)           /* 16 store   */
 #define M_IST(a,b,disp)         M_MEM (0x2c,a,b,disp)           /* 32 store   */
 #define M_LST(a,b,disp)         M_MEM (0x2d,a,b,disp)           /* 64 store   */
+#define M_AST(a,b,disp)         M_MEM (0x2d,a,b,disp)           /* addr store */
 
 #define M_BSEXT(b,c)            M_OP3 (0x1c,0x0,REG_ZERO,b,c,0) /*  8 signext */
 #define M_SSEXT(b,c)            M_OP3 (0x1c,0x1,REG_ZERO,b,c,0) /* 16 signext */
@@ -171,29 +177,53 @@ int parentargs_base; /* offset in stackframe for the parameter from the caller*/
 #define M_JSR(a,b)              M_MEM (0x1a,a,b,0x4000)         /* call sbr   */
 #define M_RET(a,b)              M_MEM (0x1a,a,b,0x8000)         /* return     */
 
-#define M_IADD(a,b,c,const)     M_OP3 (0x10,0x0,  a,b,c,const)  /* 32 add     */
-#define M_LADD(a,b,c,const)     M_OP3 (0x10,0x20, a,b,c,const)  /* 64 add     */
-#define M_ISUB(a,b,c,const)     M_OP3 (0x10,0x09, a,b,c,const)  /* 32 sub     */
-#define M_LSUB(a,b,c,const)     M_OP3 (0x10,0x29, a,b,c,const)  /* 64 sub     */
-#define M_IMUL(a,b,c,const)     M_OP3 (0x13,0x00, a,b,c,const)  /* 32 mul     */
-#define M_LMUL(a,b,c,const)     M_OP3 (0x13,0x20, a,b,c,const)  /* 64 mul     */
+#define M_IADD(a,b,c)           M_OP3 (0x10,0x0,  a,b,c,0)      /* 32 add     */
+#define M_LADD(a,b,c)           M_OP3 (0x10,0x20, a,b,c,0)      /* 64 add     */
+#define M_ISUB(a,b,c)           M_OP3 (0x10,0x09, a,b,c,0)      /* 32 sub     */
+#define M_LSUB(a,b,c)           M_OP3 (0x10,0x29, a,b,c,0)      /* 64 sub     */
+#define M_IMUL(a,b,c)           M_OP3 (0x13,0x00, a,b,c,0)      /* 32 mul     */
+#define M_LMUL(a,b,c)           M_OP3 (0x13,0x20, a,b,c,0)      /* 64 mul     */
+
+#define M_IADD_IMM(a,b,c)       M_OP3 (0x10,0x0,  a,b,c,1)      /* 32 add     */
+#define M_LADD_IMM(a,b,c)       M_OP3 (0x10,0x20, a,b,c,1)      /* 64 add     */
+#define M_ISUB_IMM(a,b,c)       M_OP3 (0x10,0x09, a,b,c,1)      /* 32 sub     */
+#define M_LSUB_IMM(a,b,c)       M_OP3 (0x10,0x29, a,b,c,1)      /* 64 sub     */
+#define M_IMUL_IMM(a,b,c)       M_OP3 (0x13,0x00, a,b,c,1)      /* 32 mul     */
+#define M_LMUL_IMM(a,b,c)       M_OP3 (0x13,0x20, a,b,c,1)      /* 64 mul     */
+
+#define M_CMPEQ(a,b,c)          M_OP3 (0x10,0x2d, a,b,c,0)      /* c = a == b */
+#define M_CMPLT(a,b,c)          M_OP3 (0x10,0x4d, a,b,c,0)      /* c = a <  b */
+#define M_CMPLE(a,b,c)          M_OP3 (0x10,0x6d, a,b,c,0)      /* c = a <= b */
 
-#define M_CMPEQ(a,b,c,const)    M_OP3 (0x10,0x2d, a,b,c,const)  /* c = a == b */
-#define M_CMPLT(a,b,c,const)    M_OP3 (0x10,0x4d, a,b,c,const)  /* c = a <  b */
-#define M_CMPLE(a,b,c,const)    M_OP3 (0x10,0x6d, a,b,c,const)  /* c = a <= b */
+#define M_CMPULE(a,b,c)         M_OP3 (0x10,0x3d, a,b,c,0)      /* c = a <= b */
+#define M_CMPULT(a,b,c)         M_OP3 (0x10,0x1d, a,b,c,0)      /* c = a <= b */
 
-#define M_CMPULE(a,b,c,const)   M_OP3 (0x10,0x3d, a,b,c,const)  /* c = a <= b */
-#define M_CMPULT(a,b,c,const)   M_OP3 (0x10,0x1d, a,b,c,const)  /* c = a <= b */
+#define M_CMPEQ_IMM(a,b,c)      M_OP3 (0x10,0x2d, a,b,c,1)      /* c = a == b */
+#define M_CMPLT_IMM(a,b,c)      M_OP3 (0x10,0x4d, a,b,c,1)      /* c = a <  b */
+#define M_CMPLE_IMM(a,b,c)      M_OP3 (0x10,0x6d, a,b,c,1)      /* c = a <= b */
 
-#define M_AND(a,b,c,const)      M_OP3 (0x11,0x00, a,b,c,const)  /* c = a &  b */
-#define M_OR(a,b,c,const)       M_OP3 (0x11,0x20, a,b,c,const)  /* c = a |  b */
-#define M_XOR(a,b,c,const)      M_OP3 (0x11,0x40, a,b,c,const)  /* c = a ^  b */
+#define M_CMPULE_IMM(a,b,c)     M_OP3 (0x10,0x3d, a,b,c,1)      /* c = a <= b */
+#define M_CMPULT_IMM(a,b,c)     M_OP3 (0x10,0x1d, a,b,c,1)      /* c = a <= b */
 
-#define M_NOP                   M_OR (31,31,31,0)
+#define M_AND(a,b,c)            M_OP3 (0x11,0x00, a,b,c,0)      /* c = a &  b */
+#define M_OR( a,b,c)            M_OP3 (0x11,0x20, a,b,c,0)      /* c = a |  b */
+#define M_XOR(a,b,c)            M_OP3 (0x11,0x40, a,b,c,0)      /* c = a ^  b */
 
-#define M_SLL(a,b,c,const)      M_OP3 (0x12,0x39, a,b,c,const)  /* c = a << b */
-#define M_SRA(a,b,c,const)      M_OP3 (0x12,0x3c, a,b,c,const)  /* c = a >> b */
-#define M_SRL(a,b,c,const)      M_OP3 (0x12,0x34, a,b,c,const)  /* c = a >>>b */
+#define M_AND_IMM(a,b,c)        M_OP3 (0x11,0x00, a,b,c,1)      /* c = a &  b */
+#define M_OR_IMM( a,b,c)        M_OP3 (0x11,0x20, a,b,c,1)      /* c = a |  b */
+#define M_XOR_IMM(a,b,c)        M_OP3 (0x11,0x40, a,b,c,1)      /* c = a ^  b */
+
+#define M_MOV(a,c)              M_OR (a,a,c)                    /* c = a      */
+#define M_CLR(c)                M_OR (31,31,c)                  /* c = 0      */
+#define M_NOP                   M_OR (31,31,31)                 /* ;          */
+
+#define M_SLL(a,b,c)            M_OP3 (0x12,0x39, a,b,c,0)      /* c = a << b */
+#define M_SRA(a,b,c)            M_OP3 (0x12,0x3c, a,b,c,0)      /* c = a >> b */
+#define M_SRL(a,b,c)            M_OP3 (0x12,0x34, a,b,c,0)      /* c = a >>>b */
+
+#define M_SLL_IMM(a,b,c)        M_OP3 (0x12,0x39, a,b,c,1)      /* c = a << b */
+#define M_SRA_IMM(a,b,c)        M_OP3 (0x12,0x3c, a,b,c,1)      /* c = a >> b */
+#define M_SRL_IMM(a,b,c)        M_OP3 (0x12,0x34, a,b,c,1)      /* c = a >>>b */
 
 #define M_FLD(a,b,disp)         M_MEM (0x22,a,b,disp)           /* load flt   */
 #define M_DLD(a,b,disp)         M_MEM (0x23,a,b,disp)           /* load dbl   */
@@ -218,17 +248,17 @@ int parentargs_base; /* offset in stackframe for the parameter from the caller*/
 #define M_FDIVS(a,b,c)          M_FOP3 (0x16, 0x583, a,b,c)     /* flt div    */
 #define M_DDIVS(a,b,c)          M_FOP3 (0x16, 0x5a3, a,b,c)     /* dbl div    */
 
-#define M_CVTDF(a,b,c)          M_FOP3 (0x16, 0x0ac, a,b,c)     /* dbl2long   */
-#define M_CVTLF(a,b,c)          M_FOP3 (0x16, 0x0bc, a,b,c)     /* long2flt   */
-#define M_CVTLD(a,b,c)          M_FOP3 (0x16, 0x0be, a,b,c)     /* long2dbl   */
-#define M_CVTDL(a,b,c)          M_FOP3 (0x16, 0x1af, a,b,c)     /* dbl2long   */
-#define M_CVTDL_C(a,b,c)        M_FOP3 (0x16, 0x12f, a,b,c)     /* dbl2long   */
-#define M_CVTLI(a,b)            M_FOP3 (0x17, 0x130, 31,a,b)    /* long2int   */
+#define M_CVTDF(b,c)            M_FOP3 (0x16, 0x0ac, 31,b,c)    /* dbl2long   */
+#define M_CVTLF(b,c)            M_FOP3 (0x16, 0x0bc, 31,b,c)    /* long2flt   */
+#define M_CVTLD(b,c)            M_FOP3 (0x16, 0x0be, 31,b,c)    /* long2dbl   */
+#define M_CVTDL(b,c)            M_FOP3 (0x16, 0x1af, 31,b,c)    /* dbl2long   */
+#define M_CVTDL_C(b,c)          M_FOP3 (0x16, 0x12f, 31,b,c)    /* dbl2long   */
+#define M_CVTLI(b,c)            M_FOP3 (0x17, 0x130, 31,b,c)    /* long2int   */
 
-#define M_CVTDFS(a,b,c)         M_FOP3 (0x16, 0x5ac, a,b,c)     /* dbl2long   */
-#define M_CVTDLS(a,b,c)         M_FOP3 (0x16, 0x5af, a,b,c)     /* dbl2long   */
-#define M_CVTDL_CS(a,b,c)       M_FOP3 (0x16, 0x52f, a,b,c)     /* dbl2long   */
-#define M_CVTLIS(a,b)           M_FOP3 (0x17, 0x530, 31,a,b)    /* long2int   */
+#define M_CVTDFS(b,c)           M_FOP3 (0x16, 0x5ac, 31,b,c)    /* dbl2long   */
+#define M_CVTDLS(b,c)           M_FOP3 (0x16, 0x5af, 31,b,c)    /* dbl2long   */
+#define M_CVTDL_CS(b,c)         M_FOP3 (0x16, 0x52f, 31,b,c)    /* dbl2long   */
+#define M_CVTLIS(b,c)           M_FOP3 (0x17, 0x530, 31,b,c)    /* long2int   */
 
 #define M_FCMPEQ(a,b,c)         M_FOP3 (0x16, 0x0a5, a,b,c)     /* c = a==b   */
 #define M_FCMPLT(a,b,c)         M_FOP3 (0x16, 0x0a6, a,b,c)     /* c = a<b    */
@@ -243,61 +273,110 @@ int parentargs_base; /* offset in stackframe for the parameter from the caller*/
 
 #define M_FBEQZ(fa,disp)        M_BRA (0x31,fa,disp)            /* br a == 0.0*/
 
-/****** macros for special commands (see an Alpha-manual for description) *****/ 
+/* macros for special commands (see an Alpha-manual for description) **********/ 
 
 #define M_TRAPB                 M_MEM (0x18,0,0,0x0000)        /* trap barrier*/
 
-#define M_S4ADDL(a,b,c,const)   M_OP3 (0x10,0x02, a,b,c,const) /* c = a*4 + b */
-#define M_S4ADDQ(a,b,c,const)   M_OP3 (0x10,0x22, a,b,c,const) /* c = a*4 + b */
-#define M_S4SUBL(a,b,c,const)   M_OP3 (0x10,0x0b, a,b,c,const) /* c = a*4 - b */
-#define M_S4SUBQ(a,b,c,const)   M_OP3 (0x10,0x2b, a,b,c,const) /* c = a*4 - b */
-#define M_S8ADDL(a,b,c,const)   M_OP3 (0x10,0x12, a,b,c,const) /* c = a*8 + b */
-#define M_S8ADDQ(a,b,c,const)   M_OP3 (0x10,0x32, a,b,c,const) /* c = a*8 + b */
-#define M_S8SUBL(a,b,c,const)   M_OP3 (0x10,0x1b, a,b,c,const) /* c = a*8 - b */
-#define M_S8SUBQ(a,b,c,const)   M_OP3 (0x10,0x3b, a,b,c,const) /* c = a*8 - b */
+#define M_S4ADDL(a,b,c)         M_OP3 (0x10,0x02, a,b,c,0)     /* c = a*4 + b */
+#define M_S4ADDQ(a,b,c)         M_OP3 (0x10,0x22, a,b,c,0)     /* c = a*4 + b */
+#define M_S4SUBL(a,b,c)         M_OP3 (0x10,0x0b, a,b,c,0)     /* c = a*4 - b */
+#define M_S4SUBQ(a,b,c)         M_OP3 (0x10,0x2b, a,b,c,0)     /* c = a*4 - b */
+#define M_S8ADDL(a,b,c)         M_OP3 (0x10,0x12, a,b,c,0)     /* c = a*8 + b */
+#define M_S8ADDQ(a,b,c)         M_OP3 (0x10,0x32, a,b,c,0)     /* c = a*8 + b */
+#define M_S8SUBL(a,b,c)         M_OP3 (0x10,0x1b, a,b,c,0)     /* c = a*8 - b */
+#define M_S8SUBQ(a,b,c)         M_OP3 (0x10,0x3b, a,b,c,0)     /* c = a*8 - b */
+#define M_SAADDQ(a,b,c)         M_S8ADDQ(a,b,c)                /* c = a*8 + b */
+
+#define M_S4ADDL_IMM(a,b,c)     M_OP3 (0x10,0x02, a,b,c,1)     /* c = a*4 + b */
+#define M_S4ADDQ_IMM(a,b,c)     M_OP3 (0x10,0x22, a,b,c,1)     /* c = a*4 + b */
+#define M_S4SUBL_IMM(a,b,c)     M_OP3 (0x10,0x0b, a,b,c,1)     /* c = a*4 - b */
+#define M_S4SUBQ_IMM(a,b,c)     M_OP3 (0x10,0x2b, a,b,c,1)     /* c = a*4 - b */
+#define M_S8ADDL_IMM(a,b,c)     M_OP3 (0x10,0x12, a,b,c,1)     /* c = a*8 + b */
+#define M_S8ADDQ_IMM(a,b,c)     M_OP3 (0x10,0x32, a,b,c,1)     /* c = a*8 + b */
+#define M_S8SUBL_IMM(a,b,c)     M_OP3 (0x10,0x1b, a,b,c,1)     /* c = a*8 - b */
+#define M_S8SUBQ_IMM(a,b,c)     M_OP3 (0x10,0x3b, a,b,c,1)     /* c = a*8 - b */
 
 #define M_LLD_U(a,b,disp)       M_MEM (0x0b,a,b,disp)          /* unalign ld  */
 #define M_LST_U(a,b,disp)       M_MEM (0x0f,a,b,disp)          /* unalign st  */
 
-#define M_ZAP(a,b,c,const)      M_OP3 (0x12,0x30, a,b,c,const)
-#define M_ZAPNOT(a,b,c,const)   M_OP3 (0x12,0x31, a,b,c,const)
-#define M_EXTBL(a,b,c,const)    M_OP3 (0x12,0x06, a,b,c,const)
-#define M_EXTWL(a,b,c,const)    M_OP3 (0x12,0x16, a,b,c,const)
-#define M_EXTLL(a,b,c,const)    M_OP3 (0x12,0x26, a,b,c,const)
-#define M_EXTQL(a,b,c,const)    M_OP3 (0x12,0x36, a,b,c,const)
-#define M_EXTWH(a,b,c,const)    M_OP3 (0x12,0x5a, a,b,c,const)
-#define M_EXTLH(a,b,c,const)    M_OP3 (0x12,0x6a, a,b,c,const)
-#define M_EXTQH(a,b,c,const)    M_OP3 (0x12,0x7a, a,b,c,const)
-#define M_INSBL(a,b,c,const)    M_OP3 (0x12,0x0b, a,b,c,const)
-#define M_INSWL(a,b,c,const)    M_OP3 (0x12,0x1b, a,b,c,const)
-#define M_INSLL(a,b,c,const)    M_OP3 (0x12,0x2b, a,b,c,const)
-#define M_INSQL(a,b,c,const)    M_OP3 (0x12,0x3b, a,b,c,const)
-#define M_INSWH(a,b,c,const)    M_OP3 (0x12,0x57, a,b,c,const)
-#define M_INSLH(a,b,c,const)    M_OP3 (0x12,0x67, a,b,c,const)
-#define M_INSQH(a,b,c,const)    M_OP3 (0x12,0x77, a,b,c,const)
-#define M_MSKBL(a,b,c,const)    M_OP3 (0x12,0x02, a,b,c,const)
-#define M_MSKWL(a,b,c,const)    M_OP3 (0x12,0x12, a,b,c,const)
-#define M_MSKLL(a,b,c,const)    M_OP3 (0x12,0x22, a,b,c,const)
-#define M_MSKQL(a,b,c,const)    M_OP3 (0x12,0x32, a,b,c,const)
-#define M_MSKWH(a,b,c,const)    M_OP3 (0x12,0x52, a,b,c,const)
-#define M_MSKLH(a,b,c,const)    M_OP3 (0x12,0x62, a,b,c,const)
-#define M_MSKQH(a,b,c,const)    M_OP3 (0x12,0x72, a,b,c,const)
-
-#define M_UMULH(a,b,c,const)    M_OP3 (0x13,0x30, a,b,c,const)  /* 64 umulh   */
-
-/****** macros for unused commands (see an Alpha-manual for description) ******/ 
+#define M_ZAP(a,b,c)            M_OP3 (0x12,0x30, a,b,c,0)
+#define M_ZAPNOT(a,b,c)         M_OP3 (0x12,0x31, a,b,c,0)
+
+#define M_ZAP_IMM(a,b,c)        M_OP3 (0x12,0x30, a,b,c,1)
+#define M_ZAPNOT_IMM(a,b,c)     M_OP3 (0x12,0x31, a,b,c,1)
+
+#define M_BZEXT(a,b)            M_ZAPNOT_IMM(a, 0x01, b)       /*  8 zeroext  */
+#define M_CZEXT(a,b)            M_ZAPNOT_IMM(a, 0x03, b)       /* 16 zeroext  */
+#define M_IZEXT(a,b)            M_ZAPNOT_IMM(a, 0x0f, b)       /* 32 zeroext  */
+
+#define M_EXTBL(a,b,c)          M_OP3 (0x12,0x06, a,b,c,0)
+#define M_EXTWL(a,b,c)          M_OP3 (0x12,0x16, a,b,c,0)
+#define M_EXTLL(a,b,c)          M_OP3 (0x12,0x26, a,b,c,0)
+#define M_EXTQL(a,b,c)          M_OP3 (0x12,0x36, a,b,c,0)
+#define M_EXTWH(a,b,c)          M_OP3 (0x12,0x5a, a,b,c,0)
+#define M_EXTLH(a,b,c)          M_OP3 (0x12,0x6a, a,b,c,0)
+#define M_EXTQH(a,b,c)          M_OP3 (0x12,0x7a, a,b,c,0)
+#define M_INSBL(a,b,c)          M_OP3 (0x12,0x0b, a,b,c,0)
+#define M_INSWL(a,b,c)          M_OP3 (0x12,0x1b, a,b,c,0)
+#define M_INSLL(a,b,c)          M_OP3 (0x12,0x2b, a,b,c,0)
+#define M_INSQL(a,b,c)          M_OP3 (0x12,0x3b, a,b,c,0)
+#define M_INSWH(a,b,c)          M_OP3 (0x12,0x57, a,b,c,0)
+#define M_INSLH(a,b,c)          M_OP3 (0x12,0x67, a,b,c,0)
+#define M_INSQH(a,b,c)          M_OP3 (0x12,0x77, a,b,c,0)
+#define M_MSKBL(a,b,c)          M_OP3 (0x12,0x02, a,b,c,0)
+#define M_MSKWL(a,b,c)          M_OP3 (0x12,0x12, a,b,c,0)
+#define M_MSKLL(a,b,c)          M_OP3 (0x12,0x22, a,b,c,0)
+#define M_MSKQL(a,b,c)          M_OP3 (0x12,0x32, a,b,c,0)
+#define M_MSKWH(a,b,c)          M_OP3 (0x12,0x52, a,b,c,0)
+#define M_MSKLH(a,b,c)          M_OP3 (0x12,0x62, a,b,c,0)
+#define M_MSKQH(a,b,c)          M_OP3 (0x12,0x72, a,b,c,0)
+
+#define M_EXTBL_IMM(a,b,c)      M_OP3 (0x12,0x06, a,b,c,1)
+#define M_EXTWL_IMM(a,b,c)      M_OP3 (0x12,0x16, a,b,c,1)
+#define M_EXTLL_IMM(a,b,c)      M_OP3 (0x12,0x26, a,b,c,1)
+#define M_EXTQL_IMM(a,b,c)      M_OP3 (0x12,0x36, a,b,c,1)
+#define M_EXTWH_IMM(a,b,c)      M_OP3 (0x12,0x5a, a,b,c,1)
+#define M_EXTLH_IMM(a,b,c)      M_OP3 (0x12,0x6a, a,b,c,1)
+#define M_EXTQH_IMM(a,b,c)      M_OP3 (0x12,0x7a, a,b,c,1)
+#define M_INSBL_IMM(a,b,c)      M_OP3 (0x12,0x0b, a,b,c,1)
+#define M_INSWL_IMM(a,b,c)      M_OP3 (0x12,0x1b, a,b,c,1)
+#define M_INSLL_IMM(a,b,c)      M_OP3 (0x12,0x2b, a,b,c,1)
+#define M_INSQL_IMM(a,b,c)      M_OP3 (0x12,0x3b, a,b,c,1)
+#define M_INSWH_IMM(a,b,c)      M_OP3 (0x12,0x57, a,b,c,1)
+#define M_INSLH_IMM(a,b,c)      M_OP3 (0x12,0x67, a,b,c,1)
+#define M_INSQH_IMM(a,b,c)      M_OP3 (0x12,0x77, a,b,c,1)
+#define M_MSKBL_IMM(a,b,c)      M_OP3 (0x12,0x02, a,b,c,1)
+#define M_MSKWL_IMM(a,b,c)      M_OP3 (0x12,0x12, a,b,c,1)
+#define M_MSKLL_IMM(a,b,c)      M_OP3 (0x12,0x22, a,b,c,1)
+#define M_MSKQL_IMM(a,b,c)      M_OP3 (0x12,0x32, a,b,c,1)
+#define M_MSKWH_IMM(a,b,c)      M_OP3 (0x12,0x52, a,b,c,1)
+#define M_MSKLH_IMM(a,b,c)      M_OP3 (0x12,0x62, a,b,c,1)
+#define M_MSKQH_IMM(a,b,c)      M_OP3 (0x12,0x72, a,b,c,1)
+
+#define M_UMULH(a,b,c)          M_OP3 (0x13,0x30, a,b,c,0)     /* 64 umulh    */
+
+#define M_UMULH_IMM(a,b,c)      M_OP3 (0x13,0x30, a,b,c,1)     /* 64 umulh    */
+
+#define M_CMOVEQ(a,b,c)         M_OP3 (0x11,0x24, a,b,c,0)     /* a==0 ? c=b  */
+#define M_CMOVNE(a,b,c)         M_OP3 (0x11,0x26, a,b,c,0)     /* a!=0 ? c=b  */
+#define M_CMOVLT(a,b,c)         M_OP3 (0x11,0x44, a,b,c,0)     /* a< 0 ? c=b  */
+#define M_CMOVGE(a,b,c)         M_OP3 (0x11,0x46, a,b,c,0)     /* a>=0 ? c=b  */
+#define M_CMOVLE(a,b,c)         M_OP3 (0x11,0x64, a,b,c,0)     /* a<=0 ? c=b  */
+#define M_CMOVGT(a,b,c)         M_OP3 (0x11,0x66, a,b,c,0)     /* a> 0 ? c=b  */
+
+#define M_CMOVEQ_IMM(a,b,c)     M_OP3 (0x11,0x24, a,b,c,1)     /* a==0 ? c=b  */
+#define M_CMOVNE_IMM(a,b,c)     M_OP3 (0x11,0x26, a,b,c,1)     /* a!=0 ? c=b  */
+#define M_CMOVLT_IMM(a,b,c)     M_OP3 (0x11,0x44, a,b,c,1)     /* a< 0 ? c=b  */
+#define M_CMOVGE_IMM(a,b,c)     M_OP3 (0x11,0x46, a,b,c,1)     /* a>=0 ? c=b  */
+#define M_CMOVLE_IMM(a,b,c)     M_OP3 (0x11,0x64, a,b,c,1)     /* a<=0 ? c=b  */
+#define M_CMOVGT_IMM(a,b,c)     M_OP3 (0x11,0x66, a,b,c,1)     /* a> 0 ? c=b  */
+
+/* macros for unused commands (see an Alpha-manual for description) ***********/ 
 
 #define M_ANDNOT(a,b,c,const)   M_OP3 (0x11,0x08, a,b,c,const) /* c = a &~ b  */
 #define M_ORNOT(a,b,c,const)    M_OP3 (0x11,0x28, a,b,c,const) /* c = a |~ b  */
 #define M_XORNOT(a,b,c,const)   M_OP3 (0x11,0x48, a,b,c,const) /* c = a ^~ b  */
 
-#define M_CMOVEQ(a,b,c,const)   M_OP3 (0x11,0x24, a,b,c,const) /* a==0 ? c=b  */
-#define M_CMOVNE(a,b,c,const)   M_OP3 (0x11,0x26, a,b,c,const) /* a!=0 ? c=b  */
-#define M_CMOVLT(a,b,c,const)   M_OP3 (0x11,0x44, a,b,c,const) /* a< 0 ? c=b  */
-#define M_CMOVGE(a,b,c,const)   M_OP3 (0x11,0x46, a,b,c,const) /* a>=0 ? c=b  */
-#define M_CMOVLE(a,b,c,const)   M_OP3 (0x11,0x64, a,b,c,const) /* a<=0 ? c=b  */
-#define M_CMOVGT(a,b,c,const)   M_OP3 (0x11,0x66, a,b,c,const) /* a> 0 ? c=b  */
-
 #define M_CMPBGE(a,b,c,const)   M_OP3 (0x10,0x0f, a,b,c,const)
 
 #define M_FCMPUN(a,b,c)         M_FOP3 (0x16, 0x0a4, a,b,c)    /* unordered   */
@@ -312,7 +391,7 @@ int parentargs_base; /* offset in stackframe for the parameter from the caller*/
 #define M_JMP_CO(a,b)           M_MEM (0x1a,a,b,0xc000)        /* call cosub  */
 
 
-/************************ function gen_resolvebranch ***************************
+/* function gen_resolvebranch **************************************************
 
        backpatches a branch instruction; Alpha branch instructions are very
        regular, so it is only necessary to overwrite some fixed bits in the
@@ -326,4 +405,4 @@ int parentargs_base; /* offset in stackframe for the parameter from the caller*/
 
 #define gen_resolvebranch(ip,so,to) ((s4*)(ip))[-1]|=((s4)(to)-(so))>>2&0x1fffff
 
-#define SOFTNULLPTRCHECK
+#define SOFTNULLPTRCHECK       /* soft null pointer check supportet as option */