* support/scripts/sdcc.nsi: added asranlib.exe to the install package
[fw/sdcc] / as / mcs51 / i51mch.c
index fa09b86f7721e09df789ab95bc9143956d37c21d..9e7b2900766053cb7b3b529a4e2d551e4260028c 100644 (file)
@@ -25,10 +25,11 @@ machine(struct mne *mp)
 {
         register unsigned op;
         register int t, t1, v1;
-        struct expr e, e1;
+        struct expr e, e1, e2;
 
         clrexpr(&e);
         clrexpr(&e1);
+        clrexpr(&e2);
 
         op = mp->m_valu;
         switch (mp->m_type) {
@@ -52,12 +53,12 @@ machine(struct mne *mp)
                 }
                 else
                 {
-                outr11(&e, op, R_J11);
+                        outr11(&e, op, R_J11);
                 }
                 break;
 
         case S_JMP16:
-                /* LCALl or LJMP. In Flat24 mode, this is a 24 bit
+                /* LCALL or LJMP. In Flat24 mode, this is a 24 bit
                  * destination; in 8051 mode, this is a 16 bit
                  * destination.
                  */
@@ -69,7 +70,7 @@ machine(struct mne *mp)
                 }
                 else
                 {
-                outrw(&e, 0);
+                        outrw(&e, 0);
                 }
                 break;
 
@@ -395,11 +396,11 @@ machine(struct mne *mp)
                          */
                         if (flat24Mode)
                         {
-                            outr24(&e1, 0);
+                                outr24(&e1, 0);
                         }
                         else
                         {
-                        outrw(&e1, 0);
+                                outrw(&e1, 0);
                         }
                         break;
 
@@ -413,15 +414,11 @@ machine(struct mne *mp)
                 t = addr(&e);
                 if ((t != S_DIR) && (t != S_EXT))
                         aerr();
-                outab(op);
-                outrb(&e, R_PAG0);
-
                 comma();
                 expr(&e1, 0);
+                outab(op);
+                outrb(&e, R_PAG0);
                 if (e1.e_base.e_ap == NULL || e1.e_base.e_ap == dot.s_area) {
-                    if ( e1.e_addr == dot.s_addr)
-                        v1 = -3;
-                    else
                         v1 = e1.e_addr - dot.s_addr - 1;
                         if (pass==2 && ((v1 < -128) || (v1 > 127)))
                                 aerr();
@@ -435,12 +432,9 @@ machine(struct mne *mp)
 
         case S_BR:
                 /* Relative branch */
-                outab(op);
                 expr(&e1, 0);
+                outab(op);
                 if (e1.e_base.e_ap == NULL || e1.e_base.e_ap == dot.s_area) {
-                    if ( e1.e_addr == dot.s_addr)
-                        v1 = -2;
-                    else
                         v1 = e1.e_addr - dot.s_addr - 1;
                         if (pass == 2 && ((v1 < -128) || (v1 > 127)))
                                 aerr();
@@ -457,6 +451,8 @@ machine(struct mne *mp)
                 t = addr(&e);
                 comma();
                 t1 = addr(&e1);
+                comma();
+                expr(&e2, 0);
                 switch (t) {
                 case S_A:
                         if (t1 == S_IMMED) {
@@ -490,38 +486,33 @@ machine(struct mne *mp)
                 }
 
                 /* branch destination */
-                comma();
-                expr(&e1, 0);
-                if (e1.e_base.e_ap == NULL || e1.e_base.e_ap == dot.s_area) {
-                        if ( e1.e_addr == dot.s_addr)
-                                v1 = -3;
-                        else
-                                v1 = e1.e_addr - dot.s_addr - 1;
+                if (e2.e_base.e_ap == NULL || e2.e_base.e_ap == dot.s_area) {
+                        v1 = e2.e_addr - dot.s_addr - 1;
                         if (pass == 2 && ((v1 < -128) || (v1 > 127)))
                                 aerr();
                         outab(v1);
                 } else {
-                        outrb(&e1, R_PCR);
+                        outrb(&e2, R_PCR);
                 }
-                if (e1.e_mode != S_USER)
+                if (e2.e_mode != S_USER)
                         rerr();
                 break;
 
         case S_DJNZ:
                 /* Dir,dest;  Reg,dest */
                 t = addr(&e);
+                comma();
+                expr(&e1, 0);
                 switch (t) {
 
                 case S_DIR:
                 case S_EXT:
                         outab(op + 5);
                         outrb(&e, R_PAG0);
-                        v1 = -3;
                         break;
 
                 case S_REG:
                         outab(op + 8 + e.e_addr);
-                        v1 = -2;
                         break;
 
                 default:
@@ -529,11 +520,8 @@ machine(struct mne *mp)
                 }
 
                 /* branch destination */
-                comma();
-                expr(&e1, 0);
                 if (e1.e_base.e_ap == NULL || e1.e_base.e_ap == dot.s_area) {
-                        if ( e1.e_addr != dot.s_addr)
-                                v1 = e1.e_addr - dot.s_addr - 1;
+                        v1 = e1.e_addr - dot.s_addr - 1;
                         if (pass == 2 && ((v1 < -128) || (v1 > 127)))
                                 aerr();
                         outab(v1);
@@ -609,7 +597,8 @@ machine(struct mne *mp)
         /* MUL/DIV A,B */
         case S_AB:
                 t = addr(&e);
-                if (t != S_RAB) aerr();
+                if (t != S_RAB)
+                        aerr();
                 outab(op);
                 break;