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