s390.md: ("movstr", "*movstr"): Add patterns.
authorAdrian Straetling <straetling@de.ibm.com>
Fri, 26 Aug 2005 06:49:57 +0000 (06:49 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Fri, 26 Aug 2005 06:49:57 +0000 (06:49 +0000)
2005-08-26  Adrian Straetling  <straetling@de.ibm.com>

* config/s390/s390.md: ("movstr", "*movstr"): Add patterns.
(UNSPEC_MVST): New constant.

From-SVN: r103516

gcc/ChangeLog
gcc/config/s390/s390.md

index 84b1da077616e56b0250e3d33015c7b0e5811789..837d6e7fc8e5f484869d5b436931f3bbff72cb5a 100644 (file)
@@ -1,3 +1,8 @@
+2005-08-26  Adrian Straetling  <straetling@de.ibm.com>
+
+       * config/s390/s390.md: ("movstr", "*movstr"): Add patterns.
+       (UNSPEC_MVST): New constant.
+
 2005-08-26  Andreas Krebbel  <krebbel1@de.ibm.com>
 
        * config/s390/predicates.md ("shift_count_operand", "setmem_operand"):
index e4d7097606bab969db1782b75a194bf578564ca5..84e58d7838d84e967e5ed62db0931803aeaf8bb1 100644 (file)
 
    ; String Functions
    (UNSPEC_SRST                        600)
+   (UNSPEC_MVST                        601)
    
    ; Stack Smashing Protector
    (UNSPEC_SP_SET              700)
   [(set_attr "length" "8")
    (set_attr "type" "vs")])
  
+;
+; movstr instruction pattern.
+;
+
+(define_expand "movstr"
+  [(set (reg:SI 0) (const_int 0))
+   (parallel 
+    [(clobber (match_dup 3))
+     (set (match_operand:BLK 1 "memory_operand" "")
+         (match_operand:BLK 2 "memory_operand" ""))
+     (set (match_operand 0 "register_operand" "")
+         (unspec [(match_dup 1) 
+                  (match_dup 2)
+                  (reg:SI 0)] UNSPEC_MVST))
+     (clobber (reg:CC CC_REGNUM))])]
+  ""
+{
+  rtx addr1 = gen_reg_rtx (Pmode);
+  rtx addr2 = gen_reg_rtx (Pmode);
+
+  emit_move_insn (addr1, force_operand (XEXP (operands[1], 0), NULL_RTX));
+  emit_move_insn (addr2, force_operand (XEXP (operands[2], 0), NULL_RTX));
+  operands[1] = replace_equiv_address_nv (operands[1], addr1);
+  operands[2] = replace_equiv_address_nv (operands[2], addr2);
+  operands[3] = addr2;
+})
+
+(define_insn "*movstr"
+  [(clobber (match_operand:P 2 "register_operand" "=d"))
+   (set (mem:BLK (match_operand:P 1 "register_operand" "0"))
+       (mem:BLK (match_operand:P 3 "register_operand" "2")))
+   (set (match_operand:P 0 "register_operand" "=d")
+       (unspec [(mem:BLK (match_dup 1)) 
+                (mem:BLK (match_dup 3))
+                (reg:SI 0)] UNSPEC_MVST))
+   (clobber (reg:CC CC_REGNUM))]
+  ""
+  "mvst\t%1,%2\;jo\t.-4"
+  [(set_attr "length" "8")
+   (set_attr "type" "vs")])
+  
+
 ;
 ; movmemM instruction pattern(s).
 ;