163d1a8abSmrg;;  Machine Description for Renesas RL78 processors
2*ec02198aSmrg;;  Copyright (C) 2011-2020 Free Software Foundation, Inc.
363d1a8abSmrg;;  Contributed by Red Hat.
463d1a8abSmrg
563d1a8abSmrg;; This file is part of GCC.
663d1a8abSmrg
763d1a8abSmrg;; GCC is free software; you can redistribute it and/or modify
863d1a8abSmrg;; it under the terms of the GNU General Public License as published by
963d1a8abSmrg;; the Free Software Foundation; either version 3, or (at your option)
1063d1a8abSmrg;; any later version.
1163d1a8abSmrg
1263d1a8abSmrg;; GCC is distributed in the hope that it will be useful,
1363d1a8abSmrg;; but WITHOUT ANY WARRANTY; without even the implied warranty of
1463d1a8abSmrg;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1563d1a8abSmrg;; GNU General Public License for more details.
1663d1a8abSmrg
1763d1a8abSmrg;; You should have received a copy of the GNU General Public License
1863d1a8abSmrg;; along with GCC; see the file COPYING3.  If not see
1963d1a8abSmrg;; <http://www.gnu.org/licenses/>.
2063d1a8abSmrg
2163d1a8abSmrg;; In this MD file, we define those insn patterns that involve
2263d1a8abSmrg;; registers, where such registers are virtual until allocated to a
2363d1a8abSmrg;; physical register.  All of these insns need to be conditional on
2463d1a8abSmrg;; rl78_virt_insns_ok () being true.
2563d1a8abSmrg
2663d1a8abSmrg;; This tells the physical register allocator what method to use to
2763d1a8abSmrg;; allocate registers.  Basically, this defines the template of the
2863d1a8abSmrg;; instruction - op1 is of the form "a = op(b)", op2 is "a = b op c"
2963d1a8abSmrg;; etc.
3063d1a8abSmrg
3163d1a8abSmrg(define_attr "valloc" "op1,op2,ro1,cmp,umul,macax,divhi,divsi"
3263d1a8abSmrg  (const_string "op2"))
3363d1a8abSmrg
3463d1a8abSmrg;;---------- Moving ------------------------
3563d1a8abSmrg
3663d1a8abSmrg(define_insn "*movqi_virt_mm"
3763d1a8abSmrg  [(set (match_operand:QI 0 "rl78_near_mem_operand" "=Y")
3863d1a8abSmrg	(match_operand    1 "rl78_near_mem_operand" "Y"))]
3963d1a8abSmrg  "rl78_virt_insns_ok ()"
4063d1a8abSmrg  "v.mov %0, %1"
4163d1a8abSmrg  [(set_attr "valloc" "op1")]
4263d1a8abSmrg)
4363d1a8abSmrg
4463d1a8abSmrg(define_insn "*movqi_virt"
4563d1a8abSmrg  [(set (match_operand:QI 0 "nonimmediate_operand" "=vY,v,*Wfr,Y,*Wfr,*Wfr")
4663d1a8abSmrg	(match_operand    1 "general_operand" "vInt8JY,*Wfr,vInt8J,*Wfr,Y,*Wfr"))]
4763d1a8abSmrg  "rl78_virt_insns_ok ()"
4863d1a8abSmrg  "v.mov %0, %1"
4963d1a8abSmrg  [(set_attr "valloc" "op1")]
5063d1a8abSmrg)
5163d1a8abSmrg
5263d1a8abSmrg(define_insn "*movhi_virt_mm"
5363d1a8abSmrg  [(set (match_operand:HI 0 "rl78_near_mem_operand" "=Y")
5463d1a8abSmrg	(match_operand:HI 1 "rl78_near_mem_operand" "Y"))]
5563d1a8abSmrg  "rl78_virt_insns_ok ()"
5663d1a8abSmrg  "v.movw %0, %1"
5763d1a8abSmrg  [(set_attr "valloc" "op1")]
5863d1a8abSmrg)
5963d1a8abSmrg
6063d1a8abSmrg(define_insn "*movhi_virt"
6163d1a8abSmrg  [(set (match_operand:HI 0 "nonimmediate_operand" "=vS,  Y,   v,   *Wfr")
6263d1a8abSmrg	(match_operand:HI 1 "general_operand"      "viYS, viS, *Wfr, vi"))]
6363d1a8abSmrg  "rl78_virt_insns_ok ()"
6463d1a8abSmrg  "v.movw %0, %1"
6563d1a8abSmrg  [(set_attr "valloc" "op1")]
6663d1a8abSmrg)
6763d1a8abSmrg
68c7a68eb7Smrg(define_insn "*bswaphi2_virt"
69c7a68eb7Smrg  [(set (match_operand:HI           0 "rl78_nonfar_nonimm_operand" "=vm")
70c7a68eb7Smrg        (bswap:HI (match_operand:HI 1 "general_operand"  "vim")))]
71c7a68eb7Smrg  "rl78_virt_insns_ok ()"
72c7a68eb7Smrg  "v.bswaphi\t%0, %1"
73c7a68eb7Smrg  [(set_attr "valloc" "op1")]
74c7a68eb7Smrg)
75c7a68eb7Smrg
7663d1a8abSmrg;;---------- Conversions ------------------------
7763d1a8abSmrg
7863d1a8abSmrg(define_insn "*zero_extendqihi2_virt"
7963d1a8abSmrg  [(set (match_operand:HI                 0 "rl78_nonfar_nonimm_operand" "=vY,*Wfr")
8063d1a8abSmrg	(zero_extend:HI (match_operand:QI 1 "general_operand" "vim,viY")))]
8163d1a8abSmrg  "rl78_virt_insns_ok () && rl78_one_far_p (operands, 2)"
8263d1a8abSmrg  "v.zero_extend\t%0, %1"
8363d1a8abSmrg  [(set_attr "valloc" "op1")]
8463d1a8abSmrg  )
8563d1a8abSmrg
8663d1a8abSmrg(define_insn "*extendqihi2_virt"
8763d1a8abSmrg  [(set (match_operand:HI                 0 "rl78_nonfar_nonimm_operand" "=vY,*Wfr")
8863d1a8abSmrg	(sign_extend:HI (match_operand:QI 1 "general_operand" "vim,viY")))]
8963d1a8abSmrg  "rl78_virt_insns_ok () && rl78_one_far_p (operands, 2)"
9063d1a8abSmrg  "v.sign_extend\t%0, %1"
9163d1a8abSmrg  [(set_attr "valloc" "op1")]
9263d1a8abSmrg  )
9363d1a8abSmrg
9463d1a8abSmrg;;---------- Arithmetic ------------------------
9563d1a8abSmrg
9663d1a8abSmrg(define_insn "*inc<mode>3_virt"
9763d1a8abSmrg  [(set (match_operand:QHI           0 "rl78_incdec_memory_operand" "=vm")
9863d1a8abSmrg	(plus:QHI (match_operand:QHI 1 "rl78_incdec_memory_operand" "0")
9963d1a8abSmrg		  (match_operand:QHI 2 "rl78_1_2_operand" "KLNO")))
10063d1a8abSmrg   ]
10163d1a8abSmrg  "rl78_virt_insns_ok ()"
10263d1a8abSmrg  "v.inc\t%0, %1, %2"
10363d1a8abSmrg)
10463d1a8abSmrg
10563d1a8abSmrg(define_insn "*add<mode>3_virt"
10663d1a8abSmrg  [(set (match_operand:QHI           0 "rl78_nonimmediate_operand" "=vY,  S, *Wfr,  vY")
10763d1a8abSmrg	(plus:QHI (match_operand:QHI 1 "rl78_general_operand"      "%viY, 0, 0viY, *Wfr")
10863d1a8abSmrg		  (match_operand:QHI 2 "rl78_general_operand"       "vim, i, viY,  viY")))
10963d1a8abSmrg   ]
11063d1a8abSmrg  "rl78_virt_insns_ok () && rl78_one_far_p (operands, 3)"
11163d1a8abSmrg  "v.add\t%0, %1, %2"
11263d1a8abSmrg)
11363d1a8abSmrg
11463d1a8abSmrg(define_insn "*sub<mode>3_virt"
11563d1a8abSmrg  [(set (match_operand:QHI            0 "rl78_nonimmediate_operand" "=vY, S, *Wfr,  vY")
11663d1a8abSmrg	(minus:QHI (match_operand:QHI 1 "rl78_general_operand"      "viY, 0, 0viY, *Wfr")
11763d1a8abSmrg		   (match_operand:QHI 2 "rl78_general_operand"      "vim, i, viY,  viY")))
11863d1a8abSmrg   ]
11963d1a8abSmrg  "rl78_virt_insns_ok () && rl78_one_far_p (operands, 3)"
12063d1a8abSmrg  "v.sub\t%0, %1, %2"
12163d1a8abSmrg)
12263d1a8abSmrg
12363d1a8abSmrg(define_insn "*umulhi3_shift_virt"
12463d1a8abSmrg  [(set (match_operand:HI          0 "register_operand" "=v")
12563d1a8abSmrg        (mult:HI (match_operand:HI 1 "rl78_nonfar_operand" "%vim")
12663d1a8abSmrg                 (match_operand:HI 2 "rl78_24_operand" "Ni")))]
12763d1a8abSmrg  "rl78_virt_insns_ok ()"
12863d1a8abSmrg  "v.mulu\t%0, %1, %2"
12963d1a8abSmrg  [(set_attr "valloc" "umul")]
13063d1a8abSmrg)
13163d1a8abSmrg
13263d1a8abSmrg(define_insn "*umulqihi3_virt"
13363d1a8abSmrg  [(set (match_operand:HI                          0 "register_operand" "=v")
13463d1a8abSmrg        (mult:HI (zero_extend:HI (match_operand:QI 1 "rl78_nonfar_operand" "%vim"))
13563d1a8abSmrg                 (zero_extend:HI (match_operand:QI 2 "general_operand" "vim"))))]
13663d1a8abSmrg  "rl78_virt_insns_ok ()"
13763d1a8abSmrg  "v.mulu\t%0, %2"
13863d1a8abSmrg  [(set_attr "valloc" "umul")]
13963d1a8abSmrg)
14063d1a8abSmrg
14163d1a8abSmrg(define_insn "*andqi3_virt"
14263d1a8abSmrg  [(set (match_operand:QI         0 "rl78_nonimmediate_operand" "=vm,  *Wfr,  vY")
14363d1a8abSmrg	(and:QI (match_operand:QI 1 "rl78_general_operand"      "%vim, 0viY, *Wfr")
14463d1a8abSmrg		(match_operand:QI 2 "rl78_general_operand"      "vim,  viY,  viY")))
14563d1a8abSmrg   ]
14663d1a8abSmrg  "rl78_virt_insns_ok () && rl78_one_far_p (operands, 3)"
14763d1a8abSmrg  "v.and\t%0, %1, %2"
14863d1a8abSmrg)
14963d1a8abSmrg
15063d1a8abSmrg(define_insn "*iorqi3_virt"
15163d1a8abSmrg  [(set (match_operand:QI         0 "rl78_nonimmediate_operand" "=vm,  *Wfr,  vY")
15263d1a8abSmrg	(ior:QI (match_operand:QI 1 "rl78_general_operand"      "%vim, 0viY, *Wfr")
15363d1a8abSmrg		(match_operand:QI 2 "rl78_general_operand"      "vim,  viY,  viY")))
15463d1a8abSmrg   ]
15563d1a8abSmrg  "rl78_virt_insns_ok () && rl78_one_far_p (operands, 3)"
15663d1a8abSmrg  "v.or\t%0, %1, %2"
15763d1a8abSmrg)
15863d1a8abSmrg
15963d1a8abSmrg(define_insn "*xorqi3_virt"
16063d1a8abSmrg  [(set (match_operand:QI         0 "rl78_nonimmediate_operand" "=vm,  *Wfr,  vY")
16163d1a8abSmrg	(xor:QI (match_operand:QI 1 "rl78_general_operand"      "%vim, 0viY, *Wfr")
16263d1a8abSmrg		(match_operand    2 "rl78_general_operand"      "vim,  viY,  viY")))
16363d1a8abSmrg   ]
16463d1a8abSmrg  "rl78_virt_insns_ok () && rl78_one_far_p (operands, 3)"
16563d1a8abSmrg  "v.xor\t%0, %1, %2"
16663d1a8abSmrg)
16763d1a8abSmrg
16863d1a8abSmrg;;---------- Shifts ------------------------
16963d1a8abSmrg
17063d1a8abSmrg(define_insn "*ashl<mode>3_virt"
17163d1a8abSmrg  [(set (match_operand:QHI             0 "rl78_nonfar_nonimm_operand" "=vm")
17263d1a8abSmrg	(ashift:QHI (match_operand:QHI 1 "rl78_nonfar_operand" "vim")
17363d1a8abSmrg		    (match_operand:QI  2 "general_operand" "vim")))
17463d1a8abSmrg   ]
17563d1a8abSmrg  "rl78_virt_insns_ok ()"
17663d1a8abSmrg  "v.shl\t%0, %1, %2"
17763d1a8abSmrg)
17863d1a8abSmrg
17963d1a8abSmrg(define_insn "*ashr<mode>3_virt"
18063d1a8abSmrg  [(set (match_operand:QHI               0 "rl78_nonfar_nonimm_operand" "=vm")
18163d1a8abSmrg	(ashiftrt:QHI (match_operand:QHI 1 "rl78_nonfar_operand" "vim")
18263d1a8abSmrg		      (match_operand:QI  2 "general_operand" "vim")))
18363d1a8abSmrg   ]
18463d1a8abSmrg  "rl78_virt_insns_ok ()"
18563d1a8abSmrg  "v.sar\t%0, %1, %2"
18663d1a8abSmrg)
18763d1a8abSmrg
18863d1a8abSmrg(define_insn "*lshr<mode>3_virt"
18963d1a8abSmrg  [(set (match_operand:QHI               0 "rl78_nonfar_nonimm_operand" "=vm")
19063d1a8abSmrg	(lshiftrt:QHI (match_operand:QHI 1 "rl78_nonfar_operand" "vim")
19163d1a8abSmrg		      (match_operand:QI  2 "general_operand" "vim")))
19263d1a8abSmrg   ]
19363d1a8abSmrg  "rl78_virt_insns_ok ()"
19463d1a8abSmrg  "v.shr\t%0, %1, %2"
19563d1a8abSmrg)
19663d1a8abSmrg
19763d1a8abSmrg;; This is complex mostly because the RL78 has no SImode operations,
19863d1a8abSmrg;; and very limited HImode operations, and no variable shifts.  This
19963d1a8abSmrg;; pattern is optimized for each constant shift count and operand
20063d1a8abSmrg;; types, so as to use a hand-optimized pattern.  For readability, the
20163d1a8abSmrg;; usual \t\; syntax is not used here.  Also, there's no easy way to
20263d1a8abSmrg;; constrain to avoid partial overlaps, hence the duplication.
20363d1a8abSmrg(define_insn "ashrsi3_virt"                                  ;;   0  1      2-7            8         9-15           16   17-23     24   25-31 var
20463d1a8abSmrg  [(set (match_operand:SI               0 "nonimmediate_operand" "=v,vU,&vU,v,  &vU,  &vU, v,  &vU,  v,  &vU, &vU,  vU,  v,&vU,    vU,  vU,   vU")
20563d1a8abSmrg	(ashiftrt:SI (match_operand:SI  1 "nonimmediate_operand" "0, 0,  vU,0,   vWab, U,  0,   vU,  0,   vWab,U,   vU,  0, vU,    vU,  vU,   0")
20663d1a8abSmrg		      (match_operand:SI 2 "nonmemory_operand"    "M, K,  K, Int3,Int3,Int3,Iv08,Iv08,Is09,Is09,Is09,Iv16,Is17,Is17,Iv24,Is25, iv")))
20763d1a8abSmrg   (clobber (reg:HI X_REG))
20863d1a8abSmrg    ]
20963d1a8abSmrg   ""
21063d1a8abSmrg   "@
21163d1a8abSmrg    ; ashrsi %0, 0
21263d1a8abSmrg
21363d1a8abSmrg   movw ax,%H1 \; sarw ax,1 \; movw %H0,ax \; mov a,%Q1 \; rorc a,1 \; mov %Q0,a \; mov a,%q1 \; rorc a,1 \; mov %q0,a
21463d1a8abSmrg   movw ax,%H1 \; sarw ax,1 \; movw %H0,ax \; mov a,%Q1 \; rorc a,1 \; mov %Q0,a \; mov a,%q1 \; rorc a,1 \; mov %q0,a
21563d1a8abSmrg
21663d1a8abSmrg   movw ax,%1 \; shlw ax,%r2 \; mov %0,a             \; mov x,%Q1 \; mov a,%H1 \; shlw ax,%r2 \; mov %Q0,a \; movw ax,%H1 \; sarw ax,%u2 \; movw %H0,ax
21763d1a8abSmrg   movw ax,%1 \; shlw ax,%r2 \; mov %0,a             \; mov x,%Q1 \; mov a,%H1 \; shlw ax,%r2 \; mov %Q0,a \; movw ax,%H1 \; sarw ax,%u2 \; movw %H0,ax
21863d1a8abSmrg   movw ax,%1 \; shlw ax,%r2 \; mov %0,a \; mov a,%Q1 \; mov x,a   \; mov a,%H1 \; shlw ax,%r2 \; mov %Q0,a \; movw ax,%H1 \; sarw ax,%u2 \; movw %H0,ax
21963d1a8abSmrg
22063d1a8abSmrg   mov x,%Q1            \; mov a,%H1 \; movw %0,ax \; movw ax,%H1 \; sarw ax,8 \; movw %H0,ax
22163d1a8abSmrg   mov a,%Q1 \; mov x, a \; mov a,%H1 \; movw %0,ax \; movw ax,%H1 \; sarw ax,8 \; movw %H0,ax
22263d1a8abSmrg
22363d1a8abSmrg   mov x,%Q1           \; mov a,%H1 \; shlw ax,%r2 \; mov %0,a \; movw ax,%H1 \; shlw ax,%r2 \; mov %Q0,a \; movw ax,%H1 \; sarw ax,%u2 \; movw %H0,ax
22463d1a8abSmrg   mov x,%Q1           \; mov a,%H1 \; shlw ax,%r2 \; mov %0,a \; movw ax,%H1 \; shlw ax,%r2 \; mov %Q0,a \; movw ax,%H1 \; sarw ax,%u2 \; movw %H0,ax
22563d1a8abSmrg   mov a,%Q1 \; mov x,a \; mov a,%H1 \; shlw ax,%r2 \; mov %0,a \; movw ax,%H1 \; shlw ax,%r2 \; mov %Q0,a \; movw ax,%H1 \; sarw ax,%u2 \; movw %H0,ax
22663d1a8abSmrg
22763d1a8abSmrg   movw ax,%H1 \; movw %0,ax \; sarw ax,15 \; movw %H0,ax
22863d1a8abSmrg
22963d1a8abSmrg   movw ax,%H1 \; sarw ax,%S2 \; movw %0,ax \; sarw ax,15 \; movw %H0,ax
23063d1a8abSmrg   movw ax,%H1 \; sarw ax,%S2 \; movw %0,ax \; sarw ax,15 \; movw %H0,ax
23163d1a8abSmrg
23263d1a8abSmrg   movw ax,%H1 \; mov %0,a \; sarw ax,15 \; movw %H0,ax \; mov %Q0,a
23363d1a8abSmrg
23463d1a8abSmrg   movw ax,%H1 \; sar a,%s2 \; mov %0,a \; sarw ax,15 \; movw %H0,ax \; mov %Q0,a
23563d1a8abSmrg
23663d1a8abSmrg   mov b,%2 \; cmp0 b \; bz $2f \; 1: \; movw ax,%H1 \; sarw ax,1 \; movw %H0,ax \; mov a,%Q1 \; rorc a,1 \; mov %Q0,a \; mov a,%q1 \; rorc a,1 \; mov %q0,a \; dec b \; bnz $1b \; 2:"
23763d1a8abSmrg  [(set_attr "valloc" "macax")]
23863d1a8abSmrg)
23963d1a8abSmrg
24063d1a8abSmrg;; Likewise.
24163d1a8abSmrg(define_insn "lshrsi3_virt"                                  ;;   0  1      2-7            8         9-15           16   17-23     24   25-31 var
24263d1a8abSmrg  [(set (match_operand:SI               0 "nonimmediate_operand" "=v,vU,&vU,v,  &vU,  &vU, v,  &vU,  v,  &vU, &vU,  vU,  v,&vU,    vU,  vU,   vU")
24363d1a8abSmrg	(lshiftrt:SI (match_operand:SI  1 "nonimmediate_operand" "0, 0,  vU,0,   vWab, U,  0,   vU,  0,   vWab,U,   vU,  0, vU,    vU,  vU,   0")
24463d1a8abSmrg		      (match_operand:SI 2 "nonmemory_operand"    "M, K,  K, Int3,Int3,Int3,Iv08,Iv08,Is09,Is09,Is09,Iv16,Is17,Is17,Iv24,Is25, iv")))
24563d1a8abSmrg   (clobber (reg:HI X_REG))
24663d1a8abSmrg   ]
24763d1a8abSmrg  ""
24863d1a8abSmrg  "@
24963d1a8abSmrg   ; lshrsi %0, 0
25063d1a8abSmrg
25163d1a8abSmrg   movw ax,%H1 \; shrw ax,1 \; movw %H0,ax \; mov a,%Q1 \; rorc a,1 \; mov %Q0,a \; mov a,%q1 \; rorc a,1 \; mov %q0,a
25263d1a8abSmrg   movw ax,%H1 \; shrw ax,1 \; movw %H0,ax \; mov a,%Q1 \; rorc a,1 \; mov %Q0,a \; mov a,%q1 \; rorc a,1 \; mov %q0,a
25363d1a8abSmrg
25463d1a8abSmrg   movw ax,%1 \; shlw ax,%r2 \; mov %0,a             \; mov x,%Q1 \; mov a,%H1 \; shlw ax,%r2 \; mov %Q0,a \; movw ax,%H1 \; shrw ax,%u2 \; movw %H0,ax
25563d1a8abSmrg   movw ax,%1 \; shlw ax,%r2 \; mov %0,a             \; mov x,%Q1 \; mov a,%H1 \; shlw ax,%r2 \; mov %Q0,a \; movw ax,%H1 \; shrw ax,%u2 \; movw %H0,ax
25663d1a8abSmrg   movw ax,%1 \; shlw ax,%r2 \; mov %0,a \; mov a,%Q1 \; mov x,a   \; mov a,%H1 \; shlw ax,%r2 \; mov %Q0,a \; movw ax,%H1 \; shrw ax,%u2 \; movw %H0,ax
25763d1a8abSmrg
25863d1a8abSmrg   mov x,%Q1            \; mov a,%H1 \; movw %0,ax \; movw ax,%H1 \; shrw ax,8 \; movw %H0,ax
25963d1a8abSmrg   mov a,%Q1 \; mov x, a \; mov a,%H1 \; movw %0,ax \; movw ax,%H1 \; shrw ax,8 \; movw %H0,ax
26063d1a8abSmrg
26163d1a8abSmrg   mov x,%Q1           \; mov a,%H1 \; shlw ax,%r2 \; mov %0,a \; movw ax,%H1 \; shlw ax,%r2 \; mov %Q0,a \; movw ax,%H1 \; shrw ax,%u2 \; movw %H0,ax
26263d1a8abSmrg   mov x,%Q1           \; mov a,%H1 \; shlw ax,%r2 \; mov %0,a \; movw ax,%H1 \; shlw ax,%r2 \; mov %Q0,a \; movw ax,%H1 \; shrw ax,%u2 \; movw %H0,ax
26363d1a8abSmrg   mov a,%Q1 \; mov x,a \; mov a,%H1 \; shlw ax,%r2 \; mov %0,a \; movw ax,%H1 \; shlw ax,%r2 \; mov %Q0,a \; movw ax,%H1 \; shrw ax,%u2 \; movw %H0,ax
26463d1a8abSmrg
26563d1a8abSmrg   movw ax,%H1 \; movw %0,ax \; movw ax,#0 \; movw %H0,ax
26663d1a8abSmrg
26763d1a8abSmrg   movw ax,%H1 \; shrw ax,%S2 \; movw %0,ax \; movw ax,#0 \; movw %H0,ax
26863d1a8abSmrg   movw ax,%H1 \; shrw ax,%S2 \; movw %0,ax \; movw ax,#0 \; movw %H0,ax
26963d1a8abSmrg
27063d1a8abSmrg   movw ax,%H1 \; mov %0,a \; movw ax,#0 \; movw %H0,ax \; mov %Q0,a
27163d1a8abSmrg
27263d1a8abSmrg   movw ax,%H1 \; shr a,%s2 \; mov %0,a \; movw ax,#0 \; movw %H0,ax \; mov %Q0,a
27363d1a8abSmrg
27463d1a8abSmrg   mov b,%2 \; cmp0 b \; bz $2f \; 1: \; movw ax,%H1 \; shrw ax,1 \; movw %H0,ax \; mov a,%Q1 \; rorc a,1 \; mov %Q0,a \; mov a,%q1 \; rorc a,1 \; mov %q0,a \; dec b \; bnz $1b \; 2:"
27563d1a8abSmrg  [(set_attr "valloc" "macax")]
27663d1a8abSmrg)
27763d1a8abSmrg
27863d1a8abSmrg;; Likewise.
27963d1a8abSmrg(define_insn "ashlsi3_virt"                                ;;   0  1      2-7            8         9-15           16        17-23     24        25-31     var
28063d1a8abSmrg  [(set (match_operand:SI             0 "nonimmediate_operand" "=v,vU,&vU,v,  &vU,  &vU, v,  &vU,  v,  &vU, &vU,  v,   U,   v,&vU,    v,   U,   v,   U,   vWab,vU,  vU")
28163d1a8abSmrg	(ashift:SI (match_operand:SI  1 "nonimmediate_operand" "0, 0,  vU,0,   vWab, U,  0,   vU,  0,   vWab,U,   vU,  vU,  0, vU,    vU,  vU,  vU,  vU,  0,   vWab,U")
28263d1a8abSmrg		    (match_operand:SI 2 "nonmemory_operand"    "M, K,  K, Int3,Int3,Int3,Iv08,Iv08,Is09,Is09,Is09,Iv16,Iv16,Is17,Is17,Iv24,Iv24,Is25,Is25,iv,  iv,  iv")))
28363d1a8abSmrg   (clobber (reg:HI X_REG))
28463d1a8abSmrg   ]
28563d1a8abSmrg  ""
28663d1a8abSmrg  "@
28763d1a8abSmrg   ; lshrsi %0, 0
28863d1a8abSmrg
28963d1a8abSmrg   movw ax,%1 \; shlw ax,1 \; movw %0,ax \; movw ax,%H1 \; rolwc ax,1 \; movw %H0,ax
29063d1a8abSmrg   movw ax,%1 \; shlw ax,1 \; movw %0,ax \; movw ax,%H1 \; rolwc ax,1 \; movw %H0,ax
29163d1a8abSmrg
29263d1a8abSmrg   movw ax,%H1 \; shlw ax,%u2 \; mov %E0,a \; mov x,%Q1           \; mov a, %H1 \; shlw ax,%S2 \; mov %H0,a \; movw ax,%1 \; shlw ax,%u2 \; movw %0,ax
29363d1a8abSmrg   movw ax,%H1 \; shlw ax,%u2 \; mov %E0,a \; mov x,%Q1           \; mov a, %H1 \; shlw ax,%S2 \; mov %H0,a \; movw ax,%1 \; shlw ax,%u2 \; movw %0,ax
29463d1a8abSmrg   movw ax,%H1 \; shlw ax,%u2 \; mov %E0,a \; mov a,%Q1 \; mov x,a \; mov a, %H1 \; shlw ax,%S2 \; mov %H0,a \; movw ax,%1 \; shlw ax,%u2 \; movw %0,ax
29563d1a8abSmrg
29663d1a8abSmrg   mov x,%Q1           \; mov a,%H1 \; movw %H0,ax \; movw ax,%1 \; shlw ax,8 \; movw %0,ax
29763d1a8abSmrg   mov a,%Q1 \; mov x,a \; mov a,%H1 \; movw %H0,ax \; movw ax,%1 \; shlw ax,8 \; movw %0,ax
29863d1a8abSmrg
29963d1a8abSmrg   mov x,%Q1           \; mov a,%H1 \; shlw ax,%s2 \; movw %H0,ax \; movw ax,%1 \; shlw ax,%s2 \; mov %H0,a \; movw ax,%1 \; shlw ax,%u2 \; movw %0,ax
30063d1a8abSmrg   mov x,%Q1           \; mov a,%H1 \; shlw ax,%s2 \; movw %H0,ax \; movw ax,%1 \; shlw ax,%s2 \; mov %H0,a \; movw ax,%1 \; shlw ax,%u2 \; movw %0,ax
30163d1a8abSmrg   mov a,%Q1 \; mov x,a \; mov a,%H1 \; shlw ax,%s2 \; movw %H0,ax \; movw ax,%1 \; shlw ax,%s2 \; mov %H0,a \; movw ax,%1 \; shlw ax,%u2 \; movw %0,ax
30263d1a8abSmrg
30363d1a8abSmrg   movw ax,%1 \; movw %H0,ax \; movw %0,#0
30463d1a8abSmrg   movw ax,%1 \; movw %H0,ax \; movw ax,#0 \; movw %0,ax
30563d1a8abSmrg
30663d1a8abSmrg   movw ax,%1 \; shlw ax,%S2 \; movw %H0,ax \; movw %0,#0
30763d1a8abSmrg   movw ax,%1 \; shlw ax,%S2 \; movw %H0,ax \; movw ax,#0 \; movw %0,ax
30863d1a8abSmrg
30963d1a8abSmrg   mov a,%1 \; movw %H0,ax \; mov %H0,#0 \; movw %0,#0
31063d1a8abSmrg   mov a,%1 \; movw %H0,ax \; movw ax,#0 \; mov %H0,a \; movW %0,ax
31163d1a8abSmrg
31263d1a8abSmrg   mov a,%1 \; shl a,%s2 \; movw %H0,ax \; mov %H0,#0 \; movw %0,#0
31363d1a8abSmrg   mov a,%1 \; shl a,%s2 \; movw %H0,ax \; movw ax,#0 \; mov %H0,a \; movW %0,ax
31463d1a8abSmrg
31563d1a8abSmrg   mov a,%2 \; cmp0 a \; bz $2f \; mov d,a \; movw ax,%H1 \; movw bc,%1 \; 1: \; shlw bc,1 \; rolwc ax,1 \; dec d \; bnz $1b \; movw %H0,ax \; movw ax,bc \; movw %0,ax \; 2:
31663d1a8abSmrg   mov a,%2 \; mov d,a \; movw ax,%H1 \; movw bc,%1 \; cmp0 0xFFEFD \; bz $2f \; 1: \; shlw bc,1 \; rolwc ax,1 \; dec d \; bnz $1b \; 2: \; movw %H0,ax \; movw ax,bc \; movw %0,ax
31763d1a8abSmrg   mov a,%2 \; mov d,a \; movw ax,%1 \; movw bc,ax \; movw ax,%H1 \; cmp0 0xFFEFD \; bz $2f \; 1: \; shlw bc,1 \; rolwc ax,1 \; dec d \; bnz $1b \; 2: \; movw %H0,ax \; movw ax,bc \; movw %0,ax"
31863d1a8abSmrg   [(set_attr "valloc" "macax")]
31963d1a8abSmrg )
32063d1a8abSmrg
32163d1a8abSmrg;;---------- Branching ------------------------
32263d1a8abSmrg
32363d1a8abSmrg(define_insn "*indirect_jump_virt"
32463d1a8abSmrg  [(set (pc)
32563d1a8abSmrg	(match_operand:HI 0 "nonimmediate_operand" "vm"))]
32663d1a8abSmrg  "rl78_virt_insns_ok ()"
32763d1a8abSmrg  "v.br\t%0"
32863d1a8abSmrg  [(set_attr "valloc" "ro1")]
32963d1a8abSmrg)
33063d1a8abSmrg
33163d1a8abSmrg(define_insn "*call_virt"
33263d1a8abSmrg  [(call (match_operand:HI 0 "memory_operand" "Wab,Wcv")
33363d1a8abSmrg	 (match_operand 1 "" ""))]
33463d1a8abSmrg  "rl78_virt_insns_ok ()"
33563d1a8abSmrg  "v.call\t%0"
33663d1a8abSmrg  [(set_attr "valloc" "ro1")]
33763d1a8abSmrg  )
33863d1a8abSmrg
33963d1a8abSmrg(define_insn "*call_value_virt"
34063d1a8abSmrg  [(set (match_operand 0 "register_operand" "=v,v")
34163d1a8abSmrg	(call (match_operand:HI 1 "memory_operand" "Wab,Wcv")
34263d1a8abSmrg	      (match_operand 2 "" "")))]
34363d1a8abSmrg  "rl78_virt_insns_ok ()"
34463d1a8abSmrg  "v.call\t%1"
34563d1a8abSmrg  [(set_attr "valloc" "op1")]
34663d1a8abSmrg  )
34763d1a8abSmrg
34863d1a8abSmrg(define_insn "*cbranchqi4_virt_signed"
34963d1a8abSmrg  [(set (pc) (if_then_else
35063d1a8abSmrg	      (match_operator 0 "rl78_cmp_operator_signed"
35163d1a8abSmrg			      [(match_operand:QI 1 "general_operand" "vim")
35263d1a8abSmrg			       (match_operand:QI 2 "nonmemory_operand" "vi")])
35363d1a8abSmrg              (label_ref (match_operand 3 "" ""))
35463d1a8abSmrg	      (pc)))]
35563d1a8abSmrg  "rl78_virt_insns_ok ()"
35663d1a8abSmrg  "v.cmp\t%1, %2\\n\tv.b%C0\t%3"
35763d1a8abSmrg  [(set_attr "valloc" "cmp")]
35863d1a8abSmrg  )
35963d1a8abSmrg
36063d1a8abSmrg(define_insn "*cbranchqi4_virt"
36163d1a8abSmrg  [(set (pc) (if_then_else
36263d1a8abSmrg	      (match_operator 0 "rl78_cmp_operator_real"
36363d1a8abSmrg			      [(match_operand:QI 1 "rl78_general_operand" "vim")
36463d1a8abSmrg			       (match_operand:QI 2 "rl78_general_operand" "vim")])
36563d1a8abSmrg              (label_ref (match_operand 3 "" ""))
36663d1a8abSmrg	      (pc)))]
36763d1a8abSmrg  "rl78_virt_insns_ok ()"
36863d1a8abSmrg  "v.cmp\t%1, %2\\n\tv.b%C0\t%3"
36963d1a8abSmrg  [(set_attr "valloc" "cmp")]
37063d1a8abSmrg  )
37163d1a8abSmrg
37263d1a8abSmrg(define_insn "*cbranchhi4_virt_signed"
37363d1a8abSmrg  [(set (pc) (if_then_else
37463d1a8abSmrg	      (match_operator 0 "rl78_cmp_operator_signed"
37563d1a8abSmrg			      [(match_operand:HI 1 "general_operand" "vim")
37663d1a8abSmrg			       (match_operand:HI 2 "nonmemory_operand" "vi")])
37763d1a8abSmrg              (label_ref (match_operand 3 "" ""))
37863d1a8abSmrg	      (pc)))]
37963d1a8abSmrg  "rl78_virt_insns_ok ()"
38063d1a8abSmrg  "v.cmpw\t%1, %2\\n\tv.b%C0\t%3"
38163d1a8abSmrg  [(set_attr "valloc" "cmp")]
38263d1a8abSmrg  )
38363d1a8abSmrg
38463d1a8abSmrg(define_insn "*cbranchhi4_virt"
38563d1a8abSmrg  [(set (pc) (if_then_else
38663d1a8abSmrg	      (match_operator 0 "rl78_cmp_operator_real"
38763d1a8abSmrg			      [(match_operand:HI 1 "rl78_general_operand" "vim")
38863d1a8abSmrg			       (match_operand:HI 2 "rl78_general_operand" "vim")])
38963d1a8abSmrg              (label_ref (match_operand 3 "" ""))
39063d1a8abSmrg	      (pc)))]
39163d1a8abSmrg  "rl78_virt_insns_ok ()"
39263d1a8abSmrg  "v.cmpw\t%1, %2\\n\tv.b%C0\t%3"
39363d1a8abSmrg  [(set_attr "valloc" "cmp")]
39463d1a8abSmrg  )
39563d1a8abSmrg
39663d1a8abSmrg(define_insn "*cbranchsi4_virt"
39763d1a8abSmrg  [(set (pc) (if_then_else
39863d1a8abSmrg	      (match_operator 0 "rl78_cmp_operator"
39963d1a8abSmrg			      [(match_operand:SI 1 "general_operand" "vim")
40063d1a8abSmrg			       (match_operand:SI 2 "nonmemory_operand" "vi")])
40163d1a8abSmrg              (label_ref (match_operand 3 "" ""))
40263d1a8abSmrg	      (pc)))
40363d1a8abSmrg   (clobber (reg:HI AX_REG))
40463d1a8abSmrg   ]
40563d1a8abSmrg  "rl78_virt_insns_ok ()"
40663d1a8abSmrg  "v.cmpd\t%1, %2\\n\tv.b%C0\t%3"
40763d1a8abSmrg  [(set_attr "valloc" "macax")]
40863d1a8abSmrg  )
40963d1a8abSmrg
41063d1a8abSmrg;;---------- Peepholes ------------------------
41163d1a8abSmrg
41263d1a8abSmrg(define_peephole2
41363d1a8abSmrg  [(set (match_operand:QI 0 "" "")
41463d1a8abSmrg	(match_operand:QI 1 "" ""))
41563d1a8abSmrg   (set (match_operand:QI 2 "" "")
41663d1a8abSmrg	(match_operand:QI 3 "" ""))]
41763d1a8abSmrg  "rl78_peep_movhi_p (operands)"
41863d1a8abSmrg  [(set (match_dup 4)
41963d1a8abSmrg	(match_dup 5))]
42063d1a8abSmrg  "rl78_setup_peep_movhi (operands);"
42163d1a8abSmrg  )
42263d1a8abSmrg
42363d1a8abSmrg(define_peephole2
42463d1a8abSmrg  [(set (reg:QI A_REG)
42563d1a8abSmrg	(match_operand:QI 1 "" ""))
42663d1a8abSmrg   (set (match_operand:QI 0 "" "")
42763d1a8abSmrg	(reg:QI A_REG))
42863d1a8abSmrg   (set (reg:QI A_REG)
42963d1a8abSmrg	(match_operand:QI 3 "" ""))
43063d1a8abSmrg   (set (match_operand:QI 2 "" "")
43163d1a8abSmrg	(reg:QI A_REG))
43263d1a8abSmrg   ]
43363d1a8abSmrg  "rl78_peep_movhi_p (operands)"
43463d1a8abSmrg  [(set (reg:HI AX_REG)
43563d1a8abSmrg	(match_dup 5))
43663d1a8abSmrg   (set (match_dup 4)
43763d1a8abSmrg	(reg:HI AX_REG))
43863d1a8abSmrg   ]
43963d1a8abSmrg  "rl78_setup_peep_movhi (operands);"
44063d1a8abSmrg  )
44163d1a8abSmrg
44263d1a8abSmrg(define_insn "*negandhi3_virt"
44363d1a8abSmrg  [(set (match_operand:HI                 0 "register_operand" "=v")
44463d1a8abSmrg	(and:HI (neg:HI (match_operand:HI 1 "register_operand"  "0"))
44563d1a8abSmrg 		(match_operand:HI         2 "immediate_operand" "n")))
44663d1a8abSmrg   ]
44763d1a8abSmrg  "rl78_virt_insns_ok ()"
44863d1a8abSmrg  "v.nand\t%0, %1, %2"
44963d1a8abSmrg)
450