xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/config/m32c/bitops.md (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
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