2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mono / arch / ppc / ppc-codegen.h
index 177e01436b4675a70f51ec637bcb6db7a0b0e711..aa85d45e8c9239b87be438501d2fe517f237fd96 100644 (file)
@@ -4,8 +4,8 @@
    for testing do the following: ./test | as -o test.o
 */
 
-#ifndef PPC_H
-#define PPC_H
+#ifndef __MONO_PPC_CODEGEN_H__
+#define __MONO_PPC_CODEGEN_H__
 #include <glib.h>
 #include <assert.h>
 
@@ -88,9 +88,15 @@ typedef enum {
 
 enum {
        /* B0 operand for branches */
+       PPC_BR_DEC_CTR_NONZERO_FALSE = 0,
        PPC_BR_LIKELY = 1, /* can be or'ed with the conditional variants */
+       PPC_BR_DEC_CTR_ZERO_FALSE = 2,
        PPC_BR_FALSE  = 4,
+       PPC_BR_DEC_CTR_NONZERO_TRUE = 8,
+       PPC_BR_DEC_CTR_ZERO_TRUE = 10,
        PPC_BR_TRUE   = 12,
+       PPC_BR_DEC_CTR_NONZERO = 16,
+       PPC_BR_DEC_CTR_ZERO = 18,
        PPC_BR_ALWAYS = 20,
        /* B1 operand for branches */
        PPC_BR_LT     = 0,
@@ -111,13 +117,14 @@ enum {
        PPC_TRAP_GE_UN = 16 + PPC_TRAP_EQ
 };
 
-#define ppc_emit32(c,x) do { *((guint32 *) c) = x; ((guint32 *)c)++;} while (0)
+#define ppc_emit32(c,x) do { *((guint32 *) (c)) = x; (c) = (char *)(c) + sizeof (guint32);} while (0)
 
-#define ppc_is_imm16(val) ((gint)val >= -(1<<16) && (gint)val <= ((1<<16)-1))
+#define ppc_is_imm16(val) ((gint)(val) >= (gint)-(1<<15) && (gint)(val) <= (gint)((1<<15)-1))
+#define ppc_is_uimm16(val) ((gint)(val) >= 0 && (gint)(val) <= 65535)
 
 #define ppc_load(c,D,v) do {   \
                if (ppc_is_imm16 ((v))) {       \
-                       ppc_li ((c), (D), (v)); \
+                       ppc_li ((c), (D), (guint16)(v));        \
                } else {        \
                        ppc_lis ((c), (D), (guint32)(v) >> 16); \
                        ppc_ori ((c), (D), (D), (guint32)(v) & 0xffff); \
@@ -127,8 +134,8 @@ enum {
 #define ppc_break(c) ppc_tw((c),31,0,0)
 #define  ppc_addi(c,D,A,d) ppc_emit32 (c, (14 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(d))
 #define ppc_addis(c,D,A,d) ppc_emit32 (c, (15 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(d))
-#define    ppc_li(c,D,v)   ppc_addi   (c, D, 0, v);
-#define   ppc_lis(c,D,v)   ppc_addis  (c, D, 0, v);
+#define    ppc_li(c,D,v)   ppc_addi   (c, D, 0, (guint16)(v));
+#define   ppc_lis(c,D,v)   ppc_addis  (c, D, 0, (guint16)(v));
 #define   ppc_lwz(c,D,d,a) ppc_emit32 (c, (32 << 26) | ((D) << 21) | ((a) << 16) | (guint16)(d))
 #define   ppc_lhz(c,D,d,a) ppc_emit32 (c, (40 << 26) | ((D) << 21) | ((a) << 16) | (guint16)(d))
 #define   ppc_lbz(c,D,d,a) ppc_emit32 (c, (34 << 26) | ((D) << 21) | ((a) << 16) | (guint16)(d))
@@ -245,9 +252,9 @@ my and Ximian's copyright to this code. ;)
 #define ppc_bnelrlp(c,BO,BI) ppc_bclr(c,BO,BI)
 
 #define ppc_cmp(c,cfrD,L,A,B) ppc_emit32(c, (31 << 26) | (cfrD << 23) | (0 << 22) | (L << 21) | (A << 16) | (B << 11) | (0x00000 << 1) | 0 )
-#define ppc_cmpi(c,cfrD,L,A,B) ppc_emit32(c, (11 << 26) | (cfrD << 23) | (0 << 22) | (L << 21) | (A << 16) | B)
+#define ppc_cmpi(c,cfrD,L,A,B) ppc_emit32(c, (11 << 26) | (cfrD << 23) | (0 << 22) | (L << 21) | (A << 16) | (guint16)(B))
 #define ppc_cmpl(c,cfrD,L,A,B) ppc_emit32(c, (31 << 26) | (cfrD << 23) | (0 << 22) | (L << 21) | (A << 16) | (B << 11) | (32 << 1) | 0 )
-#define ppc_cmpli(c,cfrD,L,A,B) ppc_emit32(c, (10 << 26) | (cfrD << 23) | (0 << 22) | (L << 21) | (A << 16) | B)
+#define ppc_cmpli(c,cfrD,L,A,B) ppc_emit32(c, (10 << 26) | (cfrD << 23) | (0 << 22) | (L << 21) | (A << 16) | (guint16)(B))
 
 #define ppc_cntlzwx(c,S,A,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (0 << 11) | (26 << 1) | Rc)
 #define ppc_cntlzw(c,S,A) ppc_cntlzwx(c,S,A,0)
@@ -290,70 +297,70 @@ my and Ximian's copyright to this code. ;)
 #define ppc_eqv(c,A,S,B) ppc_eqvx(c,A,S,B,0)
 #define ppc_eqvd(c,A,S,B) ppc_eqvx(c,A,S,B,1)
 
-#define ppc_extsbx(c,A,S,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (0 << 12) | (954 << 1) | Rc) 
+#define ppc_extsbx(c,A,S,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (0 << 11) | (954 << 1) | Rc) 
 #define ppc_extsb(c,A,S) ppc_extsbx(c,A,S,0)
 #define ppc_extsbd(c,A,S) ppc_extsbx(c,A,S,1)
 
-#define ppc_extshx(c,A,S,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (0 << 12) | (922 << 1) | Rc) 
+#define ppc_extshx(c,A,S,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (0 << 11) | (922 << 1) | Rc) 
 #define ppc_extsh(c,A,S) ppc_extshx(c,A,S,0)
 #define ppc_extshd(c,A,S) ppc_extshx(c,A,S,1)
 
-#define ppc_fabsx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 12) | (264 << 1) | Rc) 
+#define ppc_fabsx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (264 << 1) | Rc) 
 #define ppc_fabs(c,D,B) ppc_fabsx(c,D,B,0)
 #define ppc_fabsd(c,D,B) ppc_fabsx(c,D,B,1)
 
-#define ppc_faddx(c,D,A,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 12) | (0 << 7) | (21 << 1) | Rc)
+#define ppc_faddx(c,D,A,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (0 << 6) | (21 << 1) | Rc)
 #define ppc_fadd(c,D,A,B) ppc_faddx(c,D,A,B,0)
 #define ppc_faddd(c,D,A,B) ppc_faddx(c,D,A,B,1)
 
-#define ppc_faddsx(c,D,A,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 12) | (0 << 7) | (21 << 1) | Rc)
+#define ppc_faddsx(c,D,A,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (0 << 6) | (21 << 1) | Rc)
 #define ppc_fadds(c,D,A,B) ppc_faddsx(c,D,A,B,0)
 #define ppc_faddsd(c,D,A,B) ppc_faddsx(c,D,A,B,1)
 
-#define ppc_fcmpo(c,crfD,A,B) ppc_emit32(c, (63 << 26) | (crfD << 23) | (0 << 21) | (A << 16) | (B << 12) | (32 << 1) | 0)
-#define ppc_fcmpu(c,crfD,A,B) ppc_emit32(c, (63 << 26) | (crfD << 23) | (0 << 21) | (A << 16) | (B << 12) | (0 << 1) | 0)
+#define ppc_fcmpo(c,crfD,A,B) ppc_emit32(c, (63 << 26) | (crfD << 23) | (0 << 21) | (A << 16) | (B << 11) | (32 << 1) | 0)
+#define ppc_fcmpu(c,crfD,A,B) ppc_emit32(c, (63 << 26) | (crfD << 23) | (0 << 21) | (A << 16) | (B << 11) | (0 << 1) | 0)
 
-#define ppc_fctiwx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 12) | (14 << 1) | Rc)
+#define ppc_fctiwx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (14 << 1) | Rc)
 #define ppc_fctiw(c,D,B) ppc_fctiwx(c,D,B,0)
 #define ppc_fctiwd(c,D,B) ppc_fctiwx(c,D,B,1)
 
-#define ppc_fctiwzx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 12) | (15 << 1) | Rc)
+#define ppc_fctiwzx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (15 << 1) | Rc)
 #define ppc_fctiwz(c,D,B) ppc_fctiwzx(c,D,B,0)
 #define ppc_fctiwzd(c,D,B) ppc_fctiwzx(c,D,B,1)
 
-#define ppc_fdivx(c,D,A,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 12) | (0 << 7) | (18 << 1) | Rc)
+#define ppc_fdivx(c,D,A,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (0 << 6) | (18 << 1) | Rc)
 #define ppc_fdiv(c,D,A,B) ppc_fdivx(c,D,A,B,0)
 #define ppc_fdivd(c,D,A,B) ppc_fdivx(c,D,A,B,1)
 
-#define ppc_fdivsx(c,D,A,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 12) | (0 << 7) | (18 << 1) | Rc)
+#define ppc_fdivsx(c,D,A,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (0 << 6) | (18 << 1) | Rc)
 #define ppc_fdivs(c,D,A,B) ppc_fdivsx(c,D,A,B,0)
 #define ppc_fdivsd(c,D,A,B) ppc_fdivsx(c,D,A,B,1)
 
-#define ppc_fmaddx(c,D,A,B,C,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 12) | (C << 7) | (29 << 1) | Rc)
+#define ppc_fmaddx(c,D,A,B,C,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (29 << 1) | Rc)
 #define ppc_fmadd(c,D,A,B,C) ppc_fmaddx(c,D,A,B,C,0)
 #define ppc_fmaddd(c,D,A,B,C) ppc_fmaddx(c,D,A,B,C,1) 
 
-#define ppc_fmaddsx(c,D,A,B,C,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 12) | (C << 7) | (29 << 1) | Rc)
+#define ppc_fmaddsx(c,D,A,B,C,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (29 << 1) | Rc)
 #define ppc_fmadds(c,D,A,B,C) ppc_fmaddsx(c,D,A,B,C,0)
 #define ppc_fmaddsd(c,D,A,B,C) ppc_fmaddsx(c,D,A,B,C,1) 
 
-#define ppc_fmrx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 12) | (72 << 1) | Rc)
+#define ppc_fmrx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (72 << 1) | Rc)
 #define ppc_fmr(c,D,B) ppc_fmrx(c,D,B,0)
 #define ppc_fmrd(c,D,B) ppc_fmrx(c,D,B,1)
 
-#define ppc_fmsubx(c,D,A,C,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (C << 7) | (28 << 1) | Rc)
+#define ppc_fmsubx(c,D,A,C,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (28 << 1) | Rc)
 #define ppc_fmsub(c,D,A,C,B) ppc_fmsubx(c,D,A,C,B,0)
 #define ppc_fmsubd(c,D,A,C,B) ppc_fmsubx(c,D,A,C,B,1)
 
-#define ppc_fmsubsx(c,D,A,C,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 7) | (28 << 1) | Rc)
+#define ppc_fmsubsx(c,D,A,C,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (28 << 1) | Rc)
 #define ppc_fmsubs(c,D,A,C,B) ppc_fmsubsx(c,D,A,C,B,0)
 #define ppc_fmsubsd(c,D,A,C,B) ppc_fmsubsx(c,D,A,C,B,1)
 
-#define ppc_fmulx(c,D,A,C,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (0 << 11) | (C << 7) | (25 << 1) | Rc) 
+#define ppc_fmulx(c,D,A,C,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (0 << 11) | (C << 6) | (25 << 1) | Rc) 
 #define ppc_fmul(c,D,A,C) ppc_fmulx(c,D,A,C,0)
 #define ppc_fmuld(c,D,A,C) ppc_fmulx(c,D,A,C,1)
 
-#define ppc_fmulsx(c,D,A,C,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (0 << 11) | (C << 7) | (25 << 1) | Rc) 
+#define ppc_fmulsx(c,D,A,C,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (0 << 11) | (C << 6) | (25 << 1) | Rc) 
 #define ppc_fmuls(c,D,A,C) ppc_fmulsx(c,D,A,C,0)
 #define ppc_fmulsd(c,D,A,C) ppc_fmulsx(c,D,A,C,1)
 
@@ -365,23 +372,23 @@ my and Ximian's copyright to this code. ;)
 #define ppc_fneg(c,D,B) ppc_fnegx(c,D,B,0)
 #define ppc_fnegd(c,D,B) ppc_fnegx(c,D,B,1)
 
-#define ppc_fnmaddx(c,D,A,C,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 7) | (31 << 1) | Rc)
+#define ppc_fnmaddx(c,D,A,C,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (31 << 1) | Rc)
 #define ppc_fnmadd(c,D,A,C,B) ppc_fnmaddx(c,D,A,C,B,0)
 #define ppc_fnmaddd(c,D,A,C,B) ppc_fnmaddx(c,D,A,C,B,1)
 
-#define ppc_fnmaddsx(c,D,A,C,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 7) | (31 << 1) | Rc)
+#define ppc_fnmaddsx(c,D,A,C,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (31 << 1) | Rc)
 #define ppc_fnmadds(c,D,A,C,B) ppc_fnmaddsx(c,D,A,C,B,0)
 #define ppc_fnmaddsd(c,D,A,C,B) ppc_fnmaddsx(c,D,A,C,B,1)
 
-#define ppc_fnmsubx(c,D,A,C,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 7) | (30 << 1) | Rc)
+#define ppc_fnmsubx(c,D,A,C,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (30 << 1) | Rc)
 #define ppc_fnmsub(c,D,A,C,B) ppc_fnmsubx(c,D,A,C,B,0)
 #define ppc_fnmsubd(c,D,A,C,B) ppc_fnmsubx(c,D,A,C,B,1)
 
-#define ppc_fnmsubsx(c,D,A,C,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 7) | (30 << 1) | Rc)
+#define ppc_fnmsubsx(c,D,A,C,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (30 << 1) | Rc)
 #define ppc_fnmsubs(c,D,A,C,B) ppc_fnmsubsx(c,D,A,C,B,0)
 #define ppc_fnmsubsd(c,D,A,C,B) ppc_fnmsubsx(c,D,A,C,B,1)
 
-#define ppc_fresx(c,D,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (0 << 16) | (B << 11) | (0 << 7) | (24 << 1) | Rc)
+#define ppc_fresx(c,D,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (0 << 16) | (B << 11) | (0 << 6) | (24 << 1) | Rc)
 #define ppc_fres(c,D,B) ppc_fresx(c,D,B,0)
 #define ppc_fresd(c,D,B) ppc_fresx(c,D,B,1)
 
@@ -389,27 +396,27 @@ my and Ximian's copyright to this code. ;)
 #define ppc_frsp(c,D,B) ppc_frspx(c,D,B,0)
 #define ppc_frspd(c,D,B) ppc_frspx(c,D,B,1)
 
-#define ppc_frsqrtex(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (0 << 7) | (26 << 1) | Rc)
+#define ppc_frsqrtex(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (0 << 6) | (26 << 1) | Rc)
 #define ppc_frsqrte(c,D,B) ppc_frsqrtex(c,D,B,0)
 #define ppc_frsqrted(c,D,B) ppc_frsqrtex(c,D,B,1)
 
-#define ppc_fselx(c,D,A,C,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 7) | (23 << 1) | Rc)
+#define ppc_fselx(c,D,A,C,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (23 << 1) | Rc)
 #define ppc_fsel(c,D,A,C,B) ppc_fselx(c,D,A,C,B,0)
 #define ppc_fseld(c,D,A,C,B) ppc_fselx(c,D,A,C,B,1)
 
-#define ppc_fsqrtx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (0 << 7) | (22 << 1) | Rc)
+#define ppc_fsqrtx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (0 << 6) | (22 << 1) | Rc)
 #define ppc_fsqrt(c,D,B) ppc_fsqrtx(c,D,B,0)
 #define ppc_fsqrtd(c,D,B) ppc_fsqrtx(c,D,B,1)
 
-#define ppc_fsqrtsx(c,D,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (0 << 16) | (B << 11) | (0 << 7) | (22 << 1) | Rc)
+#define ppc_fsqrtsx(c,D,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (0 << 16) | (B << 11) | (0 << 6) | (22 << 1) | Rc)
 #define ppc_fsqrts(c,D,B) ppc_fsqrtsx(c,D,B,0)
 #define ppc_fsqrtsd(c,D,B) ppc_fsqrtsx(c,D,B,1)
 
-#define ppc_fsubx(c,D,A,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (0 << 7) | (20 << 1) | Rc)
+#define ppc_fsubx(c,D,A,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (0 << 6) | (20 << 1) | Rc)
 #define ppc_fsub(c,D,A,B) ppc_fsubx(c,D,A,B,0)
 #define ppc_fsubd(c,D,A,B) ppc_fsubx(c,D,A,B,1)
 
-#define ppc_fsubsx(c,D,A,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (0 << 7) | (20 << 1) | Rc)
+#define ppc_fsubsx(c,D,A,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (0 << 6) | (20 << 1) | Rc)
 #define ppc_fsubs(c,D,A,B) ppc_fsubsx(c,D,A,B,0)
 #define ppc_fsubsd(c,D,A,B) ppc_fsubsx(c,D,A,B,1)
 
@@ -529,15 +536,15 @@ my and Ximian's copyright to this code. ;)
 
 #define ppc_rfi(c) ppc_emit32(c, (19 << 26) | (0 << 11) | (50 << 1) | 0)
 
-#define ppc_rlwimix(c,A,S,SH,MB,ME,Rc) ppc_emit32(c, (20 << 26) | (S << 21) | (A << 16) | (SH << 11) | (MB << 5) | (ME << 1) | Rc)
+#define ppc_rlwimix(c,A,S,SH,MB,ME,Rc) ppc_emit32(c, (20 << 26) | (S << 21) | (A << 16) | (SH << 11) | (MB << 6) | (ME << 1) | Rc)
 #define ppc_rlwimi(c,A,S,SH,MB,ME) ppc_rlwimix(c,A,S,SH,MB,ME,0)
 #define ppc_rlwimid(c,A,S,SH,MB,ME) ppc_rlwimix(c,A,S,SH,MB,ME,1)
 
-#define ppc_rlwinmx(c,A,S,SH,MB,ME,Rc) ppc_emit32(c, (21 << 26) | (S << 21) | (A << 16) | (SH << 11) | (MB << 5) | (ME << 1) | Rc)
+#define ppc_rlwinmx(c,A,S,SH,MB,ME,Rc) ppc_emit32(c, (21 << 26) | (S << 21) | (A << 16) | (SH << 11) | (MB << 6) | (ME << 1) | Rc)
 #define ppc_rlwinm(c,A,S,SH,MB,ME) ppc_rlwinmx(c,A,S,SH,MB,ME,0)
 #define ppc_rlwinmd(c,A,S,SH,MB,ME) ppc_rlwinmx(c,A,S,SH,MB,ME,1)
 
-#define ppc_rlwnmx(c,A,S,SH,MB,ME,Rc) ppc_emit32(c, (23 << 26) | (S << 21) | (A << 16) | (SH << 11) | (MB << 5) | (ME << 1) | Rc)
+#define ppc_rlwnmx(c,A,S,SH,MB,ME,Rc) ppc_emit32(c, (23 << 26) | (S << 21) | (A << 16) | (SH << 11) | (MB << 6) | (ME << 1) | Rc)
 #define ppc_rlwnm(c,A,S,SH,MB,ME) ppc_rlwnmx(c,A,S,SH,MB,ME,0)
 #define ppc_rlwnmd(c,A,S,SH,MB,ME) ppc_rlwnmx(c,A,S,SH,MB,ME,1)
 
@@ -559,24 +566,24 @@ my and Ximian's copyright to this code. ;)
 #define ppc_srw(c,A,S,B) ppc_srwx(c,A,S,B,0)
 #define ppc_srwd(c,A,S,B) ppc_srwx(c,A,S,B,1)
 
-#define ppc_stbu(c,S,A,D) ppc_emit32(c, (39 << 26) | (S << 21) | (A << 16) | D)
+#define ppc_stbu(c,S,A,D) ppc_emit32(c, (39 << 26) | (S << 21) | (A << 16) | (guint16)(D))
 
 #define ppc_stbux(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (247 << 1) | 0)
 #define ppc_stbx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (215 << 1) | 0)
 
-#define ppc_stfdu(c,S,A,D) ppc_emit32(c, (55 << 26) | (S << 21) | (A << 16) | D)
+#define ppc_stfdu(c,S,A,D) ppc_emit32(c, (55 << 26) | (S << 21) | (A << 16) | (guint16)(D))
 
 #define ppc_stfdx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (727 << 1) | 0)
 #define ppc_stfiwx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (983 << 1) | 0)
 
-#define ppc_stfsu(c,S,A,D) ppc_emit32(c, (53 << 26) | (S << 21) | (A << 16) | D)  
+#define ppc_stfsu(c,S,A,D) ppc_emit32(c, (53 << 26) | (S << 21) | (A << 16) | (guint16)(D))
 #define ppc_stfsux(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (695 << 1) | 0)  
 #define ppc_stfsx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (663 << 1) | 0)  
 #define ppc_sthbrx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (918 << 1) | 0)  
-#define ppc_sthu(c,S,A,D) ppc_emit32(c, (45 << 26) | (S << 21) | (A << 16) | D)
+#define ppc_sthu(c,S,A,D) ppc_emit32(c, (45 << 26) | (S << 21) | (A << 16) | (guint16)(D))
 #define ppc_sthux(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (439 << 1) | 0)
 #define ppc_sthx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (407 << 1) | 0)
-#define ppc_stmw(c,S,A,D) ppc_emit32(c, (47 << 26) | (S << 21) | (A << 16) | D)
+#define ppc_stmw(c,S,A,D) ppc_emit32(c, (47 << 26) | (S << 21) | (A << 16) | (guint16)D)
 #define ppc_stswi(c,S,A,NB) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (NB << 11) | (725 << 1) | 0)
 #define ppc_stswx(c,S,A,NB) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (NB << 11) | (661 << 1) | 0)
 #define ppc_stwbrx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (662 << 1) | 0)
@@ -590,7 +597,7 @@ my and Ximian's copyright to this code. ;)
 #define ppc_subfo(c,D,A,B) ppc_subfx(c,D,A,B,1,0)
 #define ppc_subfod(c,D,A,B) ppc_subfx(c,D,A,B,1,1)
 
-#define ppc_sub(c,D,A,B) ppc_subf(c,D,B.A)
+#define ppc_sub(c,D,A,B) ppc_subf(c,D,B,A)
 
 #define ppc_subfcx(c,D,A,B,OE,Rc) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (OE << 10) | (8 << 1) | Rc)
 #define ppc_subfc(c,D,A,B) ppc_subfcx(c,D,A,B,0,0)
@@ -630,8 +637,8 @@ my and Ximian's copyright to this code. ;)
 #define ppc_xor(c,A,S,B) ppc_xorx(c,A,S,B,0)
 #define ppc_xord(c,A,S,B) ppc_xorx(c,A,S,B,1)
 
-#define ppc_xori(c,S,A,SIMM) ppc_emit32(c, (26 << 26) | (S << 21) | (A << 16) | (guint16)(SIMM))
-#define ppc_xoris(c,S,A,SIMM) ppc_emit32(c, (27 << 26) | (S << 21) | (A << 16) | (guint16)(SIMM))
+#define ppc_xori(c,S,A,UIMM) ppc_emit32(c, (26 << 26) | (S << 21) | (A << 16) | (guint16)(UIMM))
+#define ppc_xoris(c,S,A,UIMM) ppc_emit32(c, (27 << 26) | (S << 21) | (A << 16) | (guint16)(UIMM))
 
 /* this marks the end of my work, ct */