136ac495dSmrg;; Machine Descriptions for R8C/M16C/M32C 2*8feb0f0bSmrg;; Copyright (C) 2005-2020 Free Software Foundation, Inc. 336ac495dSmrg;; Contributed by Red Hat. 436ac495dSmrg;; 536ac495dSmrg;; This file is part of GCC. 636ac495dSmrg;; 736ac495dSmrg;; GCC is free software; you can redistribute it and/or modify it 836ac495dSmrg;; under the terms of the GNU General Public License as published 936ac495dSmrg;; by the Free Software Foundation; either version 3, or (at your 1036ac495dSmrg;; option) any later version. 1136ac495dSmrg;; 1236ac495dSmrg;; GCC is distributed in the hope that it will be useful, but WITHOUT 1336ac495dSmrg;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 1436ac495dSmrg;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 1536ac495dSmrg;; License for more details. 1636ac495dSmrg;; 1736ac495dSmrg;; You should have received a copy of the GNU General Public License 1836ac495dSmrg;; along with GCC; see the file COPYING3. If not see 1936ac495dSmrg;; <http://www.gnu.org/licenses/>. 2036ac495dSmrg 2136ac495dSmrg;; Bit-wise operations (and, ior, xor, shift) 2236ac495dSmrg 2336ac495dSmrg; On the R8C and M16C, "address" for bit instructions is usually (but 2436ac495dSmrg; not always!) the *bit* address, not the *byte* address. This 2536ac495dSmrg; confuses gcc, so we avoid cases where gcc would produce the wrong 2636ac495dSmrg; code. We're left with absolute addresses and registers, and the odd 2736ac495dSmrg; case of shifting a bit by a variable. 2836ac495dSmrg 2936ac495dSmrg; On the M32C, "address" for bit instructions is a regular address, 3036ac495dSmrg; and the bit number is stored in a separate field. Thus, we can let 3136ac495dSmrg; gcc do more interesting things. However, the M32C cannot set all 3236ac495dSmrg; the bits in a 16-bit register, which the R8C/M16C can do. 3336ac495dSmrg 3436ac495dSmrg; However, it all means that we end up with two sets of patterns, one 3536ac495dSmrg; for each chip. 3636ac495dSmrg 3736ac495dSmrg;;---------------------------------------------------------------------- 3836ac495dSmrg 3936ac495dSmrg;; First off, all the ways we can set one bit, other than plain IOR. 4036ac495dSmrg 4136ac495dSmrg(define_insn "bset_qi" 4236ac495dSmrg [(set (match_operand:QI 0 "memsym_operand" "+Si") 4336ac495dSmrg (ior:QI (subreg:QI (ashift:HI (const_int 1) 4436ac495dSmrg (subreg:QI (match_operand:HI 1 "a_qi_operand" "Raa") 0)) 0) 4536ac495dSmrg (match_dup 0)))] 4636ac495dSmrg "TARGET_A16" 4736ac495dSmrg "bset\t%0[%1]" 4836ac495dSmrg [(set_attr "flags" "n")] 4936ac495dSmrg ) 5036ac495dSmrg 5136ac495dSmrg(define_insn "bset_hi" 5236ac495dSmrg [(set (zero_extract:HI (match_operand:QI 0 "memsym_operand" "+Si") 5336ac495dSmrg (const_int 1) 5436ac495dSmrg (zero_extend:HI (subreg:QI (match_operand:HI 1 "a_qi_operand" "Raa") 0))) 5536ac495dSmrg (const_int 1))] 5636ac495dSmrg "TARGET_A16" 5736ac495dSmrg "bset\t%0[%1]" 5836ac495dSmrg [(set_attr "flags" "n")] 5936ac495dSmrg ) 6036ac495dSmrg 6136ac495dSmrg;;---------------------------------------------------------------------- 6236ac495dSmrg 6336ac495dSmrg;; Now all the ways we can clear one bit, other than plain AND. 6436ac495dSmrg 6536ac495dSmrg; This is odd because the shift patterns use QI counts, but we can't 6636ac495dSmrg; easily put QI in $aN without causing problems elsewhere. 6736ac495dSmrg(define_insn "bclr_qi" 6836ac495dSmrg [(set (zero_extract:HI (match_operand:QI 0 "memsym_operand" "+Si") 6936ac495dSmrg (const_int 1) 7036ac495dSmrg (zero_extend:HI (subreg:QI (match_operand:HI 1 "a_qi_operand" "Raa") 0))) 7136ac495dSmrg (const_int 0))] 7236ac495dSmrg "TARGET_A16" 7336ac495dSmrg "bclr\t%0[%1]" 7436ac495dSmrg [(set_attr "flags" "n")] 7536ac495dSmrg ) 7636ac495dSmrg 7736ac495dSmrg 7836ac495dSmrg;;---------------------------------------------------------------------- 7936ac495dSmrg 8036ac495dSmrg;; Now the generic patterns. 8136ac495dSmrg 8236ac495dSmrg(define_insn "andqi3_16" 8336ac495dSmrg [(set (match_operand:QI 0 "mra_operand" "=Sp,Rqi,RhlSd,RhlSd,??Rmm,??Rmm") 8436ac495dSmrg (and:QI (match_operand:QI 1 "mra_operand" "%0,0,0,0,0,0") 8536ac495dSmrg (match_operand:QI 2 "mrai_operand" "Imb,Imb,iRhlSd,?Rmm,iRhlSd,?Rmm")))] 8636ac495dSmrg "TARGET_A16" 8736ac495dSmrg "@ 8836ac495dSmrg bclr\t%B2,%0 8936ac495dSmrg bclr\t%B2,%h0 9036ac495dSmrg and.b\t%x2,%0 9136ac495dSmrg and.b\t%x2,%0 9236ac495dSmrg and.b\t%x2,%0 9336ac495dSmrg and.b\t%x2,%0" 9436ac495dSmrg [(set_attr "flags" "n,n,sz,sz,sz,sz")] 9536ac495dSmrg ) 9636ac495dSmrg 9736ac495dSmrg(define_insn "andhi3_16" 9836ac495dSmrg [(set (match_operand:HI 0 "mra_operand" "=Sp,Sp,Rhi,RhiSd,??Rmm,RhiSd,??Rmm") 9936ac495dSmrg (and:HI (match_operand:HI 1 "mra_operand" "%0,0,0,0,0,0,0") 10036ac495dSmrg (match_operand:HI 2 "mrai_operand" "ImB,Imw,Imw,iRhiSd,?Rmm,?Rmm,iRhiSd")))] 10136ac495dSmrg "TARGET_A16" 10236ac495dSmrg "@ 10336ac495dSmrg 10436ac495dSmrg bclr\t%B2,%0 10536ac495dSmrg bclr\t%B2-8,1+%0 10636ac495dSmrg bclr\t%B2,%0 10736ac495dSmrg and.w\t%X2,%0 10836ac495dSmrg and.w\t%X2,%0 10936ac495dSmrg and.w\t%X2,%0 11036ac495dSmrg and.w\t%X2,%0" 11136ac495dSmrg [(set_attr "flags" "n,n,n,sz,sz,sz,sz")] 11236ac495dSmrg ) 11336ac495dSmrg 11436ac495dSmrg(define_insn "andsi3" 11536ac495dSmrg [(set (match_operand:SI 0 "mra_operand" "=RsiSd,RsiSd,??Rmm,??Rmm,??Rmm,RsiSd") 11636ac495dSmrg (and:SI (match_operand:SI 1 "mra_operand" "%0,0,0,0,0,0") 11736ac495dSmrg (match_operand:SI 2 "mrai_operand" "i,?Rmm,i,RsiSd,?Rmm,RsiSd")))] 11836ac495dSmrg "" 11936ac495dSmrg "* 12036ac495dSmrg switch (which_alternative) 12136ac495dSmrg { 12236ac495dSmrg case 0: 12336ac495dSmrg output_asm_insn (\"and.w %X2,%h0\",operands); 12436ac495dSmrg operands[2]= GEN_INT (INTVAL (operands[2]) >> 16); 12536ac495dSmrg return \"and.w %X2,%H0\"; 12636ac495dSmrg case 1: 12736ac495dSmrg return \"and.w %h2,%h0\;and.w %H2,%H0\"; 12836ac495dSmrg case 2: 12936ac495dSmrg output_asm_insn (\"and.w %X2,%h0\",operands); 13036ac495dSmrg operands[2]= GEN_INT (INTVAL (operands[2]) >> 16); 13136ac495dSmrg return \"and.w %X2,%H0\"; 13236ac495dSmrg case 3: 13336ac495dSmrg return \"and.w %h2,%h0\;and.w %H2,%H0\"; 13436ac495dSmrg case 4: 13536ac495dSmrg return \"and.w %h2,%h0\;and.w %H2,%H0\"; 13636ac495dSmrg case 5: 13736ac495dSmrg return \"and.w %h2,%h0\;and.w %H2,%H0\"; 13836ac495dSmrg default: 13936ac495dSmrg gcc_unreachable (); 14036ac495dSmrg }" 14136ac495dSmrg [(set_attr "flags" "x,x,x,x,x,x")] 14236ac495dSmrg) 14336ac495dSmrg 14436ac495dSmrg 14536ac495dSmrg(define_insn "iorqi3_16" 14636ac495dSmrg [(set (match_operand:QI 0 "mra_operand" "=Sp,Rqi,RqiSd,??Rmm,RqiSd,??Rmm") 14736ac495dSmrg (ior:QI (match_operand:QI 1 "mra_operand" "%0,0,0,0,0,0") 14836ac495dSmrg (match_operand:QI 2 "mrai_operand" "Ilb,Ilb,iRhlSd,iRhlSd,?Rmm,?Rmm")))] 14936ac495dSmrg "TARGET_A16" 15036ac495dSmrg "@ 15136ac495dSmrg bset\t%B2,%0 15236ac495dSmrg bset\t%B2,%h0 15336ac495dSmrg or.b\t%x2,%0 15436ac495dSmrg or.b\t%x2,%0 15536ac495dSmrg or.b\t%x2,%0 15636ac495dSmrg or.b\t%x2,%0" 15736ac495dSmrg [(set_attr "flags" "n,n,sz,sz,sz,sz")] 15836ac495dSmrg ) 15936ac495dSmrg 16036ac495dSmrg(define_insn "iorhi3_16" 16136ac495dSmrg [(set (match_operand:HI 0 "mra_operand" "=Sp,Sp,Rhi,RhiSd,RhiSd,??Rmm,??Rmm") 16236ac495dSmrg (ior:HI (match_operand:HI 1 "mra_operand" "%0,0,0,0,0,0,0") 16336ac495dSmrg (match_operand:HI 2 "mrai_operand" "Ilb,Ilw,Ilw,iRhiSd,?Rmm,iRhiSd,?Rmm")))] 16436ac495dSmrg "TARGET_A16" 16536ac495dSmrg "@ 16636ac495dSmrg bset %B2,%0 16736ac495dSmrg bset\t%B2-8,1+%0 16836ac495dSmrg bset\t%B2,%0 16936ac495dSmrg or.w\t%X2,%0 17036ac495dSmrg or.w\t%X2,%0 17136ac495dSmrg or.w\t%X2,%0 17236ac495dSmrg or.w\t%X2,%0" 17336ac495dSmrg [(set_attr "flags" "n,n,n,sz,sz,sz,sz")] 17436ac495dSmrg ) 17536ac495dSmrg 17636ac495dSmrg; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17736ac495dSmrg 17836ac495dSmrg(define_insn "andqi3_24" 17936ac495dSmrg [(set (match_operand:QI 0 "mra_operand" "=Sd,Rqi,RhlSd,RhlSd,??Rmm,??Rmm") 18036ac495dSmrg (and:QI (match_operand:QI 1 "mra_operand" "%0,0,0,0,0,0") 18136ac495dSmrg (match_operand:QI 2 "mrai_operand" "Imb,Imb,iRhlSd,?Rmm,iRhlSd,?Rmm")))] 18236ac495dSmrg "TARGET_A24" 18336ac495dSmrg "@ 18436ac495dSmrg bclr\t%B2,%0 18536ac495dSmrg bclr\t%B2,%0 18636ac495dSmrg and.b\t%x2,%0 18736ac495dSmrg and.b\t%x2,%0 18836ac495dSmrg and.b\t%x2,%0 18936ac495dSmrg and.b\t%x2,%0" 19036ac495dSmrg [(set_attr "flags" "n,n,sz,sz,sz,sz")] 19136ac495dSmrg ) 19236ac495dSmrg 19336ac495dSmrg(define_insn "andhi3_24" 19436ac495dSmrg [(set (match_operand:HI 0 "mra_operand" "=Sd,Sd,?Rhl,?Rhl,RhiSd,??Rmm,RhiSd,??Rmm") 19536ac495dSmrg (and:HI (match_operand:HI 1 "mra_operand" "%0,0,0,0,0,0,0,0") 19636ac495dSmrg (match_operand:HI 2 "mrai_operand" "ImB,Imw,ImB,Imw,iRhiSd,?Rmm,?Rmm,iRhiSd")))] 19736ac495dSmrg "TARGET_A24" 19836ac495dSmrg "@ 19936ac495dSmrg bclr\t%B2,%0 20036ac495dSmrg bclr\t%B2-8,1+%0 20136ac495dSmrg bclr\t%B2,%h0 20236ac495dSmrg bclr\t%B2-8,%H0 20336ac495dSmrg and.w\t%X2,%0 20436ac495dSmrg and.w\t%X2,%0 20536ac495dSmrg and.w\t%X2,%0 20636ac495dSmrg and.w\t%X2,%0" 20736ac495dSmrg [(set_attr "flags" "n,n,n,n,sz,sz,sz,sz")] 20836ac495dSmrg ) 20936ac495dSmrg 21036ac495dSmrg 21136ac495dSmrg 21236ac495dSmrg(define_insn "iorqi3_24" 21336ac495dSmrg [(set (match_operand:QI 0 "mra_operand" "=RqiSd,RqiSd,??Rmm,RqiSd,??Rmm") 21436ac495dSmrg (ior:QI (match_operand:QI 1 "mra_operand" "%0,0,0,0,0") 21536ac495dSmrg (match_operand:QI 2 "mrai_operand" "Ilb,iRhlSd,iRhlSd,?Rmm,?Rmm")))] 21636ac495dSmrg "TARGET_A24" 21736ac495dSmrg "@ 21836ac495dSmrg bset\t%B2,%0 21936ac495dSmrg or.b\t%x2,%0 22036ac495dSmrg or.b\t%x2,%0 22136ac495dSmrg or.b\t%x2,%0 22236ac495dSmrg or.b\t%x2,%0" 22336ac495dSmrg [(set_attr "flags" "n,sz,sz,sz,sz")] 22436ac495dSmrg ) 22536ac495dSmrg 22636ac495dSmrg(define_insn "iorhi3_24" 22736ac495dSmrg [(set (match_operand:HI 0 "mra_operand" "=Sd,Sd,?Rhl,?Rhl,RhiSd,RhiSd,??Rmm,??Rmm") 22836ac495dSmrg (ior:HI (match_operand:HI 1 "mra_operand" "%0,0,0,0,0,0,0,0") 22936ac495dSmrg (match_operand:HI 2 "mrai_operand" "Ilb,Ilw,Ilb,Ilw,iRhiSd,?Rmm,iRhiSd,?Rmm")))] 23036ac495dSmrg "TARGET_A24" 23136ac495dSmrg "@ 23236ac495dSmrg bset\t%B2,%0 23336ac495dSmrg bset\t%B2-8,1+%0 23436ac495dSmrg bset\t%B2,%h0 23536ac495dSmrg bset\t%B2-8,%H0 23636ac495dSmrg or.w\t%X2,%0 23736ac495dSmrg or.w\t%X2,%0 23836ac495dSmrg or.w\t%X2,%0 23936ac495dSmrg or.w\t%X2,%0" 24036ac495dSmrg [(set_attr "flags" "n,n,n,n,sz,sz,sz,sz")] 24136ac495dSmrg ) 24236ac495dSmrg 24336ac495dSmrg 24436ac495dSmrg; ---------------------------------------------------------------------- 24536ac495dSmrg 24636ac495dSmrg(define_expand "andqi3" 24736ac495dSmrg [(set (match_operand:QI 0 "mra_operand" "") 24836ac495dSmrg (and:QI (match_operand:QI 1 "mra_operand" "") 24936ac495dSmrg (match_operand:QI 2 "mrai_operand" "")))] 25036ac495dSmrg "" 25136ac495dSmrg "if (TARGET_A16) 25236ac495dSmrg emit_insn (gen_andqi3_16 (operands[0], operands[1], operands[2])); 25336ac495dSmrg else 25436ac495dSmrg emit_insn (gen_andqi3_24 (operands[0], operands[1], operands[2])); 25536ac495dSmrg DONE;" 25636ac495dSmrg ) 25736ac495dSmrg 25836ac495dSmrg(define_expand "andhi3" 25936ac495dSmrg [(set (match_operand:HI 0 "mra_operand" "") 26036ac495dSmrg (and:HI (match_operand:HI 1 "mra_operand" "") 26136ac495dSmrg (match_operand:HI 2 "mrai_operand" "")))] 26236ac495dSmrg "" 26336ac495dSmrg "if (TARGET_A16) 26436ac495dSmrg emit_insn (gen_andhi3_16 (operands[0], operands[1], operands[2])); 26536ac495dSmrg else 26636ac495dSmrg emit_insn (gen_andhi3_24 (operands[0], operands[1], operands[2])); 26736ac495dSmrg DONE;" 26836ac495dSmrg ) 26936ac495dSmrg 27036ac495dSmrg(define_expand "iorqi3" 27136ac495dSmrg [(set (match_operand:QI 0 "mra_operand" "") 27236ac495dSmrg (ior:QI (match_operand:QI 1 "mra_operand" "") 27336ac495dSmrg (match_operand:QI 2 "mrai_operand" "")))] 27436ac495dSmrg "" 27536ac495dSmrg "if (TARGET_A16) 27636ac495dSmrg emit_insn (gen_iorqi3_16 (operands[0], operands[1], operands[2])); 27736ac495dSmrg else 27836ac495dSmrg emit_insn (gen_iorqi3_24 (operands[0], operands[1], operands[2])); 27936ac495dSmrg DONE;" 28036ac495dSmrg ) 28136ac495dSmrg 28236ac495dSmrg(define_expand "iorhi3" 28336ac495dSmrg [(set (match_operand:HI 0 "mra_operand" "") 28436ac495dSmrg (ior:HI (match_operand:HI 1 "mra_operand" "") 28536ac495dSmrg (match_operand:HI 2 "mrai_operand" "")))] 28636ac495dSmrg "" 28736ac495dSmrg "if (TARGET_A16) 28836ac495dSmrg emit_insn (gen_iorhi3_16 (operands[0], operands[1], operands[2])); 28936ac495dSmrg else 29036ac495dSmrg emit_insn (gen_iorhi3_24 (operands[0], operands[1], operands[2])); 29136ac495dSmrg DONE;" 29236ac495dSmrg ) 29336ac495dSmrg 29436ac495dSmrg(define_insn "iorsi3" 29536ac495dSmrg [(set (match_operand:SI 0 "mra_operand" "=RsiSd,RsiSd,??Rmm,??Rmm,??Rmm,RsiSd") 29636ac495dSmrg (ior:SI (match_operand:SI 1 "mra_operand" "%0,0,0,0,0,0") 29736ac495dSmrg (match_operand:SI 2 "mrai_operand" "i,?Rmm,i,RsiSd,?Rmm,RsiSd")))] 29836ac495dSmrg "" 29936ac495dSmrg "* 30036ac495dSmrg switch (which_alternative) 30136ac495dSmrg { 30236ac495dSmrg case 0: 30336ac495dSmrg output_asm_insn (\"or.w %X2,%h0\",operands); 30436ac495dSmrg operands[2]= GEN_INT (INTVAL (operands[2]) >> 16); 30536ac495dSmrg return \"or.w %X2,%H0\"; 30636ac495dSmrg case 1: 30736ac495dSmrg return \"or.w %h2,%h0\;or.w %H2,%H0\"; 30836ac495dSmrg case 2: 30936ac495dSmrg output_asm_insn (\"or.w %X2,%h0\",operands); 31036ac495dSmrg operands[2]= GEN_INT (INTVAL (operands[2]) >> 16); 31136ac495dSmrg return \"or.w %X2,%H0\"; 31236ac495dSmrg case 3: 31336ac495dSmrg return \"or.w %h2,%h0\;or.w %H2,%H0\"; 31436ac495dSmrg case 4: 31536ac495dSmrg return \"or.w %h2,%h0\;or.w %H2,%H0\"; 31636ac495dSmrg case 5: 31736ac495dSmrg return \"or.w %h2,%h0\;or.w %H2,%H0\"; 31836ac495dSmrg default: 31936ac495dSmrg gcc_unreachable (); 32036ac495dSmrg }" 32136ac495dSmrg [(set_attr "flags" "x,x,x,x,x,x")] 32236ac495dSmrg) 32336ac495dSmrg 32436ac495dSmrg(define_insn "xorqi3" 32536ac495dSmrg [(set (match_operand:QI 0 "mra_operand" "=RhlSd,RhlSd,??Rmm,??Rmm") 32636ac495dSmrg (xor:QI (match_operand:QI 1 "mra_operand" "%0,0,0,0") 32736ac495dSmrg (match_operand:QI 2 "mrai_operand" "iRhlSd,?Rmm,iRhlSd,?Rmm")))] 32836ac495dSmrg "" 32936ac495dSmrg "xor.b\t%x2,%0" 33036ac495dSmrg [(set_attr "flags" "sz,sz,sz,sz")] 33136ac495dSmrg ) 33236ac495dSmrg 33336ac495dSmrg(define_insn "xorhi3" 33436ac495dSmrg [(set (match_operand:HI 0 "mra_operand" "=RhiSd,RhiSd,??Rmm,??Rmm") 33536ac495dSmrg (xor:HI (match_operand:HI 1 "mra_operand" "%0,0,0,0") 33636ac495dSmrg (match_operand:HI 2 "mrai_operand" "iRhiSd,?Rmm,iRhiSd,?Rmm")))] 33736ac495dSmrg "" 33836ac495dSmrg "xor.w\t%X2,%0" 33936ac495dSmrg [(set_attr "flags" "sz,sz,sz,sz")] 34036ac495dSmrg ) 34136ac495dSmrg 34236ac495dSmrg(define_insn "xorsi3" 34336ac495dSmrg [(set (match_operand:SI 0 "mra_operand" "=RsiSd,RsiSd,??Rmm,??Rmm,??Rmm,RsiSd") 34436ac495dSmrg (xor:SI (match_operand:SI 1 "mra_operand" "%0,0,0,0,0,0") 34536ac495dSmrg (match_operand:SI 2 "mrai_operand" "i,?Rmm,i,RsiSd,?Rmm,RsiSd")))] 34636ac495dSmrg "" 34736ac495dSmrg "* 34836ac495dSmrg switch (which_alternative) 34936ac495dSmrg { 35036ac495dSmrg case 0: 35136ac495dSmrg output_asm_insn (\"xor.w %X2,%h0\",operands); 35236ac495dSmrg operands[2]= GEN_INT (INTVAL (operands[2]) >> 16); 35336ac495dSmrg return \"xor.w %X2,%H0\"; 35436ac495dSmrg case 1: 35536ac495dSmrg return \"xor.w %h2,%h0\;xor.w %H2,%H0\"; 35636ac495dSmrg case 2: 35736ac495dSmrg output_asm_insn (\"xor.w %X2,%h0\",operands); 35836ac495dSmrg operands[2]= GEN_INT (INTVAL (operands[2]) >> 16); 35936ac495dSmrg return \"xor.w %X2,%H0\"; 36036ac495dSmrg case 3: 36136ac495dSmrg return \"xor.w %h2,%h0\;xor.w %H2,%H0\"; 36236ac495dSmrg case 4: 36336ac495dSmrg return \"xor.w %h2,%h0\;xor.w %H2,%H0\"; 36436ac495dSmrg case 5: 36536ac495dSmrg return \"xor.w %h2,%h0\;xor.w %H2,%H0\"; 36636ac495dSmrg default: 36736ac495dSmrg gcc_unreachable (); 36836ac495dSmrg }" 36936ac495dSmrg [(set_attr "flags" "x,x,x,x,x,x")] 37036ac495dSmrg) 37136ac495dSmrg 37236ac495dSmrg(define_insn "one_cmplqi2" 37336ac495dSmrg [(set (match_operand:QI 0 "mra_operand" "=RhlSd,??Rmm") 37436ac495dSmrg (not:QI (match_operand:QI 1 "mra_operand" "0,0")))] 37536ac495dSmrg "" 37636ac495dSmrg "not.b\t%0" 37736ac495dSmrg [(set_attr "flags" "sz,sz")] 37836ac495dSmrg ) 37936ac495dSmrg 38036ac495dSmrg(define_insn "one_cmplhi2" 38136ac495dSmrg [(set (match_operand:HI 0 "mra_operand" "=RhiSd,??Rmm") 38236ac495dSmrg (not:HI (match_operand:HI 1 "mra_operand" "0,0")))] 38336ac495dSmrg "" 38436ac495dSmrg "not.w\t%0" 38536ac495dSmrg [(set_attr "flags" "sz,sz")] 38636ac495dSmrg ) 38736ac495dSmrg 38836ac495dSmrg; Optimizations using bit opcodes 38936ac495dSmrg 39036ac495dSmrg; We need this because combine only looks at three insns at a time, 39136ac495dSmrg; and the bclr_qi pattern uses four - mov, shift, not, and. GCC 39236ac495dSmrg; should never expand this pattern, because it only shifts a constant 39336ac495dSmrg; by a constant, so gcc should do that itself. 39436ac495dSmrg(define_insn "shift1_qi" 39536ac495dSmrg [(set (match_operand:QI 0 "mra_operand" "=Rqi") 39636ac495dSmrg (ashift:QI (const_int 1) 39736ac495dSmrg (match_operand 1 "const_int_operand" "In4")))] 39836ac495dSmrg "" 39936ac495dSmrg "mov.b\t#1,%0\n\tshl.b\t%1,%0" 40036ac495dSmrg ) 40136ac495dSmrg(define_insn "shift1_hi" 40236ac495dSmrg [(set (match_operand:HI 0 "mra_operand" "=Rhi") 40336ac495dSmrg (ashift:HI (const_int 1) 40436ac495dSmrg (match_operand 1 "const_int_operand" "In4")))] 40536ac495dSmrg "" 40636ac495dSmrg "mov.w\t#1,%0\n\tshl.w\t%1,%0" 40736ac495dSmrg ) 40836ac495dSmrg 40936ac495dSmrg; Generic insert-bit expander, needed so that we can use the bit 41036ac495dSmrg; opcodes for volatile bitfields. 41136ac495dSmrg 41236ac495dSmrg(define_expand "insv" 41336ac495dSmrg [(set (zero_extract:HI (match_operand:HI 0 "mra_operand" "") 41436ac495dSmrg (match_operand 1 "const_int_operand" "") 41536ac495dSmrg (match_operand 2 "const_int_operand" "")) 41636ac495dSmrg (match_operand:HI 3 "const_int_operand" ""))] 41736ac495dSmrg "" 41836ac495dSmrg "if (m32c_expand_insv (operands)) 41936ac495dSmrg FAIL; 42036ac495dSmrg DONE;" 42136ac495dSmrg ) 422