Hi Grant,

Ok try this patch.

Its a real hack of the way memory moves work, they are all mov.b instructions for word (2 byte) moves. I completely understand how all this works and how best to make changes, but in the examples posted I think it generates the correct code (although using 6 extra bytes, for the case where the source or destination of the move are word aligned).

It should leave "; movehiC" and "; movehi" comments in the .s file, if they are where you want them then I can take them out, see if its targeting the correct instructions first.

Register moves should be same, and I'm not sure if this is correct or not.

Regards,

--
Peter Jansen
STS
Antarctic Division
203 Channel Highway
Kingston
TAS  7050
AUSTRALIA
Phone +61 3 6232 3533

___________________________________________________________________________

   Australian Antarctic Division - Commonwealth of Australia
IMPORTANT: This transmission is intended for the addressee only. If you are not 
the
intended recipient, you are notified that use or dissemination of this 
communication is
strictly prohibited by Commonwealth law. If you have received this transmission 
in error,
please notify the sender immediately by e-mail or by telephoning +61 3 6232 
3209 and
DELETE the message.
       Visit our web site at http://www.aad.gov.au/
___________________________________________________________________________
diff -rU5 gcc-3.2.3-orig/gcc/config/msp430/msp430.c 
gcc-3.2.3/gcc/config/msp430/msp430.c
--- gcc-3.2.3-orig/gcc/config/msp430/msp430.c   2006-04-24 02:18:20.000000000 
+1000
+++ gcc-3.2.3/gcc/config/msp430/msp430.c        2006-09-13 22:49:35.000000000 
+1000
@@ -3546,10 +3546,71 @@
     return (-1);
 
   return (REGNO (x));
 }
 
+const char *
+msp430_movehi_code (insn, operands, len)
+     rtx insn;
+     rtx operands[];
+     int *len;
+{
+  rtx op0 = operands[0];
+  rtx op1 = operands[1];
+
+
+  if (memory_operand (op0, VOIDmode)
+      && memory_operand (op1, VOIDmode) && zero_shifted (op1))
+    {
+      if (!len)
+       msp430_emit_indexed_mov2 (insn, operands, NULL);
+      else
+       *len = 3;
+      return "";
+    }
+  else if (register_operand (op0, VOIDmode)
+          && memory_operand (op1, VOIDmode) && zero_shifted (op1))
+    {
+      if (!len)
+       movsisf_regmode (insn, operands, NULL);
+      else
+       *len = 1;
+      return "";
+    }
+
+  if (!len)
+    {
+        if (GET_CODE (operands[1]) == CONST_INT)
+        {
+            output_asm_insn ("mov.b\t#(%F1&0xff), %I0; movehiC", operands);
+            output_asm_insn ("mov.b\t#(%F1>>8), %J0; movehiC", operands);
+        }
+        else
+        {
+            output_asm_insn ("mov.b\t%I1, %I0; movehi", operands);
+            output_asm_insn ("mov.b\t%J1, %J0; movehi", operands);
+        }
+    }
+  else
+    {
+      *len = 1;                        /* base length */
+
+      if (register_operand (op0, VOIDmode))
+       *len += 0;
+      else if (memory_operand (op0, VOIDmode))
+       *len += 1;
+
+      if (register_operand (op1, VOIDmode))
+       *len += 0;
+      else if (memory_operand (op1, VOIDmode))
+       *len += 1;
+      else if (immediate_operand (op1, VOIDmode))
+       *len += 1;
+    }
+
+  return "";
+}
 
 const char *
 msp430_movesi_code (insn, operands, len)
      rtx insn;
      rtx operands[];
diff -rU5 gcc-3.2.3-orig/gcc/config/msp430/msp430.md 
gcc-3.2.3/gcc/config/msp430/msp430.md
--- gcc-3.2.3-orig/gcc/config/msp430/msp430.md  2006-01-30 20:47:05.000000000 
+1100
+++ gcc-3.2.3/gcc/config/msp430/msp430.md       2006-09-13 21:25:52.000000000 
+1000
@@ -1155,18 +1155,27 @@
   [(set (match_operand:HI 0 "nonimmediate_operand_msp430" "")
         (match_operand:HI 1 "general_operand_msp430" ""))]
   ""
   "")
 
-(define_insn "*movhi3"
-  [(set (match_operand:HI 0 "nonimmediate_operand_msp430"      
"=m,m,m,m,r,r,r,r")
-       (match_operand:HI 1 "general_operand_msp430"            " 
r,m,P,i,r,m,P,i"))]
+(define_insn "*movhi2"
+  [(set (match_operand:HI 0 "register_operand"                 "=r,r,r,r")
+       (match_operand:HI 1 "general_operand_msp430"            " r,m,P,i")) ]
   ""
-  "mov\\t%1, %0 "
-  [(set_attr "length" "2,3,3,3,1,2,2,2")
+  "mov\\t%1, %0"
+  [(set_attr "length" "1,2,2,2")
    (set_attr "cc" "none")])
 
+(define_insn "*movhi2m"
+  [(set (match_operand:HI 0 "memory_operand_msp430"            "=mmmm")
+       (match_operand:HI 1 "general_operand_msp430"            " rmPi")) ]
+  ""
+  "* return msp430_movehi_code(insn,operands,NULL);"
+  [(set_attr "length" "3")
+   (set_attr "cc" "none")])
+
+
 (define_insn "movhipi"
   [(set (match_operand:HI 0 "nonimmediate_operand_msp430" "=r,m")
        (mem:HI (post_inc:HI (match_operand:HI 1 "register_operand" "r,r"))))]
   ""
   "mov @%1+, %0"

Reply via email to