rl78.md (mulqi3,mulhi3): New define_expands.
authorKaushik Phatak <kaushik.phatak@kpitcummins.com>
Fri, 31 May 2013 04:23:02 +0000 (04:23 +0000)
committerKaushik Phatak <kaushikp@gcc.gnu.org>
Fri, 31 May 2013 04:23:02 +0000 (04:23 +0000)
* config/rl78/rl78.md (mulqi3,mulhi3): New define_expands.
(mulqi3_rl78,mulhi3_rl78,mulhi3_g13): New define_insns.

From-SVN: r199469

gcc/ChangeLog
gcc/config/rl78/rl78.md

index 9086576410a08cabb8b95f3616da6e33a52be5d6..42ed62640e7395f721ed53cab901a2c074f2560c 100644 (file)
@@ -1,3 +1,8 @@
+2013-05-31  Kaushik Phatak  <kaushik.phatak@kpitcummins.com>
+
+       * config/rl78/rl78.md (mulqi3,mulhi3): New define_expands.
+       (*mulqi3_rl78,*mulhi3_rl78,*mulhi3_g13): New define_insns.
+
 2013-05-30  Tobias Burnus  <burnus@net-b.de>
            Thomas Koenig  <tkoenig@gcc.gnu.org>
 
index b3cfe6d1bbccf845e19d0d619c3e9bcda68d992a..1bcfc84fdb9e46f5c43e5daf1884918154ff1c5b 100644 (file)
   [(set_attr "valloc" "macax")]
 )
 
+(define_expand "mulqi3"
+  [(set (match_operand:QI          0 "register_operand" "")
+       (mult:QI  (match_operand:QI 1 "general_operand" "")
+                 (match_operand:QI 2 "nonmemory_operand" "")))
+   ]
+  "" ; mulu supported by all targets
+  ""
+)
+
+(define_expand "mulhi3"
+  [(set (match_operand:HI          0 "register_operand" "")
+       (mult:HI (match_operand:HI 1 "general_operand" "")
+                (match_operand:HI 2 "nonmemory_operand" "")))
+   ]
+  "! RL78_MUL_NONE"
+  ""
+)
+
 (define_expand "mulsi3"
   [(set (match_operand:SI          0 "register_operand" "=&v")
        (mult:SI (match_operand:SI 1 "nonmemory_operand" "vi")
   ""
 )
 
+(define_insn "*mulqi3_rl78"
+  [(set (match_operand:QI          0 "register_operand" "=&v")
+       (mult:QI (match_operand:QI 1 "general_operand" "+viU")
+                (match_operand:QI 2 "general_operand" "vi")))
+   ]
+  "" ; mulu supported by all targets
+  "; mulqi macro %0 = %1 * %2
+       mov    a, %h1
+       mov    x, a
+       mov    a, %h2
+       mulu   x ; ax = a * x
+       mov    a, x
+       mov    %h0, a
+       ; end of mulqi macro"
+)
+
+(define_insn "*mulhi3_rl78"
+  [(set (match_operand:HI          0 "register_operand" "=&v")
+       (mult:HI (match_operand:HI 1 "general_operand" "+viU")
+                (match_operand:HI 2 "general_operand" "vi")))
+   ]
+  "RL78_MUL_RL78"
+  "; mulhi macro %0 = %1 * %2
+       movw    ax, %h1
+       movw    bc, %h2
+       mulhu   ; bcax = bc * ax
+       movw    %h0, ax
+       ; end of mulhi macro"
+)
+
+(define_insn "*mulhi3_g13"
+  [(set (match_operand:HI          0 "register_operand" "=&v")
+       (mult:HI (match_operand:HI 1 "general_operand" "+viU")
+                (match_operand:HI 2 "general_operand" "vi")))
+   ]
+  "RL78_MUL_G13"
+  "; mulhi macro %0 = %1 * %2
+       mov     a, #0x00
+       mov     !0xf00e8, a     ; MDUC
+       movw    ax, %h1
+       movw    0xffff0, ax     ; MDAL
+       movw    ax, %h2
+       movw    0xffff2, ax     ; MDAH
+       nop     ; mdb = mdal * mdah
+       movw    ax, 0xffff6     ; MDBL
+       movw    %h0, ax
+        ; end of mulhi macro"
+)
+
 ;; 0xFFFF0 is MACR(L).  0xFFFF2 is MACR(H) but we don't care about it
 ;; because we're only using the lower 16 bits (which is the upper 16
 ;; bits of the result).