{"id":2226658,"url":"http://patchwork.ozlabs.org/api/patches/2226658/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/patch/20260422180359.1067313-1-ibuclaw@gdcproject.org/","project":{"id":17,"url":"http://patchwork.ozlabs.org/api/projects/17/?format=json","name":"GNU Compiler Collection","link_name":"gcc","list_id":"gcc-patches.gcc.gnu.org","list_email":"gcc-patches@gcc.gnu.org","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20260422180359.1067313-1-ibuclaw@gdcproject.org>","list_archive_url":null,"date":"2026-04-22T18:03:59","name":"[GCC17-stage1] m32c: Remove all support for M32C target.","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"140b03e19033ad39e2d021bd9f5d384e9e2db114","submitter":{"id":46728,"url":"http://patchwork.ozlabs.org/api/people/46728/?format=json","name":"Iain Buclaw","email":"ibuclaw@gdcproject.org"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/gcc/patch/20260422180359.1067313-1-ibuclaw@gdcproject.org/mbox/","series":[{"id":501062,"url":"http://patchwork.ozlabs.org/api/series/501062/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/list/?series=501062","date":"2026-04-22T18:03:59","name":"[GCC17-stage1] m32c: Remove all support for M32C target.","version":1,"mbox":"http://patchwork.ozlabs.org/series/501062/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2226658/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2226658/checks/","tags":{},"related":[],"headers":{"Return-Path":"<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>","X-Original-To":["incoming@patchwork.ozlabs.org","gcc-patches@gcc.gnu.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","gcc-patches@gcc.gnu.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gdcproject.org header.i=@gdcproject.org\n header.a=rsa-sha256 header.s=MBO0001 header.b=c5rc/Lof;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=2620:52:6:3111::32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)","sourceware.org;\n\tdkim=pass (2048-bit key,\n unprotected) header.d=gdcproject.org header.i=@gdcproject.org\n header.a=rsa-sha256 header.s=MBO0001 header.b=c5rc/Lof","sourceware.org; dmarc=pass (p=quarantine dis=none)\n header.from=gdcproject.org","sourceware.org; spf=pass smtp.mailfrom=gdcproject.org","server2.sourceware.org;\n arc=none smtp.remote-ip=80.241.56.171"],"Received":["from vm01.sourceware.org (vm01.sourceware.org\n [IPv6:2620:52:6:3111::32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g16cs11Gcz1y2d\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 23 Apr 2026 04:07:09 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id EABCB4BA2E2A\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 22 Apr 2026 18:07:06 +0000 (GMT)","from mout-p-201.mailbox.org (mout-p-201.mailbox.org [80.241.56.171])\n by sourceware.org (Postfix) with ESMTPS id 3ABA94BBC0AA\n for <gcc-patches@gcc.gnu.org>; Wed, 22 Apr 2026 18:04:06 +0000 (GMT)","from smtp2.mailbox.org (smtp2.mailbox.org [10.196.197.2])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest\n SHA256)\n (No client certificate requested)\n by mout-p-201.mailbox.org (Postfix) with ESMTPS id 4g16YG14V1z9sSJ;\n Wed, 22 Apr 2026 20:04:02 +0200 (CEST)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org EABCB4BA2E2A","OpenDKIM Filter v2.11.0 sourceware.org 3ABA94BBC0AA"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 3ABA94BBC0AA","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 3ABA94BBC0AA","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1776881046; cv=none;\n b=ueXcqvFoB7U49tCFKuzc8qNc7htviCGxMgzXitlCb/bxUab5nrzxANcGjQZdfriHOMQSUIG52iS7T/LE0FW6kIR6Wf6klT1QhyaONQmOZGXF44+YG2MxCk/mkbGIxaOsiguIbCebJ9VEPJ7/T3gEPH3jRvK2wKtzLGkG+6Pd8Bs=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1776881046; c=relaxed/simple;\n bh=2qcmqwV1Jh/29qUanS9nddopSHUh0Ou+vqBODMnATz8=;\n h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version;\n b=IVU4zfd8XPtOQ+cvUmLyF4gDdHuQOrRPXNSELpjxLaogvwWlyYe+0buya95D4b5IMUooLKL4LpxyVeDIe2qN8JOlxZAgQBsQ5AoZmKZYlc0sLt5N3aToDA2gm20BjLo2SYpuffgtEqEnvwGg7KCYGreKyRJ8+wl75ceqtj2YWQg=","ARC-Authentication-Results":"i=1; server2.sourceware.org","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=gdcproject.org;\n s=MBO0001; t=1776881042;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:\n content-transfer-encoding:content-transfer-encoding;\n bh=juEY9pIi2ADwgiVtmvHoShRWZJPJ0UAcFOCk3YDetQU=;\n b=c5rc/LofpQded1cHdD6knxGzwn/NaG2HWvko6yuYaYHJJj2VyiEUnjh2iPkkos6uRbvJ1P\n VXs3waXkvpirHNep6rn9Th7G8g15nxPzdiGUMQ5VON5OnQ8Yq/XdRWyWA4Ov3oLn9IU52I\n XS/0aQu7CaJNHfrXJGuGwwYwWLpKMEuppY+IauZ7tyVfyTwKQR0mU1BtiJmH0vrjyVxMR8\n bX83hmzslKyRmQuZR/BxTFYl10f7woVswJIh7rsKiToqHbthY/UPw3vDlhgWS4tqy/3ONE\n oSnCGv9elbJTt/rNI7ZxWVn8JLDbbLBA7Yujkk5DQDVq+c1i6SCn9c2GkQE2kQ==","From":"Iain Buclaw <ibuclaw@gdcproject.org>","To":"gcc-patches@gcc.gnu.org","Cc":"Iain Buclaw <ibuclaw@gdcproject.org>","Subject":"[PATCH GCC17-stage1] m32c: Remove all support for M32C target.","Date":"Wed, 22 Apr 2026 20:03:59 +0200","Message-ID":"<20260422180359.1067313-1-ibuclaw@gdcproject.org>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","X-BeenThere":"gcc-patches@gcc.gnu.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Gcc-patches mailing list <gcc-patches.gcc.gnu.org>","List-Unsubscribe":"<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>","List-Archive":"<https://gcc.gnu.org/pipermail/gcc-patches/>","List-Post":"<mailto:gcc-patches@gcc.gnu.org>","List-Help":"<mailto:gcc-patches-request@gcc.gnu.org?subject=help>","List-Subscribe":"<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>","Errors-To":"gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org"},"content":"Hi,\n\nm32c target support in GCC was deprecated in GCC 16 as the target had no\nmaintainer since GCC 9.\n\nOK for trunk?\n\nRegards,\nIain.\n\n---\ncontrib/ChangeLog:\n\n\t* compare-all-tests: Remove references to m32c.\n\t* config-list.mk: Likewise.\n\ngcc/ChangeLog:\n\n\t* config/m32c/*: Delete entire directory.\n\t* attr-urls.def: Remove references to m32c.\n\t* config.gcc: Likewise.\n\t* config/msp430/msp430.cc (msp430_expand_epilogue): Likewise.\n\t* configure: Regenerate.\n\t* configure.ac: Remove references to m32c.\n\t* doc/extend.texi: Likewise.\n\t* doc/install.texi: Likewise.\n\t* doc/invoke.texi: Likewise.\n\t* doc/md.texi: Likewise.\n\t* explow.cc (promote_mode): Likewise.\n\t* regenerate-opt-urls.py: Likewise.\n\t* config/microblaze/microblaze.opt.urls: Regenerate.\n\t* config/msp430/msp430.opt.urls: Regenerate.\n\t* config/nds32/nds32.opt.urls: Regenerate.\n\t* config/rl78/rl78.opt.urls: Regenerate.\n\t* config/rs6000/sysv4.opt.urls: Regenerate.\n\t* config/rx/elf.opt.urls: Regenerate.\n\t* config/stormy16/stormy16.opt.urls: Regenerate.\n\t* config/visium/visium.opt.urls: Regenerate.\n\nlibgcc/ChangeLog:\n\n\t* config/m32c/*: Delete entire directory.\n\t* config.host: Remove references to m32c.\n\t* config/rl78/lib2div.c (C3): Likewise.\n\ngcc/testsuite/ChangeLog:\n\n\t* gcc.c-torture/compile/20000804-1.c: Remove references to m32c.\n\t* gcc.c-torture/compile/20001226-1.c: Likewise.\n\t* gcc.c-torture/compile/limits-stringlit.c: Likewise.\n\t* gcc.c-torture/execute/20020404-1.c: Likewise.\n\t* gcc.dg/20020312-2.c: Likewise.\n\t* gcc.dg/max-1.c: Likewise.\n\t* gcc.dg/torture/pr26565.c: Likewise.\n\t* gcc.dg/tree-ssa/reassoc-32.c: Likewise.\n\t* gcc.dg/tree-ssa/reassoc-33.c: Likewise.\n\t* gcc.dg/tree-ssa/reassoc-34.c: Likewise.\n\t* gcc.dg/tree-ssa/reassoc-35.c: Likewise.\n\t* gcc.dg/tree-ssa/reassoc-36.c: Likewise.\n\t* gcc.dg/utf-array-short-wchar.c: Likewise.\n\t* gcc.dg/utf-array.c: Likewise.\n\t* lib/target-supports.exp: Likewise.\n---\n contrib/compare-all-tests                     |    3 +-\n contrib/config-list.mk                        |    2 +-\n gcc/attr-urls.def                             |    4 -\n gcc/config.gcc                                |   12 +-\n gcc/config/m32c/addsub.md                     |  259 -\n gcc/config/m32c/bitops.md                     |  421 --\n gcc/config/m32c/blkmov.md                     |  241 -\n gcc/config/m32c/cond.md                       |  309 --\n gcc/config/m32c/constraints.md                |  225 -\n gcc/config/m32c/jump.md                       |  134 -\n gcc/config/m32c/m32c-modes.def                |   28 -\n gcc/config/m32c/m32c-pragma.cc                |  128 -\n gcc/config/m32c/m32c-protos.h                 |   80 -\n gcc/config/m32c/m32c.abi                      |  131 -\n gcc/config/m32c/m32c.cc                       | 4511 -----------------\n gcc/config/m32c/m32c.h                        |  635 ---\n gcc/config/m32c/m32c.md                       |   79 -\n gcc/config/m32c/m32c.opt                      |   43 -\n gcc/config/m32c/m32c.opt.urls                 |    8 -\n gcc/config/m32c/minmax.md                     |   57 -\n gcc/config/m32c/mov.md                        |  490 --\n gcc/config/m32c/muldiv.md                     |  287 --\n gcc/config/m32c/predicates.md                 |  294 --\n gcc/config/m32c/prologue.md                   |  201 -\n gcc/config/m32c/shift.md                      |  351 --\n gcc/config/m32c/t-m32c                        |   42 -\n gcc/config/microblaze/microblaze.opt.urls     |    2 +-\n gcc/config/msp430/msp430.cc                   |    3 +-\n gcc/config/msp430/msp430.opt.urls             |    2 +-\n gcc/config/nds32/nds32.opt.urls               |    2 +-\n gcc/config/rl78/rl78.opt.urls                 |    2 +-\n gcc/config/rs6000/sysv4.opt.urls              |    2 +-\n gcc/config/rx/elf.opt.urls                    |    2 +-\n gcc/config/stormy16/stormy16.opt.urls         |    2 +-\n gcc/config/visium/visium.opt.urls             |    2 +-\n gcc/configure                                 |    2 +-\n gcc/configure.ac                              |    2 +-\n gcc/doc/extend.texi                           |  115 +-\n gcc/doc/install.texi                          |   12 +-\n gcc/doc/invoke.texi                           |   37 -\n gcc/doc/md.texi                               |  129 -\n gcc/explow.cc                                 |    2 +-\n gcc/regenerate-opt-urls.py                    |    1 -\n .../gcc.c-torture/compile/20000804-1.c        |    1 -\n .../gcc.c-torture/compile/20001226-1.c        |    1 -\n .../gcc.c-torture/compile/limits-stringlit.c  |    2 +-\n .../gcc.c-torture/execute/20020404-1.c        |    1 -\n gcc/testsuite/gcc.dg/20020312-2.c             |    2 -\n gcc/testsuite/gcc.dg/max-1.c                  |    2 -\n gcc/testsuite/gcc.dg/torture/pr26565.c        |    2 -\n gcc/testsuite/gcc.dg/tree-ssa/reassoc-32.c    |    2 +-\n gcc/testsuite/gcc.dg/tree-ssa/reassoc-33.c    |    2 +-\n gcc/testsuite/gcc.dg/tree-ssa/reassoc-34.c    |    2 +-\n gcc/testsuite/gcc.dg/tree-ssa/reassoc-35.c    |    2 +-\n gcc/testsuite/gcc.dg/tree-ssa/reassoc-36.c    |    2 +-\n gcc/testsuite/gcc.dg/utf-array-short-wchar.c  |    6 +-\n gcc/testsuite/gcc.dg/utf-array.c              |    6 +-\n gcc/testsuite/lib/target-supports.exp         |    3 -\n libgcc/config.host                            |    7 -\n libgcc/config/m32c/lib1funcs.S                |  230 -\n libgcc/config/m32c/lib2funcs.c                |  147 -\n libgcc/config/m32c/t-m32c                     |   13 -\n libgcc/config/m32c/trapv.c                    |   42 -\n libgcc/config/rl78/lib2div.c                  |    2 +-\n 64 files changed, 30 insertions(+), 9741 deletions(-)\n delete mode 100644 gcc/config/m32c/addsub.md\n delete mode 100644 gcc/config/m32c/bitops.md\n delete mode 100644 gcc/config/m32c/blkmov.md\n delete mode 100644 gcc/config/m32c/cond.md\n delete mode 100644 gcc/config/m32c/constraints.md\n delete mode 100644 gcc/config/m32c/jump.md\n delete mode 100644 gcc/config/m32c/m32c-modes.def\n delete mode 100644 gcc/config/m32c/m32c-pragma.cc\n delete mode 100644 gcc/config/m32c/m32c-protos.h\n delete mode 100644 gcc/config/m32c/m32c.abi\n delete mode 100644 gcc/config/m32c/m32c.cc\n delete mode 100644 gcc/config/m32c/m32c.h\n delete mode 100644 gcc/config/m32c/m32c.md\n delete mode 100644 gcc/config/m32c/m32c.opt\n delete mode 100644 gcc/config/m32c/m32c.opt.urls\n delete mode 100644 gcc/config/m32c/minmax.md\n delete mode 100644 gcc/config/m32c/mov.md\n delete mode 100644 gcc/config/m32c/muldiv.md\n delete mode 100644 gcc/config/m32c/predicates.md\n delete mode 100644 gcc/config/m32c/prologue.md\n delete mode 100644 gcc/config/m32c/shift.md\n delete mode 100644 gcc/config/m32c/t-m32c\n delete mode 100644 libgcc/config/m32c/lib1funcs.S\n delete mode 100644 libgcc/config/m32c/lib2funcs.c\n delete mode 100644 libgcc/config/m32c/t-m32c\n delete mode 100644 libgcc/config/m32c/trapv.c","diff":"diff --git a/contrib/compare-all-tests b/contrib/compare-all-tests\nindex 3564e60c8ea..561b2195c64 100644\n--- a/contrib/compare-all-tests\n+++ b/contrib/compare-all-tests\n@@ -24,7 +24,6 @@ arm_opts='-mthumb/-march=armv5t -mthumb/-march=armv6t2 -march=armv5 -mthumb/-mar\n cris_opts='-march=v32 -march=v1'\n h8300_opts='/ -mh -mh/-mn -ms -ms/-mn -msx -msx/-mn -mint32 -mh/-mint32 -mh/-mn/-mint32 -ms/-mint32 -ms/-mn/-mint32 -msx/-mint32 -msx/-mn/-mint32'\n i386_opts='-m32 -m64 -m32/-msse/-msse2/-mfpmath=sse'\n-m32c_opts='-mcpu=r8c -mcpu=m16c -mcpu=m32c'\n m68k_opts='-m68000 -m68020 -m68020/-m68881 -m68040/-m68881 -m68060/-m68881 -mcfv4e'\n mips_opts='-msoft-float/-mgp32/-mips16 -mabi=32/-mfp32/-mgp32/-mips16 -mabi=o64/-mfp64/-mgp64/-mips16 -msoft-float/-mgp32 -mfp32/-mgp32 -march=mips64r2/-mabi=32/-mfp64/-mgp32 -msoft-float/-mgp64 -msingle-float/-mfp32/-mgp64 -mfp64/-mgp64'\n mn10300_opts='-mam33 -mam33-2'\n@@ -34,7 +33,7 @@ s390_opts='-m31 -m31/-mzarch -m64'\n sh_opts='-m3 -m3e -m4 -m4a -m4al -m4/-mieee -m1 -m1/-mno-cbranchdi -m2a -m2a/-mieee -m2e -m2e/-mieee'\n sparc_opts='-mcpu=v8/-m32 -mcpu=v9/-m32 -m64'\n \n-all_targets='alpha arm avr bfin cris fr30 frv h8300 ia64 iq2000 m32c m32r m68k mcore mips mmix mn10300 pa pdp11 ppc sh sparc v850 vax xstormy16 xtensa' # e500 \n+all_targets='alpha arm avr bfin cris fr30 frv h8300 ia64 iq2000 m32r m68k mcore mips mmix mn10300 pa pdp11 ppc sh sparc v850 vax xstormy16 xtensa' # e500\n \n test_one_file ()\n {\ndiff --git a/contrib/config-list.mk b/contrib/config-list.mk\nindex 076fc8fb49e..54ca15a7808 100644\n--- a/contrib/config-list.mk\n+++ b/contrib/config-list.mk\n@@ -66,7 +66,7 @@ LIST = \\\n   lm32-rtems lm32-uclinux \\\n   loongarch32-linux-gnuf64 loongarch32-linux-gnuf32 loongarch32-linux-gnusf \\\n   loongarch64-linux-gnuf64 loongarch64-linux-gnuf32 loongarch64-linux-gnusf \\\n-  m32c-elfOPT-enable-obsolete m32r-elf m32rle-elf \\\n+  m32r-elf m32rle-elf \\\n   m68k-elf m68k-netbsdelf \\\n   m68k-uclinux m68k-linux m68k-rtems \\\n   mcore-elf microblaze-linux microblaze-elf \\\ndiff --git a/gcc/attr-urls.def b/gcc/attr-urls.def\nindex c75030793b9..db5ec7124a0 100644\n--- a/gcc/attr-urls.def\n+++ b/gcc/attr-urls.def\n@@ -20,7 +20,6 @@ const attr_url_entry all_attrs[] = {\n  { \"assume\", \"gcc/Common-Attributes.html#index-assume\", \"\", 6},\n  { \"assume_aligned\", \"gcc/Common-Attributes.html#index-assume_005faligned\", \"\", 14},\n  { \"aux\", \"gcc/ARC-Attributes.html#index-aux_002c-ARC\", \"ARC\", 3},\n- { \"bank_switch\", \"gcc/M32C-Attributes.html#index-bank_005fswitch_002c-M32C\", \"M32C\", 11},\n  { \"below100\", \"gcc/Xstormy16-Attributes.html#index-below100_002c-Xstormy16\", \"Xstormy16\", 8},\n  { \"break_handler\", \"gcc/MicroBlaze-Attributes.html#index-break_005fhandler_002c-MicroBlaze\", \"MicroBlaze\", 13},\n  { \"brk_interrupt\", \"gcc/RL78-Attributes.html#index-brk_005finterrupt_002c-RL78\", \"RL78\", 13},\n@@ -54,7 +53,6 @@ const attr_url_entry all_attrs[] = {\n  { \"externally_visible\", \"gcc/Common-Attributes.html#index-externally_005fvisible\", \"\", 18},\n  { \"fallthrough\", \"gcc/Common-Attributes.html#index-fallthrough\", \"\", 11},\n  { \"far\", \"gcc/MIPS-Attributes.html#index-far_002c-MIPS\", \"MIPS\", 3},\n- { \"fast_interrupt\", \"gcc/M32C-Attributes.html#index-fast_005finterrupt_002c-M32C\", \"M32C\", 14},\n  { \"fast_interrupt\", \"gcc/MicroBlaze-Attributes.html#index-fast_005finterrupt_002c-MicroBlaze\", \"MicroBlaze\", 14},\n  { \"fast_interrupt\", \"gcc/RX-Attributes.html#index-fast_005finterrupt_002c-RX\", \"RX\", 14},\n  { \"fastcall\", \"gcc/x86-Attributes.html#index-fastcall_002c-x86-32\", \"x86-32\", 8},\n@@ -70,7 +68,6 @@ const attr_url_entry all_attrs[] = {\n  { \"forwarder_section\", \"gcc/Epiphany-Attributes.html#index-forwarder_005fsection_002c-Epiphany\", \"Epiphany\", 17},\n  { \"function_return\", \"gcc/x86-Attributes.html#index-function_005freturn_002c-x86\", \"x86\", 15},\n  { \"function_vector\", \"gcc/H8_002f300-Attributes.html#index-function_005fvector_002c-H8_002f300\", \"H8/300\", 15},\n- { \"function_vector\", \"gcc/M32C-Attributes.html#index-function_005fvector_002c-M16C_002fM32C\", \"M16C/M32C\", 15},\n  { \"function_vector\", \"gcc/SH-Attributes.html#index-function_005fvector_002c-SH\", \"SH\", 15},\n  { \"gcc_struct\", \"gcc/PowerPC-Attributes.html#index-gcc_005fstruct_002c-PowerPC\", \"PowerPC\", 10},\n  { \"gcc_struct\", \"gcc/x86-Attributes.html#index-gcc_005fstruct_002c-x86\", \"x86\", 10},\n@@ -90,7 +87,6 @@ const attr_url_entry all_attrs[] = {\n  { \"interrupt\", \"gcc/C-SKY-Attributes.html#index-interrupt_002c-C-SKY\", \"C-SKY\", 9},\n  { \"interrupt\", \"gcc/Common-Attributes.html#index-interrupt\", \"\", 9},\n  { \"interrupt\", \"gcc/Epiphany-Attributes.html#index-interrupt_002c-Epiphany\", \"Epiphany\", 9},\n- { \"interrupt\", \"gcc/M32C-Attributes.html#index-interrupt_002c-M32C\", \"M32C\", 9},\n  { \"interrupt\", \"gcc/M32R_002fD-Attributes.html#index-interrupt_002c-M32R_002fD\", \"M32R/D\", 9},\n  { \"interrupt\", \"gcc/MIPS-Attributes.html#index-interrupt_002c-MIPS\", \"MIPS\", 9},\n  { \"interrupt\", \"gcc/MSP430-Attributes.html#index-interrupt_002c-MSP430\", \"MSP430\", 9},\ndiff --git a/gcc/config.gcc b/gcc/config.gcc\nindex 8fe99616f82..1f977664bd2 100644\n--- a/gcc/config.gcc\n+++ b/gcc/config.gcc\n@@ -283,7 +283,7 @@ esac\n # Obsolete configurations.\n case ${target} in\n      ia64*-*-hpux* | ia64*-*-*vms* | ia64*-*-elf*\t\\\n-   | m32c*-*-* | epiphany*-*-* | rl78*-*-*\t\t\\\n+   | epiphany*-*-* | rl78*-*-*\t\t\\\n  )\n     if test \"x$enable_obsolete\" != xyes; then\n       echo \"*** Configuration ${target} is obsolete.\" >&2\n@@ -359,11 +359,6 @@ tm_p_file=\n cpu_type=`echo ${target} | sed 's/-.*$//'`\n cpu_is_64bit=\n case ${target} in\n-m32c*-*-*)\n-        cpu_type=m32c\n-\ttmake_file=m32c/t-m32c\n-\ttarget_has_targetm_common=no\n-        ;;\n aarch64*-*-*)\n \tcpu_type=aarch64\n \textra_headers=\"arm_fp16.h arm_neon.h arm_bf16.h arm_acle.h arm_sve.h arm_sme.h arm_neon_sve_bridge.h arm_private_fp8.h arm_private_neon_types.h\"\n@@ -3704,11 +3699,6 @@ am33_2.0-*-linux*)\n \tgas=yes gnu_ld=yes\n \tuse_collect2=no\n \t;;\n-m32c-*-elf*)\n-\ttm_file=\"elfos.h newlib-stdint.h ${tm_file}\"\n-\tc_target_objs=\"m32c-pragma.o\"\n-\tcxx_target_objs=\"m32c-pragma.o\"\n- \t;;\n *)\n \techo \"*** Configuration ${target} not supported\" 1>&2\n \texit 1\ndiff --git a/gcc/config/m32c/addsub.md b/gcc/config/m32c/addsub.md\ndeleted file mode 100644\nindex db4d309ae1f..00000000000\n--- a/gcc/config/m32c/addsub.md\n+++ /dev/null\n@@ -1,259 +0,0 @@\n-;; Machine Descriptions for R8C/M16C/M32C\n-;; Copyright (C) 2005-2026 Free Software Foundation, Inc.\n-;; Contributed by Red Hat.\n-;;\n-;; This file is part of GCC.\n-;;\n-;; GCC is free software; you can redistribute it and/or modify it\n-;; under the terms of the GNU General Public License as published\n-;; by the Free Software Foundation; either version 3, or (at your\n-;; option) any later version.\n-;;\n-;; GCC is distributed in the hope that it will be useful, but WITHOUT\n-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n-;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n-;; License for more details.\n-;;\n-;; You should have received a copy of the GNU General Public License\n-;; along with GCC; see the file COPYING3.  If not see\n-;; <http://www.gnu.org/licenses/>.\n-\n-;; add, sub\n-\n-(define_insn \"addqi3\"\n-  [(set (match_operand:QI 0 \"mra_or_sp_operand\"\n-\t\t  \"=SdRhl,SdRhl,??Rmm,??Rmm, *Raa,*Raa,SdRhl,??Rmm\")\n-\t(plus:QI (match_operand:QI 1 \"mra_operand\"\n-\t\t  \"%0,0,0,0, 0,0,0,0\")\n-\t\t (match_operand:QI 2 \"mrai_operand\"\n-\t\t  \"iSdRhl,?Rmm,iSdRhl,?Rmm, iSdRhl,?Rmm,*Raa,*Raa\")))]\n-  \"\"\n-  \"add.b\\t%2,%0\"\n-  [(set_attr \"flags\" \"oszc\")]\n-  )\n-\n-(define_insn \"addhi3\"\n-  [(set (match_operand:HI 0 \"m32c_nonimmediate_operand\"\n-\t \t  \"=SdRhi,SdRhi,??Rmm,??Rmm, SdRhi,??Rmm, Rhi, Raw, Raw, !Rsp\")\n-\t(plus:HI (match_operand:HI 1 \"m32c_any_operand\"\n-\t\t  \"%0,0,0,0, 0,0, Raw, Rfb, Rfb, 0\")\n-\t\t (match_operand:HI 2 \"m32c_any_operand\"\n-\t\t  \"IU2sSdRhi,?Rmm,IU2sSdRhi,?Rmm, IM2,IM2, IS2IU2, I00, IS1, i\")))]\n-  \"\"\n-  \"@\n-   add.w\\t%2,%0\n-   add.w\\t%2,%0\n-   add.w\\t%2,%0\n-   add.w\\t%2,%0\n-   sub.w\\t%m2,%0\n-   sub.w\\t%m2,%0\n-   mova\\t%d2[%1],%0\n-   stc\\t%1,%0\n-   mova\\t%D2[%1],%0\n-   add.w\\t%2,%0\"\n-  [(set_attr \"flags\" \"oszc,oszc,oszc,oszc,oszc,oszc,n,n,n,oszc\")]\n-  )\n-\n-(define_insn \"addpsi3\"\n-  [(set (match_operand:PSI 0 \"m32c_nonimmediate_operand\" \"=Rpi,Raa,SdRpi,SdRpi,Rsp*Rmm, Rpi,Rpi\")\n-\t(plus:PSI (match_operand:PSI 1 \"m32c_nonimmediate_operand\" \"0,0,0,0,0, Raa,Rad\")\n-\t\t  (match_operand:PSI 2 \"m32c_any_operand\" \"Is3,IS1,iSdRpi,?Rmm,i, i,IS2\")))]\n-  \"TARGET_A24\"\n-  \"@\n-   add.l:q\\t%2,%0\n-   addx\\t%2,%0\n-   add.l\\t%2,%0\n-   add.l\\t%2,%0\n-   add.l\\t%2,%0\n-   mova\\t%d2[%1],%0\n-   mova\\t%D2[%1],%0\"\n-  [(set_attr \"flags\" \"oszc,oszc,oszc,oszc,oszc,n,n\")]\n-  )\n-\n-(define_expand \"addsi3\"\n-  [(set (match_operand:SI 0 \"mra_operand\" \"=RsiSd,RsiSd,??Rmm,??Rmm\")\n-        (plus:SI (match_operand:SI 1 \"mra_operand\" \"%0,0,0,0\")\n-                 (match_operand:SI 2 \"mrai_operand\" \"iRsiSd,?Rmm,iRsiSd,?Rmm\")))]\n-  \"TARGET_A24 ||TARGET_A16\"\n-  \"\"\n-  )\n-\n-(define_insn \"addsi3_1\"\n-  [(set (match_operand:SI 0 \"mra_operand\" \"=RsiSd,??Rmm,RsiSd,RsiSd,??Rmm,??Rmm,??Rmm,RsiSd\")\n-        (plus:SI (match_operand:SI 1 \"mra_operand\" \"%0,0,0,0,0,0,0,0\")\n-                 (match_operand:SI 2 \"mrai_operand\" \"IU2,IU2,i,?Rmm,i,RsiSd,?Rmm,RsiSd\")))]\n-  \"TARGET_A16\"\n-  \"*\n-  \n-  switch (which_alternative)\n-    { \n-    case 0:\n-      return \\\"add.w %X2,%h0\\;adcf.w %H0\\\";\n-    case 1:\n-      return \\\"add.w %X2,%h0\\;adcf.w %H0\\\";\n-    case 2:\n-      if (GET_CODE (operands[2]) == SYMBOL_REF)\n-        {\n-          output_asm_insn (\\\"add.w #%%lo(%d2),%h0\\\",operands);\n-          return \\\"adc.w #%%hi(%d2),%H0\\\";\n-        }\n-      else\n-        {\n-          output_asm_insn (\\\"add.w %X2,%h0\\\",operands);\n-          operands[2]= GEN_INT (INTVAL (operands[2]) >> 16);\n-          return \\\"adc.w %X2,%H0\\\";\n-        }\n-    case 3:\n-      return \\\"add.w %h2,%h0\\;adc.w %H2,%H0\\\";\n-    case 4:\n-      output_asm_insn (\\\"add.w %X2,%h0\\\",operands);\n-      operands[2]= GEN_INT (INTVAL (operands[2]) >> 16);\n-      return \\\"adc.w %X2,%H0\\\";\n-    case 5:\n-      return \\\"add.w %h2,%h0\\;adc.w %H2,%H0\\\";\n-    case 6:\n-      return \\\"add.w %h2,%h0\\;adc.w %H2,%H0\\\";\n-    case 7:\n-      return \\\"add.w %h2,%h0\\;adc.w %H2,%H0\\\";\n-    default:\n-      gcc_unreachable ();\n-    }\"\n-  [(set_attr \"flags\" \"x,x,x,x,x,x,x,x\")]\n-)\n-\n-(define_insn \"addsi3_2\"\n-  [(set (match_operand:SI 0 \"mra_operand\" \"=RsiSd,RsiSd,??Rmm,??Rmm\")\n-        (plus:SI (match_operand:SI 1 \"mra_operand\" \"%0,0,0,0\")\n-                 (match_operand:SI 2 \"mrai_operand\" \"iRsiSd,?Rmm,iRsiSd,?Rmm\")))]\n-  \"TARGET_A24\"\n-  \"add.l\\t%2,%0\"\n-  [(set_attr \"flags\" \"oszc\")]\n-)\n-\n-(define_insn \"subqi3\"\n-  [(set (match_operand:QI 0 \"mra_or_sp_operand\"\n-\t\t   \"=SdRhl,SdRhl,??Rmm,??Rmm, Raa,Raa,SdRhl,??Rmm, *Rsp\")\n-\t(minus:QI (match_operand:QI 1 \"mra_operand\"\n-\t\t   \"0,0,0,0, 0,0,0,0, 0\")\n-\t\t  (match_operand:QI 2 \"mrai_operand\"\n-\t\t   \"iSdRhl,?Rmm,iSdRhl,?Rmm, iSdRhl,?Rmm,Raa,Raa, i\")))]\n-  \"\"\n-  \"sub.b\\t%2,%0\"\n-  [(set_attr \"flags\" \"oszc\")]\n-  )\n-\n-(define_insn \"subhi3\"\n-  [(set (match_operand:HI 0 \"mra_operand\"\n-\t\t   \"=SdRhi,SdRhi,??Rmm,??Rmm, SdRhi,??Rmm\")\n-\t(minus:HI (match_operand:HI 1 \"mras_operand\"\n-\t\t   \"0,0,0,0, 0,0\")\n-\t\t  (match_operand:HI 2 \"mrai_operand\"\n-\t\t   \"IU2SdRhi,?Rmm,IU2SdRhi,?Rmm, IM2,IM2\")))]\n-  \"\"\n-  \"@\n-   sub.w\\t%2,%0\n-   sub.w\\t%2,%0\n-   sub.w\\t%2,%0\n-   sub.w\\t%2,%0\n-   add.w\\t%m2,%0\n-   add.w\\t%m2,%0\"\n-  [(set_attr \"flags\" \"oszc,oszc,oszc,oszc,oszc,oszc\")]\n-  )\n-\n-(define_insn \"subpsi3\"\n-  [(set (match_operand:PSI 0 \"mra_operand\" \"=RpiSd,RpiSd,??Rmm,??Rmm\")\n-\t(minus:PSI (match_operand:PSI 1 \"mra_operand\" \"0,0,0,0\")\n-\t\t   (match_operand:PSI 2 \"mrai_operand\" \"iRpiSd,?Rmm,iRpiSd,?Rmm\")))]\n-  \"TARGET_A24\"\n-  \"sub.%&\\t%2,%0\"\n-  [(set_attr \"flags\" \"oszc\")]\n-  )\n-\n-(define_expand \"subsi3\"\n-  [(set (match_operand:SI 0 \"mra_operand\" \"=RsiSd,RsiSd,??Rmm,??Rmm\")\n-        (minus:SI (match_operand:SI 1 \"mra_operand\" \"0,0,0,0\")\n-                  (match_operand:SI 2 \"mrai_operand\" \"iRsiSd,?Rmm,iRsiSd,?Rmm\")))]\n-  \"TARGET_A24 ||TARGET_A16\"\n-  \"\"\n-)\n-\n-(define_insn \"subsi3_1\"\n-  [(set (match_operand:SI 0 \"mra_operand\" \"=RsiSd,RsiSd,??Rmm,??Rmm,??Rmm,RsiSd\")\n-        (minus:SI (match_operand:SI 1 \"mra_operand\" \"0,0,0,0,0,0\")\n-                  (match_operand:SI 2 \"mrai_operand\" \"i,?Rmm,i,RsiSd,?Rmm,RsiSd\")))]\n-  \"TARGET_A16\"\n-  \"*\n-  switch (which_alternative)\n-    {\n-    case 0:\n-      output_asm_insn (\\\"sub.w %X2,%h0\\\",operands);\n-      operands[2]= GEN_INT (INTVAL (operands[2]) >> 16);\n-      return \\\"sbb.w %X2,%H0\\\";\n-    case 1:\n-      return \\\"sub.w %h2,%h0\\;sbb.w %H2,%H0\\\";\n-    case 2:\n-      output_asm_insn (\\\"sub.w %X2,%h0\\\",operands);\n-      operands[2]= GEN_INT (INTVAL (operands[2]) >> 16);\n-      return \\\"sbb.w %X2,%H0\\\";\n-    case 3:\n-      return \\\"sub.w %h2,%h0\\;sbb.w %H2,%H0\\\";\n-    case 4:\n-      return \\\"sub.w %h2,%h0\\;sbb.w %H2,%H0\\\";\n-    case 5:\n-      return \\\"sub.w %h2,%h0\\;sbb.w %H2,%H0\\\";\n-    default:\n-      gcc_unreachable ();\n-    }\"\n-  [(set_attr \"flags\" \"x,x,x,x,x,x\")]\n-)\n-\n-(define_insn \"subsi3_2\"\n-  [(set (match_operand:SI 0 \"mra_operand\" \"=RsiSd,RsiSd,??Rmm,??Rmm\")\n-        (minus:SI (match_operand:SI 1 \"mra_operand\" \"0,0,0,0\")\n-                  (match_operand:SI 2 \"mrai_operand\" \"iRsiSd,?Rmm,iRsiSd,?Rmm\")))]\n-  \"TARGET_A24\"\n-  \"sub.l\\t%2,%0\"\n-  [(set_attr \"flags\" \"oszc,oszc,oszc,oszc\")]\n-)\n-\n-(define_insn \"negqi2\"\n-  [(set (match_operand:QI 0 \"mra_operand\" \"=SdRhl,??Rmm\")\n-\t(neg:QI (match_operand:QI 1 \"mra_operand\" \"0,0\")))]\n-  \"\"\n-  \"neg.b\\t%0\"\n-  [(set_attr \"flags\" \"oszc,oszc\")]\n-  )\n-\n-(define_insn \"neghi2\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"=SdRhi,??Rmm\")\n-\t(neg:HI (match_operand:HI 1 \"mra_operand\" \"0,0\")))]\n-  \"\"\n-  \"neg.w\\t%0\"\n-  [(set_attr \"flags\" \"oszc,oszc\")]\n-  )\n-\n-; We can negate an SImode by operating on the subparts.  GCC deals\n-; with this itself for larger modes, but not SI.\n-(define_insn \"negsi2\"\n-  [(set (match_operand:SI 0 \"mra_operand\" \"=SdR03,??Rmm\")\n-\t(neg:SI (match_operand:SI 1 \"mra_operand\" \"0,0\")))]\n-  \"\"\n-  \"not.w %h0 | not.w %H0 | add.w #1,%h0 | adcf.w %H0\"\n-  [(set_attr \"flags\" \"x\")]\n-  )\n-\n-(define_insn \"absqi2\"\n-  [(set (match_operand:QI 0 \"mra_operand\" \"=RhlSd,??Rmm\")\n-\t(abs:QI (match_operand:QI 1 \"mra_operand\" \"0,0\")))]\n-  \"\"\n-  \"abs.b\\t%0\"\n-  [(set_attr \"flags\" \"oszc\")]\n-  )\n-\n-(define_insn \"abshi2\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"=RhiSd,??Rmm\")\n-\t(abs:HI (match_operand:HI 1 \"mra_operand\" \"0,0\")))]\n-  \"\"\n-  \"abs.w\\t%0\"\n-  [(set_attr \"flags\" \"oszc\")]\n-  )\ndiff --git a/gcc/config/m32c/bitops.md b/gcc/config/m32c/bitops.md\ndeleted file mode 100644\nindex 75d07ddebe9..00000000000\n--- a/gcc/config/m32c/bitops.md\n+++ /dev/null\n@@ -1,421 +0,0 @@\n-;; Machine Descriptions for R8C/M16C/M32C\n-;; Copyright (C) 2005-2026 Free Software Foundation, Inc.\n-;; Contributed by Red Hat.\n-;;\n-;; This file is part of GCC.\n-;;\n-;; GCC is free software; you can redistribute it and/or modify it\n-;; under the terms of the GNU General Public License as published\n-;; by the Free Software Foundation; either version 3, or (at your\n-;; option) any later version.\n-;;\n-;; GCC is distributed in the hope that it will be useful, but WITHOUT\n-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n-;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n-;; License for more details.\n-;;\n-;; You should have received a copy of the GNU General Public License\n-;; along with GCC; see the file COPYING3.  If not see\n-;; <http://www.gnu.org/licenses/>.\n-\n-;; Bit-wise operations (and, ior, xor, shift)\n-\n-; On the R8C and M16C, \"address\" for bit instructions is usually (but\n-; not always!) the *bit* address, not the *byte* address.  This\n-; confuses gcc, so we avoid cases where gcc would produce the wrong\n-; code.  We're left with absolute addresses and registers, and the odd\n-; case of shifting a bit by a variable.\n-\n-; On the M32C, \"address\" for bit instructions is a regular address,\n-; and the bit number is stored in a separate field.  Thus, we can let\n-; gcc do more interesting things.  However, the M32C cannot set all\n-; the bits in a 16-bit register, which the R8C/M16C can do.\n-\n-; However, it all means that we end up with two sets of patterns, one\n-; for each chip.\n-\n-;;----------------------------------------------------------------------\n-\n-;; First off, all the ways we can set one bit, other than plain IOR.\n-\n-(define_insn \"bset_qi\"\n-  [(set (match_operand:QI 0 \"memsym_operand\" \"+Si\")\n-\t(ior:QI (subreg:QI (ashift:HI (const_int 1)\n-\t\t\t\t      (subreg:QI (match_operand:HI 1 \"a_qi_operand\" \"Raa\") 0)) 0)\n-\t\t(match_dup 0)))]\n-  \"TARGET_A16\"\n-  \"bset\\t%0[%1]\"\n-  [(set_attr \"flags\" \"n\")]\n-  )\n-\n-(define_insn \"bset_hi\"\n-  [(set (zero_extract:HI (match_operand:QI 0 \"memsym_operand\" \"+Si\")\n-\t\t\t (const_int 1)\n-\t\t\t (zero_extend:HI (subreg:QI (match_operand:HI 1 \"a_qi_operand\" \"Raa\") 0)))\n-\t(const_int 1))]\n-  \"TARGET_A16\"\n-  \"bset\\t%0[%1]\"\n-  [(set_attr \"flags\" \"n\")]\n-  )  \n-\n-;;----------------------------------------------------------------------\n-\n-;; Now all the ways we can clear one bit, other than plain AND.\n-\n-; This is odd because the shift patterns use QI counts, but we can't\n-; easily put QI in $aN without causing problems elsewhere.\n-(define_insn \"bclr_qi\"\n-  [(set (zero_extract:HI (match_operand:QI 0 \"memsym_operand\" \"+Si\")\n-\t\t\t (const_int 1)\n-\t\t\t (zero_extend:HI (subreg:QI (match_operand:HI 1 \"a_qi_operand\" \"Raa\") 0)))\n-\t(const_int 0))]\n-  \"TARGET_A16\"\n-  \"bclr\\t%0[%1]\"\n-  [(set_attr \"flags\" \"n\")]\n-  )  \n-\n-\n-;;----------------------------------------------------------------------\n-\n-;; Now the generic patterns.\n-\n-(define_insn \"andqi3_16\"\n-  [(set (match_operand:QI 0 \"mra_operand\" \"=Sp,Rqi,RhlSd,RhlSd,??Rmm,??Rmm\")\n-\t(and:QI (match_operand:QI 1 \"mra_operand\" \"%0,0,0,0,0,0\")\n-\t\t(match_operand:QI 2 \"mrai_operand\" \"Imb,Imb,iRhlSd,?Rmm,iRhlSd,?Rmm\")))]\n-  \"TARGET_A16\"\n-  \"@\n-   bclr\\t%B2,%0\n-   bclr\\t%B2,%h0\n-   and.b\\t%x2,%0\n-   and.b\\t%x2,%0\n-   and.b\\t%x2,%0\n-   and.b\\t%x2,%0\"\n-  [(set_attr \"flags\" \"n,n,sz,sz,sz,sz\")]\n-  )\n-\n-(define_insn \"andhi3_16\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"=Sp,Sp,Rhi,RhiSd,??Rmm,RhiSd,??Rmm\")\n-\t(and:HI (match_operand:HI 1 \"mra_operand\" \"%0,0,0,0,0,0,0\")\n-\t\t(match_operand:HI 2 \"mrai_operand\" \"ImB,Imw,Imw,iRhiSd,?Rmm,?Rmm,iRhiSd\")))]\n-  \"TARGET_A16\"\n-  \"@\n-   \n-   bclr\\t%B2,%0\n-   bclr\\t%B2-8,1+%0\n-   bclr\\t%B2,%0\n-   and.w\\t%X2,%0\n-   and.w\\t%X2,%0\n-   and.w\\t%X2,%0\n-   and.w\\t%X2,%0\"\n-  [(set_attr \"flags\" \"n,n,n,sz,sz,sz,sz\")]\n-  )\n-\n-(define_insn \"andsi3\"\n-  [(set (match_operand:SI 0 \"mra_operand\" \"=RsiSd,RsiSd,??Rmm,??Rmm,??Rmm,RsiSd\")\n-        (and:SI (match_operand:SI 1 \"mra_operand\" \"%0,0,0,0,0,0\")\n-                (match_operand:SI 2 \"mrai_operand\" \"i,?Rmm,i,RsiSd,?Rmm,RsiSd\")))]\n-  \"\"\n-  \"*\n-  switch (which_alternative)\n-    {\n-    case 0:\n-      output_asm_insn (\\\"and.w %X2,%h0\\\",operands);\n-      operands[2]= GEN_INT (INTVAL (operands[2]) >> 16);\n-      return \\\"and.w %X2,%H0\\\";\n-    case 1:\n-      return \\\"and.w %h2,%h0\\;and.w %H2,%H0\\\";\n-    case 2:\n-      output_asm_insn (\\\"and.w %X2,%h0\\\",operands);\n-      operands[2]= GEN_INT (INTVAL (operands[2]) >> 16);\n-      return \\\"and.w %X2,%H0\\\";\n-    case 3:\n-      return \\\"and.w %h2,%h0\\;and.w %H2,%H0\\\";\n-    case 4:\n-      return \\\"and.w %h2,%h0\\;and.w %H2,%H0\\\";\n-    case 5:\n-      return \\\"and.w %h2,%h0\\;and.w %H2,%H0\\\";\n-    default:\n-      gcc_unreachable ();\n-    }\"\n-  [(set_attr \"flags\" \"x,x,x,x,x,x\")]\n-)\n-\n-\n-(define_insn \"iorqi3_16\"\n-  [(set (match_operand:QI 0 \"mra_operand\" \"=Sp,Rqi,RqiSd,??Rmm,RqiSd,??Rmm\")\n-\t(ior:QI (match_operand:QI 1 \"mra_operand\" \"%0,0,0,0,0,0\")\n-\t\t(match_operand:QI 2 \"mrai_operand\" \"Ilb,Ilb,iRhlSd,iRhlSd,?Rmm,?Rmm\")))]\n-  \"TARGET_A16\"\n-  \"@\n-   bset\\t%B2,%0\n-   bset\\t%B2,%h0\n-   or.b\\t%x2,%0\n-   or.b\\t%x2,%0\n-   or.b\\t%x2,%0\n-   or.b\\t%x2,%0\"\n-  [(set_attr \"flags\" \"n,n,sz,sz,sz,sz\")]\n-  )\n-\n-(define_insn \"iorhi3_16\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"=Sp,Sp,Rhi,RhiSd,RhiSd,??Rmm,??Rmm\")\n-\t(ior:HI (match_operand:HI 1 \"mra_operand\" \"%0,0,0,0,0,0,0\")\n-\t\t(match_operand:HI 2 \"mrai_operand\" \"Ilb,Ilw,Ilw,iRhiSd,?Rmm,iRhiSd,?Rmm\")))]\n-  \"TARGET_A16\"\n-  \"@\n-   bset %B2,%0\n-   bset\\t%B2-8,1+%0\n-   bset\\t%B2,%0\n-   or.w\\t%X2,%0\n-   or.w\\t%X2,%0\n-   or.w\\t%X2,%0\n-   or.w\\t%X2,%0\"\n-  [(set_attr \"flags\" \"n,n,n,sz,sz,sz,sz\")]\n-  )\n-\n-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n-\n-(define_insn \"andqi3_24\"\n-  [(set (match_operand:QI 0 \"mra_operand\" \"=Sd,Rqi,RhlSd,RhlSd,??Rmm,??Rmm\")\n-\t(and:QI (match_operand:QI 1 \"mra_operand\" \"%0,0,0,0,0,0\")\n-\t\t(match_operand:QI 2 \"mrai_operand\" \"Imb,Imb,iRhlSd,?Rmm,iRhlSd,?Rmm\")))]\n-  \"TARGET_A24\"\n-  \"@\n-   bclr\\t%B2,%0\n-   bclr\\t%B2,%0\n-   and.b\\t%x2,%0\n-   and.b\\t%x2,%0\n-   and.b\\t%x2,%0\n-   and.b\\t%x2,%0\"\n-  [(set_attr \"flags\" \"n,n,sz,sz,sz,sz\")]\n-  )\n-\n-(define_insn \"andhi3_24\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"=Sd,Sd,?Rhl,?Rhl,RhiSd,??Rmm,RhiSd,??Rmm\")\n-\t(and:HI (match_operand:HI 1 \"mra_operand\" \"%0,0,0,0,0,0,0,0\")\n-\t\t(match_operand:HI 2 \"mrai_operand\" \"ImB,Imw,ImB,Imw,iRhiSd,?Rmm,?Rmm,iRhiSd\")))]\n-  \"TARGET_A24\"\n-  \"@\n-   bclr\\t%B2,%0\n-   bclr\\t%B2-8,1+%0\n-   bclr\\t%B2,%h0\n-   bclr\\t%B2-8,%H0\n-   and.w\\t%X2,%0\n-   and.w\\t%X2,%0\n-   and.w\\t%X2,%0\n-   and.w\\t%X2,%0\"\n-  [(set_attr \"flags\" \"n,n,n,n,sz,sz,sz,sz\")]\n-  )\n-\n-\n-\n-(define_insn \"iorqi3_24\"\n-  [(set (match_operand:QI 0 \"mra_operand\" \"=RqiSd,RqiSd,??Rmm,RqiSd,??Rmm\")\n-\t(ior:QI (match_operand:QI 1 \"mra_operand\" \"%0,0,0,0,0\")\n-\t\t(match_operand:QI 2 \"mrai_operand\" \"Ilb,iRhlSd,iRhlSd,?Rmm,?Rmm\")))]\n-  \"TARGET_A24\"\n-  \"@\n-   bset\\t%B2,%0\n-   or.b\\t%x2,%0\n-   or.b\\t%x2,%0\n-   or.b\\t%x2,%0\n-   or.b\\t%x2,%0\"\n-  [(set_attr \"flags\" \"n,sz,sz,sz,sz\")]\n-  )\n-\n-(define_insn \"iorhi3_24\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"=Sd,Sd,?Rhl,?Rhl,RhiSd,RhiSd,??Rmm,??Rmm\")\n-\t(ior:HI (match_operand:HI 1 \"mra_operand\" \"%0,0,0,0,0,0,0,0\")\n-\t\t(match_operand:HI 2 \"mrai_operand\" \"Ilb,Ilw,Ilb,Ilw,iRhiSd,?Rmm,iRhiSd,?Rmm\")))]\n-  \"TARGET_A24\"\n-  \"@\n-   bset\\t%B2,%0\n-   bset\\t%B2-8,1+%0\n-   bset\\t%B2,%h0\n-   bset\\t%B2-8,%H0\n-   or.w\\t%X2,%0\n-   or.w\\t%X2,%0\n-   or.w\\t%X2,%0\n-   or.w\\t%X2,%0\"\n-  [(set_attr \"flags\" \"n,n,n,n,sz,sz,sz,sz\")]\n-  )\n-\n-\n-; ----------------------------------------------------------------------\n-\n-(define_expand \"andqi3\"\n-  [(set (match_operand:QI 0 \"mra_operand\" \"\")\n-\t(and:QI (match_operand:QI 1 \"mra_operand\" \"\")\n-\t\t(match_operand:QI 2 \"mrai_operand\" \"\")))]\n-  \"\"\n-  \"if (TARGET_A16)\n-     emit_insn (gen_andqi3_16 (operands[0], operands[1], operands[2]));\n-   else\n-     emit_insn (gen_andqi3_24 (operands[0], operands[1], operands[2]));\n-   DONE;\"\n-  )\n-\n-(define_expand \"andhi3\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"\")\n-\t(and:HI (match_operand:HI 1 \"mra_operand\" \"\")\n-\t\t(match_operand:HI 2 \"mrai_operand\" \"\")))]\n-  \"\"\n-  \"if (TARGET_A16)\n-     emit_insn (gen_andhi3_16 (operands[0], operands[1], operands[2]));\n-   else\n-     emit_insn (gen_andhi3_24 (operands[0], operands[1], operands[2]));\n-   DONE;\"\n-  )\n-\n-(define_expand \"iorqi3\"\n-  [(set (match_operand:QI 0 \"mra_operand\" \"\")\n-\t(ior:QI (match_operand:QI 1 \"mra_operand\" \"\")\n-\t\t(match_operand:QI 2 \"mrai_operand\" \"\")))]\n-  \"\"\n-  \"if (TARGET_A16)\n-     emit_insn (gen_iorqi3_16 (operands[0], operands[1], operands[2]));\n-   else\n-     emit_insn (gen_iorqi3_24 (operands[0], operands[1], operands[2]));\n-   DONE;\"\n-  )\n-\n-(define_expand \"iorhi3\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"\")\n-\t(ior:HI (match_operand:HI 1 \"mra_operand\" \"\")\n-\t\t(match_operand:HI 2 \"mrai_operand\" \"\")))]\n-  \"\"\n-  \"if (TARGET_A16)\n-     emit_insn (gen_iorhi3_16 (operands[0], operands[1], operands[2]));\n-   else\n-     emit_insn (gen_iorhi3_24 (operands[0], operands[1], operands[2]));\n-   DONE;\"\n-  )\n-\n-(define_insn \"iorsi3\"\n-  [(set (match_operand:SI 0 \"mra_operand\" \"=RsiSd,RsiSd,??Rmm,??Rmm,??Rmm,RsiSd\")\n-        (ior:SI (match_operand:SI 1 \"mra_operand\" \"%0,0,0,0,0,0\")\n-                (match_operand:SI 2 \"mrai_operand\" \"i,?Rmm,i,RsiSd,?Rmm,RsiSd\")))]\n-  \"\"\n-  \"*\n-  switch (which_alternative)\n-    {\n-    case 0:\n-      output_asm_insn (\\\"or.w %X2,%h0\\\",operands);\n-      operands[2]= GEN_INT (INTVAL (operands[2]) >> 16);\n-      return \\\"or.w %X2,%H0\\\";\n-    case 1:\n-      return \\\"or.w %h2,%h0\\;or.w %H2,%H0\\\";\n-    case 2:\n-      output_asm_insn (\\\"or.w %X2,%h0\\\",operands);\n-      operands[2]= GEN_INT (INTVAL (operands[2]) >> 16);\n-      return \\\"or.w %X2,%H0\\\";\n-    case 3:\n-      return \\\"or.w %h2,%h0\\;or.w %H2,%H0\\\";\n-    case 4:\n-      return \\\"or.w %h2,%h0\\;or.w %H2,%H0\\\";\n-    case 5:\n-      return \\\"or.w %h2,%h0\\;or.w %H2,%H0\\\";\n-    default:\n-      gcc_unreachable ();\n-    }\"\n-  [(set_attr \"flags\" \"x,x,x,x,x,x\")]\n-)\n-\n-(define_insn \"xorqi3\"\n-  [(set (match_operand:QI 0 \"mra_operand\" \"=RhlSd,RhlSd,??Rmm,??Rmm\")\n-\t(xor:QI (match_operand:QI 1 \"mra_operand\" \"%0,0,0,0\")\n-\t\t(match_operand:QI 2 \"mrai_operand\" \"iRhlSd,?Rmm,iRhlSd,?Rmm\")))]\n-  \"\"\n-  \"xor.b\\t%x2,%0\"\n-  [(set_attr \"flags\" \"sz,sz,sz,sz\")]\n-  )\n-\n-(define_insn \"xorhi3\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"=RhiSd,RhiSd,??Rmm,??Rmm\")\n-\t(xor:HI (match_operand:HI 1 \"mra_operand\" \"%0,0,0,0\")\n-\t\t(match_operand:HI 2 \"mrai_operand\" \"iRhiSd,?Rmm,iRhiSd,?Rmm\")))]\n-  \"\"\n-  \"xor.w\\t%X2,%0\"\n-  [(set_attr \"flags\" \"sz,sz,sz,sz\")]\n-  )\n-\n-(define_insn \"xorsi3\"\n-  [(set (match_operand:SI 0 \"mra_operand\" \"=RsiSd,RsiSd,??Rmm,??Rmm,??Rmm,RsiSd\")\n-        (xor:SI (match_operand:SI 1 \"mra_operand\" \"%0,0,0,0,0,0\")\n-                (match_operand:SI 2 \"mrai_operand\" \"i,?Rmm,i,RsiSd,?Rmm,RsiSd\")))]\n-  \"\"\n-  \"*\n-  switch (which_alternative)\n-    {\n-    case 0:\n-      output_asm_insn (\\\"xor.w %X2,%h0\\\",operands);\n-      operands[2]= GEN_INT (INTVAL (operands[2]) >> 16);\n-      return \\\"xor.w %X2,%H0\\\";\n-    case 1:\n-      return \\\"xor.w %h2,%h0\\;xor.w %H2,%H0\\\";\n-    case 2:\n-      output_asm_insn (\\\"xor.w %X2,%h0\\\",operands);\n-      operands[2]= GEN_INT (INTVAL (operands[2]) >> 16);\n-      return \\\"xor.w %X2,%H0\\\";\n-    case 3:\n-      return \\\"xor.w %h2,%h0\\;xor.w %H2,%H0\\\";\n-    case 4:\n-      return \\\"xor.w %h2,%h0\\;xor.w %H2,%H0\\\";\n-    case 5:\n-      return \\\"xor.w %h2,%h0\\;xor.w %H2,%H0\\\";\n-    default:\n-      gcc_unreachable ();\n-    }\"\n-  [(set_attr \"flags\" \"x,x,x,x,x,x\")]\n-)\n-\n-(define_insn \"one_cmplqi2\"\n-  [(set (match_operand:QI 0 \"mra_operand\" \"=RhlSd,??Rmm\")\n-\t(not:QI (match_operand:QI 1 \"mra_operand\" \"0,0\")))]\n-  \"\"\n-  \"not.b\\t%0\"\n-  [(set_attr \"flags\" \"sz,sz\")]\n-  )\n-\n-(define_insn \"one_cmplhi2\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"=RhiSd,??Rmm\")\n-\t(not:HI (match_operand:HI 1 \"mra_operand\" \"0,0\")))]\n-  \"\"\n-  \"not.w\\t%0\"\n-  [(set_attr \"flags\" \"sz,sz\")]\n-  )\n-\n-; Optimizations using bit opcodes\n-\n-; We need this because combine only looks at three insns at a time,\n-; and the bclr_qi pattern uses four - mov, shift, not, and.  GCC\n-; should never expand this pattern, because it only shifts a constant\n-; by a constant, so gcc should do that itself.\n-(define_insn \"shift1_qi\"\n-  [(set (match_operand:QI 0 \"mra_operand\" \"=Rqi\")\n-\t(ashift:QI (const_int 1)\n-\t\t   (match_operand 1 \"const_int_operand\" \"In4\")))]\n-  \"\"\n-  \"mov.b\\t#1,%0\\n\\tshl.b\\t%1,%0\"\n-  )\n-(define_insn \"shift1_hi\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"=Rhi\")\n-\t(ashift:HI (const_int 1)\n-\t\t   (match_operand 1 \"const_int_operand\" \"In4\")))]\n-  \"\"\n-  \"mov.w\\t#1,%0\\n\\tshl.w\\t%1,%0\"\n-  )\n-\n-; Generic insert-bit expander, needed so that we can use the bit\n-; opcodes for volatile bitfields.\n-\n-(define_expand \"insv\"\n-  [(set (zero_extract:HI (match_operand:HI 0 \"mra_operand\" \"\")\n-\t\t\t (match_operand 1 \"const_int_operand\" \"\")\n-\t\t\t (match_operand 2 \"const_int_operand\" \"\"))\n-\t(match_operand:HI 3 \"const_int_operand\" \"\"))]\n-  \"\"\n-  \"if (m32c_expand_insv (operands))\n-     FAIL;\n-   DONE;\"\n-  )\ndiff --git a/gcc/config/m32c/blkmov.md b/gcc/config/m32c/blkmov.md\ndeleted file mode 100644\nindex b97e8abe0a3..00000000000\n--- a/gcc/config/m32c/blkmov.md\n+++ /dev/null\n@@ -1,241 +0,0 @@\n-;; Machine Descriptions for R8C/M16C/M32C\n-;; Copyright (C) 2006-2026 Free Software Foundation, Inc.\n-;; Contributed by Red Hat.\n-;;\n-;; This file is part of GCC.\n-;;\n-;; GCC is free software; you can redistribute it and/or modify it\n-;; under the terms of the GNU General Public License as published\n-;; by the Free Software Foundation; either version 3, or (at your\n-;; option) any later version.\n-;;\n-;; GCC is distributed in the hope that it will be useful, but WITHOUT\n-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n-;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n-;; License for more details.\n-;;\n-;; You should have received a copy of the GNU General Public License\n-;; along with GCC; see the file COPYING3.  If not see\n-;; <http://www.gnu.org/licenses/>.\n-\n-;; various block move instructions\n-\n-;; R8C:\n-;;  SMOVB - while (r3--) { *a1-- = *r1ha0--; } - memcpy\n-;;  SMOVF - while (r3--) { *a1++ = *r1ha0++; } - memcpy\n-;;  SSTR  - while (r3--) { *a1++ = [r0l,r0]; } - memset\n-\n-;; M32CM:\n-;;  SCMPU - while (*a0 && *a0 != *a1) { a0++; a1++; } - strcmp\n-;;  SIN   - while (r3--) { *a1++ = *a0; }\n-;;  SMOVB - while (r3--) { *a1-- = *a0--; } - memcpy\n-;;  SMOVF - while (r3--) { *a1++ = *a0++; } - memcpy\n-;;  SMOVU - while (*a1++ = *a0++) ; - strcpy\n-;;  SOUT  - while (r3--) { *a1 = *a0++; }\n-;;  SSTR  - while (r3--) { *a1++ = [r0l,r0]; } - memset\n-\n-\n-\n-;; 0 = destination (mem:BLK ...)\n-;; 1 = source (mem:BLK ...)\n-;; 2 = count\n-;; 3 = alignment\n-(define_expand \"cpymemhi\"\n-  [(match_operand 0 \"ap_operand\" \"\")\n-   (match_operand 1 \"ap_operand\" \"\")\n-   (match_operand 2 \"m32c_r3_operand\" \"\")\n-   (match_operand 3 \"\" \"\")\n-   ]\n-  \"\"\n-  \"if (m32c_expand_cpymemhi(operands)) DONE; FAIL;\"\n-  )\n-\n-;; We can't use mode iterators for these because M16C uses r1h to extend\n-;; the source address, for copying data from ROM to RAM.  We don't yet\n-;; support that, but we need to zero our r1h, so the patterns differ.\n-\n-;; 0 = dest (out)\n-;; 1 = src (out)\n-;; 2 = count (out)\n-;; 3 = dest (in)\n-;; 4 = src (in)\n-;; 5 = count (in)\n-(define_insn \"cpymemhi_bhi_op\"\n-  [(set (mem:QI (match_operand:HI 3 \"ap_operand\" \"0\"))\n-\t(mem:QI (match_operand:HI 4 \"ap_operand\" \"1\")))\n-   (set (match_operand:HI 2 \"m32c_r3_operand\" \"=R3w\")\n-\t(const_int 0))\n-   (set (match_operand:HI 0 \"ap_operand\" \"=Ra1\")\n-\t(plus:HI (match_dup 3)\n-\t\t  (zero_extend:HI (match_operand:HI 5 \"m32c_r3_operand\" \"2\"))))\n-   (set (match_operand:HI 1 \"ap_operand\" \"=Ra0\")\n-\t(plus:HI (match_dup 4)\n-\t\t  (zero_extend:HI (match_dup 5))))\n-   (use (reg:HI R1_REGNO))]\n-  \"TARGET_A16\"\n-  \"mov.b:q\\t#0,r1h\\n\\tsmovf.b\\t; %0[0..%2-1]=r1h%1[]\"\n-  )\n-(define_insn \"cpymemhi_bpsi_op\"\n-  [(set (mem:QI (match_operand:PSI 3 \"ap_operand\" \"0\"))\n-\t(mem:QI (match_operand:PSI 4 \"ap_operand\" \"1\")))\n-   (set (match_operand:HI 2 \"m32c_r3_operand\" \"=R3w\")\n-\t(const_int 0))\n-   (set (match_operand:PSI 0 \"ap_operand\" \"=Ra1\")\n-\t(plus:PSI (match_dup 3)\n-\t\t  (zero_extend:PSI (match_operand:HI 5 \"m32c_r3_operand\" \"2\"))))\n-   (set (match_operand:PSI 1 \"ap_operand\" \"=Ra0\")\n-\t(plus:PSI (match_dup 4)\n-\t\t  (zero_extend:PSI (match_dup 5))))]\n-  \"TARGET_A24\"\n-  \"smovf.b\\t; %0[0..%2-1]=%1[]\"\n-  )\n-(define_insn \"cpymemhi_whi_op\"\n-  [(set (mem:HI (match_operand:HI 3 \"ap_operand\" \"0\"))\n-\t(mem:HI (match_operand:HI 4 \"ap_operand\" \"1\")))\n-   (set (match_operand:HI 2 \"m32c_r3_operand\" \"=R3w\")\n-\t(const_int 0))\n-   (set (match_operand:HI 0 \"ap_operand\" \"=Ra1\")\n-\t(plus:HI (match_dup 3)\n-\t\t  (zero_extend:HI (match_operand:HI 5 \"m32c_r3_operand\" \"2\"))))\n-   (set (match_operand:HI 1 \"ap_operand\" \"=Ra0\")\n-\t(plus:HI (match_dup 4)\n-\t\t  (zero_extend:HI (match_dup 5))))\n-   (use (reg:HI R1_REGNO))]\n-  \"TARGET_A16\"\n-  \"mov.b:q\\t#0,r1h\\n\\tsmovf.w\\t; %0[0..%2-1]=r1h%1[]\"\n-  )\n-(define_insn \"cpymemhi_wpsi_op\"\n-  [(set (mem:HI (match_operand:PSI 3 \"ap_operand\" \"0\"))\n-\t(mem:HI (match_operand:PSI 4 \"ap_operand\" \"1\")))\n-   (set (match_operand:HI 2 \"m32c_r3_operand\" \"=R3w\")\n-\t(const_int 0))\n-   (set (match_operand:PSI 0 \"ap_operand\" \"=Ra1\")\n-\t(plus:PSI (match_dup 3)\n-\t\t  (zero_extend:PSI (match_operand:HI 5 \"m32c_r3_operand\" \"2\"))))\n-   (set (match_operand:PSI 1 \"ap_operand\" \"=Ra0\")\n-\t(plus:PSI (match_dup 4)\n-\t\t  (zero_extend:PSI (match_dup 5))))]\n-  \"TARGET_A24\"\n-  \"smovf.w\\t; %0[0..%2-1]=%1[]\"\n-  )\n-\n-\n-\n-;; 0 = destination (mem:BLK ...)\n-;; 1 = number of bytes\n-;; 2 = value to store\n-;; 3 = alignment\n-(define_expand \"setmemhi\"\n-  [(match_operand 0 \"ap_operand\" \"\")\n-   (match_operand 1 \"m32c_r3_operand\" \"\")\n-   (match_operand 2 \"m32c_r0_operand\" \"\")\n-   (match_operand 3 \"\" \"\")\n-   ]\n-  \"TARGET_A24\"\n-  \"if (m32c_expand_setmemhi(operands)) DONE; FAIL;\"\n-  )\n-\n-;; 0 = address (out)\n-;; 1 = count (out)\n-;; 2 = value (in)\n-;; 3 = address (in)\n-;; 4 = count (in)\n-(define_insn \"setmemhi_b<mode>_op\"\n-  [(set (mem:QI (match_operand:HPSI 3 \"ap_operand\" \"0\"))\n-\t(match_operand:QI 2 \"m32c_r0_operand\" \"R0w\"))\n-   (set (match_operand:HI 1 \"m32c_r3_operand\" \"=R3w\")\n-\t(const_int 0))\n-   (set (match_operand:HPSI 0 \"ap_operand\" \"=Ra1\")\n-\t(plus:HPSI (match_dup 3)\n-\t\t  (zero_extend:HPSI (match_operand:HI 4 \"m32c_r3_operand\" \"1\"))))]\n-  \"TARGET_A24\"\n-  \"sstr.b\\t; %0[0..%1-1]=%2\"\n-  )\n-\n-(define_insn \"setmemhi_w<mode>_op\"\n-  [(set (mem:HI (match_operand:HPSI 3 \"ap_operand\" \"0\"))\n-\t(match_operand:HI 2 \"m32c_r0_operand\" \"R0w\"))\n-   (set (match_operand:HI 1 \"m32c_r3_operand\" \"=R3w\")\n-\t(const_int 0))\n-   (set (match_operand:HPSI 0 \"ap_operand\" \"=Ra1\")\n-\t(plus:HPSI (match_dup 3)\n-\t\t  (zero_extend:HPSI (match_operand:HI 4 \"m32c_r3_operand\" \"1\"))))]\n-  \"TARGET_A24\"\n-  \"sstr.w\\t; %0[0..%1-1]=%2\"\n-  )\n-\n-\n-;; SCMPU sets the flags according to the result of the string\n-;; comparison.  GCC wants the result to be a signed value reflecting\n-;; the result, which it then compares to zero.  Hopefully we can\n-;; optimize that later (see peephole in cond.md).  Meanwhile, the\n-;; strcmp builtin is expanded to a SCMPU followed by a flags-to-int\n-;; pattern in cond.md.\n-\n-;; 0 = result:HI\n-;; 1 = destination (mem:BLK ...)\n-;; 2 = source (mem:BLK ...)\n-;; 3 = alignment\n-\n-(define_expand \"cmpstrsi\"\n-  [(match_operand:HI 0 \"register_operand\" \"\")\n-   (match_operand 1 \"memory_operand\" \"\")\n-   (match_operand 2 \"memory_operand\" \"\")\n-   (match_operand 3 \"const_int_operand\" \"\")\n-   ]\n-  \"TARGET_A24\"\n-  \"if (m32c_expand_cmpstr(operands)) DONE; FAIL;\"\n-  )\n-\n-;; 0 = string1\n-;; 1 = string2\n-\n-(define_insn \"cmpstrhi_op\"\n-  [(set (reg:CC FLG_REGNO)\n-\t(compare:CC (mem:BLK (match_operand:PSI 0 \"ap_operand\" \"Ra0\"))\n-\t\t    (mem:BLK (match_operand:PSI 1 \"ap_operand\" \"Ra1\"))))\n-   (clobber (match_operand:PSI 2 \"ap_operand\" \"=0\"))\n-   (clobber (match_operand:PSI 3 \"ap_operand\" \"=1\"))]\n-  \"TARGET_A24\"\n-  \"scmpu.b\\t; flags := strcmp(*%0,*%1)\"\n-  [(set_attr \"flags\" \"oszc\")]\n-  )\n-\n-\n-\n-;; Note that SMOVU leaves the address registers pointing *after*\n-;; the NUL at the end of the string.  This is not what gcc expects; it\n-;; expects the address registers to point *at* the NUL.  The expander\n-;; must emit a suitable add insn.\n-\n-;; 0 = target: set to &NUL in dest\n-;; 1 = destination (mem:BLK ...)\n-;; 2 = source (mem:BLK ...)\n-\n-(define_expand \"movstr\"\n-  [(match_operand 0 \"m32c_nonimmediate_operand\" \"\")\n-   (match_operand 1 \"\" \"\")\n-   (match_operand 2 \"\" \"\")\n-   ]\n-  \"TARGET_A24\"\n-  \"if (m32c_expand_movstr(operands)) DONE; FAIL;\"\n-  )\n-\n-;; 0 = dest (out)\n-;; 1 = src (out) (clobbered)\n-;; 2 = dest (in)\n-;; 3 = src (in)\n-(define_insn \"movstr_op\"\n-  [(set (mem:BLK (match_operand:PSI 2 \"ap_operand\" \"0\"))\n-\t(mem:BLK (match_operand:PSI 3 \"ap_operand\" \"1\")))\n-   (set (match_operand:PSI 0 \"ap_operand\" \"=Ra1\")\n-\t(plus:PSI (match_dup 2)\n-\t\t  (unspec:PSI [(const_int 0)] UNS_SMOVU)))\n-   (set (match_operand:PSI 1 \"ap_operand\" \"=Ra0\")\n-\t(plus:PSI (match_dup 3)\n-\t\t  (unspec:PSI [(const_int 0)] UNS_SMOVU)))]\n-  \"TARGET_A24\"\n-  \"smovu.b\\t; while (*%2++ := *%3++) != 0\"\n-  [(set_attr \"flags\" \"*\")]\n-  )\n-  \ndiff --git a/gcc/config/m32c/cond.md b/gcc/config/m32c/cond.md\ndeleted file mode 100644\nindex 218a25f2ced..00000000000\n--- a/gcc/config/m32c/cond.md\n+++ /dev/null\n@@ -1,309 +0,0 @@\n-;; Machine Descriptions for R8C/M16C/M32C\n-;; Copyright (C) 2005-2026 Free Software Foundation, Inc.\n-;; Contributed by Red Hat.\n-;;\n-;; This file is part of GCC.\n-;;\n-;; GCC is free software; you can redistribute it and/or modify it\n-;; under the terms of the GNU General Public License as published\n-;; by the Free Software Foundation; either version 3, or (at your\n-;; option) any later version.\n-;;\n-;; GCC is distributed in the hope that it will be useful, but WITHOUT\n-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n-;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n-;; License for more details.\n-;;\n-;; You should have received a copy of the GNU General Public License\n-;; along with GCC; see the file COPYING3.  If not see\n-;; <http://www.gnu.org/licenses/>.\n-\n-; conditionals - cmp, jcc, setcc, etc.\n-\n-; Special note about conditional instructions: GCC always emits the\n-; compare right before the insn, which is good, because m32c's mov\n-; insns modify the flags.  However, this means that any conditional\n-; insn that may require reloading must be kept with its compare until\n-; after reload finishes, else the reload insns might clobber the\n-; flags.  Thus, these rules:\n-;\n-; * the cmp* expanders just save the operands in compare_op0 and\n-;   compare_op1 via m32c_pend_compare.\n-; * conditional insns that won't need reload can call\n-;   m32c_unpend_compare before their expansion.\n-; * other insns must expand to include the compare operands within,\n-;   then split after reload to a separate compare and conditional.\n-\n-; Until support for relaxing is supported in gas, we must assume that\n-; short labels won't reach, so we must use long labels.\n-; Unfortunately, there aren't any conditional jumps with long labels,\n-; so instead we invert the conditional and jump around a regular jump.\n-\n-; Note that we can, at some point in the future, add code to omit the\n-; \"cmp\" portion of the insn if the preceding insn happened to set the\n-; right flags already.  For example, a mov followed by a \"cmp *,0\" is\n-; redundant; the move already set the Z flag.\n-\n-(define_insn_and_split \"cbranch<mode>4\"\n-  [(set (pc) (if_then_else\n-\t      (match_operator 0 \"m32c_cmp_operator\"\n-\t\t\t      [(match_operand:QHPSI 1 \"mra_operand\" \"RraSd\")\n-\t\t\t       (match_operand:QHPSI 2 \"mrai_operand\" \"iRraSd\")])\n-              (label_ref (match_operand 3 \"\" \"\"))\n-\t      (pc)))]\n-  \"\"\n-  \"#\"\n-  \"reload_completed\"\n-  [(set (reg:CC FLG_REGNO)\n-\t(compare (match_dup 1)\n-\t\t (match_dup 2)))\n-   (set (pc) (if_then_else (match_op_dup 0 [(reg:CC FLG_REGNO) (const_int 0)])\n-\t\t\t   (label_ref (match_dup 3))\n-\t\t\t   (pc)))]\n-  \"\"\n-  )\n-\n-(define_insn \"bcc_op\"\n-  [(set (pc)\n-        (if_then_else (match_operator 0 \"ordered_comparison_operator\"\n-\t\t       [(reg:CC FLG_REGNO) (const_int 0)])\n-                      (label_ref (match_operand 1 \"\"))\n-                      (pc)))]\n-  \"\"\n-  \"j%c0\\t%l1\"\n-  [(set_attr \"flags\" \"n\")]\n-)\n-\n-(define_insn \"stzx_16\"\n-  [(set (match_operand:QI 0 \"register_operand\" \"=R0w,R0w,R0w\")\n-\t(if_then_else:QI (eq (reg:CC FLG_REGNO) (const_int 0))\n-\t\t\t (match_operand:QI 1 \"const_int_operand\" \"i,i,0\")\n-\t\t\t (match_operand:QI 2 \"const_int_operand\" \"i,0,i\")))]\n-  \"TARGET_A16 && reload_completed\"\n-  \"@\n-   stzx\\t%1,%2,%0\n-   stz\\t%1,%0\n-   stnz\\t%2,%0\"\n-  [(set_attr \"flags\" \"n,n,n\")]\n-)\n-\n-(define_insn \"stzx_24_<mode>\"\n-  [(set (match_operand:QHI 0 \"mra_operand\" \"=RraSd,RraSd,RraSd\")\n-\t(if_then_else:QHI (eq (reg:CC FLG_REGNO) (const_int 0))\n-\t\t\t (match_operand:QHI 1 \"const_int_operand\" \"i,i,0\")\n-\t\t\t (match_operand:QHI 2 \"const_int_operand\" \"i,0,i\")))]\n-  \"TARGET_A24 && reload_completed\"\n-  \"@\n-   stzx.<bwl>\\t%1,%2,%0\n-   stz.<bwl>\\t%1,%0\n-   stnz.<bwl>\\t%2,%0\"\n-  [(set_attr \"flags\" \"n,n,n\")])\n-\n-(define_insn_and_split \"stzx_reversed_<mode>\"\n-  [(set (match_operand:QHI 0 \"m32c_r0_operand\" \"=R0w\")\n-\t(if_then_else:QHI (ne (reg:CC FLG_REGNO) (const_int 0))\n-\t\t\t (match_operand:QHI 1 \"const_int_operand\" \"\")\n-\t\t\t (match_operand:QHI 2 \"const_int_operand\" \"\")))]\n-  \"(TARGET_A24 || GET_MODE (operands[0]) == QImode) && reload_completed\"\n-  \"#\"\n-  \"\"\n-  [(set (match_dup 0)\n-\t(if_then_else:QHI (eq (reg:CC FLG_REGNO) (const_int 0))\n-\t\t      (match_dup 2)\n-\t\t      (match_dup 1)))]\n-  \"\"\n-  )\n-\n-\n-(define_insn \"cmp<mode>_op\"\n-  [(set (reg:CC FLG_REGNO)\n-\t(compare (match_operand:QHPSI 0 \"mra_operand\" \"RraSd\")\n-\t\t (match_operand:QHPSI 1 \"mrai_operand\" \"RraSdi\")))]\n-  \"\"\n-  \"* return m32c_output_compare(insn, operands); \"\n-  [(set_attr \"flags\" \"oszc\")])\n-\n-;; m32c_conditional_register_usage changes the setcc_gen_code array to\n-;; point to the _24 variants if needed.\n-\n-;; We need to keep the compare and conditional sets together through\n-;; reload, because reload might need to add address reloads to the\n-;; set, which would clobber the flags.  By keeping them together, the\n-;; reloads get put before the compare, thus preserving the flags.\n-\n-;; These are the post-split patterns for the conditional sets.\n-\n-(define_insn \"scc_op\"\n-  [(set (match_operand:QI 0 \"register_operand\" \"=Rqi\")\n-\t(match_operator:QI 1 \"ordered_comparison_operator\"\n-\t [(reg:CC FLG_REGNO) (const_int 0)]))]\n-  \"TARGET_A16 && reload_completed\"\n-  \"* return m32c_scc_pattern(operands, GET_CODE (operands[1]));\")\n-\n-(define_insn \"scc_24_op\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"=RhiSd\")\n-\t(match_operator:HI 1 \"ordered_comparison_operator\"\n-\t [(reg:CC FLG_REGNO) (const_int 0)]))]\n-  \"TARGET_A24 && reload_completed\"\n-  \"sc%c1\\t%0\"\n-  [(set_attr \"flags\" \"n\")]\n-)\n-\n-;; These are the pre-split patterns for the conditional sets.\n-\n-(define_expand \"cstore<mode>4\"\n-  [(set (match_operand:QI 0 \"register_operand\")\n-\t(match_operator:QI 1 \"ordered_comparison_operator\"\n-\t [(match_operand:QHPSI 2 \"mra_operand\")\n-\t  (match_operand:QHPSI 3 \"mrai_operand\")]))]\n-  \"\"\n-{\n-  if (TARGET_A24)\n-    {\n-      rtx o = gen_reg_rtx (HImode);\n-      emit_insn (gen_cstore<mode>4_24 (o, operands[1],\n-\t\t\t\t       operands[2], operands[3]));\n-      emit_move_insn (operands[0], gen_lowpart (QImode, o));\n-      DONE;\n-    }\n-})\n-\n-(define_insn_and_split \"*cstore<mode>4_16\"\n-  [(set (match_operand:QI 0 \"register_operand\" \"=Rqi\")\n-\t(match_operator:QI 1 \"ordered_comparison_operator\"\n-\t [(match_operand:QHPSI 2 \"mra_operand\" \"RraSd\")\n-\t  (match_operand:QHPSI 3 \"mrai_operand\" \"RraSdi\")]))]\n-  \"TARGET_A16\"\n-  \"#\"\n-  \"&& reload_completed\"\n-  [(set (reg:CC FLG_REGNO)\n-\t(compare (match_dup 2)\n-\t\t (match_dup 3)))\n-   (set (match_dup 0)\n-\t(match_op_dup 1 [(reg:CC FLG_REGNO) (const_int 0)]))]\n-  \"\"\n-  [(set_attr \"flags\" \"x\")]\n-)\n-\n-(define_insn_and_split \"cstore<mode>4_24\"\n-  [(set (match_operand:HI 0 \"mra_nopp_operand\" \"=RhiSd\")\n-\t(match_operator:HI 1 \"ordered_comparison_operator\"\n-\t [(match_operand:QHPSI 2 \"mra_operand\" \"RraSd\")\n-\t  (match_operand:QHPSI 3 \"mrai_operand\" \"RraSdi\")]))]\n-  \"TARGET_A24\"\n-  \"#\"\n-  \"&& reload_completed\"\n-  [(set (reg:CC FLG_REGNO)\n-\t(compare (match_dup 2)\n-\t\t (match_dup 3)))\n-   (set (match_dup 0)\n-\t(match_op_dup 1 [(reg:CC FLG_REGNO) (const_int 0)]))]\n-  \"\"\n-  [(set_attr \"flags\" \"x\")]\n-)\n-\n-(define_insn_and_split \"movqicc_<code>_<mode>\"\n-  [(set (match_operand:QI 0 \"register_operand\" \"=R0w\")\n-        (if_then_else:QI (eqne_cond (match_operand:QHPSI 1 \"mra_operand\" \"RraSd\")\n-\t\t\t\t    (match_operand:QHPSI 2 \"mrai_operand\" \"RraSdi\"))\n-\t\t\t  (match_operand:QI 3 \"const_int_operand\" \"\")\n-\t\t\t  (match_operand:QI 4 \"const_int_operand\" \"\")))]\n-  \"\"\n-  \"#\"\n-  \"reload_completed\"\n-  [(set (reg:CC FLG_REGNO)\n-\t(compare (match_dup 1)\n-\t\t (match_dup 2)))\n-   (set (match_dup 0)\n-        (if_then_else:QI (eqne_cond (reg:CC FLG_REGNO) (const_int 0))\n-\t\t\t (match_dup 3)\n-\t\t\t (match_dup 4)))]\n-  \"\"\n-  [(set_attr \"flags\" \"x\")]\n-  )\n-\n-(define_insn_and_split \"movhicc_<code>_<mode>\"\n-  [(set (match_operand:HI 0 \"register_operand\" \"=R0w\")\n-        (if_then_else:HI (eqne_cond (match_operand:QHPSI 1 \"mra_operand\" \"RraSd\")\n-\t\t\t\t    (match_operand:QHPSI 2 \"mrai_operand\" \"RraSdi\"))\n-\t\t\t  (match_operand:HI 3 \"const_int_operand\" \"\")\n-\t\t\t  (match_operand:HI 4 \"const_int_operand\" \"\")))]\n-  \"TARGET_A24\"\n-  \"#\"\n-  \"reload_completed\"\n-  [(set (reg:CC FLG_REGNO)\n-\t(compare (match_dup 1)\n-\t\t (match_dup 2)))\n-   (set (match_dup 0)\n-        (if_then_else:HI (eqne_cond (reg:CC FLG_REGNO) (const_int 0))\n-\t\t\t (match_dup 3)\n-\t\t\t (match_dup 4)))]\n-  \"\"\n-  [(set_attr \"flags\" \"x\")]\n-  )\n-\n-;; And these are the expanders.\n-\n-(define_expand \"movqicc\"\n-  [(set (match_operand:QI 0 \"register_operand\" \"\")\n-        (if_then_else:QI (match_operand 1 \"m32c_eqne_operator\" \"\")\n-                         (match_operand:QI 2 \"const_int_operand\" \"\")\n-                         (match_operand:QI 3 \"const_int_operand\" \"\")))]\n-  \"\"\n-  \"if (m32c_expand_movcc(operands))\n-     FAIL;\n-   DONE;\"\n-)\n-\n-(define_expand \"movhicc\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"\")\n-        (if_then_else:HI (match_operand 1 \"m32c_eqne_operator\" \"\")\n-                         (match_operand:HI 2 \"const_int_operand\" \"\")\n-                         (match_operand:HI 3 \"const_int_operand\" \"\")))]\n-  \"TARGET_A24\"\n-  \"if (m32c_expand_movcc(operands))\n-     FAIL;\n-   DONE;\"\n-)\n-\n-\n-;; CMP opcodes subtract two values, set the flags, and discard the\n-;; value.  This pattern recovers the sign of the discarded value based\n-;; on the flags.  Operand 0 is set to -1, 0, or 1.  This is used for\n-;; the cmpstr pattern.  For optimal code, this should be removed if\n-;; followed by a suitable CMP insn (see the peephole following).  This\n-;; pattern is 7 bytes and 5 cycles.  If you don't need specific\n-;; values, a 5/4 pattern can be made with SCGT and BMLT to set the\n-;; appropriate bits.\n-\n-(define_insn \"cond_to_int\"\n-  [(set (match_operand:HI 0 \"mra_qi_operand\" \"=Rqi\")\n-\t(if_then_else:HI (lt (reg:CC FLG_REGNO) (const_int 0))\n-\t\t\t (const_int -1)\n-\t\t\t (if_then_else:HI (eq (reg:CC FLG_REGNO) (const_int 0))\n-\t\t\t\t\t  (const_int 0)\n-\t\t\t\t\t  (const_int -1))))]\n-  \"TARGET_A24\"\n-  \"sceq\\t%0\\n\\tbmgt\\t1,%h0\\n\\tdec.w\\t%0\"\n-  [(set_attr \"flags\" \"x\")]\n-  )  \n-\n-;; A cond_to_int followed by a compare against zero is essentially a\n-;; no-op.  However, the result of the cond_to_int may be used by later\n-;; insns, so make sure it's dead before deleting its set.\n-\n-(define_peephole2\n-  [(set (match_operand:HI 0 \"mra_qi_operand\" \"\")\n-\t(if_then_else:HI (lt (reg:CC FLG_REGNO) (const_int 0))\n-\t\t\t (const_int -1)\n-\t\t\t (if_then_else:HI (eq (reg:CC FLG_REGNO) (const_int 0))\n-\t\t\t\t\t  (const_int 0)\n-\t\t\t\t\t  (const_int -1))))\n-   (set (reg:CC FLG_REGNO)\n-\t(compare (match_operand:HI 1 \"mra_qi_operand\" \"\")\n-\t\t (const_int 0)))\n-   ]\n-  \"rtx_equal_p (operands[0], operands[1])\n-     && dead_or_set_p (peep2_next_insn (1), operands[0])\"\n-  [(const_int 1)]\n-  \"\")\ndiff --git a/gcc/config/m32c/constraints.md b/gcc/config/m32c/constraints.md\ndeleted file mode 100644\nindex 6dd3a2ea34b..00000000000\n--- a/gcc/config/m32c/constraints.md\n+++ /dev/null\n@@ -1,225 +0,0 @@\n-;; m32c constraints\n-;; Copyright (C) 2012-2026 Free Software Foundation, Inc.\n-;;\n-;; This file is part of GCC.\n-;;\n-;; GCC is free software; you can redistribute it and/or modify it\n-;; under the terms of the GNU General Public License as published by\n-;; the Free Software Foundation; either version 3, or (at your option)\n-;; any later version.\n-;;\n-;; GCC is distributed in the hope that it will be useful, but WITHOUT\n-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n-;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n-;; License for more details.\n-;;\n-;; You should have received a copy of the GNU General Public License\n-;; along with GCC; see the file COPYING3.  If not see\n-;; <http://www.gnu.org/licenses/>.\n-\n-(define_register_constraint \"Rsp\" \"SP_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"Rfb\" \"FB_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"Rsb\" \"SB_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"Rcr\" \"TARGET_A16 ? CR_REGS : NO_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"Rcl\" \"TARGET_A24 ? CR_REGS : NO_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"R0w\" \"R0_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"R1w\" \"R1_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"R2w\" \"R2_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"R3w\" \"R3_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"R02\" \"R02_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"R13\" \"R13_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"R03\" \"R03_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"Rdi\" \"DI_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"Rhl\" \"HL_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"R23\" \"R23_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"Ra0\" \"A0_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"Ra1\" \"A1_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"Raa\" \"A_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"Raw\" \"TARGET_A16 ? A_REGS : NO_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"Ral\" \"TARGET_A24 ? A_REGS : NO_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"Rqi\" \"QI_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"Rad\" \"AD_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"Rsi\" \"SI_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"Rhi\" \"HI_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"Rhc\" \"HC_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"Rra\" \"RA_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"Rfl\" \"FLG_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"Rmm\" \"fixed_regs[MEM0_REGNO] ? NO_REGS : MEM_REGS\"\n-  \"@internal\")\n-\n-(define_register_constraint \"Rpi\" \"TARGET_A16 ? HI_REGS : RA_REGS\"\n-  \"@internal\")\n-\n-;;; For integer constant constraints:\n-;;; s=signed u=unsigned n=nonzero m=minus l=log2able,\n-;;; [sun] bits [SUN] bytes, p=pointer size\n-;;; I[-0-9][0-9] matches that number\n-\n-(define_constraint \"Is3\"\n-  \"@internal\"\n-  (and (match_code \"const_int\")\n-       (match_test \"IN_RANGE (ival, -8, 7)\")))\n-\n-(define_constraint \"IS1\"\n-  \"@internal\"\n-  (and (match_code \"const_int\")\n-       (match_test \"IN_RANGE (ival, -128, 127)\")))\n-\n-(define_constraint \"IS2\"\n-  \"@internal\"\n-  (and (match_code \"const_int\")\n-       (match_test \"IN_RANGE (ival, -32768, 32767)\")))\n-\n-(define_constraint \"IU2\"\n-  \"@internal\"\n-  (and (match_code \"const_int\")\n-       (match_test \"IN_RANGE (ival, 0, 65535)\")))\n-\n-(define_constraint \"IU3\"\n-  \"@internal\"\n-  (and (match_code \"const_int\")\n-       (match_test \"IN_RANGE (ival, 0, 0x00ffffff)\")))\n-\n-(define_constraint \"In4\"\n-  \"@internal\"\n-  (and (match_code \"const_int\")\n-       (match_test \"IN_RANGE (ival, -8, 8) && ival\")))\n-\n-(define_constraint \"In5\"\n-  \"@internal\"\n-  (and (match_code \"const_int\")\n-       (match_test \"IN_RANGE (ival, -16, 16) && ival\")))\n-\n-(define_constraint \"In6\"\n-  \"@internal\"\n-  (and (match_code \"const_int\")\n-       (match_test \"IN_RANGE (ival, -32, 32) && ival\")))\n-\n-(define_constraint \"IM2\"\n-  \"@internal\"\n-  (and (match_code \"const_int\")\n-       (match_test \"IN_RANGE (ival, -65536, -1)\")))\n-\n-(define_constraint \"Ilb\"\n-  \"@internal\"\n-  (and (match_code \"const_int\")\n-       (match_test \"IN_RANGE (exact_log2 (ival), 0, 7)\")))\n-\n-(define_constraint \"Imb\"\n-  \"@internal\"\n-  (and (match_code \"const_int\")\n-       (match_test \"IN_RANGE (exact_log2 ((ival ^ 0xff) & 0xff), 0, 7)\")))\n-\n-(define_constraint \"ImB\"\n-  \"@internal\"\n-  (and (match_code \"const_int\")\n-       (match_test \"IN_RANGE (exact_log2 ((ival ^ 0xffff) & 0xffff), 0, 7)\")))\n-\n-(define_constraint \"Ilw\"\n-  \"@internal\"\n-  (and (match_code \"const_int\")\n-       (match_test \"IN_RANGE (exact_log2 (ival), 0, 15)\")))\n-\n-(define_constraint \"Imw\"\n-  \"@internal\"\n-  (and (match_code \"const_int\")\n-       (match_test \"IN_RANGE (exact_log2 ((ival ^ 0xffff) & 0xffff), 0, 15)\")))\n-\n-(define_constraint \"I00\"\n-  \"@internal\"\n-  (and (match_code \"const_int\")\n-       (match_test \"ival == 0\")))\n-\n-(define_memory_constraint \"SF\"\n-  \"@internal\"\n-  (match_test \"m32c_matches_constraint_p (op, CONSTRAINT_SF)\"))\n-\n-(define_memory_constraint \"Sd\"\n-  \"@internal\"\n-  (match_test \"m32c_matches_constraint_p (op, CONSTRAINT_Sd)\"))\n-\n-(define_memory_constraint \"Sa\"\n-  \"@internal\"\n-  (match_test \"m32c_matches_constraint_p (op, CONSTRAINT_Sa)\"))\n-\n-(define_memory_constraint \"Si\"\n-  \"@internal\"\n-  (match_test \"m32c_matches_constraint_p (op, CONSTRAINT_Si)\"))\n-\n-(define_memory_constraint \"Ss\"\n-  \"@internal\"\n-  (match_test \"m32c_matches_constraint_p (op, CONSTRAINT_Ss)\"))\n-\n-(define_memory_constraint \"Sf\"\n-  \"@internal\"\n-  (match_test \"m32c_matches_constraint_p (op, CONSTRAINT_Sf)\"))\n-\n-(define_memory_constraint \"Sb\"\n-  \"@internal\"\n-  (match_test \"m32c_matches_constraint_p (op, CONSTRAINT_Sb)\"))\n-\n-(define_memory_constraint \"Sp\"\n-  \"@internal\"\n-  (match_test \"m32c_matches_constraint_p (op, CONSTRAINT_Sp)\"))\n-\n-(define_memory_constraint \"S1\"\n-  \"@internal\"\n-  (match_test \"m32c_matches_constraint_p (op, CONSTRAINT_S1)\"))\n-\n-(define_constraint \"Rpa\"\n-  \"@internal\"\n-  (match_test \"m32c_matches_constraint_p (op, CONSTRAINT_Rpa)\"))\ndiff --git a/gcc/config/m32c/jump.md b/gcc/config/m32c/jump.md\ndeleted file mode 100644\nindex b9d2e8c1f9b..00000000000\n--- a/gcc/config/m32c/jump.md\n+++ /dev/null\n@@ -1,134 +0,0 @@\n-;; Machine Descriptions for R8C/M16C/M32C\n-;; Copyright (C) 2005-2026 Free Software Foundation, Inc.\n-;; Contributed by Red Hat.\n-;;\n-;; This file is part of GCC.\n-;;\n-;; GCC is free software; you can redistribute it and/or modify it\n-;; under the terms of the GNU General Public License as published\n-;; by the Free Software Foundation; either version 3, or (at your\n-;; option) any later version.\n-;;\n-;; GCC is distributed in the hope that it will be useful, but WITHOUT\n-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n-;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n-;; License for more details.\n-;;\n-;; You should have received a copy of the GNU General Public License\n-;; along with GCC; see the file COPYING3.  If not see\n-;; <http://www.gnu.org/licenses/>.\n-\n-;; jump, conditionals, calls, etc\n-\n-(define_insn \"indirect_jump_16\"\n-  [(set (pc)\n-       (match_operand:HI 0 \"register_operand\" \"Rhi\"))]\n-  \"TARGET_A16\"\n-;  \"jmpi.a\\t%0\"\n-  ; no 16-bit jmpi in r8c\n-  \"push.b #0 | push.w\\t%0 | rts\"\n-  [(set_attr \"flags\" \"x\")]\n-  )\n-\n-(define_insn \"indirect_jump_24\"\n-  [(set (pc)\n-       (match_operand:PSI 0 \"register_operand\" \"Rpi\"))]\n-  \"TARGET_A24\"\n-  \"jmpi.a\\t%0\"\n-  [(set_attr \"flags\" \"n\")]\n-  )\n-\n-(define_expand \"indirect_jump\"\n-  [(match_operand 0 \"register_operand\" \"\")]\n-  \"\"\n-  \"if (TARGET_A16)\n-     emit_jump_insn (gen_indirect_jump_16(operands[0]));\n-   else\n-     emit_jump_insn (gen_indirect_jump_24(operands[0]));\n-   DONE;\"\n-  )\n-\n-; We can replace this with jmp.s when gas supports relaxing.  m32c\n-; opcodes are too complicated to try to compute their sizes here, it's\n-; far easier (and more reliable) to let gas worry about it.\n-(define_insn \"jump\"\n-  [(set (pc)\n-\t(label_ref (match_operand 0 \"\" \"\")))]\n-  \"\"\n-  \"jmp.a\\t%l0\"\n-  [(set_attr \"flags\" \"n\")]\n-)\n-\n-; No 16-bit indirect calls on r8c/m16c.  */\n-(define_insn \"call\"\n-  [(call (match_operand:QI 0 \"memory_operand\" \"Si,SaSb,?Rmm\")\n-\t (match_operand 1 \"\" \"\"))\n-   (use (match_operand 2 \"immediate_operand\" \"\"))]\n-  \"\"\n-  \"*\n-switch (which_alternative) {\n-  case 0:\n-    {\n-      HOST_WIDE_INT func_vect_num = \n-      current_function_special_page_vector(XEXP (operands[0], 0));\n-      if (func_vect_num)\n-        {\n-          operands[3] = gen_rtx_CONST_INT (VOIDmode, func_vect_num);\n-          return \\\"jsrs\\t%3\\\";\n-        }\n-      else\n-        return \\\"jsr.a\\t%0\\\";\n-    }\n-  case 1: return TARGET_A16 ? \\\"push.w %a0 | jsr.a\\tm32c_jsri16\\\" : \\\"jsri.a\\t%a0\\\";\n-  case 2: return \\\"jsri.a\\t%a0\\\";\n-  default: gcc_unreachable ();\n-}\"\n-  [(set_attr \"flags\" \"x\")]\n-  )\n-\n-(define_insn \"call_value\"\n-  [(set (match_operand 0 \"m32c_return_operand\" \"=RdiRmmRpa,RdiRmmRpa,RdiRmmRpa\")\n-\t(call (match_operand:QI 1 \"memory_operand\" \"Si,SaSb,?Rmm\")\n-\t      (match_operand 2 \"\" \"\")))\n-   (use (match_operand 3 \"immediate_operand\" \"\"))]\n-  \"\"\n-  \"*\n-switch (which_alternative) {\n-  case 0:\n-    {\n-      HOST_WIDE_INT func_vect_num = \n-      current_function_special_page_vector(XEXP (operands[1], 0));\n-      if (func_vect_num)\n-        {\n-          operands[4] = gen_rtx_CONST_INT (VOIDmode, func_vect_num);\n-          return \\\"jsrs\\t%4\\\";\n-        }\n-      else\n-        return \\\"jsr.a\\t%1\\\";\n-    }\n-  case 1: return TARGET_A16 ? \\\"push.w %a1 | jsr.a\\tm32c_jsri16\\\" : \\\"jsri.a\\t%a1\\\";\n-  case 2: return \\\"jsri.a\\t%a1\\\";\n-  default: gcc_unreachable ();\n-}\"\n-  [(set_attr \"flags\" \"x,x,x\")]\n-  )\n-\n-(define_expand \"untyped_call\"\n-  [(parallel [(call (match_operand 0 \"\" \"\")\n-                    (const_int 0))\n-              (match_operand 1 \"\" \"\")\n-              (match_operand 2 \"\" \"\")])]\n-  \"\"\n-  \"\n-{\n-  int i;\n-\n-  emit_call_insn (gen_call (operands[0], const0_rtx, const0_rtx));\n-\n-  for (i = 0; i < XVECLEN (operands[2], 0); i++)\n-    {\n-      rtx set = XVECEXP (operands[2], 0, i);\n-      emit_move_insn (SET_DEST (set), SET_SRC (set));\n-    }\n-  DONE;\n-}\")\ndiff --git a/gcc/config/m32c/m32c-modes.def b/gcc/config/m32c/m32c-modes.def\ndeleted file mode 100644\nindex c4d9baf7a5d..00000000000\n--- a/gcc/config/m32c/m32c-modes.def\n+++ /dev/null\n@@ -1,28 +0,0 @@\n-/* Target-Specific Modes for R8C/M16C/M32C\n-   Copyright (C) 2005-2026 Free Software Foundation, Inc.\n-   Contributed by Red Hat.\n-\n-   This file is part of GCC.\n-\n-   GCC is free software; you can redistribute it and/or modify it\n-   under the terms of the GNU General Public License as published\n-   by the Free Software Foundation; either version 3, or (at your\n-   option) any later version.\n-\n-   GCC is distributed in the hope that it will be useful, but WITHOUT\n-   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n-   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n-   License for more details.\n-\n-   You should have received a copy of the GNU General Public License\n-   along with GCC; see the file COPYING3.  If not see\n-   <http://www.gnu.org/licenses/>.  */\n-\n-/* 24-bit pointers, whole */\n-/*INT_MODE (PI, 3);*/\n-\n-/* 24-bit pointers, in 32-bit units */\n-PARTIAL_INT_MODE (SI, 24, PSI);\n-\n-/* 48-bit MULEX result */\n-/* INT_MODE (MI, 6); */\ndiff --git a/gcc/config/m32c/m32c-pragma.cc b/gcc/config/m32c/m32c-pragma.cc\ndeleted file mode 100644\nindex b92f3ca7517..00000000000\n--- a/gcc/config/m32c/m32c-pragma.cc\n+++ /dev/null\n@@ -1,128 +0,0 @@\n-/* M32C Pragma support\n-   Copyright (C) 2004-2026 Free Software Foundation, Inc.\n-   Contributed by Red Hat, Inc.\n-\n-   This file is part of GCC.\n-\n-   GCC is free software; you can redistribute it and/or modify\n-   it under the terms of the GNU General Public License as published by\n-   the Free Software Foundation; either version 3, or (at your option)\n-   any later version.\n-\n-   GCC is distributed in the hope that it will be useful,\n-   but WITHOUT ANY WARRANTY; without even the implied warranty of\n-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n-   GNU General Public License for more details.\n-\n-   You should have received a copy of the GNU General Public License\n-   along with GCC; see the file COPYING3.  If not see\n-   <http://www.gnu.org/licenses/>.  */\n-\n-#define IN_TARGET_CODE 1\n-\n-#include \"config.h\"\n-#include \"system.h\"\n-#include \"coretypes.h\"\n-#include \"tm.h\"\n-#include \"c-family/c-common.h\"\n-#include \"c-family/c-pragma.h\"\n-#include \"m32c-protos.h\"\n-\n-/* Implements the \"GCC memregs\" pragma.  This pragma takes only an\n-   integer, and is semantically identical to the -memregs= command\n-   line option.  The only catch is, the programmer should only use\n-   this pragma at the beginning of the file (preferably, in some\n-   project-wide header) to avoid ABI changes related to changing the\n-   list of available \"registers\".  */\n-static void\n-m32c_pragma_memregs (cpp_reader * reader ATTRIBUTE_UNUSED)\n-{\n-  /* on off */\n-  tree val;\n-  enum cpp_ttype type;\n-  HOST_WIDE_INT i;\n-\n-  type = pragma_lex (&val);\n-  if (type == CPP_NUMBER)\n-    {\n-      if (tree_fits_uhwi_p (val))\n-\t{\n-\t  i = tree_to_uhwi (val);\n-\n-\t  type = pragma_lex (&val);\n-\t  if (type != CPP_EOF)\n-\t    warning (0, \"junk at end of %<#pragma GCC memregs%> [0-16]\");\n-\n-\t  if (i >= 0 && i <= 16)\n-\t    {\n-\t      if (!ok_to_change_target_memregs)\n-\t\t{\n-\t\t  warning (0,\n-\t\t\t   \"%<#pragma GCC memregs%> must precede any function declarations\");\n-\t\t  return;\n-\t\t}\n-\t      target_memregs = i;\n-\t      m32c_conditional_register_usage ();\n-\t    }\n-\t  else\n-\t    {\n-\t      warning (0, \"%<#pragma GCC memregs%> takes a number [0-16]\");\n-\t    }\n-\n-\t  return;\n-\t}\n-    }\n-\n-  error (\"%<#pragma GCC memregs%> takes a number [0-16]\");\n-}\n-\n-/* Implements the \"pragma ADDRESS\" pragma.  This pragma takes a\n-   variable name and an address, and arranges for that variable to be\n-   \"at\" that address.  The variable is also made volatile.  */\n-static void\n-m32c_pragma_address (cpp_reader * reader ATTRIBUTE_UNUSED)\n-{\n-  /* on off */\n-  tree var, addr;\n-  enum cpp_ttype type;\n-\n-  type = pragma_lex (&var);\n-  if (type == CPP_NAME)\n-    {\n-      type = pragma_lex (&addr);\n-      if (type == CPP_NUMBER)\n-\t{\n-\t  if (var != error_mark_node)\n-\t    {\n-\t      unsigned uaddr = tree_to_uhwi (addr);\n-\t      m32c_note_pragma_address (IDENTIFIER_POINTER (var), uaddr);\n-\t    }\n-\n-\t  type = pragma_lex (&var);\n-\t  if (type != CPP_EOF)\n-\t    {\n-\t      error (\"junk at end of %<#pragma ADDRESS%>\");\n-\t    }\n-\t  return;\n-\t}\n-    }\n-  error (\"malformed %<#pragma ADDRESS%> variable address\");\n-}\n-\n-/* Implements REGISTER_TARGET_PRAGMAS.  */\n-void\n-m32c_register_pragmas (void)\n-{\n-  c_register_pragma (\"GCC\", \"memregs\", m32c_pragma_memregs);\n-  c_register_pragma (NULL, \"ADDRESS\", m32c_pragma_address);\n-  c_register_pragma (NULL, \"address\", m32c_pragma_address);\n-\n-  /* R8C and M16C have 16-bit pointers in a 20-bit address zpace.\n-     M32C has 24-bit pointers in a 24-bit address space, so does not\n-     need far pointers, but we accept the qualifier anyway, as a\n-     no-op.  */\n-  if (TARGET_A16)\n-    c_register_addr_space (\"__far\", ADDR_SPACE_FAR);\n-  else\n-    c_register_addr_space (\"__far\", ADDR_SPACE_GENERIC);\n-}\ndiff --git a/gcc/config/m32c/m32c-protos.h b/gcc/config/m32c/m32c-protos.h\ndeleted file mode 100644\nindex 822021a054e..00000000000\n--- a/gcc/config/m32c/m32c-protos.h\n+++ /dev/null\n@@ -1,80 +0,0 @@\n-/* Target Prototypes for R8C/M16C/M32C\n-   Copyright (C) 2005-2026 Free Software Foundation, Inc.\n-   Contributed by Red Hat.\n-\n-   This file is part of GCC.\n-\n-   GCC is free software; you can redistribute it and/or modify it\n-   under the terms of the GNU General Public License as published\n-   by the Free Software Foundation; either version 3, or (at your\n-   option) any later version.\n-\n-   GCC is distributed in the hope that it will be useful, but WITHOUT\n-   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n-   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n-   License for more details.\n-\n-   You should have received a copy of the GNU General Public License\n-   along with GCC; see the file COPYING3.  If not see\n-   <http://www.gnu.org/licenses/>.  */\n-\n-void m32c_conditional_register_usage (void);\n-unsigned int m32c_dwarf_frame_regnum (int);\n-int  m32c_eh_return_data_regno (int);\n-void m32c_emit_epilogue (void);\n-void m32c_emit_prologue (void);\n-int  m32c_epilogue_uses (int);\n-int  m32c_function_arg_regno_p (int);\n-void m32c_init_expanders (void);\n-int  m32c_initial_elimination_offset (int, int);\n-void m32c_output_reg_pop (FILE *, int);\n-void m32c_output_reg_push (FILE *, int);\n-poly_int64 m32c_push_rounding (poly_int64);\n-void m32c_register_pragmas (void);\n-void m32c_note_pragma_address (const char *, unsigned);\n-int  m32c_regno_ok_for_base_p (int);\n-int  m32c_trampoline_alignment (void);\n-int  m32c_trampoline_size (void);\n-\n-#ifdef RTX_CODE\n-\n-rtx  m32c_eh_return_stackadj_rtx (void);\n-void m32c_emit_eh_epilogue (rtx);\n-int  m32c_expand_cmpstr (rtx *);\n-int  m32c_expand_insv (rtx *);\n-int  m32c_expand_movcc (rtx *);\n-int  m32c_expand_cpymemhi (rtx *);\n-int  m32c_expand_movstr (rtx *);\n-void m32c_expand_neg_mulpsi3 (rtx *);\n-int  m32c_expand_setmemhi (rtx *);\n-bool m32c_matches_constraint_p (rtx, int);\n-bool m32c_illegal_subreg_p (rtx);\n-bool m32c_immd_dbl_mov (rtx *, machine_mode);\n-rtx  m32c_incoming_return_addr_rtx (void);\n-int  m32c_legitimize_reload_address (rtx *, machine_mode, int, int, int);\n-int  m32c_limit_reload_class (machine_mode, int);\n-bool m32c_mov_ok (rtx *, machine_mode);\n-char * m32c_output_compare (rtx_insn *, rtx *);\n-int  m32c_prepare_move (rtx *, machine_mode);\n-int  m32c_prepare_shift (rtx *, int, int);\n-int  m32c_reg_ok_for_base_p (rtx, int);\n-enum reg_class m32c_regno_reg_class (int);\n-rtx  m32c_return_addr_rtx (int);\n-const char *m32c_scc_pattern (rtx *, RTX_CODE);\n-int  m32c_secondary_reload_class (int, machine_mode, rtx);\n-int  m32c_split_move (rtx *, machine_mode, int);\n-int  m32c_split_psi_p (rtx *);\n-int current_function_special_page_vector (rtx);\n-\n-#endif\n-\n-#ifdef TREE_CODE\n-\n-tree m32c_gimplify_va_arg_expr (tree, tree, gimple_seq *, gimple_seq *);\n-void m32c_init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, tree, int);\n-bool m32c_promote_function_return (const_tree);\n-int  m32c_special_page_vector_p (tree);\n-void m32c_output_aligned_common (FILE *, tree, const char *,\n-\t\t\t\t int, int, int);\n-\n-#endif\ndiff --git a/gcc/config/m32c/m32c.abi b/gcc/config/m32c/m32c.abi\ndeleted file mode 100644\nindex a77f081f6e6..00000000000\n--- a/gcc/config/m32c/m32c.abi\n+++ /dev/null\n@@ -1,131 +0,0 @@\n-   Target Definitions for R8C/M16C/M32C\n-   Copyright (C) 2005-2026 Free Software Foundation, Inc.\n-   Contributed by Red Hat.\n-\n-   This file is part of GCC.\n-\n-   GCC is free software; you can redistribute it and/or modify it\n-   under the terms of the GNU General Public License as published\n-   by the Free Software Foundation; either version 3, or (at your\n-   option) any later version.\n-\n-   GCC is distributed in the hope that it will be useful, but WITHOUT\n-   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n-   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n-   License for more details.\n-\n-   You should have received a copy of the GNU General Public License\n-   along with GCC; see the file COPYING3.  If not see\n-   <http://www.gnu.org/licenses/>.\n-\n-\n-These are just some random notes I used during development of this\n-port.  Please don't consider these to be \"official\" specifications,\n-just additional information to help make the code easier to\n-understand.\n-\n-\n-Frame\n-=====\n-\n-\t+--------------------\n-\t| incoming args\n-\t+--------------------\n-\t| return Address\n-osp ->\t+--------------------\n-\t| saved fp\n-fp ->\t+--------------------\n-\t| local data\n-\t+--------------------\n-\t| saved regs\n-\t+--------------------\n-\t| outgoing args (opt)\n-sp ->\t+--------------------\n-\n-Argument Passing\n-================\n-\n-r8c, m16c\n----------\n-\n-First arg may be passed in r1l or r1 if it (1) fits (QImode or\n-HImode), (2) is named, and (3) is an integer or pointer type (no\n-structs, floats, etc).  Otherwise, it's passed on the stack.\n-\n-Second arg may be passed in r2, same restrictions (but not QImode),\n-even if the first arg is passed on the stack.\n-\n-Third and further args are passed on the stack.  No padding is used,\n-stack \"alignment\" is 8 bits.\n-\n-m32cm, m32c\n------------\n-First arg may be passed in r0l or r0, same restrictions as above.\n-\n-Second and further args are passed on the stack.  Padding is used\n-after QImode parameters (i.e. lower-addressed byte is the value,\n-higher-addressed byte is the padding), stack \"alignment\" is 16 bits.\n-\n-\n-Return Value\n-============\n-\n-r8c, m16c\n----------\n-\n-QImode in r0l\n-HImode in r0\n-near pointer in r0\n-(desired)\n-SImode in r2r0\n-far pointer in r2r0\n-(actual)\n-Anything bigger than 16 bits is returned in memory, at mem0 (mem0\n-through mem15 are provided by libgcc.a)\n-\n-Aggregate values (regardless of size) are returned by pushing a\n-pointer to a temporary area on the stack after the args are pushed.\n-The function fills in this area with the value.  Note that this\n-pointer on the stack does not affect how register arguments, if any,\n-are configured.\n-\n-m32cm, m32c\n------------\n-Same.\n-\n-\n-Registers Preserved Across Calls\n-================================\n-\n-r8c, m16c\n----------\n-sb, fb, sp (i.e. nearly all registers are call clobbered)\n-\n-m32cm, m32c\n------------\n-r1, r2, r3, a0, a1, sb, fb, sp\n-(except when used for return values)\n-\n-\n-Interrupt Handlers\n-==================\n-\n-The stack frame is slightly different for interrupt handlers, because\n-(1) we don't have a usable parent frame, and (2) we have to use\n-special instructions to return and thus must save/restore everything\n-differently.\n-\n-\t+--------------------\n-\t| program state\n-osp ->\t+--------------------\n-\t| return address\n-\t+--------------------\n-\t| saved r0..fp (pushm)\n-fp ->\t+--------------------\n-\t| local data\n-\t+--------------------\n-\t| saved regs mem0..mem15\n-\t+--------------------\n-\t| outgoing args (opt)\n-sp ->\t+--------------------\n-\ndiff --git a/gcc/config/m32c/m32c.cc b/gcc/config/m32c/m32c.cc\ndeleted file mode 100644\nindex b18246df05e..00000000000\n--- a/gcc/config/m32c/m32c.cc\n+++ /dev/null\n@@ -1,4511 +0,0 @@\n-/* Target Code for R8C/M16C/M32C\n-   Copyright (C) 2005-2026 Free Software Foundation, Inc.\n-   Contributed by Red Hat.\n-\n-   This file is part of GCC.\n-\n-   GCC is free software; you can redistribute it and/or modify it\n-   under the terms of the GNU General Public License as published\n-   by the Free Software Foundation; either version 3, or (at your\n-   option) any later version.\n-\n-   GCC is distributed in the hope that it will be useful, but WITHOUT\n-   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n-   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n-   License for more details.\n-\n-   You should have received a copy of the GNU General Public License\n-   along with GCC; see the file COPYING3.  If not see\n-   <http://www.gnu.org/licenses/>.  */\n-\n-#define IN_TARGET_CODE 1\n-\n-#include \"config.h\"\n-#include \"system.h\"\n-#include \"coretypes.h\"\n-#include \"backend.h\"\n-#include \"target.h\"\n-#include \"rtl.h\"\n-#include \"tree.h\"\n-#include \"stringpool.h\"\n-#include \"attribs.h\"\n-#include \"df.h\"\n-#include \"memmodel.h\"\n-#include \"tm_p.h\"\n-#include \"optabs.h\"\n-#include \"regs.h\"\n-#include \"emit-rtl.h\"\n-#include \"recog.h\"\n-#include \"diagnostic-core.h\"\n-#include \"output.h\"\n-#include \"insn-attr.h\"\n-#include \"flags.h\"\n-#include \"reload.h\"\n-#include \"stor-layout.h\"\n-#include \"varasm.h\"\n-#include \"calls.h\"\n-#include \"explow.h\"\n-#include \"expr.h\"\n-#include \"tm-constrs.h\"\n-#include \"builtins.h\"\n-#include \"opts.h\"\n-\n-/* This file should be included last.  */\n-#include \"target-def.h\"\n-\n-/* Prototypes */\n-\n-/* Used by m32c_pushm_popm.  */\n-typedef enum\n-{\n-  PP_pushm,\n-  PP_popm,\n-  PP_justcount\n-} Push_Pop_Type;\n-\n-static bool m32c_function_needs_enter (void);\n-static tree interrupt_handler (tree *, tree, tree, int, bool *);\n-static tree function_vector_handler (tree *, tree, tree, int, bool *);\n-static int interrupt_p (tree node);\n-static int bank_switch_p (tree node);\n-static int fast_interrupt_p (tree node);\n-static int interrupt_p (tree node);\n-static bool m32c_asm_integer (rtx, unsigned int, int);\n-static int m32c_comp_type_attributes (const_tree, const_tree);\n-static bool m32c_fixed_condition_code_regs (unsigned int *, unsigned int *);\n-static struct machine_function *m32c_init_machine_status (void);\n-static void m32c_insert_attributes (tree, tree *);\n-static bool m32c_legitimate_address_p (machine_mode, rtx, bool,\n-\t\t\t\t       code_helper = ERROR_MARK);\n-static bool m32c_addr_space_legitimate_address_p (machine_mode, rtx, bool,\n-\t\t\t\t\t\t  addr_space_t,\n-\t\t\t\t\t\t  code_helper = ERROR_MARK);\n-static rtx m32c_function_arg (cumulative_args_t, const function_arg_info &);\n-static bool m32c_pass_by_reference (cumulative_args_t,\n-\t\t\t\t    const function_arg_info &);\n-static void m32c_function_arg_advance (cumulative_args_t,\n-\t\t\t\t       const function_arg_info &);\n-static unsigned int m32c_function_arg_boundary (machine_mode, const_tree);\n-static int m32c_pushm_popm (Push_Pop_Type);\n-static bool m32c_strict_argument_naming (cumulative_args_t);\n-static rtx m32c_struct_value_rtx (tree, int);\n-static rtx m32c_subreg (machine_mode, rtx, machine_mode, int);\n-static int need_to_save (int);\n-static rtx m32c_function_value (const_tree, const_tree, bool);\n-static rtx m32c_libcall_value (machine_mode, const_rtx);\n-\n-/* Returns true if an address is specified, else false.  */\n-static bool m32c_get_pragma_address (const char *varname, unsigned *addr);\n-\n-static bool m32c_hard_regno_mode_ok (unsigned int, machine_mode);\n-\n-#define SYMBOL_FLAG_FUNCVEC_FUNCTION    (SYMBOL_FLAG_MACH_DEP << 0)\n-\n-#define streq(a,b) (strcmp ((a), (b)) == 0)\n-\n-/* Internal support routines */\n-\n-/* Debugging statements are tagged with DEBUG0 only so that they can\n-   be easily enabled individually, by replacing the '0' with '1' as\n-   needed.  */\n-#define DEBUG0 0\n-#define DEBUG1 1\n-\n-#if DEBUG0\n-#include \"print-tree.h\"\n-/* This is needed by some of the commented-out debug statements\n-   below.  */\n-static char const *class_names[LIM_REG_CLASSES] = REG_CLASS_NAMES;\n-#endif\n-static int class_contents[LIM_REG_CLASSES][1] = REG_CLASS_CONTENTS;\n-\n-/* These are all to support encode_pattern().  */\n-static char pattern[30], *patternp;\n-static GTY(()) rtx patternr[30];\n-#define RTX_IS(x) (streq (pattern, x))\n-\n-/* Some macros to simplify the logic throughout this file.  */\n-#define IS_MEM_REGNO(regno) ((regno) >= MEM0_REGNO && (regno) <= MEM7_REGNO)\n-#define IS_MEM_REG(rtx) (GET_CODE (rtx) == REG && IS_MEM_REGNO (REGNO (rtx)))\n-\n-#define IS_CR_REGNO(regno) ((regno) >= SB_REGNO && (regno) <= PC_REGNO)\n-#define IS_CR_REG(rtx) (GET_CODE (rtx) == REG && IS_CR_REGNO (REGNO (rtx)))\n-\n-static int\n-far_addr_space_p (rtx x)\n-{\n-  if (GET_CODE (x) != MEM)\n-    return 0;\n-#if DEBUG0\n-  fprintf(stderr, \"\\033[35mfar_addr_space: \"); debug_rtx(x);\n-  fprintf(stderr, \" = %d\\033[0m\\n\", MEM_ADDR_SPACE (x) == ADDR_SPACE_FAR);\n-#endif\n-  return MEM_ADDR_SPACE (x) == ADDR_SPACE_FAR;\n-}\n-\n-/* We do most RTX matching by converting the RTX into a string, and\n-   using string compares.  This vastly simplifies the logic in many of\n-   the functions in this file.\n-\n-   On exit, pattern[] has the encoded string (use RTX_IS(\"...\") to\n-   compare it) and patternr[] has pointers to the nodes in the RTX\n-   corresponding to each character in the encoded string.  The latter\n-   is mostly used by print_operand().\n-\n-   Unrecognized patterns have '?' in them; this shows up when the\n-   assembler complains about syntax errors.\n-*/\n-\n-static void\n-encode_pattern_1 (rtx x)\n-{\n-  int i;\n-\n-  if (patternp == pattern + sizeof (pattern) - 2)\n-    {\n-      patternp[-1] = '?';\n-      return;\n-    }\n-\n-  patternr[patternp - pattern] = x;\n-\n-  switch (GET_CODE (x))\n-    {\n-    case REG:\n-      *patternp++ = 'r';\n-      break;\n-    case SUBREG:\n-      if (GET_MODE_SIZE (GET_MODE (x)) !=\n-\t  GET_MODE_SIZE (GET_MODE (XEXP (x, 0))))\n-\t*patternp++ = 'S';\n-      if (GET_MODE (x) == PSImode\n-\t  && GET_CODE (XEXP (x, 0)) == REG)\n-\t*patternp++ = 'S';\n-      encode_pattern_1 (XEXP (x, 0));\n-      break;\n-    case MEM:\n-      *patternp++ = 'm';\n-      /* FALLTHRU */\n-    case CONST:\n-      encode_pattern_1 (XEXP (x, 0));\n-      break;\n-    case SIGN_EXTEND:\n-      *patternp++ = '^';\n-      *patternp++ = 'S';\n-      encode_pattern_1 (XEXP (x, 0));\n-      break;\n-    case ZERO_EXTEND:\n-      *patternp++ = '^';\n-      *patternp++ = 'Z';\n-      encode_pattern_1 (XEXP (x, 0));\n-      break;\n-    case PLUS:\n-      *patternp++ = '+';\n-      encode_pattern_1 (XEXP (x, 0));\n-      encode_pattern_1 (XEXP (x, 1));\n-      break;\n-    case PRE_DEC:\n-      *patternp++ = '>';\n-      encode_pattern_1 (XEXP (x, 0));\n-      break;\n-    case POST_INC:\n-      *patternp++ = '<';\n-      encode_pattern_1 (XEXP (x, 0));\n-      break;\n-    case LO_SUM:\n-      *patternp++ = 'L';\n-      encode_pattern_1 (XEXP (x, 0));\n-      encode_pattern_1 (XEXP (x, 1));\n-      break;\n-    case HIGH:\n-      *patternp++ = 'H';\n-      encode_pattern_1 (XEXP (x, 0));\n-      break;\n-    case SYMBOL_REF:\n-      *patternp++ = 's';\n-      break;\n-    case LABEL_REF:\n-      *patternp++ = 'l';\n-      break;\n-    case CODE_LABEL:\n-      *patternp++ = 'c';\n-      break;\n-    case CONST_INT:\n-    case CONST_DOUBLE:\n-      *patternp++ = 'i';\n-      break;\n-    case UNSPEC:\n-      *patternp++ = 'u';\n-      *patternp++ = '0' + XCINT (x, 1, UNSPEC);\n-      for (i = 0; i < XVECLEN (x, 0); i++)\n-\tencode_pattern_1 (XVECEXP (x, 0, i));\n-      break;\n-    case USE:\n-      *patternp++ = 'U';\n-      break;\n-    case PARALLEL:\n-      *patternp++ = '|';\n-      for (i = 0; i < XVECLEN (x, 0); i++)\n-\tencode_pattern_1 (XVECEXP (x, 0, i));\n-      break;\n-    case EXPR_LIST:\n-      *patternp++ = 'E';\n-      encode_pattern_1 (XEXP (x, 0));\n-      if (XEXP (x, 1))\n-\tencode_pattern_1 (XEXP (x, 1));\n-      break;\n-    default:\n-      *patternp++ = '?';\n-#if DEBUG0\n-      fprintf (stderr, \"can't encode pattern %s\\n\",\n-\t       GET_RTX_NAME (GET_CODE (x)));\n-      debug_rtx (x);\n-#endif\n-      break;\n-    }\n-}\n-\n-static void\n-encode_pattern (rtx x)\n-{\n-  patternp = pattern;\n-  encode_pattern_1 (x);\n-  *patternp = 0;\n-}\n-\n-/* Since register names indicate the mode they're used in, we need a\n-   way to determine which name to refer to the register with.  Called\n-   by print_operand().  */\n-\n-static const char *\n-reg_name_with_mode (int regno, machine_mode mode)\n-{\n-  int mlen = GET_MODE_SIZE (mode);\n-  if (regno == R0_REGNO && mlen == 1)\n-    return \"r0l\";\n-  if (regno == R0_REGNO && (mlen == 3 || mlen == 4))\n-    return \"r2r0\";\n-  if (regno == R0_REGNO && mlen == 6)\n-    return \"r2r1r0\";\n-  if (regno == R0_REGNO && mlen == 8)\n-    return \"r3r1r2r0\";\n-  if (regno == R1_REGNO && mlen == 1)\n-    return \"r1l\";\n-  if (regno == R1_REGNO && (mlen == 3 || mlen == 4))\n-    return \"r3r1\";\n-  if (regno == A0_REGNO && TARGET_A16 && (mlen == 3 || mlen == 4))\n-    return \"a1a0\";\n-  return reg_names[regno];\n-}\n-\n-/* How many bytes a register uses on stack when it's pushed.  We need\n-   to know this because the push opcode needs to explicitly indicate\n-   the size of the register, even though the name of the register\n-   already tells it that.  Used by m32c_output_reg_{push,pop}, which\n-   is only used through calls to ASM_OUTPUT_REG_{PUSH,POP}.  */\n-\n-static int\n-reg_push_size (int regno)\n-{\n-  switch (regno)\n-    {\n-    case R0_REGNO:\n-    case R1_REGNO:\n-      return 2;\n-    case R2_REGNO:\n-    case R3_REGNO:\n-    case FLG_REGNO:\n-      return 2;\n-    case A0_REGNO:\n-    case A1_REGNO:\n-    case SB_REGNO:\n-    case FB_REGNO:\n-    case SP_REGNO:\n-      if (TARGET_A16)\n-\treturn 2;\n-      else\n-\treturn 3;\n-    default:\n-      gcc_unreachable ();\n-    }\n-}\n-\n-/* Given two register classes, find the largest intersection between\n-   them.  If there is no intersection, return RETURNED_IF_EMPTY\n-   instead.  */\n-static reg_class_t\n-reduce_class (reg_class_t original_class, reg_class_t limiting_class,\n-\t      reg_class_t returned_if_empty)\n-{\n-  HARD_REG_SET cc;\n-  int i;\n-  reg_class_t best = NO_REGS;\n-  unsigned int best_size = 0;\n-\n-  if (original_class == limiting_class)\n-    return original_class;\n-\n-  cc = reg_class_contents[original_class] & reg_class_contents[limiting_class];\n-\n-  for (i = 0; i < LIM_REG_CLASSES; i++)\n-    {\n-      if (hard_reg_set_subset_p (reg_class_contents[i], cc))\n-\tif (best_size < reg_class_size[i])\n-\t  {\n-\t    best = (reg_class_t) i;\n-\t    best_size = reg_class_size[i];\n-\t  }\n-\n-    }\n-  if (best == NO_REGS)\n-    return returned_if_empty;\n-  return best;\n-}\n-\n-/* Used by m32c_register_move_cost to determine if a move is\n-   impossibly expensive.  */\n-static bool\n-class_can_hold_mode (reg_class_t rclass, machine_mode mode)\n-{\n-  /* Cache the results:  0=untested  1=no  2=yes */\n-  static char results[LIM_REG_CLASSES][MAX_MACHINE_MODE];\n-\n-  if (results[(int) rclass][mode] == 0)\n-    {\n-      int r;\n-      results[rclass][mode] = 1;\n-      for (r = 0; r < FIRST_PSEUDO_REGISTER; r++)\n-\tif (in_hard_reg_set_p (reg_class_contents[(int) rclass], mode, r)\n-\t    && m32c_hard_regno_mode_ok (r, mode))\n-\t  {\n-\t    results[rclass][mode] = 2;\n-\t    break;\n-\t  }\n-    }\n-\n-#if DEBUG0\n-  fprintf (stderr, \"class %s can hold %s? %s\\n\",\n-\t   class_names[(int) rclass], mode_name[mode],\n-\t   (results[rclass][mode] == 2) ? \"yes\" : \"no\");\n-#endif\n-  return results[(int) rclass][mode] == 2;\n-}\n-\n-/* Run-time Target Specification.  */\n-\n-/* Memregs are memory locations that gcc treats like general\n-   registers, as there are a limited number of true registers and the\n-   m32c families can use memory in most places that registers can be\n-   used.\n-\n-   However, since memory accesses are more expensive than registers,\n-   we allow the user to limit the number of memregs available, in\n-   order to try to persuade gcc to try harder to use real registers.\n-\n-   Memregs are provided by lib1funcs.S.\n-*/\n-\n-int ok_to_change_target_memregs = TRUE;\n-\n-/* Implements TARGET_OPTION_OVERRIDE.  */\n-\n-#undef TARGET_OPTION_OVERRIDE\n-#define TARGET_OPTION_OVERRIDE m32c_option_override\n-\n-static void\n-m32c_option_override (void)\n-{\n-  /* We limit memregs to 0..16, and provide a default.  */\n-  if (OPTION_SET_P (target_memregs))\n-    {\n-      if (target_memregs < 0 || target_memregs > 16)\n-\terror (\"invalid target memregs value %<%d%>\", target_memregs);\n-    }\n-  else\n-    target_memregs = 16;\n-\n-  if (TARGET_A24)\n-    flag_ivopts = 0;\n-\n-  /* This target defaults to strict volatile bitfields.  */\n-  if (flag_strict_volatile_bitfields < 0 && abi_version_at_least(2))\n-    flag_strict_volatile_bitfields = 1;\n-\n-  /* r8c/m16c have no 16-bit indirect call, so thunks are involved.\n-     This is always worse than an absolute call.  */\n-  if (TARGET_A16)\n-    flag_no_function_cse = 1;\n-\n-  /* This wants to put insns between compares and their jumps.  */\n-  /* FIXME: The right solution is to properly trace the flags register\n-     values, but that is too much work for stage 4.  */\n-  flag_combine_stack_adjustments = 0;\n-}\n-\n-#undef TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE\n-#define TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE m32c_override_options_after_change\n-\n-static void\n-m32c_override_options_after_change (void)\n-{\n-  if (TARGET_A16)\n-    flag_no_function_cse = 1;\n-}\n-\n-/* Defining data structures for per-function information */\n-\n-/* The usual; we set up our machine_function data.  */\n-static struct machine_function *\n-m32c_init_machine_status (void)\n-{\n-  return ggc_cleared_alloc<machine_function> ();\n-}\n-\n-/* Implements INIT_EXPANDERS.  We just set up to call the above\n-   function.  */\n-void\n-m32c_init_expanders (void)\n-{\n-  init_machine_status = m32c_init_machine_status;\n-}\n-\n-/* Storage Layout */\n-\n-/* Register Basics */\n-\n-/* Basic Characteristics of Registers */\n-\n-/* Whether a mode fits in a register is complex enough to warrant a\n-   table.  */\n-static struct\n-{\n-  char qi_regs;\n-  char hi_regs;\n-  char pi_regs;\n-  char si_regs;\n-  char di_regs;\n-} nregs_table[FIRST_PSEUDO_REGISTER] =\n-{\n-  { 1, 1, 2, 2, 4 },\t\t/* r0 */\n-  { 0, 1, 0, 0, 0 },\t\t/* r2 */\n-  { 1, 1, 2, 2, 0 },\t\t/* r1 */\n-  { 0, 1, 0, 0, 0 },\t\t/* r3 */\n-  { 0, 1, 1, 0, 0 },\t\t/* a0 */\n-  { 0, 1, 1, 0, 0 },\t\t/* a1 */\n-  { 0, 1, 1, 0, 0 },\t\t/* sb */\n-  { 0, 1, 1, 0, 0 },\t\t/* fb */\n-  { 0, 1, 1, 0, 0 },\t\t/* sp */\n-  { 1, 1, 1, 0, 0 },\t\t/* pc */\n-  { 0, 0, 0, 0, 0 },\t\t/* fl */\n-  { 1, 1, 1, 0, 0 },\t\t/* ap */\n-  { 1, 1, 2, 2, 4 },\t\t/* mem0 */\n-  { 1, 1, 2, 2, 4 },\t\t/* mem1 */\n-  { 1, 1, 2, 2, 4 },\t\t/* mem2 */\n-  { 1, 1, 2, 2, 4 },\t\t/* mem3 */\n-  { 1, 1, 2, 2, 4 },\t\t/* mem4 */\n-  { 1, 1, 2, 2, 0 },\t\t/* mem5 */\n-  { 1, 1, 2, 2, 0 },\t\t/* mem6 */\n-  { 1, 1, 0, 0, 0 },\t\t/* mem7 */\n-};\n-\n-/* Implements TARGET_CONDITIONAL_REGISTER_USAGE.  We adjust the number\n-   of available memregs, and select which registers need to be preserved\n-   across calls based on the chip family.  */\n-\n-#undef TARGET_CONDITIONAL_REGISTER_USAGE\n-#define TARGET_CONDITIONAL_REGISTER_USAGE m32c_conditional_register_usage\n-void\n-m32c_conditional_register_usage (void)\n-{\n-  int i;\n-\n-  if (target_memregs >= 0 && target_memregs <= 16)\n-    {\n-      /* The command line option is bytes, but our \"registers\" are\n-\t 16-bit words.  */\n-      for (i = (target_memregs+1)/2; i < 8; i++)\n-\t{\n-\t  fixed_regs[MEM0_REGNO + i] = 1;\n-\t  CLEAR_HARD_REG_BIT (reg_class_contents[MEM_REGS], MEM0_REGNO + i);\n-\t}\n-    }\n-\n-  /* M32CM and M32C preserve more registers across function calls.  */\n-  if (TARGET_A24)\n-    {\n-      call_used_regs[R1_REGNO] = 0;\n-      call_used_regs[R2_REGNO] = 0;\n-      call_used_regs[R3_REGNO] = 0;\n-      call_used_regs[A0_REGNO] = 0;\n-      call_used_regs[A1_REGNO] = 0;\n-    }\n-}\n-\n-/* How Values Fit in Registers */\n-\n-/* Implements TARGET_HARD_REGNO_NREGS.  This is complicated by the fact that\n-   different registers are different sizes from each other, *and* may\n-   be different sizes in different chip families.  */\n-static unsigned int\n-m32c_hard_regno_nregs_1 (unsigned int regno, machine_mode mode)\n-{\n-  if (regno == FLG_REGNO && mode == CCmode)\n-    return 1;\n-  if (regno >= FIRST_PSEUDO_REGISTER)\n-    return ((GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD);\n-\n-  if (regno >= MEM0_REGNO && regno <= MEM7_REGNO)\n-    return (GET_MODE_SIZE (mode) + 1) / 2;\n-\n-  if (GET_MODE_SIZE (mode) <= 1)\n-    return nregs_table[regno].qi_regs;\n-  if (GET_MODE_SIZE (mode) <= 2)\n-    return nregs_table[regno].hi_regs;\n-  if (regno == A0_REGNO && mode == SImode && TARGET_A16)\n-    return 2;\n-  if ((GET_MODE_SIZE (mode) <= 3 || mode == PSImode) && TARGET_A24)\n-    return nregs_table[regno].pi_regs;\n-  if (GET_MODE_SIZE (mode) <= 4)\n-    return nregs_table[regno].si_regs;\n-  if (GET_MODE_SIZE (mode) <= 8)\n-    return nregs_table[regno].di_regs;\n-  return 0;\n-}\n-\n-static unsigned int\n-m32c_hard_regno_nregs (unsigned int regno, machine_mode mode)\n-{\n-  unsigned int rv = m32c_hard_regno_nregs_1 (regno, mode);\n-  return rv ? rv : 1;\n-}\n-\n-/* Implement TARGET_HARD_REGNO_MODE_OK.  The above function does the work\n-   already; just test its return value.  */\n-static bool\n-m32c_hard_regno_mode_ok (unsigned int regno, machine_mode mode)\n-{\n-  return m32c_hard_regno_nregs_1 (regno, mode) != 0;\n-}\n-\n-/* Implement TARGET_MODES_TIEABLE_P.  In general, modes aren't tieable since\n-   registers are all different sizes.  However, since most modes are\n-   bigger than our registers anyway, it's easier to implement this\n-   function that way, leaving QImode as the only unique case.  */\n-static bool\n-m32c_modes_tieable_p (machine_mode m1, machine_mode m2)\n-{\n-  if (GET_MODE_SIZE (m1) == GET_MODE_SIZE (m2))\n-    return 1;\n-\n-#if 0\n-  if (m1 == QImode || m2 == QImode)\n-    return 0;\n-#endif\n-\n-  return 1;\n-}\n-\n-/* Register Classes */\n-\n-/* Implements REGNO_REG_CLASS.  */\n-enum reg_class\n-m32c_regno_reg_class (int regno)\n-{\n-  switch (regno)\n-    {\n-    case R0_REGNO:\n-      return R0_REGS;\n-    case R1_REGNO:\n-      return R1_REGS;\n-    case R2_REGNO:\n-      return R2_REGS;\n-    case R3_REGNO:\n-      return R3_REGS;\n-    case A0_REGNO:\n-      return A0_REGS;\n-    case A1_REGNO:\n-      return A1_REGS;\n-    case SB_REGNO:\n-      return SB_REGS;\n-    case FB_REGNO:\n-      return FB_REGS;\n-    case SP_REGNO:\n-      return SP_REGS;\n-    case FLG_REGNO:\n-      return FLG_REGS;\n-    default:\n-      if (IS_MEM_REGNO (regno))\n-\treturn MEM_REGS;\n-      return ALL_REGS;\n-    }\n-}\n-\n-/* Implements REGNO_OK_FOR_BASE_P.  */\n-int\n-m32c_regno_ok_for_base_p (int regno)\n-{\n-  if (regno == A0_REGNO\n-      || regno == A1_REGNO || regno >= FIRST_PSEUDO_REGISTER)\n-    return 1;\n-  return 0;\n-}\n-\n-/* Implements TARGET_PREFERRED_RELOAD_CLASS.  In general, prefer general\n-   registers of the appropriate size.  */\n-\n-#undef TARGET_PREFERRED_RELOAD_CLASS\n-#define TARGET_PREFERRED_RELOAD_CLASS m32c_preferred_reload_class\n-\n-static reg_class_t\n-m32c_preferred_reload_class (rtx x, reg_class_t rclass)\n-{\n-  reg_class_t newclass = rclass;\n-\n-#if DEBUG0\n-  fprintf (stderr, \"\\npreferred_reload_class for %s is \",\n-\t   class_names[rclass]);\n-#endif\n-  if (rclass == NO_REGS)\n-    rclass = GET_MODE (x) == QImode ? HL_REGS : R03_REGS;\n-\n-  if (reg_classes_intersect_p (rclass, CR_REGS))\n-    {\n-      switch (GET_MODE (x))\n-\t{\n-\tcase E_QImode:\n-\t  newclass = HL_REGS;\n-\t  break;\n-\tdefault:\n-\t  /*      newclass = HI_REGS; */\n-\t  break;\n-\t}\n-    }\n-\n-  else if (newclass == QI_REGS && GET_MODE_SIZE (GET_MODE (x)) > 2)\n-    newclass = SI_REGS;\n-  else if (GET_MODE_SIZE (GET_MODE (x)) > 4\n-\t   && ! reg_class_subset_p (R03_REGS, rclass))\n-    newclass = DI_REGS;\n-\n-  rclass = reduce_class (rclass, newclass, rclass);\n-\n-  if (GET_MODE (x) == QImode)\n-    rclass = reduce_class (rclass, HL_REGS, rclass);\n-\n-#if DEBUG0\n-  fprintf (stderr, \"%s\\n\", class_names[rclass]);\n-  debug_rtx (x);\n-\n-  if (GET_CODE (x) == MEM\n-      && GET_CODE (XEXP (x, 0)) == PLUS\n-      && GET_CODE (XEXP (XEXP (x, 0), 0)) == PLUS)\n-    fprintf (stderr, \"Glorm!\\n\");\n-#endif\n-  return rclass;\n-}\n-\n-/* Implements TARGET_PREFERRED_OUTPUT_RELOAD_CLASS.  */\n-\n-#undef TARGET_PREFERRED_OUTPUT_RELOAD_CLASS\n-#define TARGET_PREFERRED_OUTPUT_RELOAD_CLASS m32c_preferred_output_reload_class\n-\n-static reg_class_t\n-m32c_preferred_output_reload_class (rtx x, reg_class_t rclass)\n-{\n-  return m32c_preferred_reload_class (x, rclass);\n-}\n-\n-/* Implements LIMIT_RELOAD_CLASS.  We basically want to avoid using\n-   address registers for reloads since they're needed for address\n-   reloads.  */\n-int\n-m32c_limit_reload_class (machine_mode mode, int rclass)\n-{\n-#if DEBUG0\n-  fprintf (stderr, \"limit_reload_class for %s: %s ->\",\n-\t   mode_name[mode], class_names[rclass]);\n-#endif\n-\n-  if (mode == QImode)\n-    rclass = reduce_class (rclass, HL_REGS, rclass);\n-  else if (mode == HImode)\n-    rclass = reduce_class (rclass, HI_REGS, rclass);\n-  else if (mode == SImode)\n-    rclass = reduce_class (rclass, SI_REGS, rclass);\n-\n-  if (rclass != A_REGS)\n-    rclass = reduce_class (rclass, DI_REGS, rclass);\n-\n-#if DEBUG0\n-  fprintf (stderr, \" %s\\n\", class_names[rclass]);\n-#endif\n-  return rclass;\n-}\n-\n-/* Implements SECONDARY_RELOAD_CLASS.  QImode have to be reloaded in\n-   r0 or r1, as those are the only real QImode registers.  CR regs get\n-   reloaded through appropriately sized general or address\n-   registers.  */\n-int\n-m32c_secondary_reload_class (int rclass, machine_mode mode, rtx x)\n-{\n-  int cc = class_contents[rclass][0];\n-#if DEBUG0\n-  fprintf (stderr, \"\\nsecondary reload class %s %s\\n\",\n-\t   class_names[rclass], mode_name[mode]);\n-  debug_rtx (x);\n-#endif\n-  if (mode == QImode\n-      && GET_CODE (x) == MEM && (cc & ~class_contents[R23_REGS][0]) == 0)\n-    return QI_REGS;\n-  if (reg_classes_intersect_p (rclass, CR_REGS)\n-      && GET_CODE (x) == REG\n-      && REGNO (x) >= SB_REGNO && REGNO (x) <= SP_REGNO)\n-    return (TARGET_A16 || mode == HImode) ? HI_REGS : A_REGS;\n-  return NO_REGS;\n-}\n-\n-/* Implements TARGET_CLASS_LIKELY_SPILLED_P.  A_REGS is needed for address\n-   reloads.  */\n-\n-#undef TARGET_CLASS_LIKELY_SPILLED_P\n-#define TARGET_CLASS_LIKELY_SPILLED_P m32c_class_likely_spilled_p\n-\n-static bool\n-m32c_class_likely_spilled_p (reg_class_t regclass)\n-{\n-  if (regclass == A_REGS)\n-    return true;\n-\n-  return (reg_class_size[(int) regclass] == 1);\n-}\n-\n-/* Implements TARGET_CLASS_MAX_NREGS.  We calculate this according to its\n-   documented meaning, to avoid potential inconsistencies with actual\n-   class definitions.  */\n-\n-#undef TARGET_CLASS_MAX_NREGS\n-#define TARGET_CLASS_MAX_NREGS m32c_class_max_nregs\n-\n-static unsigned char\n-m32c_class_max_nregs (reg_class_t regclass, machine_mode mode)\n-{\n-  int rn;\n-  unsigned char max = 0;\n-\n-  for (rn = 0; rn < FIRST_PSEUDO_REGISTER; rn++)\n-    if (TEST_HARD_REG_BIT (reg_class_contents[(int) regclass], rn))\n-      {\n-\tunsigned char n = m32c_hard_regno_nregs (rn, mode);\n-\tif (max < n)\n-\t  max = n;\n-      }\n-  return max;\n-}\n-\n-/* Implements TARGET_CAN_CHANGE_MODE_CLASS.  Only r0 and r1 can change to\n-   QI (r0l, r1l) because the chip doesn't support QI ops on other\n-   registers (well, it does on a0/a1 but if we let gcc do that, reload\n-   suffers).  Otherwise, we allow changes to larger modes.  */\n-static bool\n-m32c_can_change_mode_class (machine_mode from,\n-\t\t\t    machine_mode to, reg_class_t rclass)\n-{\n-  int rn;\n-#if DEBUG0\n-  fprintf (stderr, \"can change from %s to %s in %s\\n\",\n-\t   mode_name[from], mode_name[to], class_names[rclass]);\n-#endif\n-\n-  /* If the larger mode isn't allowed in any of these registers, we\n-     can't allow the change.  */\n-  for (rn = 0; rn < FIRST_PSEUDO_REGISTER; rn++)\n-    if (class_contents[rclass][0] & (1 << rn))\n-      if (! m32c_hard_regno_mode_ok (rn, to))\n-\treturn false;\n-\n-  if (to == QImode)\n-    return (class_contents[rclass][0] & 0x1ffa) == 0;\n-\n-  if (class_contents[rclass][0] & 0x0005\t/* r0, r1 */\n-      && GET_MODE_SIZE (from) > 1)\n-    return true;\n-  if (GET_MODE_SIZE (from) > 2)\t/* all other regs */\n-    return true;\n-\n-  return false;\n-}\n-\n-/* Helpers for the rest of the file.  */\n-/* TRUE if the rtx is a REG rtx for the given register.  */\n-#define IS_REG(rtx,regno) (GET_CODE (rtx) == REG \\\n-\t\t\t   && REGNO (rtx) == regno)\n-/* TRUE if the rtx is a pseudo - specifically, one we can use as a\n-   base register in address calculations (hence the \"strict\"\n-   argument).  */\n-#define IS_PSEUDO(rtx,strict) (!strict && GET_CODE (rtx) == REG \\\n-\t\t\t       && (REGNO (rtx) == AP_REGNO \\\n-\t\t\t\t   || REGNO (rtx) >= FIRST_PSEUDO_REGISTER))\n-\n-#define A0_OR_PSEUDO(x) (IS_REG(x, A0_REGNO) || REGNO (x) >= FIRST_PSEUDO_REGISTER)\n-\n-/* Implements matching for constraints (see next function too).  'S' is\n-   for memory constraints, plus \"Rpa\" for PARALLEL rtx's we use for\n-   call return values.  */\n-bool\n-m32c_matches_constraint_p (rtx value, int constraint)\n-{\n-  encode_pattern (value);\n-\n-  switch (constraint) {\n-  case CONSTRAINT_SF:\n-    return (far_addr_space_p (value)\n-\t    && ((RTX_IS (\"mr\")\n-\t\t && A0_OR_PSEUDO (patternr[1])\n-\t\t && GET_MODE (patternr[1]) == SImode)\n-\t\t|| (RTX_IS (\"m+^Sri\")\n-\t\t    && A0_OR_PSEUDO (patternr[4])\n-\t\t    && GET_MODE (patternr[4]) == HImode)\n-\t\t|| (RTX_IS (\"m+^Srs\")\n-\t\t    && A0_OR_PSEUDO (patternr[4])\n-\t\t    && GET_MODE (patternr[4]) == HImode)\n-\t\t|| (RTX_IS (\"m+^S+ris\")\n-\t\t    && A0_OR_PSEUDO (patternr[5])\n-\t\t    && GET_MODE (patternr[5]) == HImode)\n-\t\t|| RTX_IS (\"ms\")));\n-  case CONSTRAINT_Sd:\n-    {\n-      /* This is the common \"src/dest\" address */\n-      rtx r;\n-      if (GET_CODE (value) == MEM && CONSTANT_P (XEXP (value, 0)))\n-\treturn true;\n-      if (RTX_IS (\"ms\") || RTX_IS (\"m+si\"))\n-\treturn true;\n-      if (RTX_IS (\"m++rii\"))\n-\t{\n-\t  if (REGNO (patternr[3]) == FB_REGNO\n-\t      && INTVAL (patternr[4]) == 0)\n-\t    return true;\n-\t}\n-      if (RTX_IS (\"mr\"))\n-\tr = patternr[1];\n-      else if (RTX_IS (\"m+ri\") || RTX_IS (\"m+rs\") || RTX_IS (\"m+r+si\"))\n-\tr = patternr[2];\n-      else\n-\treturn false;\n-      if (REGNO (r) == SP_REGNO)\n-\treturn false;\n-      return m32c_legitimate_address_p (GET_MODE (value), XEXP (value, 0), 1);\n-    }\n-  case CONSTRAINT_Sa:\n-    {\n-      rtx r;\n-      if (RTX_IS (\"mr\"))\n-\tr = patternr[1];\n-      else if (RTX_IS (\"m+ri\"))\n-\tr = patternr[2];\n-      else\n-\treturn false;\n-      return (IS_REG (r, A0_REGNO) || IS_REG (r, A1_REGNO));\n-    }\n-  case CONSTRAINT_Si:\n-    return (RTX_IS (\"mi\") || RTX_IS (\"ms\") || RTX_IS (\"m+si\"));\n-  case CONSTRAINT_Ss:\n-    return ((RTX_IS (\"mr\")\n-\t     && (IS_REG (patternr[1], SP_REGNO)))\n-\t    || (RTX_IS (\"m+ri\") && (IS_REG (patternr[2], SP_REGNO))));\n-  case CONSTRAINT_Sf:\n-    return ((RTX_IS (\"mr\")\n-\t     && (IS_REG (patternr[1], FB_REGNO)))\n-\t    || (RTX_IS (\"m+ri\") && (IS_REG (patternr[2], FB_REGNO))));\n-  case CONSTRAINT_Sb:\n-    return ((RTX_IS (\"mr\")\n-\t     && (IS_REG (patternr[1], SB_REGNO)))\n-\t    || (RTX_IS (\"m+ri\") && (IS_REG (patternr[2], SB_REGNO))));\n-  case CONSTRAINT_Sp:\n-    /* Absolute addresses 0..0x1fff used for bit addressing (I/O ports) */\n-    return (RTX_IS (\"mi\")\n-\t    && !(INTVAL (patternr[1]) & ~0x1fff));\n-  case CONSTRAINT_S1:\n-    return r1h_operand (value, QImode);\n-  case CONSTRAINT_Rpa:\n-    return GET_CODE (value) == PARALLEL;\n-  default:\n-    return false;\n-  }\n-}\n-\n-/* STACK AND CALLING */\n-\n-/* Frame Layout */\n-\n-/* Implements RETURN_ADDR_RTX.  Note that R8C and M16C push 24 bits\n-   (yes, THREE bytes) onto the stack for the return address, but we\n-   don't support pointers bigger than 16 bits on those chips.  This\n-   will likely wreak havoc with exception unwinding.  FIXME.  */\n-rtx\n-m32c_return_addr_rtx (int count)\n-{\n-  machine_mode mode;\n-  int offset;\n-  rtx ra_mem;\n-\n-  if (count)\n-    return NULL_RTX;\n-  /* we want 2[$fb] */\n-\n-  if (TARGET_A24)\n-    {\n-      /* It's four bytes */\n-      mode = PSImode;\n-      offset = 4;\n-    }\n-  else\n-    {\n-      /* FIXME: it's really 3 bytes */\n-      mode = HImode;\n-      offset = 2;\n-    }\n-\n-  ra_mem =\n-    gen_rtx_MEM (mode, plus_constant (Pmode, gen_rtx_REG (Pmode, FP_REGNO),\n-\t\t\t\t      offset));\n-  return copy_to_mode_reg (mode, ra_mem);\n-}\n-\n-/* Implements INCOMING_RETURN_ADDR_RTX.  See comment above.  */\n-rtx\n-m32c_incoming_return_addr_rtx (void)\n-{\n-  /* we want [sp] */\n-  return gen_rtx_MEM (PSImode, gen_rtx_REG (PSImode, SP_REGNO));\n-}\n-\n-/* Exception Handling Support */\n-\n-/* Implements EH_RETURN_DATA_REGNO.  Choose registers able to hold\n-   pointers.  */\n-int\n-m32c_eh_return_data_regno (int n)\n-{\n-  switch (n)\n-    {\n-    case 0:\n-      return MEM0_REGNO;\n-    case 1:\n-      return MEM0_REGNO+4;\n-    default:\n-      return INVALID_REGNUM;\n-    }\n-}\n-\n-/* Implements EH_RETURN_STACKADJ_RTX.  Saved and used later in\n-   m32c_emit_eh_epilogue.  */\n-rtx\n-m32c_eh_return_stackadj_rtx (void)\n-{\n-  if (!cfun->machine->eh_stack_adjust)\n-    {\n-      rtx sa;\n-\n-      sa = gen_rtx_REG (Pmode, R0_REGNO);\n-      cfun->machine->eh_stack_adjust = sa;\n-    }\n-  return cfun->machine->eh_stack_adjust;\n-}\n-\n-/* Registers That Address the Stack Frame */\n-\n-/* Implements DWARF_FRAME_REGNUM and DEBUGGER_REGNO.  Note that\n-   the original spec called for dwarf numbers to vary with register\n-   width as well, for example, r0l, r0, and r2r0 would each have\n-   different dwarf numbers.  GCC doesn't support this, and we don't do\n-   it, and gdb seems to like it this way anyway.  */\n-unsigned int\n-m32c_dwarf_frame_regnum (int n)\n-{\n-  switch (n)\n-    {\n-    case R0_REGNO:\n-      return 5;\n-    case R1_REGNO:\n-      return 6;\n-    case R2_REGNO:\n-      return 7;\n-    case R3_REGNO:\n-      return 8;\n-    case A0_REGNO:\n-      return 9;\n-    case A1_REGNO:\n-      return 10;\n-    case FB_REGNO:\n-      return 11;\n-    case SB_REGNO:\n-      return 19;\n-\n-    case SP_REGNO:\n-      return 12;\n-    case PC_REGNO:\n-      return 13;\n-    default:\n-      return DWARF_FRAME_REGISTERS + 1;\n-    }\n-}\n-\n-/* The frame looks like this:\n-\n-   ap -> +------------------------------\n-         | Return address (3 or 4 bytes)\n-\t | Saved FB (2 or 4 bytes)\n-   fb -> +------------------------------\n-\t | local vars\n-         | register saves fb\n-\t |        through r0 as needed\n-   sp -> +------------------------------\n-*/\n-\n-/* We use this to wrap all emitted insns in the prologue.  */\n-static rtx\n-F (rtx x)\n-{\n-  RTX_FRAME_RELATED_P (x) = 1;\n-  return x;\n-}\n-\n-/* This maps register numbers to the PUSHM/POPM bitfield, and tells us\n-   how much the stack pointer moves for each, for each cpu family.  */\n-static struct\n-{\n-  int reg1;\n-  int bit;\n-  int a16_bytes;\n-  int a24_bytes;\n-} pushm_info[] =\n-{\n-  /* These are in reverse push (nearest-to-sp) order.  */\n-  { R0_REGNO, 0x80, 2, 2 },\n-  { R1_REGNO, 0x40, 2, 2 },\n-  { R2_REGNO, 0x20, 2, 2 },\n-  { R3_REGNO, 0x10, 2, 2 },\n-  { A0_REGNO, 0x08, 2, 4 },\n-  { A1_REGNO, 0x04, 2, 4 },\n-  { SB_REGNO, 0x02, 2, 4 },\n-  { FB_REGNO, 0x01, 2, 4 }\n-};\n-\n-#define PUSHM_N (ARRAY_SIZE (pushm_info))\n-\n-/* Returns TRUE if we need to save/restore the given register.  We\n-   save everything for exception handlers, so that any register can be\n-   unwound.  For interrupt handlers, we save everything if the handler\n-   calls something else (because we don't know what *that* function\n-   might do), but try to be a bit smarter if the handler is a leaf\n-   function.  We always save $a0, though, because we use that in the\n-   epilogue to copy $fb to $sp.  */\n-static int\n-need_to_save (int regno)\n-{\n-  if (fixed_regs[regno])\n-    return 0;\n-  if (crtl->calls_eh_return)\n-    return 1;\n-  if (regno == FP_REGNO)\n-    return 0;\n-  if (cfun->machine->is_interrupt\n-      && (!cfun->machine->is_leaf\n-\t  || (regno == A0_REGNO\n-\t      && m32c_function_needs_enter ())\n-\t  ))\n-    return 1;\n-  if (df_regs_ever_live_p (regno)\n-      && (!call_used_or_fixed_reg_p (regno) || cfun->machine->is_interrupt))\n-    return 1;\n-  return 0;\n-}\n-\n-/* This function contains all the intelligence about saving and\n-   restoring registers.  It always figures out the register save set.\n-   When called with PP_justcount, it merely returns the size of the\n-   save set (for eliminating the frame pointer, for example).  When\n-   called with PP_pushm or PP_popm, it emits the appropriate\n-   instructions for saving (pushm) or restoring (popm) the\n-   registers.  */\n-static int\n-m32c_pushm_popm (Push_Pop_Type ppt)\n-{\n-  int reg_mask = 0;\n-  int byte_count = 0, bytes;\n-  int i;\n-  rtx dwarf_set[PUSHM_N];\n-  int n_dwarfs = 0;\n-  int nosave_mask = 0;\n-\n-  if (crtl->return_rtx\n-      && GET_CODE (crtl->return_rtx) == PARALLEL\n-      && !(crtl->calls_eh_return || cfun->machine->is_interrupt))\n-    {\n-      rtx exp = XVECEXP (crtl->return_rtx, 0, 0);\n-      rtx rv = XEXP (exp, 0);\n-      int rv_bytes = GET_MODE_SIZE (GET_MODE (rv));\n-\n-      if (rv_bytes > 2)\n-\tnosave_mask |= 0x20;\t/* PSI, SI */\n-      else\n-\tnosave_mask |= 0xf0;\t/* DF */\n-      if (rv_bytes > 4)\n-\tnosave_mask |= 0x50;\t/* DI */\n-    }\n-\n-  for (i = 0; i < (int) PUSHM_N; i++)\n-    {\n-      /* Skip if neither register needs saving.  */\n-      if (!need_to_save (pushm_info[i].reg1))\n-\tcontinue;\n-\n-      if (pushm_info[i].bit & nosave_mask)\n-\tcontinue;\n-\n-      reg_mask |= pushm_info[i].bit;\n-      bytes = TARGET_A16 ? pushm_info[i].a16_bytes : pushm_info[i].a24_bytes;\n-\n-      if (ppt == PP_pushm)\n-\t{\n-\t  machine_mode mode = (bytes == 2) ? HImode : SImode;\n-\t  rtx addr;\n-\n-\t  /* Always use stack_pointer_rtx instead of calling\n-\t     rtx_gen_REG ourselves.  Code elsewhere in GCC assumes\n-\t     that there is a single rtx representing the stack pointer,\n-\t     namely stack_pointer_rtx, and uses == to recognize it.  */\n-\t  addr = stack_pointer_rtx;\n-\n-\t  if (byte_count != 0)\n-\t    addr = gen_rtx_PLUS (GET_MODE (addr), addr, GEN_INT (byte_count));\n-\n-\t  dwarf_set[n_dwarfs++] =\n-\t    gen_rtx_SET (gen_rtx_MEM (mode, addr),\n-\t\t\t gen_rtx_REG (mode, pushm_info[i].reg1));\n-\t  F (dwarf_set[n_dwarfs - 1]);\n-\n-\t}\n-      byte_count += bytes;\n-    }\n-\n-  if (cfun->machine->is_interrupt)\n-    {\n-      cfun->machine->intr_pushm = reg_mask & 0xfe;\n-      reg_mask = 0;\n-      byte_count = 0;\n-    }\n-\n-  if (cfun->machine->is_interrupt)\n-    for (i = MEM0_REGNO; i <= MEM7_REGNO; i++)\n-      if (need_to_save (i))\n-\t{\n-\t  byte_count += 2;\n-\t  cfun->machine->intr_pushmem[i - MEM0_REGNO] = 1;\n-\t}\n-\n-  if (ppt == PP_pushm && byte_count)\n-    {\n-      rtx note = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (n_dwarfs + 1));\n-      rtx pushm;\n-\n-      if (reg_mask)\n-\t{\n-\t  XVECEXP (note, 0, 0)\n-\t    = gen_rtx_SET (stack_pointer_rtx,\n-\t\t\t   gen_rtx_PLUS (GET_MODE (stack_pointer_rtx),\n-\t\t\t\t\t stack_pointer_rtx,\n-\t\t\t\t\t GEN_INT (-byte_count)));\n-\t  F (XVECEXP (note, 0, 0));\n-\n-\t  for (i = 0; i < n_dwarfs; i++)\n-\t    XVECEXP (note, 0, i + 1) = dwarf_set[i];\n-\n-\t  pushm = F (emit_insn (gen_pushm (GEN_INT (reg_mask))));\n-\n-\t  add_reg_note (pushm, REG_FRAME_RELATED_EXPR, note);\n-\t}\n-\n-      if (cfun->machine->is_interrupt)\n-\tfor (i = MEM0_REGNO; i <= MEM7_REGNO; i++)\n-\t  if (cfun->machine->intr_pushmem[i - MEM0_REGNO])\n-\t    {\n-\t      if (TARGET_A16)\n-\t\tpushm = emit_insn (gen_pushhi_16 (gen_rtx_REG (HImode, i)));\n-\t      else\n-\t\tpushm = emit_insn (gen_pushhi_24 (gen_rtx_REG (HImode, i)));\n-\t      F (pushm);\n-\t    }\n-    }\n-  if (ppt == PP_popm && byte_count)\n-    {\n-      if (cfun->machine->is_interrupt)\n-\tfor (i = MEM7_REGNO; i >= MEM0_REGNO; i--)\n-\t  if (cfun->machine->intr_pushmem[i - MEM0_REGNO])\n-\t    {\n-\t      if (TARGET_A16)\n-\t\temit_insn (gen_pophi_16 (gen_rtx_REG (HImode, i)));\n-\t      else\n-\t\temit_insn (gen_pophi_24 (gen_rtx_REG (HImode, i)));\n-\t    }\n-      if (reg_mask)\n-\temit_insn (gen_popm (GEN_INT (reg_mask)));\n-    }\n-\n-  return byte_count;\n-}\n-\n-/* Implements INITIAL_ELIMINATION_OFFSET.  See the comment above that\n-   diagrams our call frame.  */\n-int\n-m32c_initial_elimination_offset (int from, int to)\n-{\n-  int ofs = 0;\n-\n-  if (from == AP_REGNO)\n-    {\n-      if (TARGET_A16)\n-\tofs += 5;\n-      else\n-\tofs += 8;\n-    }\n-\n-  if (to == SP_REGNO)\n-    {\n-      ofs += m32c_pushm_popm (PP_justcount);\n-      ofs += get_frame_size ();\n-    }\n-\n-  /* Account for push rounding.  */\n-  if (TARGET_A24)\n-    ofs = (ofs + 1) & ~1;\n-#if DEBUG0\n-  fprintf (stderr, \"initial_elimination_offset from=%d to=%d, ofs=%d\\n\", from,\n-\t   to, ofs);\n-#endif\n-  return ofs;\n-}\n-\n-/* Passing Function Arguments on the Stack */\n-\n-/* Implements PUSH_ROUNDING.  The R8C and M16C have byte stacks, the\n-   M32C has word stacks.  */\n-poly_int64\n-m32c_push_rounding (poly_int64 n)\n-{\n-  if (TARGET_R8C || TARGET_M16C)\n-    return n;\n-  return (n + 1) & ~1;\n-}\n-\n-#undef TARGET_PUSH_ARGUMENT\n-#define TARGET_PUSH_ARGUMENT hook_bool_uint_true\n-\n-/* Passing Arguments in Registers */\n-\n-/* Implements TARGET_FUNCTION_ARG.  Arguments are passed partly in\n-   registers, partly on stack.  If our function returns a struct, a\n-   pointer to a buffer for it is at the top of the stack (last thing\n-   pushed).  The first few real arguments may be in registers as\n-   follows:\n-\n-   R8C/M16C:\targ1 in r1 if it's QI or HI (else it's pushed on stack)\n-\t\targ2 in r2 if it's HI (else pushed on stack)\n-\t\trest on stack\n-   M32C:        arg1 in r0 if it's QI or HI (else it's pushed on stack)\n-\t\trest on stack\n-\n-   Structs are not passed in registers, even if they fit.  Only\n-   integer and pointer types are passed in registers.\n-\n-   Note that when arg1 doesn't fit in r1, arg2 may still be passed in\n-   r2 if it fits.  */\n-#undef TARGET_FUNCTION_ARG\n-#define TARGET_FUNCTION_ARG m32c_function_arg\n-static rtx\n-m32c_function_arg (cumulative_args_t ca_v, const function_arg_info &arg)\n-{\n-  CUMULATIVE_ARGS *ca = get_cumulative_args (ca_v);\n-\n-  /* Can return a reg, parallel, or 0 for stack */\n-  rtx rv = NULL_RTX;\n-#if DEBUG0\n-  fprintf (stderr, \"func_arg %d (%s, %d)\\n\",\n-\t   ca->parm_num, mode_name[arg.mode], arg.named);\n-  debug_tree (arg.type);\n-#endif\n-\n-  if (arg.end_marker_p ())\n-    return GEN_INT (0);\n-\n-  if (ca->force_mem || !arg.named)\n-    {\n-#if DEBUG0\n-      fprintf (stderr, \"func arg: force %d named %d, mem\\n\", ca->force_mem,\n-\t       arg.named);\n-#endif\n-      return NULL_RTX;\n-    }\n-\n-  if (arg.type && INTEGRAL_TYPE_P (arg.type) && POINTER_TYPE_P (arg.type))\n-    return NULL_RTX;\n-\n-  if (arg.aggregate_type_p ())\n-    return NULL_RTX;\n-\n-  switch (ca->parm_num)\n-    {\n-    case 1:\n-      if (GET_MODE_SIZE (arg.mode) == 1 || GET_MODE_SIZE (arg.mode) == 2)\n-\trv = gen_rtx_REG (arg.mode, TARGET_A16 ? R1_REGNO : R0_REGNO);\n-      break;\n-\n-    case 2:\n-      if (TARGET_A16 && GET_MODE_SIZE (arg.mode) == 2)\n-\trv = gen_rtx_REG (arg.mode, R2_REGNO);\n-      break;\n-    }\n-\n-#if DEBUG0\n-  debug_rtx (rv);\n-#endif\n-  return rv;\n-}\n-\n-#undef TARGET_PASS_BY_REFERENCE\n-#define TARGET_PASS_BY_REFERENCE m32c_pass_by_reference\n-static bool\n-m32c_pass_by_reference (cumulative_args_t, const function_arg_info &)\n-{\n-  return 0;\n-}\n-\n-/* Implements INIT_CUMULATIVE_ARGS.  */\n-void\n-m32c_init_cumulative_args (CUMULATIVE_ARGS * ca,\n-\t\t\t   tree fntype,\n-\t\t\t   rtx libname ATTRIBUTE_UNUSED,\n-\t\t\t   tree fndecl,\n-\t\t\t   int n_named_args ATTRIBUTE_UNUSED)\n-{\n-  if (fntype && aggregate_value_p (TREE_TYPE (fntype), fndecl))\n-    ca->force_mem = 1;\n-  else\n-    ca->force_mem = 0;\n-  ca->parm_num = 1;\n-}\n-\n-/* Implements TARGET_FUNCTION_ARG_ADVANCE.  force_mem is set for\n-   functions returning structures, so we always reset that.  Otherwise,\n-   we only need to know the sequence number of the argument to know what\n-   to do with it.  */\n-#undef TARGET_FUNCTION_ARG_ADVANCE\n-#define TARGET_FUNCTION_ARG_ADVANCE m32c_function_arg_advance\n-static void\n-m32c_function_arg_advance (cumulative_args_t ca_v,\n-\t\t\t   const function_arg_info &)\n-{\n-  CUMULATIVE_ARGS *ca = get_cumulative_args (ca_v);\n-\n-  if (ca->force_mem)\n-    ca->force_mem = 0;\n-  else\n-    ca->parm_num++;\n-}\n-\n-/* Implements TARGET_FUNCTION_ARG_BOUNDARY.  */\n-#undef TARGET_FUNCTION_ARG_BOUNDARY\n-#define TARGET_FUNCTION_ARG_BOUNDARY m32c_function_arg_boundary\n-static unsigned int\n-m32c_function_arg_boundary (machine_mode mode ATTRIBUTE_UNUSED,\n-\t\t\t    const_tree type ATTRIBUTE_UNUSED)\n-{\n-  return (TARGET_A16 ? 8 : 16);\n-}\n-\n-/* Implements FUNCTION_ARG_REGNO_P.  */\n-int\n-m32c_function_arg_regno_p (int r)\n-{\n-  if (TARGET_A24)\n-    return (r == R0_REGNO);\n-  return (r == R1_REGNO || r == R2_REGNO);\n-}\n-\n-/* HImode and PSImode are the two \"native\" modes as far as GCC is\n-   concerned, but the chips also support a 32-bit mode which is used\n-   for some opcodes in R8C/M16C and for reset vectors and such.  */\n-#undef TARGET_VALID_POINTER_MODE\n-#define TARGET_VALID_POINTER_MODE m32c_valid_pointer_mode\n-static bool\n-m32c_valid_pointer_mode (scalar_int_mode mode)\n-{\n-  if (mode == HImode\n-      || mode == PSImode\n-      || mode == SImode\n-      )\n-    return 1;\n-  return 0;\n-}\n-\n-/* How Scalar Function Values Are Returned */\n-\n-/* Implements TARGET_LIBCALL_VALUE.  Most values are returned in $r0, or some\n-   combination of registers starting there (r2r0 for longs, r3r1r2r0\n-   for long long, r3r2r1r0 for doubles), except that that ABI\n-   currently doesn't work because it ends up using all available\n-   general registers and gcc often can't compile it.  So, instead, we\n-   return anything bigger than 16 bits in \"mem0\" (effectively, a\n-   memory location).  */\n-\n-#undef TARGET_LIBCALL_VALUE\n-#define TARGET_LIBCALL_VALUE m32c_libcall_value\n-\n-static rtx\n-m32c_libcall_value (machine_mode mode, const_rtx fun ATTRIBUTE_UNUSED)\n-{\n-  /* return reg or parallel */\n-#if 0\n-  /* FIXME: GCC has difficulty returning large values in registers,\n-     because that ties up most of the general registers and gives the\n-     register allocator little to work with.  Until we can resolve\n-     this, large values are returned in memory.  */\n-  if (mode == DFmode)\n-    {\n-      rtx rv;\n-\n-      rv = gen_rtx_PARALLEL (mode, rtvec_alloc (4));\n-      XVECEXP (rv, 0, 0) = gen_rtx_EXPR_LIST (VOIDmode,\n-\t\t\t\t\t      gen_rtx_REG (HImode,\n-\t\t\t\t\t\t\t   R0_REGNO),\n-\t\t\t\t\t      GEN_INT (0));\n-      XVECEXP (rv, 0, 1) = gen_rtx_EXPR_LIST (VOIDmode,\n-\t\t\t\t\t      gen_rtx_REG (HImode,\n-\t\t\t\t\t\t\t   R1_REGNO),\n-\t\t\t\t\t      GEN_INT (2));\n-      XVECEXP (rv, 0, 2) = gen_rtx_EXPR_LIST (VOIDmode,\n-\t\t\t\t\t      gen_rtx_REG (HImode,\n-\t\t\t\t\t\t\t   R2_REGNO),\n-\t\t\t\t\t      GEN_INT (4));\n-      XVECEXP (rv, 0, 3) = gen_rtx_EXPR_LIST (VOIDmode,\n-\t\t\t\t\t      gen_rtx_REG (HImode,\n-\t\t\t\t\t\t\t   R3_REGNO),\n-\t\t\t\t\t      GEN_INT (6));\n-      return rv;\n-    }\n-\n-  if (TARGET_A24 && GET_MODE_SIZE (mode) > 2)\n-    {\n-      rtx rv;\n-\n-      rv = gen_rtx_PARALLEL (mode, rtvec_alloc (1));\n-      XVECEXP (rv, 0, 0) = gen_rtx_EXPR_LIST (VOIDmode,\n-\t\t\t\t\t      gen_rtx_REG (mode,\n-\t\t\t\t\t\t\t   R0_REGNO),\n-\t\t\t\t\t      GEN_INT (0));\n-      return rv;\n-    }\n-#endif\n-\n-  if (GET_MODE_SIZE (mode) > 2)\n-    return gen_rtx_REG (mode, MEM0_REGNO);\n-  return gen_rtx_REG (mode, R0_REGNO);\n-}\n-\n-/* Implements TARGET_FUNCTION_VALUE.  Functions and libcalls have the same\n-   conventions.  */\n-\n-#undef TARGET_FUNCTION_VALUE\n-#define TARGET_FUNCTION_VALUE m32c_function_value\n-\n-static rtx\n-m32c_function_value (const_tree valtype,\n-\t\t     const_tree fn_decl_or_type ATTRIBUTE_UNUSED,\n-\t\t     bool outgoing ATTRIBUTE_UNUSED)\n-{\n-  /* return reg or parallel */\n-  const machine_mode mode = TYPE_MODE (valtype);\n-  return m32c_libcall_value (mode, NULL_RTX);\n-}\n-\n-/* Implements TARGET_FUNCTION_VALUE_REGNO_P.  */\n-\n-#undef TARGET_FUNCTION_VALUE_REGNO_P\n-#define TARGET_FUNCTION_VALUE_REGNO_P m32c_function_value_regno_p\n-\n-static bool\n-m32c_function_value_regno_p (const unsigned int regno)\n-{\n-  return (regno == R0_REGNO || regno == MEM0_REGNO);\n-}\n-\n-/* How Large Values Are Returned */\n-\n-/* We return structures by pushing the address on the stack, even if\n-   we use registers for the first few \"real\" arguments.  */\n-#undef TARGET_STRUCT_VALUE_RTX\n-#define TARGET_STRUCT_VALUE_RTX m32c_struct_value_rtx\n-static rtx\n-m32c_struct_value_rtx (tree fndecl ATTRIBUTE_UNUSED,\n-\t\t       int incoming ATTRIBUTE_UNUSED)\n-{\n-  return 0;\n-}\n-\n-/* Function Entry and Exit */\n-\n-/* Implements EPILOGUE_USES.  Interrupts restore all registers.  */\n-int\n-m32c_epilogue_uses (int regno ATTRIBUTE_UNUSED)\n-{\n-  if (cfun->machine->is_interrupt)\n-    return 1;\n-  return 0;\n-}\n-\n-/* Implementing the Varargs Macros */\n-\n-#undef TARGET_STRICT_ARGUMENT_NAMING\n-#define TARGET_STRICT_ARGUMENT_NAMING m32c_strict_argument_naming\n-static bool\n-m32c_strict_argument_naming (cumulative_args_t ca ATTRIBUTE_UNUSED)\n-{\n-  return 1;\n-}\n-\n-/* Trampolines for Nested Functions */\n-\n-/*\n-   m16c:\n-   1 0000 75C43412              mov.w   #0x1234,a0\n-   2 0004 FC000000              jmp.a   label\n-\n-   m32c:\n-   1 0000 BC563412              mov.l:s #0x123456,a0\n-   2 0004 CC000000              jmp.a   label\n-*/\n-\n-/* Implements TRAMPOLINE_SIZE.  */\n-int\n-m32c_trampoline_size (void)\n-{\n-  /* Allocate extra space so we can avoid the messy shifts when we\n-     initialize the trampoline; we just write past the end of the\n-     opcode.  */\n-  return TARGET_A16 ? 8 : 10;\n-}\n-\n-/* Implements TRAMPOLINE_ALIGNMENT.  */\n-int\n-m32c_trampoline_alignment (void)\n-{\n-  return 2;\n-}\n-\n-/* Implements TARGET_TRAMPOLINE_INIT.  */\n-\n-#undef TARGET_TRAMPOLINE_INIT\n-#define TARGET_TRAMPOLINE_INIT m32c_trampoline_init\n-static void\n-m32c_trampoline_init (rtx m_tramp, tree fndecl, rtx chainval)\n-{\n-  rtx function = XEXP (DECL_RTL (fndecl), 0);\n-\n-#define A0(m,i) adjust_address (m_tramp, m, i)\n-  if (TARGET_A16)\n-    {\n-      /* Note: we subtract a \"word\" because the moves want signed\n-\t constants, not unsigned constants.  */\n-      emit_move_insn (A0 (HImode, 0), GEN_INT (0xc475 - 0x10000));\n-      emit_move_insn (A0 (HImode, 2), chainval);\n-      emit_move_insn (A0 (QImode, 4), GEN_INT (0xfc - 0x100));\n-      /* We use 16-bit addresses here, but store the zero to turn it\n-\t into a 24-bit offset.  */\n-      emit_move_insn (A0 (HImode, 5), function);\n-      emit_move_insn (A0 (QImode, 7), GEN_INT (0x00));\n-    }\n-  else\n-    {\n-      /* Note that the PSI moves actually write 4 bytes.  Make sure we\n-\t write stuff out in the right order, and leave room for the\n-\t extra byte at the end.  */\n-      emit_move_insn (A0 (QImode, 0), GEN_INT (0xbc - 0x100));\n-      emit_move_insn (A0 (PSImode, 1), chainval);\n-      emit_move_insn (A0 (QImode, 4), GEN_INT (0xcc - 0x100));\n-      emit_move_insn (A0 (PSImode, 5), function);\n-    }\n-#undef A0\n-}\n-\n-#undef TARGET_LRA_P\n-#define TARGET_LRA_P hook_bool_void_false\n-\n-/* Addressing Modes */\n-\n-/* The r8c/m32c family supports a wide range of non-orthogonal\n-   addressing modes, including the ability to double-indirect on *some*\n-   of them.  Not all insns support all modes, either, but we rely on\n-   predicates and constraints to deal with that.  */\n-#undef TARGET_LEGITIMATE_ADDRESS_P\n-#define TARGET_LEGITIMATE_ADDRESS_P m32c_legitimate_address_p\n-bool\n-m32c_legitimate_address_p (machine_mode mode, rtx x, bool strict, code_helper)\n-{\n-  int mode_adjust;\n-  if (CONSTANT_P (x))\n-    return 1;\n-\n-  if (TARGET_A16 && GET_MODE (x) != HImode && GET_MODE (x) != SImode)\n-    return 0;\n-  if (TARGET_A24 && GET_MODE (x) != PSImode)\n-    return 0;\n-\n-  /* Wide references to memory will be split after reload, so we must\n-     ensure that all parts of such splits remain legitimate\n-     addresses.  */\n-  mode_adjust = GET_MODE_SIZE (mode) - 1;\n-\n-  /* allowing PLUS yields mem:HI(plus:SI(mem:SI(plus:SI in m32c_split_move */\n-  if (GET_CODE (x) == PRE_DEC\n-      || GET_CODE (x) == POST_INC || GET_CODE (x) == PRE_MODIFY)\n-    {\n-      return (GET_CODE (XEXP (x, 0)) == REG\n-\t      && REGNO (XEXP (x, 0)) == SP_REGNO);\n-    }\n-\n-#if 0\n-  /* This is the double indirection detection, but it currently\n-     doesn't work as cleanly as this code implies, so until we've had\n-     a chance to debug it, leave it disabled.  */\n-  if (TARGET_A24 && GET_CODE (x) == MEM && GET_CODE (XEXP (x, 0)) != PLUS)\n-    {\n-#if DEBUG_DOUBLE\n-      fprintf (stderr, \"double indirect\\n\");\n-#endif\n-      x = XEXP (x, 0);\n-    }\n-#endif\n-\n-  encode_pattern (x);\n-  if (RTX_IS (\"r\"))\n-    {\n-      /* Most indexable registers can be used without displacements,\n-\t although some of them will be emitted with an explicit zero\n-\t to please the assembler.  */\n-      switch (REGNO (patternr[0]))\n-\t{\n-\tcase A1_REGNO:\n-\tcase SB_REGNO:\n-\tcase FB_REGNO:\n-\tcase SP_REGNO:\n-\t  if (TARGET_A16 && GET_MODE (x) == SImode)\n-\t    return 0;\n-\t  /* FALLTHRU */\n-\tcase A0_REGNO:\n-\t  return 1;\n-\n-\tdefault:\n-\t  if (IS_PSEUDO (patternr[0], strict))\n-\t    return 1;\n-\t  return 0;\n-\t}\n-    }\n-\n-  if (TARGET_A16 && GET_MODE (x) == SImode)\n-    return 0;\n-\n-  if (RTX_IS (\"+ri\"))\n-    {\n-      /* This is more interesting, because different base registers\n-\t allow for different displacements - both range and signedness\n-\t - and it differs from chip series to chip series too.  */\n-      int rn = REGNO (patternr[1]);\n-      HOST_WIDE_INT offs = INTVAL (patternr[2]);\n-      switch (rn)\n-\t{\n-\tcase A0_REGNO:\n-\tcase A1_REGNO:\n-\tcase SB_REGNO:\n-\t  /* The syntax only allows positive offsets, but when the\n-\t     offsets span the entire memory range, we can simulate\n-\t     negative offsets by wrapping.  */\n-\t  if (TARGET_A16)\n-\t    return (offs >= -65536 && offs <= 65535 - mode_adjust);\n-\t  if (rn == SB_REGNO)\n-\t    return (offs >= 0 && offs <= 65535 - mode_adjust);\n-\t  /* A0 or A1 */\n-\t  return (offs >= -16777216 && offs <= 16777215);\n-\n-\tcase FB_REGNO:\n-\t  if (TARGET_A16)\n-\t    return (offs >= -128 && offs <= 127 - mode_adjust);\n-\t  return (offs >= -65536 && offs <= 65535 - mode_adjust);\n-\n-\tcase SP_REGNO:\n-\t  return (offs >= -128 && offs <= 127 - mode_adjust);\n-\n-\tdefault:\n-\t  if (IS_PSEUDO (patternr[1], strict))\n-\t    return 1;\n-\t  return 0;\n-\t}\n-    }\n-  if (RTX_IS (\"+rs\") || RTX_IS (\"+r+si\"))\n-    {\n-      rtx reg = patternr[1];\n-\n-      /* We don't know where the symbol is, so only allow base\n-\t registers which support displacements spanning the whole\n-\t address range.  */\n-      switch (REGNO (reg))\n-\t{\n-\tcase A0_REGNO:\n-\tcase A1_REGNO:\n-\t  /* $sb needs a secondary reload, but since it's involved in\n-\t     memory address reloads too, we don't deal with it very\n-\t     well.  */\n-\t  /*    case SB_REGNO: */\n-\t  return 1;\n-\tdefault:\n-\t  if (GET_CODE (reg) == SUBREG)\n-\t    return 0;\n-\t  if (IS_PSEUDO (reg, strict))\n-\t    return 1;\n-\t  return 0;\n-\t}\n-    }\n-  return 0;\n-}\n-\n-/* Implements REG_OK_FOR_BASE_P.  */\n-int\n-m32c_reg_ok_for_base_p (rtx x, int strict)\n-{\n-  if (GET_CODE (x) != REG)\n-    return 0;\n-  switch (REGNO (x))\n-    {\n-    case A0_REGNO:\n-    case A1_REGNO:\n-    case SB_REGNO:\n-    case FB_REGNO:\n-    case SP_REGNO:\n-      return 1;\n-    default:\n-      if (IS_PSEUDO (x, strict))\n-\treturn 1;\n-      return 0;\n-    }\n-}\n-\n-/* We have three choices for choosing fb->aN offsets.  If we choose -128,\n-   we need one MOVA -128[fb],aN opcode and 16-bit aN displacements,\n-   like this:\n-       EB 4B FF    mova    -128[$fb],$a0\n-       D8 0C FF FF mov.w:Q #0,-1[$a0]\n-\n-   Alternately, we subtract the frame size, and hopefully use 8-bit aN\n-   displacements:\n-       7B F4       stc $fb,$a0\n-       77 54 00 01 sub #256,$a0\n-       D8 08 01    mov.w:Q #0,1[$a0]\n-\n-   If we don't offset (i.e. offset by zero), we end up with:\n-       7B F4       stc $fb,$a0\n-       D8 0C 00 FF mov.w:Q #0,-256[$a0]\n-\n-   We have to subtract *something* so that we have a PLUS rtx to mark\n-   that we've done this reload.  The -128 offset will never result in\n-   an 8-bit aN offset, and the payoff for the second case is five\n-   loads *if* those loads are within 256 bytes of the other end of the\n-   frame, so the third case seems best.  Note that we subtract the\n-   zero, but detect that in the addhi3 pattern.  */\n-\n-#define BIG_FB_ADJ 0\n-\n-/* Implements LEGITIMIZE_ADDRESS.  The only address we really have to\n-   worry about is frame base offsets, as $fb has a limited\n-   displacement range.  We deal with this by attempting to reload $fb\n-   itself into an address register; that seems to result in the best\n-   code.  */\n-#undef TARGET_LEGITIMIZE_ADDRESS\n-#define TARGET_LEGITIMIZE_ADDRESS m32c_legitimize_address\n-static rtx\n-m32c_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,\n-\t\t\t machine_mode mode)\n-{\n-#if DEBUG0\n-  fprintf (stderr, \"m32c_legitimize_address for mode %s\\n\", mode_name[mode]);\n-  debug_rtx (x);\n-  fprintf (stderr, \"\\n\");\n-#endif\n-\n-  if (GET_CODE (x) == PLUS\n-      && GET_CODE (XEXP (x, 0)) == REG\n-      && REGNO (XEXP (x, 0)) == FB_REGNO\n-      && GET_CODE (XEXP (x, 1)) == CONST_INT\n-      && (INTVAL (XEXP (x, 1)) < -128\n-\t  || INTVAL (XEXP (x, 1)) > (128 - GET_MODE_SIZE (mode))))\n-    {\n-      /* reload FB to A_REGS */\n-      rtx temp = gen_reg_rtx (Pmode);\n-      x = copy_rtx (x);\n-      emit_insn (gen_rtx_SET (temp, XEXP (x, 0)));\n-      XEXP (x, 0) = temp;\n-    }\n-\n-  return x;\n-}\n-\n-/* Implements LEGITIMIZE_RELOAD_ADDRESS.  See comment above.  */\n-int\n-m32c_legitimize_reload_address (rtx * x,\n-\t\t\t\tmachine_mode mode,\n-\t\t\t\tint opnum,\n-\t\t\t\tint type, int ind_levels ATTRIBUTE_UNUSED)\n-{\n-#if DEBUG0\n-  fprintf (stderr, \"\\nm32c_legitimize_reload_address for mode %s\\n\",\n-\t   mode_name[mode]);\n-  debug_rtx (*x);\n-#endif\n-\n-  /* At one point, this function tried to get $fb copied to an address\n-     register, which in theory would maximize sharing, but gcc was\n-     *also* still trying to reload the whole address, and we'd run out\n-     of address registers.  So we let gcc do the naive (but safe)\n-     reload instead, when the above function doesn't handle it for\n-     us.\n-\n-     The code below is a second attempt at the above.  */\n-\n-  if (GET_CODE (*x) == PLUS\n-      && GET_CODE (XEXP (*x, 0)) == REG\n-      && REGNO (XEXP (*x, 0)) == FB_REGNO\n-      && GET_CODE (XEXP (*x, 1)) == CONST_INT\n-      && (INTVAL (XEXP (*x, 1)) < -128\n-\t  || INTVAL (XEXP (*x, 1)) > (128 - GET_MODE_SIZE (mode))))\n-    {\n-      rtx sum;\n-      int offset = INTVAL (XEXP (*x, 1));\n-      int adjustment = -BIG_FB_ADJ;\n-\n-      sum = gen_rtx_PLUS (Pmode, XEXP (*x, 0),\n-\t\t\t  GEN_INT (adjustment));\n-      *x = gen_rtx_PLUS (Pmode, sum, GEN_INT (offset - adjustment));\n-      if (type == RELOAD_OTHER)\n-\ttype = RELOAD_FOR_OTHER_ADDRESS;\n-      push_reload (sum, NULL_RTX, &XEXP (*x, 0), NULL,\n-\t\t   A_REGS, Pmode, VOIDmode, 0, 0, opnum,\n-\t\t   (enum reload_type) type);\n-      return 1;\n-    }\n-\n-  if (GET_CODE (*x) == PLUS\n-      && GET_CODE (XEXP (*x, 0)) == PLUS\n-      && GET_CODE (XEXP (XEXP (*x, 0), 0)) == REG\n-      && REGNO (XEXP (XEXP (*x, 0), 0)) == FB_REGNO\n-      && GET_CODE (XEXP (XEXP (*x, 0), 1)) == CONST_INT\n-      && GET_CODE (XEXP (*x, 1)) == CONST_INT\n-      )\n-    {\n-      if (type == RELOAD_OTHER)\n-\ttype = RELOAD_FOR_OTHER_ADDRESS;\n-      push_reload (XEXP (*x, 0), NULL_RTX, &XEXP (*x, 0), NULL,\n-\t\t   A_REGS, Pmode, VOIDmode, 0, 0, opnum,\n-\t\t   (enum reload_type) type);\n-      return 1;\n-    }\n-\n-  if (TARGET_A24 && GET_MODE (*x) == PSImode)\n-    {\n-      push_reload (*x, NULL_RTX, x, NULL,\n-\t\t   A_REGS, PSImode, VOIDmode, 0, 0, opnum,\n-\t\t   (enum reload_type) type);\n-      return 1;\n-    }\n-\n-  return 0;\n-}\n-\n-/* Return the appropriate mode for a named address pointer.  */\n-#undef TARGET_ADDR_SPACE_POINTER_MODE\n-#define TARGET_ADDR_SPACE_POINTER_MODE m32c_addr_space_pointer_mode\n-static scalar_int_mode\n-m32c_addr_space_pointer_mode (addr_space_t addrspace)\n-{\n-  switch (addrspace)\n-    {\n-    case ADDR_SPACE_GENERIC:\n-      return TARGET_A24 ? PSImode : HImode;\n-    case ADDR_SPACE_FAR:\n-      return SImode;\n-    default:\n-      gcc_unreachable ();\n-    }\n-}\n-\n-/* Return the appropriate mode for a named address address.  */\n-#undef TARGET_ADDR_SPACE_ADDRESS_MODE\n-#define TARGET_ADDR_SPACE_ADDRESS_MODE m32c_addr_space_address_mode\n-static scalar_int_mode\n-m32c_addr_space_address_mode (addr_space_t addrspace)\n-{\n-  switch (addrspace)\n-    {\n-    case ADDR_SPACE_GENERIC:\n-      return TARGET_A24 ? PSImode : HImode;\n-    case ADDR_SPACE_FAR:\n-      return SImode;\n-    default:\n-      gcc_unreachable ();\n-    }\n-}\n-\n-/* Like m32c_legitimate_address_p, except with named addresses.  */\n-#undef TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P\n-#define TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P \\\n-  m32c_addr_space_legitimate_address_p\n-static bool\n-m32c_addr_space_legitimate_address_p (machine_mode mode, rtx x, bool strict,\n-\t\t\t\t      addr_space_t as, code_helper ch)\n-{\n-  if (as == ADDR_SPACE_FAR)\n-    {\n-      if (TARGET_A24)\n-\treturn 0;\n-      encode_pattern (x);\n-      if (RTX_IS (\"r\"))\n-\t{\n-\t  if (GET_MODE (x) != SImode)\n-\t    return 0;\n-\t  switch (REGNO (patternr[0]))\n-\t    {\n-\t    case A0_REGNO:\n-\t      return 1;\n-\n-\t    default:\n-\t      if (IS_PSEUDO (patternr[0], strict))\n-\t\treturn 1;\n-\t      return 0;\n-\t    }\n-\t}\n-      if (RTX_IS (\"+^Sri\"))\n-\t{\n-\t  int rn = REGNO (patternr[3]);\n-\t  HOST_WIDE_INT offs = INTVAL (patternr[4]);\n-\t  if (GET_MODE (patternr[3]) != HImode)\n-\t    return 0;\n-\t  switch (rn)\n-\t    {\n-\t    case A0_REGNO:\n-\t      return (offs >= 0 && offs <= 0xfffff);\n-\n-\t    default:\n-\t      if (IS_PSEUDO (patternr[3], strict))\n-\t\treturn 1;\n-\t      return 0;\n-\t    }\n-\t}\n-      if (RTX_IS (\"+^Srs\"))\n-\t{\n-\t  int rn = REGNO (patternr[3]);\n-\t  if (GET_MODE (patternr[3]) != HImode)\n-\t    return 0;\n-\t  switch (rn)\n-\t    {\n-\t    case A0_REGNO:\n-\t      return 1;\n-\n-\t    default:\n-\t      if (IS_PSEUDO (patternr[3], strict))\n-\t\treturn 1;\n-\t      return 0;\n-\t    }\n-\t}\n-      if (RTX_IS (\"+^S+ris\"))\n-\t{\n-\t  int rn = REGNO (patternr[4]);\n-\t  if (GET_MODE (patternr[4]) != HImode)\n-\t    return 0;\n-\t  switch (rn)\n-\t    {\n-\t    case A0_REGNO:\n-\t      return 1;\n-\n-\t    default:\n-\t      if (IS_PSEUDO (patternr[4], strict))\n-\t\treturn 1;\n-\t      return 0;\n-\t    }\n-\t}\n-      if (RTX_IS (\"s\"))\n-\t{\n-\t  return 1;\n-\t}\n-      return 0;\n-    }\n-\n-  else if (as != ADDR_SPACE_GENERIC)\n-    gcc_unreachable ();\n-\n-  return m32c_legitimate_address_p (mode, x, strict, ch);\n-}\n-\n-/* Like m32c_legitimate_address, except with named address support.  */\n-#undef TARGET_ADDR_SPACE_LEGITIMIZE_ADDRESS\n-#define TARGET_ADDR_SPACE_LEGITIMIZE_ADDRESS m32c_addr_space_legitimize_address\n-static rtx\n-m32c_addr_space_legitimize_address (rtx x, rtx oldx, machine_mode mode,\n-\t\t\t\t    addr_space_t as)\n-{\n-  if (as != ADDR_SPACE_GENERIC)\n-    {\n-#if DEBUG0\n-      fprintf (stderr, \"\\033[36mm32c_addr_space_legitimize_address for mode %s\\033[0m\\n\", mode_name[mode]);\n-      debug_rtx (x);\n-      fprintf (stderr, \"\\n\");\n-#endif\n-\n-      if (GET_CODE (x) != REG)\n-\t{\n-\t  x = force_reg (SImode, x);\n-\t}\n-      return x;\n-    }\n-\n-  return m32c_legitimize_address (x, oldx, mode);\n-}\n-\n-/* Determine if one named address space is a subset of another.  */\n-#undef TARGET_ADDR_SPACE_SUBSET_P\n-#define TARGET_ADDR_SPACE_SUBSET_P m32c_addr_space_subset_p\n-static bool\n-m32c_addr_space_subset_p (addr_space_t subset, addr_space_t superset)\n-{\n-  gcc_assert (subset == ADDR_SPACE_GENERIC || subset == ADDR_SPACE_FAR);\n-  gcc_assert (superset == ADDR_SPACE_GENERIC || superset == ADDR_SPACE_FAR);\n-\n-  if (subset == superset)\n-    return true;\n-\n-  else\n-    return (subset == ADDR_SPACE_GENERIC && superset == ADDR_SPACE_FAR);\n-}\n-\n-#undef TARGET_ADDR_SPACE_CONVERT\n-#define TARGET_ADDR_SPACE_CONVERT m32c_addr_space_convert\n-/* Convert from one address space to another.  */\n-static rtx\n-m32c_addr_space_convert (rtx op, tree from_type, tree to_type)\n-{\n-  addr_space_t from_as = TYPE_ADDR_SPACE (TREE_TYPE (from_type));\n-  addr_space_t to_as = TYPE_ADDR_SPACE (TREE_TYPE (to_type));\n-  rtx result;\n-\n-  gcc_assert (from_as == ADDR_SPACE_GENERIC || from_as == ADDR_SPACE_FAR);\n-  gcc_assert (to_as == ADDR_SPACE_GENERIC || to_as == ADDR_SPACE_FAR);\n-\n-  if (to_as == ADDR_SPACE_GENERIC && from_as == ADDR_SPACE_FAR)\n-    {\n-      /* This is unpredictable, as we're truncating off usable address\n-\t bits.  */\n-\n-      result = gen_reg_rtx (HImode);\n-      emit_move_insn (result, simplify_subreg (HImode, op, SImode, 0));\n-      return result;\n-    }\n-  else if (to_as == ADDR_SPACE_FAR && from_as == ADDR_SPACE_GENERIC)\n-    {\n-      /* This always works.  */\n-      result = gen_reg_rtx (SImode);\n-      emit_insn (gen_zero_extendhisi2 (result, op));\n-      return result;\n-    }\n-  else\n-    gcc_unreachable ();\n-}\n-\n-/* Condition Code Status */\n-\n-#undef TARGET_FIXED_CONDITION_CODE_REGS\n-#define TARGET_FIXED_CONDITION_CODE_REGS m32c_fixed_condition_code_regs\n-static bool\n-m32c_fixed_condition_code_regs (unsigned int *p1, unsigned int *p2)\n-{\n-  *p1 = FLG_REGNO;\n-  *p2 = INVALID_REGNUM;\n-  return true;\n-}\n-\n-/* Describing Relative Costs of Operations */\n-\n-/* Implements TARGET_REGISTER_MOVE_COST.  We make impossible moves\n-   prohibitively expensive, like trying to put QIs in r2/r3 (there are\n-   no opcodes to do that).  We also discourage use of mem* registers\n-   since they're really memory.  */\n-\n-#undef TARGET_REGISTER_MOVE_COST\n-#define TARGET_REGISTER_MOVE_COST m32c_register_move_cost\n-\n-static int\n-m32c_register_move_cost (machine_mode mode, reg_class_t from,\n-\t\t\t reg_class_t to)\n-{\n-  int cost = COSTS_N_INSNS (3);\n-  HARD_REG_SET cc;\n-\n-/* FIXME: pick real values, but not 2 for now.  */\n-  cc = reg_class_contents[from] | reg_class_contents[(int) to];\n-\n-  if (mode == QImode\n-      && hard_reg_set_intersect_p (cc, reg_class_contents[R23_REGS]))\n-    {\n-      if (hard_reg_set_subset_p (cc, reg_class_contents[R23_REGS]))\n-\tcost = COSTS_N_INSNS (1000);\n-      else\n-\tcost = COSTS_N_INSNS (80);\n-    }\n-\n-  if (!class_can_hold_mode (from, mode) || !class_can_hold_mode (to, mode))\n-    cost = COSTS_N_INSNS (1000);\n-\n-  if (reg_classes_intersect_p (from, CR_REGS))\n-    cost += COSTS_N_INSNS (5);\n-\n-  if (reg_classes_intersect_p (to, CR_REGS))\n-    cost += COSTS_N_INSNS (5);\n-\n-  if (from == MEM_REGS || to == MEM_REGS)\n-    cost += COSTS_N_INSNS (50);\n-  else if (reg_classes_intersect_p (from, MEM_REGS)\n-\t   || reg_classes_intersect_p (to, MEM_REGS))\n-    cost += COSTS_N_INSNS (10);\n-\n-#if DEBUG0\n-  fprintf (stderr, \"register_move_cost %s from %s to %s = %d\\n\",\n-\t   mode_name[mode], class_names[(int) from], class_names[(int) to],\n-\t   cost);\n-#endif\n-  return cost;\n-}\n-\n-/*  Implements TARGET_MEMORY_MOVE_COST.  */\n-\n-#undef TARGET_MEMORY_MOVE_COST\n-#define TARGET_MEMORY_MOVE_COST m32c_memory_move_cost\n-\n-static int\n-m32c_memory_move_cost (machine_mode mode ATTRIBUTE_UNUSED,\n-\t\t       reg_class_t rclass ATTRIBUTE_UNUSED,\n-\t\t       bool in ATTRIBUTE_UNUSED)\n-{\n-  /* FIXME: pick real values.  */\n-  return COSTS_N_INSNS (10);\n-}\n-\n-/* Here we try to describe when we use multiple opcodes for one RTX so\n-   that gcc knows when to use them.  */\n-#undef TARGET_RTX_COSTS\n-#define TARGET_RTX_COSTS m32c_rtx_costs\n-static bool\n-m32c_rtx_costs (rtx x, machine_mode mode, int outer_code,\n-\t\tint opno ATTRIBUTE_UNUSED,\n-\t\tint *total, bool speed ATTRIBUTE_UNUSED)\n-{\n-  int code = GET_CODE (x);\n-  switch (code)\n-    {\n-    case REG:\n-      if (REGNO (x) >= MEM0_REGNO && REGNO (x) <= MEM7_REGNO)\n-\t*total += COSTS_N_INSNS (500);\n-      else\n-\t*total += COSTS_N_INSNS (1);\n-      return true;\n-\n-    case ASHIFT:\n-    case LSHIFTRT:\n-    case ASHIFTRT:\n-      if (GET_CODE (XEXP (x, 1)) != CONST_INT)\n-\t{\n-\t  /* mov.b r1l, r1h */\n-\t  *total +=  COSTS_N_INSNS (1);\n-\t  return true;\n-\t}\n-      if (INTVAL (XEXP (x, 1)) > 8\n-\t  || INTVAL (XEXP (x, 1)) < -8)\n-\t{\n-\t  /* mov.b #N, r1l */\n-\t  /* mov.b r1l, r1h */\n-\t  *total +=  COSTS_N_INSNS (2);\n-\t  return true;\n-\t}\n-      return true;\n-\n-    case LE:\n-    case LEU:\n-    case LT:\n-    case LTU:\n-    case GT:\n-    case GTU:\n-    case GE:\n-    case GEU:\n-    case NE:\n-    case EQ:\n-      if (outer_code == SET)\n-\t{\n-\t  *total += COSTS_N_INSNS (2);\n-\t  return true;\n-\t}\n-      break;\n-\n-    case ZERO_EXTRACT:\n-      {\n-\trtx dest = XEXP (x, 0);\n-\trtx addr = XEXP (dest, 0);\n-\tswitch (GET_CODE (addr))\n-\t  {\n-\t  case CONST_INT:\n-\t    *total += COSTS_N_INSNS (1);\n-\t    break;\n-\t  case SYMBOL_REF:\n-\t    *total += COSTS_N_INSNS (3);\n-\t    break;\n-\t  default:\n-\t    *total += COSTS_N_INSNS (2);\n-\t    break;\n-\t  }\n-\treturn true;\n-      }\n-      break;\n-\n-    default:\n-      /* Reasonable default.  */\n-      if (TARGET_A16 && mode == SImode)\n-\t*total += COSTS_N_INSNS (2);\n-      break;\n-    }\n-  return false;\n-}\n-\n-#undef TARGET_ADDRESS_COST\n-#define TARGET_ADDRESS_COST m32c_address_cost\n-static int\n-m32c_address_cost (rtx addr, machine_mode mode ATTRIBUTE_UNUSED,\n-\t\t   addr_space_t as ATTRIBUTE_UNUSED,\n-\t\t   bool speed ATTRIBUTE_UNUSED)\n-{\n-  int i;\n-  /*  fprintf(stderr, \"\\naddress_cost\\n\");\n-      debug_rtx(addr);*/\n-  switch (GET_CODE (addr))\n-    {\n-    case CONST_INT:\n-      i = INTVAL (addr);\n-      if (i == 0)\n-\treturn COSTS_N_INSNS(1);\n-      if (i > 0 && i <= 255)\n-\treturn COSTS_N_INSNS(2);\n-      if (i > 0 && i <= 65535)\n-\treturn COSTS_N_INSNS(3);\n-      return COSTS_N_INSNS(4);\n-    case SYMBOL_REF:\n-      return COSTS_N_INSNS(4);\n-    case REG:\n-      return COSTS_N_INSNS(1);\n-    case PLUS:\n-      if (GET_CODE (XEXP (addr, 1)) == CONST_INT)\n-\t{\n-\t  i = INTVAL (XEXP (addr, 1));\n-\t  if (i == 0)\n-\t    return COSTS_N_INSNS(1);\n-\t  if (i > 0 && i <= 255)\n-\t    return COSTS_N_INSNS(2);\n-\t  if (i > 0 && i <= 65535)\n-\t    return COSTS_N_INSNS(3);\n-\t}\n-      return COSTS_N_INSNS(4);\n-    default:\n-      return 0;\n-    }\n-}\n-\n-/* Defining the Output Assembler Language */\n-\n-/* Output of Data */\n-\n-/* We may have 24 bit sizes, which is the native address size.\n-   Currently unused, but provided for completeness.  */\n-#undef TARGET_ASM_INTEGER\n-#define TARGET_ASM_INTEGER m32c_asm_integer\n-static bool\n-m32c_asm_integer (rtx x, unsigned int size, int aligned_p)\n-{\n-  switch (size)\n-    {\n-    case 3:\n-      fprintf (asm_out_file, \"\\t.3byte\\t\");\n-      output_addr_const (asm_out_file, x);\n-      fputc ('\\n', asm_out_file);\n-      return true;\n-    case 4:\n-      if (GET_CODE (x) == SYMBOL_REF)\n-\t{\n-\t  fprintf (asm_out_file, \"\\t.long\\t\");\n-\t  output_addr_const (asm_out_file, x);\n-\t  fputc ('\\n', asm_out_file);\n-\t  return true;\n-\t}\n-      break;\n-    }\n-  return default_assemble_integer (x, size, aligned_p);\n-}\n-\n-/* Output of Assembler Instructions */\n-\n-/* We use a lookup table because the addressing modes are non-orthogonal.  */\n-\n-static struct\n-{\n-  char code;\n-  char const *pattern;\n-  char const *format;\n-}\n-const conversions[] = {\n-  { 0, \"r\", \"0\" },\n-\n-  { 0, \"mr\", \"z[1]\" },\n-  { 0, \"m+ri\", \"3[2]\" },\n-  { 0, \"m+rs\", \"3[2]\" },\n-  { 0, \"m+^Zrs\", \"5[4]\" },\n-  { 0, \"m+^Zri\", \"5[4]\" },\n-  { 0, \"m+^Z+ris\", \"7+6[5]\" },\n-  { 0, \"m+^Srs\", \"5[4]\" },\n-  { 0, \"m+^Sri\", \"5[4]\" },\n-  { 0, \"m+^S+ris\", \"7+6[5]\" },\n-  { 0, \"m+r+si\", \"4+5[2]\" },\n-  { 0, \"ms\", \"1\" },\n-  { 0, \"mi\", \"1\" },\n-  { 0, \"m+si\", \"2+3\" },\n-\n-  { 0, \"mmr\", \"[z[2]]\" },\n-  { 0, \"mm+ri\", \"[4[3]]\" },\n-  { 0, \"mm+rs\", \"[4[3]]\" },\n-  { 0, \"mm+r+si\", \"[5+6[3]]\" },\n-  { 0, \"mms\", \"[[2]]\" },\n-  { 0, \"mmi\", \"[[2]]\" },\n-  { 0, \"mm+si\", \"[4[3]]\" },\n-\n-  { 0, \"i\", \"#0\" },\n-  { 0, \"s\", \"#0\" },\n-  { 0, \"+si\", \"#1+2\" },\n-  { 0, \"l\", \"#0\" },\n-\n-  { 'l', \"l\", \"0\" },\n-  { 'd', \"i\", \"0\" },\n-  { 'd', \"s\", \"0\" },\n-  { 'd', \"+si\", \"1+2\" },\n-  { 'D', \"i\", \"0\" },\n-  { 'D', \"s\", \"0\" },\n-  { 'D', \"+si\", \"1+2\" },\n-  { 'x', \"i\", \"#0\" },\n-  { 'X', \"i\", \"#0\" },\n-  { 'm', \"i\", \"#0\" },\n-  { 'b', \"i\", \"#0\" },\n-  { 'B', \"i\", \"0\" },\n-  { 'p', \"i\", \"0\" },\n-\n-  { 0, 0, 0 }\n-};\n-\n-/* This is in order according to the bitfield that pushm/popm use.  */\n-static char const *pushm_regs[] = {\n-  \"fb\", \"sb\", \"a1\", \"a0\", \"r3\", \"r2\", \"r1\", \"r0\"\n-};\n-\n-/* Implements TARGET_PRINT_OPERAND.  */\n-\n-#undef TARGET_PRINT_OPERAND\n-#define TARGET_PRINT_OPERAND m32c_print_operand\n-\n-static void\n-m32c_print_operand (FILE * file, rtx x, int code)\n-{\n-  int i, j, b;\n-  const char *comma;\n-  HOST_WIDE_INT ival;\n-  int unsigned_const = 0;\n-  int force_sign;\n-\n-  /* Multiplies; constants are converted to sign-extended format but\n-   we need unsigned, so 'u' and 'U' tell us what size unsigned we\n-   need.  */\n-  if (code == 'u')\n-    {\n-      unsigned_const = 2;\n-      code = 0;\n-    }\n-  if (code == 'U')\n-    {\n-      unsigned_const = 1;\n-      code = 0;\n-    }\n-  /* This one is only for debugging; you can put it in a pattern to\n-     force this error.  */\n-  if (code == '!')\n-    {\n-      fprintf (stderr, \"dj: unreviewed pattern:\");\n-      if (current_output_insn)\n-\tdebug_rtx (current_output_insn);\n-      gcc_unreachable ();\n-    }\n-  /* PSImode operations are either .w or .l depending on the target.  */\n-  if (code == '&')\n-    {\n-      if (TARGET_A16)\n-\tfprintf (file, \"w\");\n-      else\n-\tfprintf (file, \"l\");\n-      return;\n-    }\n-  /* Inverted conditionals.  */\n-  if (code == 'C')\n-    {\n-      switch (GET_CODE (x))\n-\t{\n-\tcase LE:\n-\t  fputs (\"gt\", file);\n-\t  break;\n-\tcase LEU:\n-\t  fputs (\"gtu\", file);\n-\t  break;\n-\tcase LT:\n-\t  fputs (\"ge\", file);\n-\t  break;\n-\tcase LTU:\n-\t  fputs (\"geu\", file);\n-\t  break;\n-\tcase GT:\n-\t  fputs (\"le\", file);\n-\t  break;\n-\tcase GTU:\n-\t  fputs (\"leu\", file);\n-\t  break;\n-\tcase GE:\n-\t  fputs (\"lt\", file);\n-\t  break;\n-\tcase GEU:\n-\t  fputs (\"ltu\", file);\n-\t  break;\n-\tcase NE:\n-\t  fputs (\"eq\", file);\n-\t  break;\n-\tcase EQ:\n-\t  fputs (\"ne\", file);\n-\t  break;\n-\tdefault:\n-\t  gcc_unreachable ();\n-\t}\n-      return;\n-    }\n-  /* Regular conditionals.  */\n-  if (code == 'c')\n-    {\n-      switch (GET_CODE (x))\n-\t{\n-\tcase LE:\n-\t  fputs (\"le\", file);\n-\t  break;\n-\tcase LEU:\n-\t  fputs (\"leu\", file);\n-\t  break;\n-\tcase LT:\n-\t  fputs (\"lt\", file);\n-\t  break;\n-\tcase LTU:\n-\t  fputs (\"ltu\", file);\n-\t  break;\n-\tcase GT:\n-\t  fputs (\"gt\", file);\n-\t  break;\n-\tcase GTU:\n-\t  fputs (\"gtu\", file);\n-\t  break;\n-\tcase GE:\n-\t  fputs (\"ge\", file);\n-\t  break;\n-\tcase GEU:\n-\t  fputs (\"geu\", file);\n-\t  break;\n-\tcase NE:\n-\t  fputs (\"ne\", file);\n-\t  break;\n-\tcase EQ:\n-\t  fputs (\"eq\", file);\n-\t  break;\n-\tdefault:\n-\t  gcc_unreachable ();\n-\t}\n-      return;\n-    }\n-  /* Used in negsi2 to do HImode ops on the two parts of an SImode\n-     operand.  */\n-  if (code == 'h' && GET_MODE (x) == SImode)\n-    {\n-      x = m32c_subreg (HImode, x, SImode, 0);\n-      code = 0;\n-    }\n-  if (code == 'H' && GET_MODE (x) == SImode)\n-    {\n-      x = m32c_subreg (HImode, x, SImode, 2);\n-      code = 0;\n-    }\n-  if (code == 'h' && GET_MODE (x) == HImode)\n-    {\n-      x = m32c_subreg (QImode, x, HImode, 0);\n-      code = 0;\n-    }\n-  if (code == 'H' && GET_MODE (x) == HImode)\n-    {\n-      /* We can't actually represent this as an rtx.  Do it here.  */\n-      if (GET_CODE (x) == REG)\n-\t{\n-\t  switch (REGNO (x))\n-\t    {\n-\t    case R0_REGNO:\n-\t      fputs (\"r0h\", file);\n-\t      return;\n-\t    case R1_REGNO:\n-\t      fputs (\"r1h\", file);\n-\t      return;\n-\t    default:\n-\t      gcc_unreachable();\n-\t    }\n-\t}\n-      /* This should be a MEM.  */\n-      x = m32c_subreg (QImode, x, HImode, 1);\n-      code = 0;\n-    }\n-  /* This is for BMcond, which always wants word register names.  */\n-  if (code == 'h' && GET_MODE (x) == QImode)\n-    {\n-      if (GET_CODE (x) == REG)\n-\tx = gen_rtx_REG (HImode, REGNO (x));\n-      code = 0;\n-    }\n-  /* 'x' and 'X' need to be ignored for non-immediates.  */\n-  if ((code == 'x' || code == 'X') && GET_CODE (x) != CONST_INT)\n-    code = 0;\n-\n-  encode_pattern (x);\n-  force_sign = 0;\n-  for (i = 0; conversions[i].pattern; i++)\n-    if (conversions[i].code == code\n-\t&& streq (conversions[i].pattern, pattern))\n-      {\n-\tfor (j = 0; conversions[i].format[j]; j++)\n-\t  /* backslash quotes the next character in the output pattern.  */\n-\t  if (conversions[i].format[j] == '\\\\')\n-\t    {\n-\t      fputc (conversions[i].format[j + 1], file);\n-\t      j++;\n-\t    }\n-\t  /* Digits in the output pattern indicate that the\n-\t     corresponding RTX is to be output at that point.  */\n-\t  else if (ISDIGIT (conversions[i].format[j]))\n-\t    {\n-\t      rtx r = patternr[conversions[i].format[j] - '0'];\n-\t      switch (GET_CODE (r))\n-\t\t{\n-\t\tcase REG:\n-\t\t  fprintf (file, \"%s\",\n-\t\t\t   reg_name_with_mode (REGNO (r), GET_MODE (r)));\n-\t\t  break;\n-\t\tcase CONST_INT:\n-\t\t  switch (code)\n-\t\t    {\n-\t\t    case 'b':\n-\t\t    case 'B':\n-\t\t      {\n-\t\t\tint v = INTVAL (r);\n-\t\t\tint i = (int) exact_log2 (v);\n-\t\t\tif (i == -1)\n-\t\t\t  i = (int) exact_log2 ((v ^ 0xffff) & 0xffff);\n-\t\t\tif (i == -1)\n-\t\t\t  i = (int) exact_log2 ((v ^ 0xff) & 0xff);\n-\t\t\t/* Bit position.  */\n-\t\t\tfprintf (file, \"%d\", i);\n-\t\t      }\n-\t\t      break;\n-\t\t    case 'x':\n-\t\t      /* Unsigned byte.  */\n-\t\t      fprintf (file, HOST_WIDE_INT_PRINT_HEX,\n-\t\t\t       INTVAL (r) & 0xff);\n-\t\t      break;\n-\t\t    case 'X':\n-\t\t      /* Unsigned word.  */\n-\t\t      fprintf (file, HOST_WIDE_INT_PRINT_HEX,\n-\t\t\t       INTVAL (r) & 0xffff);\n-\t\t      break;\n-\t\t    case 'p':\n-\t\t      /* pushm and popm encode a register set into a single byte.  */\n-\t\t      comma = \"\";\n-\t\t      for (b = 7; b >= 0; b--)\n-\t\t\tif (INTVAL (r) & (1 << b))\n-\t\t\t  {\n-\t\t\t    fprintf (file, \"%s%s\", comma, pushm_regs[b]);\n-\t\t\t    comma = \",\";\n-\t\t\t  }\n-\t\t      break;\n-\t\t    case 'm':\n-\t\t      /* \"Minus\".  Output -X  */\n-\t\t      ival = (-INTVAL (r) & 0xffff);\n-\t\t      if (ival & 0x8000)\n-\t\t\tival = ival - 0x10000;\n-\t\t      fprintf (file, HOST_WIDE_INT_PRINT_DEC, ival);\n-\t\t      break;\n-\t\t    default:\n-\t\t      ival = INTVAL (r);\n-\t\t      if (conversions[i].format[j + 1] == '[' && ival < 0)\n-\t\t\t{\n-\t\t\t  /* We can simulate negative displacements by\n-\t\t\t     taking advantage of address space\n-\t\t\t     wrapping when the offset can span the\n-\t\t\t     entire address range.  */\n-\t\t\t  rtx base =\n-\t\t\t    patternr[conversions[i].format[j + 2] - '0'];\n-\t\t\t  if (GET_CODE (base) == REG)\n-\t\t\t    switch (REGNO (base))\n-\t\t\t      {\n-\t\t\t      case A0_REGNO:\n-\t\t\t      case A1_REGNO:\n-\t\t\t\tif (TARGET_A24)\n-\t\t\t\t  ival = 0x1000000 + ival;\n-\t\t\t\telse\n-\t\t\t\t  ival = 0x10000 + ival;\n-\t\t\t\tbreak;\n-\t\t\t      case SB_REGNO:\n-\t\t\t\tif (TARGET_A16)\n-\t\t\t\t  ival = 0x10000 + ival;\n-\t\t\t\tbreak;\n-\t\t\t      }\n-\t\t\t}\n-\t\t      else if (code == 'd' && ival < 0 && j == 0)\n-\t\t\t/* The \"mova\" opcode is used to do addition by\n-\t\t\t   computing displacements, but again, we need\n-\t\t\t   displacements to be unsigned *if* they're\n-\t\t\t   the only component of the displacement\n-\t\t\t   (i.e. no \"symbol-4\" type displacement).  */\n-\t\t\tival = (TARGET_A24 ? 0x1000000 : 0x10000) + ival;\n-\n-\t\t      if (conversions[i].format[j] == '0')\n-\t\t\t{\n-\t\t\t  /* More conversions to unsigned.  */\n-\t\t\t  if (unsigned_const == 2)\n-\t\t\t    ival &= 0xffff;\n-\t\t\t  if (unsigned_const == 1)\n-\t\t\t    ival &= 0xff;\n-\t\t\t}\n-\t\t      if (streq (conversions[i].pattern, \"mi\")\n-\t\t\t  || streq (conversions[i].pattern, \"mmi\"))\n-\t\t\t{\n-\t\t\t  /* Integers used as addresses are unsigned.  */\n-\t\t\t  ival &= (TARGET_A24 ? 0xffffff : 0xffff);\n-\t\t\t}\n-\t\t      if (force_sign && ival >= 0)\n-\t\t\tfputc ('+', file);\n-\t\t      fprintf (file, HOST_WIDE_INT_PRINT_DEC, ival);\n-\t\t      break;\n-\t\t    }\n-\t\t  break;\n-\t\tcase CONST_DOUBLE:\n-\t\t  /* We don't have const_double constants.  If it\n-\t\t     happens, make it obvious.  */\n-\t\t  fprintf (file, \"[const_double 0x%lx]\",\n-\t\t\t   (unsigned long) CONST_DOUBLE_HIGH (r));\n-\t\t  break;\n-\t\tcase SYMBOL_REF:\n-\t\t  assemble_name (file, XSTR (r, 0));\n-\t\t  break;\n-\t\tcase LABEL_REF:\n-\t\t  output_asm_label (r);\n-\t\t  break;\n-\t\tdefault:\n-\t\t  fprintf (stderr, \"don't know how to print this operand:\");\n-\t\t  debug_rtx (r);\n-\t\t  gcc_unreachable ();\n-\t\t}\n-\t    }\n-\t  else\n-\t    {\n-\t      if (conversions[i].format[j] == 'z')\n-\t\t{\n-\t\t  /* Some addressing modes *must* have a displacement,\n-\t\t     so insert a zero here if needed.  */\n-\t\t  int k;\n-\t\t  for (k = j + 1; conversions[i].format[k]; k++)\n-\t\t    if (ISDIGIT (conversions[i].format[k]))\n-\t\t      {\n-\t\t\trtx reg = patternr[conversions[i].format[k] - '0'];\n-\t\t\tif (GET_CODE (reg) == REG\n-\t\t\t    && (REGNO (reg) == SB_REGNO\n-\t\t\t\t|| REGNO (reg) == FB_REGNO\n-\t\t\t\t|| REGNO (reg) == SP_REGNO))\n-\t\t\t  fputc ('0', file);\n-\t\t      }\n-\t\t  continue;\n-\t\t}\n-\t      /* Signed displacements off symbols need to have signs\n-\t\t blended cleanly.  */\n-\t      if (conversions[i].format[j] == '+'\n-\t\t  && (!code || code == 'D' || code == 'd')\n-\t\t  && ISDIGIT (conversions[i].format[j + 1])\n-\t\t  && (GET_CODE (patternr[conversions[i].format[j + 1] - '0'])\n-\t\t      == CONST_INT))\n-\t\t{\n-\t\t  force_sign = 1;\n-\t\t  continue;\n-\t\t}\n-\t      fputc (conversions[i].format[j], file);\n-\t    }\n-\tbreak;\n-      }\n-  if (!conversions[i].pattern)\n-    {\n-      fprintf (stderr, \"unconvertible operand %c `%s'\", code ? code : '-',\n-\t       pattern);\n-      debug_rtx (x);\n-      fprintf (file, \"[%c.%s]\", code ? code : '-', pattern);\n-    }\n-\n-  return;\n-}\n-\n-/* Implements TARGET_PRINT_OPERAND_PUNCT_VALID_P.\n-\n-   See m32c_print_operand above for descriptions of what these do.  */\n-\n-#undef TARGET_PRINT_OPERAND_PUNCT_VALID_P\n-#define TARGET_PRINT_OPERAND_PUNCT_VALID_P m32c_print_operand_punct_valid_p\n-\n-static bool\n-m32c_print_operand_punct_valid_p (unsigned char c)\n-{\n-  if (c == '&' || c == '!')\n-    return true;\n-\n-  return false;\n-}\n-\n-/* Implements TARGET_PRINT_OPERAND_ADDRESS.  Nothing unusual here.  */\n-\n-#undef TARGET_PRINT_OPERAND_ADDRESS\n-#define TARGET_PRINT_OPERAND_ADDRESS m32c_print_operand_address\n-\n-static void\n-m32c_print_operand_address (FILE * stream, machine_mode /*mode*/, rtx address)\n-{\n-  if (GET_CODE (address) == MEM)\n-    address = XEXP (address, 0);\n-  else\n-    /* cf: gcc.dg/asm-4.c.  */\n-    gcc_assert (GET_CODE (address) == REG);\n-\n-  m32c_print_operand (stream, address, 0);\n-}\n-\n-/* Implements ASM_OUTPUT_REG_PUSH.  Control registers are pushed\n-   differently than general registers.  */\n-void\n-m32c_output_reg_push (FILE * s, int regno)\n-{\n-  if (regno == FLG_REGNO)\n-    fprintf (s, \"\\tpushc\\tflg\\n\");\n-  else\n-    fprintf (s, \"\\tpush.%c\\t%s\\n\",\n-\t     \" bwll\"[reg_push_size (regno)], reg_names[regno]);\n-}\n-\n-/* Likewise for ASM_OUTPUT_REG_POP.  */\n-void\n-m32c_output_reg_pop (FILE * s, int regno)\n-{\n-  if (regno == FLG_REGNO)\n-    fprintf (s, \"\\tpopc\\tflg\\n\");\n-  else\n-    fprintf (s, \"\\tpop.%c\\t%s\\n\",\n-\t     \" bwll\"[reg_push_size (regno)], reg_names[regno]);\n-}\n-\n-/* Defining target-specific uses of `__attribute__' */\n-\n-/* Used to simplify the logic below.  Find the attributes wherever\n-   they may be.  */\n-#define M32C_ATTRIBUTES(decl) \\\n-  (TYPE_P (decl)) ? TYPE_ATTRIBUTES (decl) \\\n-                : DECL_ATTRIBUTES (decl) \\\n-                  ? (DECL_ATTRIBUTES (decl)) \\\n-\t\t  : TYPE_ATTRIBUTES (TREE_TYPE (decl))\n-\n-/* Returns TRUE if the given tree has the \"interrupt\" attribute.  */\n-static int\n-interrupt_p (tree node ATTRIBUTE_UNUSED)\n-{\n-  tree list = M32C_ATTRIBUTES (node);\n-  while (list)\n-    {\n-      if (is_attribute_p (\"interrupt\", TREE_PURPOSE (list)))\n-\treturn 1;\n-      list = TREE_CHAIN (list);\n-    }\n-  return fast_interrupt_p (node);\n-}\n-\n-/* Returns TRUE if the given tree has the \"bank_switch\" attribute.  */\n-static int\n-bank_switch_p (tree node ATTRIBUTE_UNUSED)\n-{\n-  tree list = M32C_ATTRIBUTES (node);\n-  while (list)\n-    {\n-      if (is_attribute_p (\"bank_switch\", TREE_PURPOSE (list)))\n-\treturn 1;\n-      list = TREE_CHAIN (list);\n-    }\n-  return 0;\n-}\n-\n-/* Returns TRUE if the given tree has the \"fast_interrupt\" attribute.  */\n-static int\n-fast_interrupt_p (tree node ATTRIBUTE_UNUSED)\n-{\n-  tree list = M32C_ATTRIBUTES (node);\n-  while (list)\n-    {\n-      if (is_attribute_p (\"fast_interrupt\", TREE_PURPOSE (list)))\n-\treturn 1;\n-      list = TREE_CHAIN (list);\n-    }\n-  return 0;\n-}\n-\n-static tree\n-interrupt_handler (tree * node ATTRIBUTE_UNUSED,\n-\t\t   tree name ATTRIBUTE_UNUSED,\n-\t\t   tree args ATTRIBUTE_UNUSED,\n-\t\t   int flags ATTRIBUTE_UNUSED,\n-\t\t   bool * no_add_attrs ATTRIBUTE_UNUSED)\n-{\n-  return NULL_TREE;\n-}\n-\n-/* Returns TRUE if given tree has the \"function_vector\" attribute. */\n-int\n-m32c_special_page_vector_p (tree func)\n-{\n-  tree list;\n-\n-  if (TREE_CODE (func) != FUNCTION_DECL)\n-    return 0;\n-\n-  list = M32C_ATTRIBUTES (func);\n-  while (list)\n-    {\n-      if (is_attribute_p (\"function_vector\", TREE_PURPOSE (list)))\n-        return 1;\n-      list = TREE_CHAIN (list);\n-    }\n-  return 0;\n-}\n-\n-static tree\n-function_vector_handler (tree * node ATTRIBUTE_UNUSED,\n-                         tree name ATTRIBUTE_UNUSED,\n-                         tree args ATTRIBUTE_UNUSED,\n-                         int flags ATTRIBUTE_UNUSED,\n-                         bool * no_add_attrs ATTRIBUTE_UNUSED)\n-{\n-  if (TARGET_R8C)\n-    {\n-      /* The attribute is not supported for R8C target.  */\n-      warning (OPT_Wattributes,\n-                \"%qE attribute is not supported for R8C target\",\n-                name);\n-      *no_add_attrs = true;\n-    }\n-  else if (TREE_CODE (*node) != FUNCTION_DECL)\n-    {\n-      /* The attribute must be applied to functions only.  */\n-      warning (OPT_Wattributes,\n-                \"%qE attribute applies only to functions\",\n-                name);\n-      *no_add_attrs = true;\n-    }\n-  else if (TREE_CODE (TREE_VALUE (args)) != INTEGER_CST)\n-    {\n-      /* The argument must be a constant integer.  */\n-      warning (OPT_Wattributes,\n-                \"%qE attribute argument not an integer constant\",\n-                name);\n-      *no_add_attrs = true;\n-    }\n-  else if (TREE_INT_CST_LOW (TREE_VALUE (args)) < 18\n-           || TREE_INT_CST_LOW (TREE_VALUE (args)) > 255)\n-    {\n-      /* The argument value must be between 18 to 255.  */\n-      warning (OPT_Wattributes,\n-                \"%qE attribute argument should be between 18 to 255\",\n-                name);\n-      *no_add_attrs = true;\n-    }\n-  return NULL_TREE;\n-}\n-\n-/* If the function is assigned the attribute 'function_vector', it\n-   returns the function vector number, otherwise returns zero.  */\n-int\n-current_function_special_page_vector (rtx x)\n-{\n-  int num;\n-\n-  if ((GET_CODE(x) == SYMBOL_REF)\n-      && (SYMBOL_REF_FLAGS (x) & SYMBOL_FLAG_FUNCVEC_FUNCTION))\n-    {\n-      tree list;\n-      tree t = SYMBOL_REF_DECL (x);\n-\n-      if (TREE_CODE (t) != FUNCTION_DECL)\n-        return 0;\n-\n-      list = M32C_ATTRIBUTES (t);\n-      while (list)\n-        {\n-          if (is_attribute_p (\"function_vector\", TREE_PURPOSE (list)))\n-            {\n-              num = TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (list)));\n-              return num;\n-            }\n-\n-          list = TREE_CHAIN (list);\n-        }\n-\n-      return 0;\n-    }\n-  else\n-    return 0;\n-}\n-\n-#undef TARGET_ATTRIBUTE_TABLE\n-#define TARGET_ATTRIBUTE_TABLE m32c_attribute_table\n-TARGET_GNU_ATTRIBUTES (m32c_attribute_table, {\n-  /* { name, min_len, max_len, decl_req, type_req, fn_type_req,\n-       affects_type_identity, handler, exclude } */\n-  { \"interrupt\", 0, 0, false, false, false, false, interrupt_handler, NULL },\n-  { \"bank_switch\", 0, 0, false, false, false, false, interrupt_handler, NULL },\n-  { \"fast_interrupt\", 0, 0, false, false, false, false,\n-    interrupt_handler, NULL },\n-  { \"function_vector\", 1, 1, true,  false, false, false,\n-    function_vector_handler, NULL }\n-});\n-\n-#undef TARGET_COMP_TYPE_ATTRIBUTES\n-#define TARGET_COMP_TYPE_ATTRIBUTES m32c_comp_type_attributes\n-static int\n-m32c_comp_type_attributes (const_tree type1 ATTRIBUTE_UNUSED,\n-\t\t\t   const_tree type2 ATTRIBUTE_UNUSED)\n-{\n-  /* 0=incompatible 1=compatible 2=warning */\n-  return 1;\n-}\n-\n-#undef TARGET_INSERT_ATTRIBUTES\n-#define TARGET_INSERT_ATTRIBUTES m32c_insert_attributes\n-static void\n-m32c_insert_attributes (tree node ATTRIBUTE_UNUSED,\n-\t\t\ttree * attr_ptr ATTRIBUTE_UNUSED)\n-{\n-  unsigned addr;\n-  /* See if we need to make #pragma address variables volatile.  */\n-\n-  if (VAR_P (node))\n-    {\n-      const char *name = IDENTIFIER_POINTER (DECL_NAME (node));\n-      if (m32c_get_pragma_address  (name, &addr))\n-\t{\n-\t  TREE_THIS_VOLATILE (node) = true;\n-\t}\n-    }\n-}\n-\n-/* Hash table of pragma info.  */\n-static GTY(()) hash_map<nofree_string_hash, unsigned> *pragma_htab;\n-\n-void\n-m32c_note_pragma_address (const char *varname, unsigned address)\n-{\n-  if (!pragma_htab)\n-    pragma_htab = hash_map<nofree_string_hash, unsigned>::create_ggc (31);\n-\n-  const char *name = ggc_strdup (varname);\n-  unsigned int *slot = &pragma_htab->get_or_insert (name);\n-  *slot = address;\n-}\n-\n-static bool\n-m32c_get_pragma_address (const char *varname, unsigned *address)\n-{\n-  if (!pragma_htab)\n-    return false;\n-\n-  unsigned int *slot = pragma_htab->get (varname);\n-  if (slot)\n-    {\n-      *address = *slot;\n-      return true;\n-    }\n-  return false;\n-}\n-\n-void\n-m32c_output_aligned_common (FILE *stream, tree decl ATTRIBUTE_UNUSED,\n-\t\t\t    const char *name,\n-\t\t\t    int size, int align, int global)\n-{\n-  unsigned address;\n-\n-  if (m32c_get_pragma_address (name, &address))\n-    {\n-      /* We never output these as global.  */\n-      assemble_name (stream, name);\n-      fprintf (stream, \" = 0x%04x\\n\", address);\n-      return;\n-    }\n-  if (!global)\n-    {\n-      fprintf (stream, \"\\t.local\\t\");\n-      assemble_name (stream, name);\n-      fprintf (stream, \"\\n\");\n-    }\n-  fprintf (stream, \"\\t.comm\\t\");\n-  assemble_name (stream, name);\n-  fprintf (stream, \",%u,%u\\n\", size, align / BITS_PER_UNIT);\n-}\n-\n-/* Predicates */\n-\n-/* This is a list of legal subregs of hard regs.  */\n-static const struct {\n-  unsigned char outer_mode_size;\n-  unsigned char inner_mode_size;\n-  unsigned char byte_mask;\n-  unsigned char legal_when;\n-  unsigned int regno;\n-} legal_subregs[] = {\n-  {1, 2, 0x03, 1, R0_REGNO}, /* r0h r0l */\n-  {1, 2, 0x03, 1, R1_REGNO}, /* r1h r1l */\n-  {1, 2, 0x01, 1, A0_REGNO},\n-  {1, 2, 0x01, 1, A1_REGNO},\n-\n-  {1, 4, 0x01, 1, A0_REGNO},\n-  {1, 4, 0x01, 1, A1_REGNO},\n-\n-  {2, 4, 0x05, 1, R0_REGNO}, /* r2 r0 */\n-  {2, 4, 0x05, 1, R1_REGNO}, /* r3 r1 */\n-  {2, 4, 0x05, 16, A0_REGNO}, /* a1 a0 */\n-  {2, 4, 0x01, 24, A0_REGNO}, /* a1 a0 */\n-  {2, 4, 0x01, 24, A1_REGNO}, /* a1 a0 */\n-\n-  {4, 8, 0x55, 1, R0_REGNO}, /* r3 r1 r2 r0 */\n-};\n-\n-/* Returns TRUE if OP is a subreg of a hard reg which we don't\n-   support.  We also bail on MEMs with illegal addresses.  */\n-bool\n-m32c_illegal_subreg_p (rtx op)\n-{\n-  int offset;\n-  unsigned int i;\n-  machine_mode src_mode, dest_mode;\n-\n-  if (GET_CODE (op) == MEM\n-      && ! m32c_legitimate_address_p (Pmode, XEXP (op, 0), false))\n-    {\n-      return true;\n-    }\n-\n-  if (GET_CODE (op) != SUBREG)\n-    return false;\n-\n-  dest_mode = GET_MODE (op);\n-  offset = SUBREG_BYTE (op);\n-  op = SUBREG_REG (op);\n-  src_mode = GET_MODE (op);\n-\n-  if (GET_MODE_SIZE (dest_mode) == GET_MODE_SIZE (src_mode))\n-    return false;\n-  if (GET_CODE (op) != REG)\n-    return false;\n-  if (REGNO (op) >= MEM0_REGNO)\n-    return false;\n-\n-  offset = (1 << offset);\n-\n-  for (i = 0; i < ARRAY_SIZE (legal_subregs); i ++)\n-    if (legal_subregs[i].outer_mode_size == GET_MODE_SIZE (dest_mode)\n-\t&& legal_subregs[i].regno == REGNO (op)\n-\t&& legal_subregs[i].inner_mode_size == GET_MODE_SIZE (src_mode)\n-\t&& legal_subregs[i].byte_mask & offset)\n-      {\n-\tswitch (legal_subregs[i].legal_when)\n-\t  {\n-\t  case 1:\n-\t    return false;\n-\t  case 16:\n-\t    if (TARGET_A16)\n-\t      return false;\n-\t    break;\n-\t  case 24:\n-\t    if (TARGET_A24)\n-\t      return false;\n-\t    break;\n-\t  }\n-      }\n-  return true;\n-}\n-\n-/* Returns TRUE if we support a move between the first two operands.\n-   At the moment, we just want to discourage mem to mem moves until\n-   after reload, because reload has a hard time with our limited\n-   number of address registers, and we can get into a situation where\n-   we need three of them when we only have two.  */\n-bool\n-m32c_mov_ok (rtx * operands, machine_mode mode ATTRIBUTE_UNUSED)\n-{\n-  rtx op0 = operands[0];\n-  rtx op1 = operands[1];\n-\n-  if (TARGET_A24)\n-    return true;\n-\n-#define DEBUG_MOV_OK 0\n-#if DEBUG_MOV_OK\n-  fprintf (stderr, \"m32c_mov_ok %s\\n\", mode_name[mode]);\n-  debug_rtx (op0);\n-  debug_rtx (op1);\n-#endif\n-\n-  if (GET_CODE (op0) == SUBREG)\n-    op0 = XEXP (op0, 0);\n-  if (GET_CODE (op1) == SUBREG)\n-    op1 = XEXP (op1, 0);\n-\n-  if (GET_CODE (op0) == MEM\n-      && GET_CODE (op1) == MEM\n-      && ! reload_completed)\n-    {\n-#if DEBUG_MOV_OK\n-      fprintf (stderr, \" - no, mem to mem\\n\");\n-#endif\n-      return false;\n-    }\n-\n-#if DEBUG_MOV_OK\n-  fprintf (stderr, \" - ok\\n\");\n-#endif\n-  return true;\n-}\n-\n-/* Returns TRUE if two consecutive HImode mov instructions, generated\n-   for moving an immediate double data to a double data type variable\n-   location, can be combined into single SImode mov instruction.  */\n-bool\n-m32c_immd_dbl_mov (rtx * operands ATTRIBUTE_UNUSED,\n-\t\t   machine_mode mode ATTRIBUTE_UNUSED)\n-{\n-  /* ??? This relied on the now-defunct MEM_SCALAR and MEM_IN_STRUCT_P\n-     flags.  */\n-  return false;\n-}\n-\n-/* Expanders */\n-\n-/* Subregs are non-orthogonal for us, because our registers are all\n-   different sizes.  */\n-static rtx\n-m32c_subreg (machine_mode outer,\n-\t     rtx x, machine_mode inner, int byte)\n-{\n-  int r, nr = -1;\n-\n-  /* Converting MEMs to different types that are the same size, we\n-     just rewrite them.  */\n-  if (GET_CODE (x) == SUBREG\n-      && SUBREG_BYTE (x) == 0\n-      && GET_CODE (SUBREG_REG (x)) == MEM\n-      && (GET_MODE_SIZE (GET_MODE (x))\n-\t  == GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))))\n-    {\n-      rtx oldx = x;\n-      x = gen_rtx_MEM (GET_MODE (x), XEXP (SUBREG_REG (x), 0));\n-      MEM_COPY_ATTRIBUTES (x, SUBREG_REG (oldx));\n-    }\n-\n-  /* Push/pop get done as smaller push/pops.  */\n-  if (GET_CODE (x) == MEM\n-      && (GET_CODE (XEXP (x, 0)) == PRE_DEC\n-\t  || GET_CODE (XEXP (x, 0)) == POST_INC))\n-    return gen_rtx_MEM (outer, XEXP (x, 0));\n-  if (GET_CODE (x) == SUBREG\n-      && GET_CODE (XEXP (x, 0)) == MEM\n-      && (GET_CODE (XEXP (XEXP (x, 0), 0)) == PRE_DEC\n-\t  || GET_CODE (XEXP (XEXP (x, 0), 0)) == POST_INC))\n-    return gen_rtx_MEM (outer, XEXP (XEXP (x, 0), 0));\n-\n-  if (GET_CODE (x) != REG)\n-    {\n-      rtx r = simplify_gen_subreg (outer, x, inner, byte);\n-      if (GET_CODE (r) == SUBREG\n-\t  && GET_CODE (x) == MEM\n-\t  && MEM_VOLATILE_P (x))\n-\t{\n-\t  /* Volatile MEMs don't get simplified, but we need them to\n-\t     be.  We are little endian, so the subreg byte is the\n-\t     offset.  */\n-\t  r = adjust_address_nv (x, outer, byte);\n-\t}\n-      return r;\n-    }\n-\n-  r = REGNO (x);\n-  if (r >= FIRST_PSEUDO_REGISTER || r == AP_REGNO)\n-    return simplify_gen_subreg (outer, x, inner, byte);\n-\n-  if (IS_MEM_REGNO (r))\n-    return simplify_gen_subreg (outer, x, inner, byte);\n-\n-  /* This is where the complexities of our register layout are\n-     described.  */\n-  if (byte == 0)\n-    nr = r;\n-  else if (outer == HImode)\n-    {\n-      if (r == R0_REGNO && byte == 2)\n-\tnr = R2_REGNO;\n-      else if (r == R0_REGNO && byte == 4)\n-\tnr = R1_REGNO;\n-      else if (r == R0_REGNO && byte == 6)\n-\tnr = R3_REGNO;\n-      else if (r == R1_REGNO && byte == 2)\n-\tnr = R3_REGNO;\n-      else if (r == A0_REGNO && byte == 2)\n-\tnr = A1_REGNO;\n-    }\n-  else if (outer == SImode)\n-    {\n-      if (r == R0_REGNO && byte == 0)\n-\tnr = R0_REGNO;\n-      else if (r == R0_REGNO && byte == 4)\n-\tnr = R1_REGNO;\n-    }\n-  if (nr == -1)\n-    {\n-      fprintf (stderr, \"m32c_subreg %s %s %d\\n\",\n-\t       mode_name[outer], mode_name[inner], byte);\n-      debug_rtx (x);\n-      gcc_unreachable ();\n-    }\n-  return gen_rtx_REG (outer, nr);\n-}\n-\n-/* Used to emit move instructions.  We split some moves,\n-   and avoid mem-mem moves.  */\n-int\n-m32c_prepare_move (rtx * operands, machine_mode mode)\n-{\n-  if (far_addr_space_p (operands[0])\n-      && CONSTANT_P (operands[1]))\n-    {\n-      operands[1] = force_reg (GET_MODE (operands[0]), operands[1]);\n-    }\n-  if (TARGET_A16 && mode == PSImode)\n-    return m32c_split_move (operands, mode, 1);\n-  if ((GET_CODE (operands[0]) == MEM)\n-      && (GET_CODE (XEXP (operands[0], 0)) == PRE_MODIFY))\n-    {\n-      rtx pmv = XEXP (operands[0], 0);\n-      rtx dest_reg = XEXP (pmv, 0);\n-      rtx dest_mod = XEXP (pmv, 1);\n-\n-      emit_insn (gen_rtx_SET (dest_reg, dest_mod));\n-      operands[0] = gen_rtx_MEM (mode, dest_reg);\n-    }\n-  if (can_create_pseudo_p () && MEM_P (operands[0]) && MEM_P (operands[1]))\n-    operands[1] = copy_to_mode_reg (mode, operands[1]);\n-  return 0;\n-}\n-\n-#define DEBUG_SPLIT 0\n-\n-/* Returns TRUE if the given PSImode move should be split.  We split\n-   for all r8c/m16c moves, since it doesn't support them, and for\n-   POP.L as we can only *push* SImode.  */\n-int\n-m32c_split_psi_p (rtx * operands)\n-{\n-#if DEBUG_SPLIT\n-  fprintf (stderr, \"\\nm32c_split_psi_p\\n\");\n-  debug_rtx (operands[0]);\n-  debug_rtx (operands[1]);\n-#endif\n-  if (TARGET_A16)\n-    {\n-#if DEBUG_SPLIT\n-      fprintf (stderr, \"yes, A16\\n\");\n-#endif\n-      return 1;\n-    }\n-  if (GET_CODE (operands[1]) == MEM\n-      && GET_CODE (XEXP (operands[1], 0)) == POST_INC)\n-    {\n-#if DEBUG_SPLIT\n-      fprintf (stderr, \"yes, pop.l\\n\");\n-#endif\n-      return 1;\n-    }\n-#if DEBUG_SPLIT\n-  fprintf (stderr, \"no, default\\n\");\n-#endif\n-  return 0;\n-}\n-\n-/* Split the given move.  SPLIT_ALL is 0 if splitting is optional\n-   (define_expand), 1 if it is not optional (define_insn_and_split),\n-   and 3 for define_split (alternate api). */\n-int\n-m32c_split_move (rtx * operands, machine_mode mode, int split_all)\n-{\n-  rtx s[4], d[4];\n-  int parts, si, di, rev = 0;\n-  int rv = 0, opi = 2;\n-  machine_mode submode = HImode;\n-  rtx *ops, local_ops[10];\n-\n-  /* define_split modifies the existing operands, but the other two\n-     emit new insns.  OPS is where we store the operand pairs, which\n-     we emit later.  */\n-  if (split_all == 3)\n-    ops = operands;\n-  else\n-    ops = local_ops;\n-\n-  /* Else HImode.  */\n-  if (mode == DImode)\n-    submode = SImode;\n-\n-  /* Before splitting mem-mem moves, force one operand into a\n-     register.  */\n-  if (can_create_pseudo_p () && MEM_P (operands[0]) && MEM_P (operands[1]))\n-    {\n-#if DEBUG0\n-      fprintf (stderr, \"force_reg...\\n\");\n-      debug_rtx (operands[1]);\n-#endif\n-      operands[1] = force_reg (mode, operands[1]);\n-#if DEBUG0\n-      debug_rtx (operands[1]);\n-#endif\n-    }\n-\n-  parts = 2;\n-\n-#if DEBUG_SPLIT\n-  fprintf (stderr, \"\\nsplit_move %d all=%d\\n\", !can_create_pseudo_p (),\n-\t   split_all);\n-  debug_rtx (operands[0]);\n-  debug_rtx (operands[1]);\n-#endif\n-\n-  /* Note that split_all is not used to select the api after this\n-     point, so it's safe to set it to 3 even with define_insn.  */\n-  /* None of the chips can move SI operands to sp-relative addresses,\n-     so we always split those.  */\n-  if (satisfies_constraint_Ss (operands[0]))\n-    split_all = 3;\n-\n-  if (TARGET_A16\n-      && (far_addr_space_p (operands[0])\n-\t  || far_addr_space_p (operands[1])))\n-    split_all |= 1;\n-\n-  /* We don't need to split these.  */\n-  if (TARGET_A24\n-      && split_all != 3\n-      && (mode == SImode || mode == PSImode)\n-      && !(GET_CODE (operands[1]) == MEM\n-\t   && GET_CODE (XEXP (operands[1], 0)) == POST_INC))\n-    return 0;\n-\n-  /* First, enumerate the subregs we'll be dealing with.  */\n-  for (si = 0; si < parts; si++)\n-    {\n-      d[si] =\n-\tm32c_subreg (submode, operands[0], mode,\n-\t\t     si * GET_MODE_SIZE (submode));\n-      s[si] =\n-\tm32c_subreg (submode, operands[1], mode,\n-\t\t     si * GET_MODE_SIZE (submode));\n-    }\n-\n-  /* Split pushes by emitting a sequence of smaller pushes.  */\n-  if (GET_CODE (d[0]) == MEM && GET_CODE (XEXP (d[0], 0)) == PRE_DEC)\n-    {\n-      for (si = parts - 1; si >= 0; si--)\n-\t{\n-\t  ops[opi++] = gen_rtx_MEM (submode,\n-\t\t\t\t    gen_rtx_PRE_DEC (Pmode,\n-\t\t\t\t\t\t     gen_rtx_REG (Pmode,\n-\t\t\t\t\t\t\t\t  SP_REGNO)));\n-\t  ops[opi++] = s[si];\n-\t}\n-\n-      rv = 1;\n-    }\n-  /* Likewise for pops.  */\n-  else if (GET_CODE (s[0]) == MEM && GET_CODE (XEXP (s[0], 0)) == POST_INC)\n-    {\n-      for (di = 0; di < parts; di++)\n-\t{\n-\t  ops[opi++] = d[di];\n-\t  ops[opi++] = gen_rtx_MEM (submode,\n-\t\t\t\t    gen_rtx_POST_INC (Pmode,\n-\t\t\t\t\t\t      gen_rtx_REG (Pmode,\n-\t\t\t\t\t\t\t\t   SP_REGNO)));\n-\t}\n-      rv = 1;\n-    }\n-  else if (split_all)\n-    {\n-      /* if d[di] == s[si] for any di < si, we'll early clobber. */\n-      for (di = 0; di < parts - 1; di++)\n-\tfor (si = di + 1; si < parts; si++)\n-\t  if (reg_mentioned_p (d[di], s[si]))\n-\t    rev = 1;\n-\n-      if (rev)\n-\tfor (si = 0; si < parts; si++)\n-\t  {\n-\t    ops[opi++] = d[si];\n-\t    ops[opi++] = s[si];\n-\t  }\n-      else\n-\tfor (si = parts - 1; si >= 0; si--)\n-\t  {\n-\t    ops[opi++] = d[si];\n-\t    ops[opi++] = s[si];\n-\t  }\n-      rv = 1;\n-    }\n-  /* Now emit any moves we may have accumulated.  */\n-  if (rv && split_all != 3)\n-    {\n-      int i;\n-      for (i = 2; i < opi; i += 2)\n-\temit_move_insn (ops[i], ops[i + 1]);\n-    }\n-  return rv;\n-}\n-\n-/* The m32c has a number of opcodes that act like memcpy, strcmp, and\n-   the like.  For the R8C they expect one of the addresses to be in\n-   R1L:An so we need to arrange for that.  Otherwise, it's just a\n-   matter of picking out the operands we want and emitting the right\n-   pattern for them.  All these expanders, which correspond to\n-   patterns in blkmov.md, must return nonzero if they expand the insn,\n-   or zero if they should FAIL.  */\n-\n-/* This is a memset() opcode.  All operands are implied, so we need to\n-   arrange for them to be in the right registers.  The opcode wants\n-   addresses, not [mem] syntax.  $0 is the destination (MEM:BLK), $1\n-   the count (HI), and $2 the value (QI).  */\n-int\n-m32c_expand_setmemhi(rtx *operands)\n-{\n-  rtx desta, count, val;\n-  rtx desto, counto;\n-\n-  desta = XEXP (operands[0], 0);\n-  count = operands[1];\n-  val = operands[2];\n-\n-  desto = gen_reg_rtx (Pmode);\n-  counto = gen_reg_rtx (HImode);\n-\n-  if (GET_CODE (desta) != REG\n-      || REGNO (desta) < FIRST_PSEUDO_REGISTER)\n-    desta = copy_to_mode_reg (Pmode, desta);\n-\n-  /* This looks like an arbitrary restriction, but this is by far the\n-     most common case.  For counts 8..14 this actually results in\n-     smaller code with no speed penalty because the half-sized\n-     constant can be loaded with a shorter opcode.  */\n-  if (GET_CODE (count) == CONST_INT\n-      && GET_CODE (val) == CONST_INT\n-      && ! (INTVAL (count) & 1)\n-      && (INTVAL (count) > 1)\n-      && (INTVAL (val) <= 7 && INTVAL (val) >= -8))\n-    {\n-      unsigned v = INTVAL (val) & 0xff;\n-      v = v | (v << 8);\n-      count = copy_to_mode_reg (HImode, GEN_INT (INTVAL (count) / 2));\n-      val = copy_to_mode_reg (HImode, GEN_INT (v));\n-      if (TARGET_A16)\n-\temit_insn (gen_setmemhi_whi_op (desto, counto, val, desta, count));\n-      else\n-\temit_insn (gen_setmemhi_wpsi_op (desto, counto, val, desta, count));\n-      return 1;\n-    }\n-\n-  /* This is the generalized memset() case.  */\n-  if (GET_CODE (val) != REG\n-      || REGNO (val) < FIRST_PSEUDO_REGISTER)\n-    val = copy_to_mode_reg (QImode, val);\n-\n-  if (GET_CODE (count) != REG\n-      || REGNO (count) < FIRST_PSEUDO_REGISTER)\n-    count = copy_to_mode_reg (HImode, count);\n-\n-  if (TARGET_A16)\n-    emit_insn (gen_setmemhi_bhi_op (desto, counto, val, desta, count));\n-  else\n-    emit_insn (gen_setmemhi_bpsi_op (desto, counto, val, desta, count));\n-\n-  return 1;\n-}\n-\n-/* This is a memcpy() opcode.  All operands are implied, so we need to\n-   arrange for them to be in the right registers.  The opcode wants\n-   addresses, not [mem] syntax.  $0 is the destination (MEM:BLK), $1\n-   is the source (MEM:BLK), and $2 the count (HI).  */\n-int\n-m32c_expand_cpymemhi(rtx *operands)\n-{\n-  rtx desta, srca, count;\n-  rtx desto, srco, counto;\n-\n-  desta = XEXP (operands[0], 0);\n-  srca = XEXP (operands[1], 0);\n-  count = operands[2];\n-\n-  desto = gen_reg_rtx (Pmode);\n-  srco = gen_reg_rtx (Pmode);\n-  counto = gen_reg_rtx (HImode);\n-\n-  if (GET_CODE (desta) != REG\n-      || REGNO (desta) < FIRST_PSEUDO_REGISTER)\n-    desta = copy_to_mode_reg (Pmode, desta);\n-\n-  if (GET_CODE (srca) != REG\n-      || REGNO (srca) < FIRST_PSEUDO_REGISTER)\n-    srca = copy_to_mode_reg (Pmode, srca);\n-\n-  /* Similar to setmem, but we don't need to check the value.  */\n-  if (GET_CODE (count) == CONST_INT\n-      && ! (INTVAL (count) & 1)\n-      && (INTVAL (count) > 1))\n-    {\n-      count = copy_to_mode_reg (HImode, GEN_INT (INTVAL (count) / 2));\n-      if (TARGET_A16)\n-\temit_insn (gen_cpymemhi_whi_op (desto, srco, counto, desta, srca, count));\n-      else\n-\temit_insn (gen_cpymemhi_wpsi_op (desto, srco, counto, desta, srca, count));\n-      return 1;\n-    }\n-\n-  /* This is the generalized memset() case.  */\n-  if (GET_CODE (count) != REG\n-      || REGNO (count) < FIRST_PSEUDO_REGISTER)\n-    count = copy_to_mode_reg (HImode, count);\n-\n-  if (TARGET_A16)\n-    emit_insn (gen_cpymemhi_bhi_op (desto, srco, counto, desta, srca, count));\n-  else\n-    emit_insn (gen_cpymemhi_bpsi_op (desto, srco, counto, desta, srca, count));\n-\n-  return 1;\n-}\n-\n-/* This is a stpcpy() opcode.  $0 is the destination (MEM:BLK) after\n-   the copy, which should point to the NUL at the end of the string,\n-   $1 is the destination (MEM:BLK), and $2 is the source (MEM:BLK).\n-   Since our opcode leaves the destination pointing *after* the NUL,\n-   we must emit an adjustment.  */\n-int\n-m32c_expand_movstr(rtx *operands)\n-{\n-  rtx desta, srca;\n-  rtx desto, srco;\n-\n-  desta = XEXP (operands[1], 0);\n-  srca = XEXP (operands[2], 0);\n-\n-  desto = gen_reg_rtx (Pmode);\n-  srco = gen_reg_rtx (Pmode);\n-\n-  if (GET_CODE (desta) != REG\n-      || REGNO (desta) < FIRST_PSEUDO_REGISTER)\n-    desta = copy_to_mode_reg (Pmode, desta);\n-\n-  if (GET_CODE (srca) != REG\n-      || REGNO (srca) < FIRST_PSEUDO_REGISTER)\n-    srca = copy_to_mode_reg (Pmode, srca);\n-\n-  emit_insn (gen_movstr_op (desto, srco, desta, srca));\n-  /* desto ends up being a1, which allows this type of add through MOVA.  */\n-  emit_insn (gen_addpsi3 (operands[0], desto, GEN_INT (-1)));\n-\n-  return 1;\n-}\n-\n-/* This is a strcmp() opcode.  $0 is the destination (HI) which holds\n-   <=>0 depending on the comparison, $1 is one string (MEM:BLK), and\n-   $2 is the other (MEM:BLK).  We must do the comparison, and then\n-   convert the flags to a signed integer result.  */\n-int\n-m32c_expand_cmpstr(rtx *operands)\n-{\n-  rtx src1a, src2a;\n-\n-  src1a = XEXP (operands[1], 0);\n-  src2a = XEXP (operands[2], 0);\n-\n-  if (GET_CODE (src1a) != REG\n-      || REGNO (src1a) < FIRST_PSEUDO_REGISTER)\n-    src1a = copy_to_mode_reg (Pmode, src1a);\n-\n-  if (GET_CODE (src2a) != REG\n-      || REGNO (src2a) < FIRST_PSEUDO_REGISTER)\n-    src2a = copy_to_mode_reg (Pmode, src2a);\n-\n-  emit_insn (gen_cmpstrhi_op (src1a, src2a, src1a, src2a));\n-  emit_insn (gen_cond_to_int (operands[0]));\n-\n-  return 1;\n-}\n-\n-\n-typedef rtx (*shift_gen_func)(rtx, rtx, rtx);\n-\n-static shift_gen_func\n-shift_gen_func_for (int mode, int code)\n-{\n-#define GFF(m,c,f) if (mode == m && code == c) return f\n-  GFF(QImode,  ASHIFT,   gen_ashlqi3_i);\n-  GFF(QImode,  ASHIFTRT, gen_ashrqi3_i);\n-  GFF(QImode,  LSHIFTRT, gen_lshrqi3_i);\n-  GFF(HImode,  ASHIFT,   gen_ashlhi3_i);\n-  GFF(HImode,  ASHIFTRT, gen_ashrhi3_i);\n-  GFF(HImode,  LSHIFTRT, gen_lshrhi3_i);\n-  GFF(PSImode, ASHIFT,   gen_ashlpsi3_i);\n-  GFF(PSImode, ASHIFTRT, gen_ashrpsi3_i);\n-  GFF(PSImode, LSHIFTRT, gen_lshrpsi3_i);\n-  GFF(SImode,  ASHIFT,   TARGET_A16 ? gen_ashlsi3_16 : gen_ashlsi3_24);\n-  GFF(SImode,  ASHIFTRT, TARGET_A16 ? gen_ashrsi3_16 : gen_ashrsi3_24);\n-  GFF(SImode,  LSHIFTRT, TARGET_A16 ? gen_lshrsi3_16 : gen_lshrsi3_24);\n-#undef GFF\n-  gcc_unreachable ();\n-}\n-\n-/* The m32c only has one shift, but it takes a signed count.  GCC\n-   doesn't want this, so we fake it by negating any shift count when\n-   we're pretending to shift the other way.  Also, the shift count is\n-   limited to -8..8.  It's slightly better to use two shifts for 9..15\n-   than to load the count into r1h, so we do that too.  */\n-int\n-m32c_prepare_shift (rtx * operands, int scale, int shift_code)\n-{\n-  machine_mode mode = GET_MODE (operands[0]);\n-  shift_gen_func func = shift_gen_func_for (mode, shift_code);\n-  rtx temp;\n-\n-  if (GET_CODE (operands[2]) == CONST_INT)\n-    {\n-      int maxc = TARGET_A24 && (mode == PSImode || mode == SImode) ? 32 : 8;\n-      int count = INTVAL (operands[2]) * scale;\n-\n-      while (count > maxc)\n-\t{\n-\t  temp = gen_reg_rtx (mode);\n-\t  emit_insn (func (temp, operands[1], GEN_INT (maxc)));\n-\t  operands[1] = temp;\n-\t  count -= maxc;\n-\t}\n-      while (count < -maxc)\n-\t{\n-\t  temp = gen_reg_rtx (mode);\n-\t  emit_insn (func (temp, operands[1], GEN_INT (-maxc)));\n-\t  operands[1] = temp;\n-\t  count += maxc;\n-\t}\n-      emit_insn (func (operands[0], operands[1], GEN_INT (count)));\n-      return 1;\n-    }\n-\n-  temp = gen_reg_rtx (QImode);\n-  if (scale < 0)\n-    /* The pattern has a NEG that corresponds to this. */\n-    emit_move_insn (temp, gen_rtx_NEG (QImode, operands[2]));\n-  else if (TARGET_A16 && mode == SImode)\n-    /* We do this because the code below may modify this, we don't\n-       want to modify the origin of this value.  */\n-    emit_move_insn (temp, operands[2]);\n-  else\n-    /* We'll only use it for the shift, no point emitting a move.  */\n-    temp = operands[2];\n-\n-  if (TARGET_A16 && GET_MODE_SIZE (mode) == 4)\n-    {\n-      /* The m16c has a limit of -16..16 for SI shifts, even when the\n-\t shift count is in a register.  Since there are so many targets\n-\t of these shifts, it's better to expand the RTL here than to\n-\t call a helper function.\n-\n-\t The resulting code looks something like this:\n-\n-\t\tcmp.b\tr1h,-16\n-\t\tjge.b\t1f\n-\t\tshl.l\t-16,dest\n-\t\tadd.b\tr1h,16\n-\t1f:\tcmp.b\tr1h,16\n-\t\tjle.b\t1f\n-\t\tshl.l\t16,dest\n-\t\tsub.b\tr1h,16\n-\t1f:\tshl.l\tr1h,dest\n-\n-\t We take advantage of the fact that \"negative\" shifts are\n-\t undefined to skip one of the comparisons.  */\n-\n-      rtx count;\n-      rtx tempvar;\n-      rtx_insn *insn;\n-\n-      emit_move_insn (operands[0], operands[1]);\n-\n-      count = temp;\n-      rtx_code_label *label = gen_label_rtx ();\n-      LABEL_NUSES (label) ++;\n-\n-      tempvar = gen_reg_rtx (mode);\n-\n-      if (shift_code == ASHIFT)\n-\t{\n-\t  /* This is a left shift.  We only need check positive counts.  */\n-\t  emit_jump_insn (gen_cbranchqi4 (gen_rtx_LE (VOIDmode, 0, 0),\n-\t\t\t\t\t  count, GEN_INT (16), label));\n-\t  emit_insn (func (tempvar, operands[0], GEN_INT (8)));\n-\t  emit_insn (func (operands[0], tempvar, GEN_INT (8)));\n-\t  insn = emit_insn (gen_addqi3 (count, count, GEN_INT (-16)));\n-\t  emit_label_after (label, insn);\n-\t}\n-      else\n-\t{\n-\t  /* This is a right shift.  We only need check negative counts.  */\n-\t  emit_jump_insn (gen_cbranchqi4 (gen_rtx_GE (VOIDmode, 0, 0),\n-\t\t\t\t\t  count, GEN_INT (-16), label));\n-\t  emit_insn (func (tempvar, operands[0], GEN_INT (-8)));\n-\t  emit_insn (func (operands[0], tempvar, GEN_INT (-8)));\n-\t  insn = emit_insn (gen_addqi3 (count, count, GEN_INT (16)));\n-\t  emit_label_after (label, insn);\n-\t}\n-      operands[1] = operands[0];\n-      emit_insn (func (operands[0], operands[0], count));\n-      return 1;\n-    }\n-\n-  operands[2] = temp;\n-  return 0;\n-}\n-\n-/* The m32c has a limited range of operations that work on PSImode\n-   values; we have to expand to SI, do the math, and truncate back to\n-   PSI.  Yes, this is expensive, but hopefully gcc will learn to avoid\n-   those cases.  */\n-void\n-m32c_expand_neg_mulpsi3 (rtx * operands)\n-{\n-  /* operands: a = b * i */\n-  rtx temp1; /* b as SI */\n-  rtx scale /* i as SI */;\n-  rtx temp2; /* a*b as SI */\n-\n-  temp1 = gen_reg_rtx (SImode);\n-  temp2 = gen_reg_rtx (SImode);\n-  if (GET_CODE (operands[2]) != CONST_INT)\n-    {\n-      scale = gen_reg_rtx (SImode);\n-      emit_insn (gen_zero_extendpsisi2 (scale, operands[2]));\n-    }\n-  else\n-    scale = copy_to_mode_reg (SImode, operands[2]);\n-\n-  emit_insn (gen_zero_extendpsisi2 (temp1, operands[1]));\n-  temp2 = expand_simple_binop (SImode, MULT, temp1, scale, temp2, 1, OPTAB_LIB);\n-  emit_insn (gen_truncsipsi2 (operands[0], temp2));\n-}\n-\n-/* Pattern Output Functions */\n-\n-int\n-m32c_expand_movcc (rtx *operands)\n-{\n-  rtx rel = operands[1];\n-\n-  if (GET_CODE (rel) != EQ && GET_CODE (rel) != NE)\n-    return 1;\n-  if (GET_CODE (operands[2]) != CONST_INT\n-      || GET_CODE (operands[3]) != CONST_INT)\n-    return 1;\n-  if (GET_CODE (rel) == NE)\n-    {\n-      rtx tmp = operands[2];\n-      operands[2] = operands[3];\n-      operands[3] = tmp;\n-      rel = gen_rtx_EQ (GET_MODE (rel), XEXP (rel, 0), XEXP (rel, 1));\n-    }\n-\n-  emit_move_insn (operands[0],\n-\t\t  gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]),\n-\t\t\t\t\trel,\n-\t\t\t\t\toperands[2],\n-\t\t\t\t\toperands[3]));\n-  return 0;\n-}\n-\n-/* Used for the \"insv\" pattern.  Return nonzero to fail, else done.  */\n-int\n-m32c_expand_insv (rtx *operands)\n-{\n-  rtx op0, src0, p;\n-  int mask;\n-\n-  if (INTVAL (operands[1]) != 1)\n-    return 1;\n-\n-  /* Our insv opcode (bset, bclr) can only insert a one-bit constant.  */\n-  if (GET_CODE (operands[3]) != CONST_INT)\n-    return 1;\n-  if (INTVAL (operands[3]) != 0\n-      && INTVAL (operands[3]) != 1\n-      && INTVAL (operands[3]) != -1)\n-    return 1;\n-\n-  mask = 1 << INTVAL (operands[2]);\n-\n-  op0 = operands[0];\n-  if (GET_CODE (op0) == SUBREG\n-      && SUBREG_BYTE (op0) == 0)\n-    {\n-      rtx sub = SUBREG_REG (op0);\n-      if (GET_MODE (sub) == HImode || GET_MODE (sub) == QImode)\n-\top0 = sub;\n-    }\n-\n-  if (!can_create_pseudo_p ()\n-      || (GET_CODE (op0) == MEM && MEM_VOLATILE_P (op0)))\n-    src0 = op0;\n-  else\n-    {\n-      src0 = gen_reg_rtx (GET_MODE (op0));\n-      emit_move_insn (src0, op0);\n-    }\n-\n-  if (GET_MODE (op0) == HImode\n-      && INTVAL (operands[2]) >= 8\n-      && GET_CODE (op0) == MEM)\n-    {\n-      /* We are little endian.  */\n-      rtx new_mem = gen_rtx_MEM (QImode, plus_constant (Pmode,\n-\t\t\t\t\t\t\tXEXP (op0, 0), 1));\n-      MEM_COPY_ATTRIBUTES (new_mem, op0);\n-      mask >>= 8;\n-    }\n-\n-  /* First, we generate a mask with the correct polarity.  If we are\n-     storing a zero, we want an AND mask, so invert it.  */\n-  if (INTVAL (operands[3]) == 0)\n-    {\n-      /* Storing a zero, use an AND mask */\n-      if (GET_MODE (op0) == HImode)\n-\tmask ^= 0xffff;\n-      else\n-\tmask ^= 0xff;\n-    }\n-  /* Now we need to properly sign-extend the mask in case we need to\n-     fall back to an AND or OR opcode.  */\n-  if (GET_MODE (op0) == HImode)\n-    {\n-      if (mask & 0x8000)\n-\tmask -= 0x10000;\n-    }\n-  else\n-    {\n-      if (mask & 0x80)\n-\tmask -= 0x100;\n-    }\n-\n-  switch (  (INTVAL (operands[3]) ? 4 : 0)\n-\t  + ((GET_MODE (op0) == HImode) ? 2 : 0)\n-\t  + (TARGET_A24 ? 1 : 0))\n-    {\n-    case 0: p = gen_andqi3_16 (op0, src0, GEN_INT (mask)); break;\n-    case 1: p = gen_andqi3_24 (op0, src0, GEN_INT (mask)); break;\n-    case 2: p = gen_andhi3_16 (op0, src0, GEN_INT (mask)); break;\n-    case 3: p = gen_andhi3_24 (op0, src0, GEN_INT (mask)); break;\n-    case 4: p = gen_iorqi3_16 (op0, src0, GEN_INT (mask)); break;\n-    case 5: p = gen_iorqi3_24 (op0, src0, GEN_INT (mask)); break;\n-    case 6: p = gen_iorhi3_16 (op0, src0, GEN_INT (mask)); break;\n-    case 7: p = gen_iorhi3_24 (op0, src0, GEN_INT (mask)); break;\n-    default: p = NULL_RTX; break; /* Not reached, but silences a warning.  */\n-    }\n-\n-  emit_insn (p);\n-  return 0;\n-}\n-\n-const char *\n-m32c_scc_pattern(rtx *operands, RTX_CODE code)\n-{\n-  static char buf[30];\n-  if (GET_CODE (operands[0]) == REG\n-      && REGNO (operands[0]) == R0_REGNO)\n-    {\n-      if (code == EQ)\n-\treturn \"stzx\\t#1,#0,r0l\";\n-      if (code == NE)\n-\treturn \"stzx\\t#0,#1,r0l\";\n-    }\n-  sprintf(buf, \"bm%s\\t0,%%h0\\n\\tand.b\\t#1,%%0\", GET_RTX_NAME (code));\n-  return buf;\n-}\n-\n-/* Encode symbol attributes of a SYMBOL_REF into its\n-   SYMBOL_REF_FLAGS. */\n-static void\n-m32c_encode_section_info (tree decl, rtx rtl, int first)\n-{\n-  int extra_flags = 0;\n-\n-  default_encode_section_info (decl, rtl, first);\n-  if (TREE_CODE (decl) == FUNCTION_DECL\n-      && m32c_special_page_vector_p (decl))\n-\n-    extra_flags = SYMBOL_FLAG_FUNCVEC_FUNCTION;\n-\n-  if (extra_flags)\n-    SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= extra_flags;\n-}\n-\n-/* Returns TRUE if the current function is a leaf, and thus we can\n-   determine which registers an interrupt function really needs to\n-   save.  The logic below is mostly about finding the insn sequence\n-   that's the function, versus any sequence that might be open for the\n-   current insn.  */\n-static int\n-m32c_leaf_function_p (void)\n-{\n-  int rv;\n-\n-  push_topmost_sequence ();\n-  rv = leaf_function_p ();\n-  pop_topmost_sequence ();\n-  return rv;\n-}\n-\n-/* Returns TRUE if the current function needs to use the ENTER/EXIT\n-   opcodes.  If the function doesn't need the frame base or stack\n-   pointer, it can use the simpler RTS opcode.  */\n-static bool\n-m32c_function_needs_enter (void)\n-{\n-  rtx_insn *insn;\n-  rtx sp = gen_rtx_REG (Pmode, SP_REGNO);\n-  rtx fb = gen_rtx_REG (Pmode, FB_REGNO);\n-\n-  for (insn = get_topmost_sequence ()->first; insn; insn = NEXT_INSN (insn))\n-    if (NONDEBUG_INSN_P (insn))\n-      {\n-\tif (reg_mentioned_p (sp, insn))\n-\t  return true;\n-\tif (reg_mentioned_p (fb, insn))\n-\t  return true;\n-      }\n-  return false;\n-}\n-\n-/* Mark all the subexpressions of the PARALLEL rtx PAR as\n-   frame-related.  Return PAR.\n-\n-   dwarf2out.cc:dwarf2out_frame_debug_expr ignores sub-expressions of a\n-   PARALLEL rtx other than the first if they do not have the\n-   FRAME_RELATED flag set on them.  So this function is handy for\n-   marking up 'enter' instructions.  */\n-static rtx\n-m32c_all_frame_related (rtx par)\n-{\n-  int len = XVECLEN (par, 0);\n-  int i;\n-\n-  for (i = 0; i < len; i++)\n-    F (XVECEXP (par, 0, i));\n-\n-  return par;\n-}\n-\n-/* Emits the prologue.  See the frame layout comment earlier in this\n-   file.  We can reserve up to 256 bytes with the ENTER opcode, beyond\n-   that we manually update sp.  */\n-void\n-m32c_emit_prologue (void)\n-{\n-  int frame_size, extra_frame_size = 0, reg_save_size;\n-  int complex_prologue = 0;\n-\n-  cfun->machine->is_leaf = m32c_leaf_function_p ();\n-  if (interrupt_p (cfun->decl))\n-    {\n-      cfun->machine->is_interrupt = 1;\n-      complex_prologue = 1;\n-    }\n-  else if (bank_switch_p (cfun->decl))\n-    warning (OPT_Wattributes,\n-\t     \"%<bank_switch%> has no effect on non-interrupt functions\");\n-\n-  reg_save_size = m32c_pushm_popm (PP_justcount);\n-\n-  if (interrupt_p (cfun->decl))\n-    {\n-      if (bank_switch_p (cfun->decl))\n-\temit_insn (gen_fset_b ());\n-      else if (cfun->machine->intr_pushm)\n-\temit_insn (gen_pushm (GEN_INT (cfun->machine->intr_pushm)));\n-    }\n-\n-  frame_size =\n-    m32c_initial_elimination_offset (FB_REGNO, SP_REGNO) - reg_save_size;\n-  if (frame_size == 0\n-      && !m32c_function_needs_enter ())\n-    cfun->machine->use_rts = 1;\n-\n-  if (flag_stack_usage_info)\n-    current_function_static_stack_size = frame_size;\n-\n-  if (frame_size > 254)\n-    {\n-      extra_frame_size = frame_size - 254;\n-      frame_size = 254;\n-    }\n-  if (cfun->machine->use_rts == 0)\n-    F (emit_insn (m32c_all_frame_related\n-\t\t  (TARGET_A16\n-\t\t   ? gen_prologue_enter_16 (GEN_INT (frame_size + 2))\n-\t\t   : gen_prologue_enter_24 (GEN_INT (frame_size + 4)))));\n-\n-  if (extra_frame_size)\n-    {\n-      complex_prologue = 1;\n-      if (TARGET_A16)\n-\tF (emit_insn (gen_addhi3 (gen_rtx_REG (HImode, SP_REGNO),\n-\t\t\t\t  gen_rtx_REG (HImode, SP_REGNO),\n-\t\t\t\t  GEN_INT (-extra_frame_size))));\n-      else\n-\tF (emit_insn (gen_addpsi3 (gen_rtx_REG (PSImode, SP_REGNO),\n-\t\t\t\t   gen_rtx_REG (PSImode, SP_REGNO),\n-\t\t\t\t   GEN_INT (-extra_frame_size))));\n-    }\n-\n-  complex_prologue += m32c_pushm_popm (PP_pushm);\n-\n-  /* This just emits a comment into the .s file for debugging.  */\n-  if (complex_prologue)\n-    emit_insn (gen_prologue_end ());\n-}\n-\n-/* Likewise, for the epilogue.  The only exception is that, for\n-   interrupts, we must manually unwind the frame as the REIT opcode\n-   doesn't do that.  */\n-void\n-m32c_emit_epilogue (void)\n-{\n-  int popm_count = m32c_pushm_popm (PP_justcount);\n-\n-  /* This just emits a comment into the .s file for debugging.  */\n-  if (popm_count > 0 || cfun->machine->is_interrupt)\n-    emit_insn (gen_epilogue_start ());\n-\n-  if (popm_count > 0)\n-    m32c_pushm_popm (PP_popm);\n-\n-  if (cfun->machine->is_interrupt)\n-    {\n-      machine_mode spmode = TARGET_A16 ? HImode : PSImode;\n-\n-      /* REIT clears B flag and restores $fp for us, but we still\n-\t have to fix up the stack.  USE_RTS just means we didn't\n-\t emit ENTER.  */\n-      if (!cfun->machine->use_rts)\n-\t{\n-\t  emit_move_insn (gen_rtx_REG (spmode, A0_REGNO),\n-\t\t\t  gen_rtx_REG (spmode, FP_REGNO));\n-\t  emit_move_insn (gen_rtx_REG (spmode, SP_REGNO),\n-\t\t\t  gen_rtx_REG (spmode, A0_REGNO));\n-\t  /* We can't just add this to the POPM because it would be in\n-\t     the wrong order, and wouldn't fix the stack if we're bank\n-\t     switching.  */\n-\t  if (TARGET_A16)\n-\t    emit_insn (gen_pophi_16 (gen_rtx_REG (HImode, FP_REGNO)));\n-\t  else\n-\t    emit_insn (gen_poppsi (gen_rtx_REG (PSImode, FP_REGNO)));\n-\t}\n-      if (!bank_switch_p (cfun->decl) && cfun->machine->intr_pushm)\n-\temit_insn (gen_popm (GEN_INT (cfun->machine->intr_pushm)));\n-\n-      /* The FREIT (Fast REturn from InTerrupt) instruction should be\n-         generated only for M32C/M32CM targets (generate the REIT\n-         instruction otherwise).  */\n-      if (fast_interrupt_p (cfun->decl))\n-        {\n-          /* Check if fast_attribute is set for M32C or M32CM.  */\n-          if (TARGET_A24)\n-            {\n-              emit_jump_insn (gen_epilogue_freit ());\n-            }\n-          /* If fast_interrupt attribute is set for an R8C or M16C\n-             target ignore this attribute and generated REIT\n-             instruction.  */\n-          else\n-\t    {\n-\t      warning (OPT_Wattributes,\n-\t\t       \"%<fast_interrupt%> attribute directive ignored\");\n-\t      emit_jump_insn (gen_epilogue_reit_16 ());\n-\t    }\n-        }\n-      else if (TARGET_A16)\n-\temit_jump_insn (gen_epilogue_reit_16 ());\n-      else\n-\temit_jump_insn (gen_epilogue_reit_24 ());\n-    }\n-  else if (cfun->machine->use_rts)\n-    emit_jump_insn (gen_epilogue_rts ());\n-  else if (TARGET_A16)\n-    emit_jump_insn (gen_epilogue_exitd_16 ());\n-  else\n-    emit_jump_insn (gen_epilogue_exitd_24 ());\n-}\n-\n-void\n-m32c_emit_eh_epilogue (rtx ret_addr)\n-{\n-  /* R0[R2] has the stack adjustment.  R1[R3] has the address to\n-     return to.  We have to fudge the stack, pop everything, pop SP\n-     (fudged), and return (fudged).  This is actually easier to do in\n-     assembler, so punt to libgcc.  */\n-  emit_jump_insn (gen_eh_epilogue (ret_addr, cfun->machine->eh_stack_adjust));\n-  /*  emit_clobber (gen_rtx_REG (HImode, R0L_REGNO)); */\n-}\n-\n-/* Indicate which flags must be properly set for a given conditional.  */\n-static int\n-flags_needed_for_conditional (rtx cond)\n-{\n-  switch (GET_CODE (cond))\n-    {\n-    case LE:\n-    case GT:\n-      return FLAGS_OSZ;\n-    case LEU:\n-    case GTU:\n-      return FLAGS_ZC;\n-    case LT:\n-    case GE:\n-      return FLAGS_OS;\n-    case LTU:\n-    case GEU:\n-      return FLAGS_C;\n-    case EQ:\n-    case NE:\n-      return FLAGS_Z;\n-    default:\n-      return FLAGS_N;\n-    }\n-}\n-\n-#define DEBUG_CMP 0\n-\n-/* Returns true if a compare insn is redundant because it would only\n-   set flags that are already set correctly.  */\n-static bool\n-m32c_compare_redundant (rtx_insn *cmp, rtx *operands)\n-{\n-  int flags_needed;\n-  int pflags;\n-  rtx_insn *prev;\n-  rtx pp, next;\n-  rtx op0, op1;\n-#if DEBUG_CMP\n-  int prev_icode, i;\n-#endif\n-\n-  op0 = operands[0];\n-  op1 = operands[1];\n-\n-#if DEBUG_CMP\n-  fprintf(stderr, \"\\n\\033[32mm32c_compare_redundant\\033[0m\\n\");\n-  debug_rtx(cmp);\n-  for (i=0; i<2; i++)\n-    {\n-      fprintf(stderr, \"operands[%d] = \", i);\n-      debug_rtx(operands[i]);\n-    }\n-#endif\n-\n-  next = next_nonnote_insn (cmp);\n-  if (!next || !INSN_P (next))\n-    {\n-#if DEBUG_CMP\n-      fprintf(stderr, \"compare not followed by insn\\n\");\n-      debug_rtx(next);\n-#endif\n-      return false;\n-    }\n-  if (GET_CODE (PATTERN (next)) == SET\n-      && GET_CODE (XEXP ( PATTERN (next), 1)) == IF_THEN_ELSE)\n-    {\n-      next = XEXP (XEXP (PATTERN (next), 1), 0);\n-    }\n-  else if (GET_CODE (PATTERN (next)) == SET)\n-    {\n-      /* If this is a conditional, flags_needed will be something\n-\t other than FLAGS_N, which we test below.  */\n-      next = XEXP (PATTERN (next), 1);\n-    }\n-  else\n-    {\n-#if DEBUG_CMP\n-      fprintf(stderr, \"compare not followed by conditional\\n\");\n-      debug_rtx(next);\n-#endif\n-      return false;\n-    }\n-#if DEBUG_CMP\n-  fprintf(stderr, \"conditional is: \");\n-  debug_rtx(next);\n-#endif\n-\n-  flags_needed = flags_needed_for_conditional (next);\n-  if (flags_needed == FLAGS_N)\n-    {\n-#if DEBUG_CMP\n-      fprintf(stderr, \"compare not followed by conditional\\n\");\n-      debug_rtx(next);\n-#endif\n-      return false;\n-    }\n-\n-  /* Compare doesn't set overflow and carry the same way that\n-     arithmetic instructions do, so we can't replace those.  */\n-  if (flags_needed & FLAGS_OC)\n-    return false;\n-\n-  prev = cmp;\n-  do {\n-    prev = prev_nonnote_insn (prev);\n-    if (!prev)\n-      {\n-#if DEBUG_CMP\n-\tfprintf(stderr, \"No previous insn.\\n\");\n-#endif\n-\treturn false;\n-      }\n-    if (!INSN_P (prev))\n-      {\n-#if DEBUG_CMP\n-\tfprintf(stderr, \"Previous insn is a non-insn.\\n\");\n-#endif\n-\treturn false;\n-      }\n-    pp = PATTERN (prev);\n-    if (GET_CODE (pp) != SET)\n-      {\n-#if DEBUG_CMP\n-\tfprintf(stderr, \"Previous insn is not a SET.\\n\");\n-#endif\n-\treturn false;\n-      }\n-    pflags = get_attr_flags (prev);\n-\n-    /* Looking up attributes of previous insns corrupted the recog\n-       tables.  */\n-    INSN_UID (cmp) = -1;\n-    recog (PATTERN (cmp), cmp, 0);\n-\n-    if (pflags == FLAGS_N\n-\t&& reg_mentioned_p (op0, pp))\n-      {\n-#if DEBUG_CMP\n-\tfprintf(stderr, \"intermediate non-flags insn uses op:\\n\");\n-\tdebug_rtx(prev);\n-#endif\n-\treturn false;\n-      }\n-\n-    /* Check for comparisons against memory - between volatiles and\n-       aliases, we just can't risk this one.  */\n-    if (GET_CODE (operands[0]) == MEM\n-\t|| GET_CODE (operands[0]) == MEM)\n-      {\n-#if DEBUG_CMP\n-\tfprintf(stderr, \"comparisons with memory:\\n\");\n-\tdebug_rtx(prev);\n-#endif\n-\treturn false;\n-      }\n-\n-    /* Check for PREV changing a register that's used to compute a\n-       value in CMP, even if it doesn't otherwise change flags.  */\n-    if (GET_CODE (operands[0]) == REG\n-\t&& rtx_referenced_p (SET_DEST (PATTERN (prev)), operands[0]))\n-      {\n-#if DEBUG_CMP\n-\tfprintf(stderr, \"sub-value affected, op0:\\n\");\n-\tdebug_rtx(prev);\n-#endif\n-\treturn false;\n-      }\n-    if (GET_CODE (operands[1]) == REG\n-\t&& rtx_referenced_p (SET_DEST (PATTERN (prev)), operands[1]))\n-      {\n-#if DEBUG_CMP\n-\tfprintf(stderr, \"sub-value affected, op1:\\n\");\n-\tdebug_rtx(prev);\n-#endif\n-\treturn false;\n-      }\n-\n-  } while (pflags == FLAGS_N);\n-#if DEBUG_CMP\n-  fprintf(stderr, \"previous flag-setting insn:\\n\");\n-  debug_rtx(prev);\n-  debug_rtx(pp);\n-#endif\n-\n-  if (GET_CODE (pp) == SET\n-      && GET_CODE (XEXP (pp, 0)) == REG\n-      && REGNO (XEXP (pp, 0)) == FLG_REGNO\n-      && GET_CODE (XEXP (pp, 1)) == COMPARE)\n-    {\n-      /* Adjacent cbranches must have the same operands to be\n-\t redundant.  */\n-      rtx pop0 = XEXP (XEXP (pp, 1), 0);\n-      rtx pop1 = XEXP (XEXP (pp, 1), 1);\n-#if DEBUG_CMP\n-      fprintf(stderr, \"adjacent cbranches\\n\");\n-      debug_rtx(pop0);\n-      debug_rtx(pop1);\n-#endif\n-      if (rtx_equal_p (op0, pop0)\n-\t  && rtx_equal_p (op1, pop1))\n-\treturn true;\n-#if DEBUG_CMP\n-      fprintf(stderr, \"prev cmp not same\\n\");\n-#endif\n-      return false;\n-    }\n-\n-  /* Else the previous insn must be a SET, with either the source or\n-     dest equal to operands[0], and operands[1] must be zero.  */\n-\n-  if (!rtx_equal_p (op1, const0_rtx))\n-    {\n-#if DEBUG_CMP\n-      fprintf(stderr, \"operands[1] not const0_rtx\\n\");\n-#endif\n-      return false;\n-    }\n-  if (GET_CODE (pp) != SET)\n-    {\n-#if DEBUG_CMP\n-      fprintf (stderr, \"pp not set\\n\");\n-#endif\n-      return false;\n-    }\n-  if (!rtx_equal_p (op0, SET_SRC (pp))\n-      && !rtx_equal_p (op0, SET_DEST (pp)))\n-    {\n-#if DEBUG_CMP\n-      fprintf(stderr, \"operands[0] not found in set\\n\");\n-#endif\n-      return false;\n-    }\n-\n-#if DEBUG_CMP\n-  fprintf(stderr, \"cmp flags %x prev flags %x\\n\", flags_needed, pflags);\n-#endif\n-  if ((pflags & flags_needed) == flags_needed)\n-    return true;\n-\n-  return false;\n-}\n-\n-/* Return the pattern for a compare.  This will be commented out if\n-   the compare is redundant, else a normal pattern is returned.  Thus,\n-   the assembler output says where the compare would have been.  */\n-char *\n-m32c_output_compare (rtx_insn *insn, rtx *operands)\n-{\n-  static char templ[] = \";cmp.b\\t%1,%0\";\n-  /*                             ^ 5  */\n-\n-  templ[5] = \" bwll\"[GET_MODE_SIZE(GET_MODE(operands[0]))];\n-  if (m32c_compare_redundant (insn, operands))\n-    {\n-#if DEBUG_CMP\n-      fprintf(stderr, \"cbranch: cmp not needed\\n\");\n-#endif\n-      return templ;\n-    }\n-\n-#if DEBUG_CMP\n-  fprintf(stderr, \"cbranch: cmp needed: `%s'\\n\", templ + 1);\n-#endif\n-  return templ + 1;\n-}\n-\n-#undef TARGET_ENCODE_SECTION_INFO\n-#define TARGET_ENCODE_SECTION_INFO m32c_encode_section_info\n-\n-/* If the frame pointer isn't used, we detect it manually.  But the\n-   stack pointer doesn't have as flexible addressing as the frame\n-   pointer, so we always assume we have it.  */\n-\n-#undef TARGET_FRAME_POINTER_REQUIRED\n-#define TARGET_FRAME_POINTER_REQUIRED hook_bool_void_true\n-\n-#undef TARGET_HARD_REGNO_NREGS\n-#define TARGET_HARD_REGNO_NREGS m32c_hard_regno_nregs\n-#undef TARGET_HARD_REGNO_MODE_OK\n-#define TARGET_HARD_REGNO_MODE_OK m32c_hard_regno_mode_ok\n-#undef TARGET_MODES_TIEABLE_P\n-#define TARGET_MODES_TIEABLE_P m32c_modes_tieable_p\n-\n-#undef TARGET_CAN_CHANGE_MODE_CLASS\n-#define TARGET_CAN_CHANGE_MODE_CLASS m32c_can_change_mode_class\n-\n-#undef TARGET_DOCUMENTATION_NAME\n-#define TARGET_DOCUMENTATION_NAME \"M32C\"\n-\n-/* The Global `targetm' Variable. */\n-\n-struct gcc_target targetm = TARGET_INITIALIZER;\n-\n-#include \"gt-m32c.h\"\ndiff --git a/gcc/config/m32c/m32c.h b/gcc/config/m32c/m32c.h\ndeleted file mode 100644\nindex 5c87b65a04a..00000000000\n--- a/gcc/config/m32c/m32c.h\n+++ /dev/null\n@@ -1,635 +0,0 @@\n-/* Target Definitions for R8C/M16C/M32C\n-   Copyright (C) 2005-2026 Free Software Foundation, Inc.\n-   Contributed by Red Hat.\n-\n-   This file is part of GCC.\n-\n-   GCC is free software; you can redistribute it and/or modify it\n-   under the terms of the GNU General Public License as published\n-   by the Free Software Foundation; either version 3, or (at your\n-   option) any later version.\n-\n-   GCC is distributed in the hope that it will be useful, but WITHOUT\n-   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n-   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n-   License for more details.\n-\n-   You should have received a copy of the GNU General Public License\n-   along with GCC; see the file COPYING3.  If not see\n-   <http://www.gnu.org/licenses/>.  */\n-\n-#ifndef GCC_M32C_H\n-#define GCC_M32C_H\n-\n-/* Controlling the Compilation Driver, `gcc'.  */\n-\n-#undef  STARTFILE_SPEC\n-#define STARTFILE_SPEC \"crt0.o%s crtbegin.o%s\"\n-\n-#undef  ENDFILE_SPEC\n-#define ENDFILE_SPEC \"crtend.o%s crtn.o%s\"\n-\n-#undef  LINK_SPEC\n-#define LINK_SPEC \"%{h*} %{v:-V} \\\n-\t\t   %{static:-Bstatic} %{shared:-shared} %{symbolic:-Bsymbolic}\"\n-\n-/* There are four CPU series we support, but they basically break down\n-   into two families - the R8C/M16C families, with 16-bit address\n-   registers and one set of opcodes, and the M32CM/M32C group, with\n-   24-bit address registers and a different set of opcodes.  The\n-   assembler doesn't care except for which opcode set is needed; the\n-   big difference is in the memory maps, which we cover in\n-   LIB_SPEC.  */\n-\n-#undef  ASM_SPEC\n-#define ASM_SPEC \"\\\n-%{mcpu=r8c:--m16c} \\\n-%{mcpu=m16c:--m16c} \\\n-%{mcpu=m32cm:--m32c} \\\n-%{mcpu=m32c:--m32c} \"\n-\n-/* The default is R8C hardware.  We support a simulator, which has its\n-   own libgloss and link map, plus one default link map for each chip\n-   family.  Most of the logic here is making sure we do the right\n-   thing when no CPU is specified, which defaults to R8C.  */\n-#undef  LIB_SPEC\n-#define LIB_SPEC \"-( -lc %{msim:-lsim}%{!msim:-lnosys} -) \\\n-%{msim:%{!T*: %{mcpu=m32cm:%Tsim24.ld}%{mcpu=m32c:%Tsim24.ld} \\\n-       %{!mcpu=m32cm:%{!mcpu=m32c:%Tsim16.ld}}}} \\\n-%{!T*:%{!msim: %{mcpu=m16c:%Tm16c.ld} \\\n-\t       %{mcpu=m32cm:%Tm32cm.ld} \\\n-\t       %{mcpu=m32c:%Tm32c.ld} \\\n-\t       %{!mcpu=m16c:%{!mcpu=m32cm:%{!mcpu=m32c:%Tr8c.ld}}}}} \\\n-\"\n-\n-/* Run-time Target Specification */\n-\n-/* Nothing unusual here.  */\n-#define TARGET_CPU_CPP_BUILTINS() \\\n-  { \\\n-    builtin_assert (\"cpu=m32c\"); \\\n-    builtin_assert (\"machine=m32c\"); \\\n-    builtin_define (\"__m32c__=1\"); \\\n-    if (TARGET_R8C) \\\n-      builtin_define (\"__r8c_cpu__=1\"); \\\n-    if (TARGET_M16C) \\\n-      builtin_define (\"__m16c_cpu__=1\"); \\\n-    if (TARGET_M32CM) \\\n-      builtin_define (\"__m32cm_cpu__=1\"); \\\n-    if (TARGET_M32C) \\\n-      builtin_define (\"__m32c_cpu__=1\"); \\\n-  }\n-\n-/* The pragma handlers need to know if we've started processing\n-   functions yet, as the memregs pragma should only be given at the\n-   beginning of the file.  This variable starts off TRUE and later\n-   becomes FALSE.  */\n-extern int ok_to_change_target_memregs;\n-\n-/* TARGET_CPU is a multi-way option set in m32c.opt.  While we could\n-   use enums or defines for this, this and m32c.opt are the only\n-   places that know (or care) what values are being used.  */\n-#define TARGET_R8C\t(target_cpu == 'r')\n-#define TARGET_M16C\t(target_cpu == '6')\n-#define TARGET_M32CM\t(target_cpu == 'm')\n-#define TARGET_M32C\t(target_cpu == '3')\n-\n-/* Address register sizes.  Warning: these are used all over the place\n-   to select between the two CPU families in general.  */\n-#define TARGET_A16\t(TARGET_R8C || TARGET_M16C)\n-#define TARGET_A24\t(TARGET_M32CM || TARGET_M32C)\n-\n-/* Defining data structures for per-function information */\n-\n-typedef struct GTY (()) machine_function\n-{\n-  /* How much we adjust the stack when returning from an exception\n-     handler.  */\n-  rtx eh_stack_adjust;\n-\n-  /* TRUE if the current function is an interrupt handler.  */\n-  int is_interrupt;\n-\n-  /* TRUE if the current function is a leaf function.  Currently, this\n-     only affects saving $a0 in interrupt functions.  */\n-  int is_leaf;\n-\n-  /* Bitmask that keeps track of which registers are used in an\n-     interrupt function, so we know which ones need to be saved and\n-     restored.  */\n-  int intr_pushm;\n-  /* Likewise, one element for each memreg that needs to be saved.  */\n-  char intr_pushmem[16];\n-\n-  /* TRUE if the current function can use a simple RTS to return, instead\n-     of the longer ENTER/EXIT pair.  */\n-  int use_rts;\n-}\n-machine_function;\n-\n-#define INIT_EXPANDERS m32c_init_expanders ()\n-\n-/* Storage Layout */\n-\n-#define BITS_BIG_ENDIAN 0\n-#define BYTES_BIG_ENDIAN 0\n-#define WORDS_BIG_ENDIAN 0\n-\n-/* We can do QI, HI, and SI operations pretty much equally well, but\n-   GCC expects us to have a \"native\" format, so we pick the one that\n-   matches \"int\".  Pointers are 16 bits for R8C/M16C (when TARGET_A16\n-   is true) and 24 bits for M32CM/M32C (when TARGET_A24 is true), but\n-   24-bit pointers are stored in 32-bit words.  */\n-#define UNITS_PER_WORD 2\n-#define POINTER_SIZE (TARGET_A16 ? 16 : 32)\n-#define POINTERS_EXTEND_UNSIGNED 1\n-/* We have a problem with libgcc2.  It only defines two versions of\n-   each function, one for \"int\" and one for \"long long\".  Ie it assumes\n-   that \"sizeof (int) == sizeof (long)\".  For the M32C this is not true\n-   and we need a third set of functions.  We explicitly define\n-   LIBGCC2_UNITS_PER_WORD here so that it is clear that we are expecting\n-   to get the SI and DI versions from the libgcc2.c sources, and we\n-   provide our own set of HI functions in m32c-lib2.c, which is why this\n-   definition is surrounded by #ifndef..#endif.  */\n-#ifndef LIBGCC2_UNITS_PER_WORD\n-#define LIBGCC2_UNITS_PER_WORD 4\n-#endif\n-\n-/* These match the alignment enforced by the two types of stack operations.  */\n-#define PARM_BOUNDARY (TARGET_A16 ? 8 : 16)\n-#define STACK_BOUNDARY (TARGET_A16 ? 8 : 16)\n-\n-/* We do this because we care more about space than about speed.  For\n-   the chips with 16-bit busses, we could set these to 16 if\n-   desired.  */\n-#define FUNCTION_BOUNDARY 8\n-#define BIGGEST_ALIGNMENT 8\n-\n-/* Since we have a maximum structure alignment of 8 there\n-   is no need to enforce any alignment of bitfield types.  */\n-#undef  PCC_BITFIELD_TYPE_MATTERS\n-#define PCC_BITFIELD_TYPE_MATTERS 0\n-\n-#define STRICT_ALIGNMENT 0\n-#define SLOW_BYTE_ACCESS 1\n-\n-/* Layout of Source Language Data Types */\n-\n-#define INT_TYPE_SIZE 16\n-#define SHORT_TYPE_SIZE 16\n-#define LONG_TYPE_SIZE 32\n-#define LONG_LONG_TYPE_SIZE 64\n-\n-#define DEFAULT_SIGNED_CHAR 1\n-\n-#undef PTRDIFF_TYPE\n-#define PTRDIFF_TYPE (TARGET_A16 ? \"int\" : \"long int\")\n-\n-#undef UINTPTR_TYPE\n-#define UINTPTR_TYPE (TARGET_A16 ? \"unsigned int\" : \"long unsigned int\")\n-\n-#undef  SIZE_TYPE\n-#define SIZE_TYPE \"unsigned int\"\n-\n-#undef  WCHAR_TYPE\n-#define WCHAR_TYPE \"long int\"\n-\n-#undef  WCHAR_TYPE_SIZE\n-#define WCHAR_TYPE_SIZE 32\n-\n-/* REGISTER USAGE */\n-\n-/* Register Basics */\n-\n-/* Register layout:\n-\n-        [r0h][r0l]  $r0  (16 bits, or two 8-bit halves)\n-        [--------]  $r2  (16 bits)\n-        [r1h][r1l]  $r1  (16 bits, or two 8-bit halves)\n-        [--------]  $r3  (16 bits)\n-   [---][--------]  $a0  (might be 24 bits)\n-   [---][--------]  $a1  (might be 24 bits)\n-   [---][--------]  $sb  (might be 24 bits)\n-   [---][--------]  $fb  (might be 24 bits)\n-   [---][--------]  $sp  (might be 24 bits)\n-   [-------------]  $pc  (20 or 24 bits)\n-             [---]  $flg (CPU flags)\n-   [---][--------]  $argp (virtual)\n-        [--------]  $mem0 (all 16 bits)\n-          . . .\n-        [--------]  $mem14\n-*/\n-\n-#define FIRST_PSEUDO_REGISTER   20\n-\n-/* Note that these two tables are modified based on which CPU family\n-   you select; see m32c_conditional_register_usage for details.  */\n-\n-/* r0 r2 r1 r3 - a0 a1 sb fb - sp pc flg argp - mem0..mem14 */\n-#define FIXED_REGISTERS     { 0, 0, 0, 0, \\\n-\t\t\t      0, 0, 1, 0, \\\n-\t\t\t      1, 1, 0, 1, \\\n-\t\t\t      0, 0, 0, 0, 0, 0, 0, 0 }\n-#define CALL_USED_REGISTERS { 1, 1, 1, 1, \\\n-\t\t\t      1, 1, 1, 0, \\\n-\t\t\t      1, 1, 1, 1, \\\n-\t\t\t      1, 1, 1, 1, 1, 1, 1, 1 }\n-\n-/* The *_REGNO theme matches m32c.md and most register number\n-   arguments; the PC_REGNUM is the odd one out.  */\n-#ifndef PC_REGNO\n-#define PC_REGNO 9\n-#endif\n-#define PC_REGNUM PC_REGNO\n-\n-/* Order of Allocation of Registers */\n-\n-#define REG_ALLOC_ORDER { \\\n-\t0, 1, 2, 3, 4, 5, /* r0..r3, a0, a1 */ \\\n-        12, 13, 14, 15, 16, 17, 18, 19, /* mem0..mem7 */\t\\\n-\t6, 7, 8, 9, 10, 11 /* sb, fb, sp, pc, flg, ap */ }\n-\n-/* How Values Fit in Registers */\n-\n-#define AVOID_CCMODE_COPIES\n-\n-/* Register Classes */\n-\n-/* Most registers are special purpose in some form or another, so this\n-   table is pretty big.  Class names are used for constraints also;\n-   for example the HL_REGS class (HL below) is \"Rhl\" in the md files.\n-   See m32c_reg_class_from_constraint for the mapping.  There's some\n-   duplication so that we can better isolate the reason for using\n-   constraints in the md files from the actual registers used; for\n-   example we may want to exclude a1a0 from SI_REGS in the future,\n-   without precluding their use as HImode registers.  */\n-\n-/* m7654 - m3210 - argp flg pc sp - fb sb a1 a0 - r3 r1 r2 r0 */\n-/*       mmPAR */\n-#define REG_CLASS_CONTENTS \\\n-{ { 0x00000000 }, /* NO */\\\n-  { 0x00000100 }, /* SP  - sp */\\\n-  { 0x00000080 }, /* FB  - fb */\\\n-  { 0x00000040 }, /* SB  - sb */\\\n-  { 0x000001c0 }, /* CR  - sb fb sp */\\\n-  { 0x00000001 }, /* R0  - r0 */\\\n-  { 0x00000004 }, /* R1  - r1 */\\\n-  { 0x00000002 }, /* R2  - r2 */\\\n-  { 0x00000008 }, /* R3  - r3 */\\\n-  { 0x00000003 }, /* R02 - r0r2 */\\\n-  { 0x0000000c }, /* R13 - r1r3 */\\\n-  { 0x00000005 }, /* HL  - r0 r1 */\\\n-  { 0x0000000a }, /* R23 - r2 r3 */\\\n-  { 0x0000000f }, /* R03 - r0r2 r1r3 */\\\n-  { 0x00000010 }, /* A0  - a0 */\\\n-  { 0x00000020 }, /* A1  - a1 */\\\n-  { 0x00000030 }, /* A   - a0 a1 */\\\n-  { 0x000000f0 }, /* AD  - a0 a1 sb fp */\\\n-  { 0x000001f0 }, /* PS  - a0 a1 sb fp sp */\\\n-  { 0x00000033 }, /* R02A  - r0r2 a0 a1 */ \\\n-  { 0x0000003f }, /* RA  - r0 r1 r2 r3 a0 a1 */\\\n-  { 0x0000007f }, /* GENERAL */\\\n-  { 0x00000400 }, /* FLG */\\\n-  { 0x000001ff }, /* HC  - r0l r1 r2 r3 a0 a1 sb fb sp */\\\n-  { 0x000ff000 }, /* MEM */\\\n-  { 0x000ff003 }, /* R02_A_MEM */\\\n-  { 0x000ff005 }, /* A_HL_MEM */\\\n-  { 0x000ff00c }, /* R1_R3_A_MEM */\\\n-  { 0x000ff00f }, /* R03_MEM */\\\n-  { 0x000ff03f }, /* A_HI_MEM */\\\n-  { 0x000ff0ff }, /* A_AD_CR_MEM_SI */\\\n-  { 0x000ff5ff }, /* ALL */\\\n-}\n-\n-#define QI_REGS HL_REGS\n-#define HI_REGS RA_REGS\n-#define SI_REGS R03_REGS\n-#define DI_REGS R03_REGS\n-\n-enum reg_class\n-{\n-  NO_REGS,\n-  SP_REGS,\n-  FB_REGS,\n-  SB_REGS,\n-  CR_REGS,\n-  R0_REGS,\n-  R1_REGS,\n-  R2_REGS,\n-  R3_REGS,\n-  R02_REGS,\n-  R13_REGS,\n-  HL_REGS,\n-  R23_REGS,\n-  R03_REGS,\n-  A0_REGS,\n-  A1_REGS,\n-  A_REGS,\n-  AD_REGS,\n-  PS_REGS,\n-  R02A_REGS,\n-  RA_REGS,\n-  GENERAL_REGS,\n-  FLG_REGS,\n-  HC_REGS,\n-  MEM_REGS,\n-  R02_A_MEM_REGS,\n-  A_HL_MEM_REGS,\n-  R1_R3_A_MEM_REGS,\n-  R03_MEM_REGS,\n-  A_HI_MEM_REGS,\n-  A_AD_CR_MEM_SI_REGS,\n-  ALL_REGS,\n-  LIM_REG_CLASSES\n-};\n-\n-#define N_REG_CLASSES LIM_REG_CLASSES\n-\n-#define REG_CLASS_NAMES {\\\n-\"NO_REGS\", \\\n-\"SP_REGS\", \\\n-\"FB_REGS\", \\\n-\"SB_REGS\", \\\n-\"CR_REGS\", \\\n-\"R0_REGS\", \\\n-\"R1_REGS\", \\\n-\"R2_REGS\", \\\n-\"R3_REGS\", \\\n-\"R02_REGS\", \\\n-\"R13_REGS\", \\\n-\"HL_REGS\", \\\n-\"R23_REGS\", \\\n-\"R03_REGS\", \\\n-\"A0_REGS\", \\\n-\"A1_REGS\", \\\n-\"A_REGS\", \\\n-\"AD_REGS\", \\\n-\"PS_REGS\", \\\n-\"R02A_REGS\", \\\n-\"RA_REGS\", \\\n-\"GENERAL_REGS\", \\\n-\"FLG_REGS\", \\\n-\"HC_REGS\", \\\n-\"MEM_REGS\", \\\n-\"R02_A_MEM_REGS\", \\\n-\"A_HL_MEM_REGS\", \\\n-\"R1_R3_A_MEM_REGS\", \\\n-\"R03_MEM_REGS\", \\\n-\"A_HI_MEM_REGS\", \\\n-\"A_AD_CR_MEM_SI_REGS\", \\\n-\"ALL_REGS\", \\\n-}\n-\n-#define REGNO_REG_CLASS(R) m32c_regno_reg_class (R)\n-\n-/* We support simple displacements off address registers, nothing else.  */\n-#define BASE_REG_CLASS A_REGS\n-#define INDEX_REG_CLASS NO_REGS\n-\n-/* We primarily use the new \"long\" constraint names, with the initial\n-   letter classifying the constraint type and following letters\n-   specifying which.  The types are:\n-\n-   I - integer values\n-   R - register classes\n-   S - memory references (M was used)\n-   A - addresses (currently unused)\n-*/\n-\n-#define REGNO_OK_FOR_BASE_P(NUM) m32c_regno_ok_for_base_p (NUM)\n-#define REGNO_OK_FOR_INDEX_P(NUM) 0\n-\n-#define LIMIT_RELOAD_CLASS(MODE,CLASS) \\\n-  (enum reg_class) m32c_limit_reload_class (MODE, CLASS)\n-\n-#define SECONDARY_RELOAD_CLASS(CLASS,MODE,X) \\\n-  (enum reg_class) m32c_secondary_reload_class (CLASS, MODE, X)\n-\n-#define TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P hook_bool_mode_true\n-\n-/* STACK AND CALLING */\n-\n-/* Frame Layout */\n-\n-/* Standard push/pop stack, no surprises here.  */\n-\n-#define STACK_GROWS_DOWNWARD 1\n-#define STACK_PUSH_CODE PRE_DEC\n-#define FRAME_GROWS_DOWNWARD 1\n-\n-#define FIRST_PARM_OFFSET(F) 0\n-\n-#define RETURN_ADDR_RTX(COUNT,FA) m32c_return_addr_rtx (COUNT)\n-\n-#define INCOMING_RETURN_ADDR_RTX m32c_incoming_return_addr_rtx()\n-#define INCOMING_FRAME_SP_OFFSET (TARGET_A24 ? 4 : 3)\n-\n-/* Exception Handling Support */\n-\n-#define EH_RETURN_DATA_REGNO(N) m32c_eh_return_data_regno (N)\n-#define EH_RETURN_STACKADJ_RTX m32c_eh_return_stackadj_rtx ()\n-\n-/* Registers That Address the Stack Frame */\n-\n-#ifndef FP_REGNO\n-#define FP_REGNO 7\n-#endif\n-#ifndef SP_REGNO\n-#define SP_REGNO 8\n-#endif\n-#define AP_REGNO 11\n-\n-#define STACK_POINTER_REGNUM\tSP_REGNO\n-#define FRAME_POINTER_REGNUM\tFP_REGNO\n-#define ARG_POINTER_REGNUM\tAP_REGNO\n-\n-/* The static chain must be pointer-capable.  */\n-#define STATIC_CHAIN_REGNUM A0_REGNO\n-\n-#define DWARF_FRAME_REGISTERS 20\n-#define DWARF_FRAME_REGNUM(N) m32c_dwarf_frame_regnum (N)\n-#define DEBUGGER_REGNO(N) m32c_dwarf_frame_regnum (N)\n-\n-#undef ASM_PREFERRED_EH_DATA_FORMAT\n-/* This is the same as the default in practice, except that by making\n-   it explicit we tell binutils what size pointers to use.  */\n-#define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \\\n-  (TARGET_A16 ? DW_EH_PE_udata2 : DW_EH_PE_udata4)\n-\n-/* Eliminating Frame Pointer and Arg Pointer */\n-\n-#define ELIMINABLE_REGS \\\n-  {{AP_REGNO, SP_REGNO}, \\\n-   {AP_REGNO, FB_REGNO}, \\\n-   {FB_REGNO, SP_REGNO}}\n-\n-#define INITIAL_ELIMINATION_OFFSET(FROM,TO,VAR) \\\n-\t(VAR) = m32c_initial_elimination_offset(FROM,TO)\n-\n-/* Passing Function Arguments on the Stack */\n-\n-#define PUSH_ROUNDING(N) m32c_push_rounding (N)\n-#define CALL_POPS_ARGS(C) 0\n-\n-/* Passing Arguments in Registers */\n-\n-typedef struct m32c_cumulative_args\n-{\n-  /* For address of return value buffer (structures are returned by\n-     passing the address of a buffer as an invisible first argument.\n-     This identifies it).  If set, the current parameter will be put\n-     on the stack, regardless of type.  */\n-  int force_mem;\n-  /* First parm is 1, parm 0 is hidden pointer for returning\n-     aggregates.  */\n-  int parm_num;\n-} m32c_cumulative_args;\n-\n-#define CUMULATIVE_ARGS m32c_cumulative_args\n-#define INIT_CUMULATIVE_ARGS(CA,FNTYPE,LIBNAME,FNDECL,N_NAMED_ARGS) \\\n-\tm32c_init_cumulative_args (&(CA),FNTYPE,LIBNAME,FNDECL,N_NAMED_ARGS)\n-#define FUNCTION_ARG_REGNO_P(r) m32c_function_arg_regno_p (r)\n-\n-/* How Large Values Are Returned */\n-\n-#define DEFAULT_PCC_STRUCT_RETURN 1\n-\n-/* Function Entry and Exit */\n-\n-#define EXIT_IGNORE_STACK 0\n-#define EPILOGUE_USES(REGNO) m32c_epilogue_uses(REGNO)\n-#define EH_USES(REGNO) 0\t/* FIXME */\n-\n-/* Generating Code for Profiling */\n-\n-#define FUNCTION_PROFILER(FILE,LABELNO)\n-\n-/* Implementing the Varargs Macros */\n-\n-/* Trampolines for Nested Functions */\n-\n-#define TRAMPOLINE_SIZE m32c_trampoline_size ()\n-#define TRAMPOLINE_ALIGNMENT m32c_trampoline_alignment ()\n-\n-/* Addressing Modes */\n-\n-#define HAVE_PRE_DECREMENT 1\n-#define HAVE_POST_INCREMENT 1\n-#define MAX_REGS_PER_ADDRESS 1\n-\n-/* This is passed to the macros below, so that they can be implemented\n-   in m32c.cc.  */\n-#ifdef REG_OK_STRICT\n-#define REG_OK_STRICT_V 1\n-#else\n-#define REG_OK_STRICT_V 0\n-#endif\n-\n-#define REG_OK_FOR_BASE_P(X) m32c_reg_ok_for_base_p (X, REG_OK_STRICT_V)\n-#define REG_OK_FOR_INDEX_P(X) 0\n-\n-/* #define FIND_BASE_TERM(X) when we do unspecs for symrefs */\n-\n-#define LEGITIMIZE_RELOAD_ADDRESS(X,MODE,OPNUM,TYPE,IND_LEVELS,WIN) \\\n-\tif (m32c_legitimize_reload_address(&(X),MODE,OPNUM,TYPE,IND_LEVELS)) \\\n-\t  goto WIN;\n-\n-/* Address spaces.  */\n-#define ADDR_SPACE_FAR\t1\n-\n-\n-/* Condition Code Status */\n-\n-#define REVERSIBLE_CC_MODE(MODE) 1\n-\n-/* Dividing the Output into Sections (Texts, Data, ...) */\n-\n-#define TEXT_SECTION_ASM_OP \".text\"\n-#define DATA_SECTION_ASM_OP \".data\"\n-#define BSS_SECTION_ASM_OP \".bss\"\n-\n-#define CTOR_LIST_BEGIN\n-#define CTOR_LIST_END\n-#define DTOR_LIST_BEGIN\n-#define DTOR_LIST_END\n-#define CTORS_SECTION_ASM_OP \"\\t.section\\t.init_array,\\\"aw\\\",%init_array\"\n-#define DTORS_SECTION_ASM_OP \"\\t.section\\t.fini_array,\\\"aw\\\",%fini_array\"\n-#define INIT_ARRAY_SECTION_ASM_OP \"\\t.section\\t.init_array,\\\"aw\\\",%init_array\"\n-#define FINI_ARRAY_SECTION_ASM_OP \"\\t.section\\t.fini_array,\\\"aw\\\",%fini_array\"\n-\n-/* The Overall Framework of an Assembler File */\n-\n-#define ASM_COMMENT_START \";\"\n-#define ASM_APP_ON \"\"\n-#define ASM_APP_OFF \"\"\n-\n-/* Output and Generation of Labels */\n-\n-#define GLOBAL_ASM_OP \"\\t.global\\t\"\n-\n-/* Output of Assembler Instructions */\n-\n-#define REGISTER_NAMES {\t\\\n-  \"r0\", \"r2\", \"r1\", \"r3\", \\\n-  \"a0\", \"a1\", \"sb\", \"fb\", \"sp\", \\\n-  \"pc\", \"flg\", \"argp\", \\\n-  \"mem0\",  \"mem2\",  \"mem4\",  \"mem6\",  \"mem8\",  \"mem10\",  \"mem12\",  \"mem14\", \\\n-}\n-\n-#define ADDITIONAL_REGISTER_NAMES { \\\n-  {\"r0l\", 0}, \\\n-  {\"r1l\", 2}, \\\n-  {\"r0r2\", 0}, \\\n-  {\"r1r3\", 2}, \\\n-  {\"a0a1\", 4}, \\\n-  {\"r0r2r1r3\", 0} }\n-\n-#undef USER_LABEL_PREFIX\n-#define USER_LABEL_PREFIX \"_\"\n-\n-#define ASM_OUTPUT_REG_PUSH(S,R) m32c_output_reg_push (S, R)\n-#define ASM_OUTPUT_REG_POP(S,R) m32c_output_reg_pop (S, R)\n-\n-#define ASM_OUTPUT_ALIGNED_DECL_COMMON(STREAM, DECL, NAME, SIZE, ALIGNMENT) \\\n-\tm32c_output_aligned_common (STREAM, DECL, NAME, SIZE, ALIGNMENT, 1)\n-\n-#define ASM_OUTPUT_ALIGNED_DECL_LOCAL(STREAM, DECL, NAME, SIZE, ALIGNMENT) \\\n-\tm32c_output_aligned_common (STREAM, DECL, NAME, SIZE, ALIGNMENT, 0)\n-\n-\n-/* Output of Dispatch Tables */\n-\n-#define ASM_OUTPUT_ADDR_VEC_ELT(S,V) \\\n-\tfprintf (S, \"\\t.word L%d\\n\", V)\n-\n-/* Assembler Commands for Exception Regions */\n-\n-#define DWARF_CIE_DATA_ALIGNMENT -1\n-\n-/* Assembler Commands for Alignment */\n-\n-#define ASM_OUTPUT_ALIGN(STREAM,POWER) \\\n-\tfprintf (STREAM, \"\\t.p2align\\t%d\\n\", POWER);\n-\n-/* Controlling Debugging Information Format */\n-\n-#define DWARF2_ADDR_SIZE\t4\n-\n-/* Miscellaneous Parameters */\n-\n-#define HAS_LONG_COND_BRANCH false\n-#define HAS_LONG_UNCOND_BRANCH true\n-#define CASE_VECTOR_MODE SImode\n-#define LOAD_EXTEND_OP(MEM) ZERO_EXTEND\n-\n-#define MOVE_MAX 4\n-\n-#define STORE_FLAG_VALUE 1\n-\n-/* 16- or 24-bit pointers */\n-#define Pmode (TARGET_A16 ? HImode : PSImode)\n-#define FUNCTION_MODE QImode\n-\n-#define REGISTER_TARGET_PRAGMAS() m32c_register_pragmas()\n-\n-#endif\ndiff --git a/gcc/config/m32c/m32c.md b/gcc/config/m32c/m32c.md\ndeleted file mode 100644\nindex f66deadf311..00000000000\n--- a/gcc/config/m32c/m32c.md\n+++ /dev/null\n@@ -1,79 +0,0 @@\n-;; Machine Descriptions for R8C/M16C/M32C\n-;; Copyright (C) 2005-2026 Free Software Foundation, Inc.\n-;; Contributed by Red Hat.\n-;;\n-;; This file is part of GCC.\n-;;\n-;; GCC is free software; you can redistribute it and/or modify it\n-;; under the terms of the GNU General Public License as published\n-;; by the Free Software Foundation; either version 3, or (at your\n-;; option) any later version.\n-;;\n-;; GCC is distributed in the hope that it will be useful, but WITHOUT\n-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n-;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n-;; License for more details.\n-;;\n-;; You should have received a copy of the GNU General Public License\n-;; along with GCC; see the file COPYING3.  If not see\n-;; <http://www.gnu.org/licenses/>.\n-\n-(define_constants\n-  [(R0_REGNO 0)\n-   (R2_REGNO 1)\n-   (R1_REGNO 2)\n-   (R3_REGNO 3)\n-\n-   (A0_REGNO 4)\n-   (A1_REGNO 5)\n-   (SB_REGNO 6)\n-   (FB_REGNO 7)\n-\n-   (SP_REGNO 8)\n-   (PC_REGNO 9)\n-   (FLG_REGNO 10)\n-   (MEM0_REGNO 12)\n-   (MEM7_REGNO 19)\n-   ])\n-\n-(define_constants\n-  [(UNS_PROLOGUE_END 1)\n-   (UNS_EPILOGUE_START 2)\n-   (UNS_EH_EPILOGUE 3)\n-   (UNS_PUSHM 4)\n-   (UNS_POPM 5)\n-   (UNS_SMOVF 6)\n-   (UNS_SSTR 7)\n-   (UNS_SCMPU 8)\n-   (UNS_SMOVU 9)\n-   (UNS_FSETB 10)\n-   (UNS_FREIT 11)\n-   ])\n-\n-;; n = no change, x = clobbered.  The first 16 values are chosen such\n-;; that the enum has one bit set for each flag.\n-(define_attr \"flags\" \"x,c,z,zc,s,sc,sz,szc,o,oc,oz,ozc,os,osc,osz,oszc,n\" (const_string \"n\"))\n-(define_asm_attributes [(set_attr \"flags\" \"x\")])\n-\n-(define_mode_iterator QHI [QI HI])\n-(define_mode_iterator HPSI [(HI \"TARGET_A16\") (PSI \"TARGET_A24\")])\n-(define_mode_iterator QHPSI [QI HI (PSI \"TARGET_A24\")])\n-(define_mode_iterator QHSI [QI HI (SI \"TARGET_A24\")])\n-(define_mode_attr bwl [(QI \"b\") (HI \"w\") (PSI \"l\") (SI \"l\")])\n-\n-(define_code_iterator eqne_cond [eq ne])\n-\n-\n-(define_insn \"nop\"\n-  [(const_int 0)]\n-  \"\"\n-  \"nop\"\n-  [(set_attr \"flags\" \"n\")]\n-)\n-\n-(define_insn \"no_insn\"\n-  [(const_int 1)]\n-  \"\"\n-  \"\"\n-  [(set_attr \"flags\" \"n\")]\n-)\ndiff --git a/gcc/config/m32c/m32c.opt b/gcc/config/m32c/m32c.opt\ndeleted file mode 100644\nindex d43dd0c31fa..00000000000\n--- a/gcc/config/m32c/m32c.opt\n+++ /dev/null\n@@ -1,43 +0,0 @@\n-; Target Options for R8C/M16C/M32C\n-; Copyright (C) 2005-2026 Free Software Foundation, Inc.\n-; Contributed by Red Hat.\n-;\n-; This file is part of GCC.\n-;\n-; GCC is free software; you can redistribute it and/or modify it\n-; under the terms of the GNU General Public License as published\n-; by the Free Software Foundation; either version 3, or (at your\n-; option) any later version.\n-;\n-; GCC is distributed in the hope that it will be useful, but WITHOUT\n-; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n-; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n-; License for more details.\n-;\n-; You should have received a copy of the GNU General Public License\n-; along with GCC; see the file COPYING3.  If not see\n-; <http://www.gnu.org/licenses/>.\n-\n-msim\n-Target\n--msim\tUse simulator runtime.\n-\n-mcpu=r8c\n-Target RejectNegative Var(target_cpu,'r') Init('r')\n--mcpu=r8c\tCompile code for R8C variants.\n-\n-mcpu=m16c\n-Target RejectNegative Var(target_cpu,'6')\n--mcpu=m16c\tCompile code for M16C variants.\n-\n-mcpu=m32cm\n-Target RejectNegative Var(target_cpu,'m')\n--mcpu=m32cm\tCompile code for M32CM variants.\n-\n-mcpu=m32c\n-Target RejectNegative Var(target_cpu,'3')\n--mcpu=m32c\tCompile code for M32C variants.\n-\n-memregs=\n-Target RejectNegative Joined UInteger Var(target_memregs) Init(16)\n--memregs=\tNumber of memreg bytes (default: 16, range: 0..16).\ndiff --git a/gcc/config/m32c/m32c.opt.urls b/gcc/config/m32c/m32c.opt.urls\ndeleted file mode 100644\nindex da1bc024f74..00000000000\n--- a/gcc/config/m32c/m32c.opt.urls\n+++ /dev/null\n@@ -1,8 +0,0 @@\n-; Autogenerated by regenerate-opt-urls.py from gcc/config/m32c/m32c.opt and generated HTML\n-\n-msim\n-UrlSuffix(gcc/M32C-Options.html#index-msim-4)\n-\n-memregs=\n-UrlSuffix(gcc/M32C-Options.html#index-memregs_003d)\n-\ndiff --git a/gcc/config/m32c/minmax.md b/gcc/config/m32c/minmax.md\ndeleted file mode 100644\nindex 5305b65358b..00000000000\n--- a/gcc/config/m32c/minmax.md\n+++ /dev/null\n@@ -1,57 +0,0 @@\n-;; Machine Descriptions for R8C/M16C/M32C\n-;; Copyright (C) 2005-2026 Free Software Foundation, Inc.\n-;; Contributed by Red Hat.\n-;;\n-;; This file is part of GCC.\n-;;\n-;; GCC is free software; you can redistribute it and/or modify it\n-;; under the terms of the GNU General Public License as published\n-;; by the Free Software Foundation; either version 3, or (at your\n-;; option) any later version.\n-;;\n-;; GCC is distributed in the hope that it will be useful, but WITHOUT\n-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n-;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n-;; License for more details.\n-;;\n-;; You should have received a copy of the GNU General Public License\n-;; along with GCC; see the file COPYING3.  If not see\n-;; <http://www.gnu.org/licenses/>.\n-\n-;; min, max\n-\n-(define_insn \"sminqi3\"\n-  [(set (match_operand:QI 0 \"mra_operand\" \"=RhlSd,RhlSd,??Rmm,??Rmm,Raa,Raa\")\n-\t(smin:QI (match_operand:QI 1 \"mra_operand\" \"%0,0,0,0,0,0\")\n-\t\t (match_operand:QI 2 \"mrai_operand\" \"iRhlSdRaa,?Rmm,iRhlSdRaa,?Rmm,iRhlSd,?Rmm\")))]\n-  \"TARGET_A24\"\n-  \"min.b\\t%2,%0\"\n-  [(set_attr \"flags\" \"n\")]\n-  )\n-\n-(define_insn \"sminhi3\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"=RhiSd,RhiSd,??Rmm,??Rmm\")\n-\t(smin:HI (match_operand:HI 1 \"mra_operand\" \"%0,0,0,0\")\n-\t\t (match_operand:HI 2 \"mrai_operand\" \"iRhiSd,?Rmm,iRhiSd,?Rmm\")))]\n-  \"TARGET_A24\"\n-  \"min.w\\t%2,%0\"\n-  [(set_attr \"flags\" \"n\")]\n-  )\n-\n-(define_insn \"smaxqi3\"\n-  [(set (match_operand:QI 0 \"mra_operand\" \"=RhlSd,RhlSd,??Rmm,??Rmm,Raa,Raa\")\n-\t(smax:QI (match_operand:QI 1 \"mra_operand\" \"%0,0,0,0,0,0\")\n-\t\t (match_operand:QI 2 \"mrai_operand\" \"iRhlSdRaa,?Rmm,iRhlSdRaa,?Rmm,iRhlSd,?Rmm\")))]\n-  \"TARGET_A24\"\n-  \"max.b\\t%2,%0\"\n-  [(set_attr \"flags\" \"n\")]\n-  )\n-\n-(define_insn \"smaxhi3\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"=RhiSd,RhiSd,??Rmm,??Rmm\")\n-\t(smax:HI (match_operand:HI 1 \"mra_operand\" \"%0,0,0,0\")\n-\t\t (match_operand:HI 2 \"mrai_operand\" \"iRhiSd,?Rmm,iRhiSd,?Rmm\")))]\n-  \"TARGET_A24\"\n-  \"max.w\\t%2,%0\"\n-  [(set_attr \"flags\" \"n\")]\n-  )\ndiff --git a/gcc/config/m32c/mov.md b/gcc/config/m32c/mov.md\ndeleted file mode 100644\nindex db0a08c1bd5..00000000000\n--- a/gcc/config/m32c/mov.md\n+++ /dev/null\n@@ -1,490 +0,0 @@\n-;; Machine Descriptions for R8C/M16C/M32C\n-;; Copyright (C) 2005-2026 Free Software Foundation, Inc.\n-;; Contributed by Red Hat.\n-;;\n-;; This file is part of GCC.\n-;;\n-;; GCC is free software; you can redistribute it and/or modify it\n-;; under the terms of the GNU General Public License as published\n-;; by the Free Software Foundation; either version 3, or (at your\n-;; option) any later version.\n-;;\n-;; GCC is distributed in the hope that it will be useful, but WITHOUT\n-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n-;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n-;; License for more details.\n-;;\n-;; You should have received a copy of the GNU General Public License\n-;; along with GCC; see the file COPYING3.  If not see\n-;; <http://www.gnu.org/licenses/>.\n-\n-;; move, push, extend, etc.\n-\n-;; Be careful to never create an alternative that has memory as both\n-;; src and dest, as that makes gcc think that mem-mem moves in general\n-;; are supported.  While the chip does support this, it only has two\n-;; address registers and sometimes gcc requires more than that.  One\n-;; example is code like this: a = *b where both a and b are spilled to\n-;; the stack.\n-\n-(define_insn \"mov<mode>_far_op1\"\n-  [(set (match_operand:QHI 0 \"register_operand\" \"=Rhi\")\n-\t(mem:QHI (plus:SI (sign_extend:SI (match_operand:HI 1 \"register_operand\" \"Ra0\"))\n-\t\t\t (match_operand 2 \"immediate_operand\" \"si\"))))\n-   ]\n-  \"\"\n-  \"lde.<bwl>\\t%D2[%1],%0\"\n-  [(set_attr \"flags\" \"sz\")]\n-  )\n-\n-(define_insn \"mov<mode>_far_op2\"\n-  [(set (mem:QHI (plus:SI (sign_extend:SI (match_operand:HI 0 \"register_operand\" \"Ra0\"))\n-\t\t\t (match_operand 1 \"immediate_operand\" \"si\")))\n-\t(match_operand:QHI 2 \"register_operand\"\n-\t\t\t  \"=Rhi\"))\n-   ]\n-  \"\"\n-  \"ste.<bwl>\\t%2,%D1[%0]\"\n-  [(set_attr \"flags\" \"sz\")]\n-  )\n-\n-;; Match push/pop before mov.b for passing char as arg,\n-;; e.g. stdlib/efgcvt.c.\n-(define_insn \"movqi_op\"\n-  [(set (match_operand:QI 0 \"m32c_nonimmediate_operand\"\n-\t\t\t  \"=SF,Rhi*Rmm, Rqi*Rmm, <,          RqiSd*Rmm, SdSs,    Rqi*Rmm, Sd\")\n-\t(match_operand:QI 1 \"m32c_any_operand\"\n-\t\t\t  \"Rhi*Rmm,SF, iRqi*Rmm, iRqiSd*Rmm, >,         Rqi*Rmm, SdSs,    i\"))]\n-  \"m32c_mov_ok (operands, QImode)\"\n-  \"@\n-    lde.b\\t%1,%0\n-    ste.b\\t%1,%0\n-    mov.b\\t%1,%0\n-    push.b\\t%1\n-    pop.b\\t%0\n-    mov.b\\t%1,%0\n-    mov.b\\t%1,%0\n-    mov.b\\t%1,%0\"\n-  [(set_attr \"flags\" \"sz,sz,sz,*,*,sz,sz,sz\")]\n-  )\n-\n-(define_expand \"movqi\"\n-  [(set (match_operand:QI 0 \"nonimmediate_operand\" \"=RqiSd*Rmm\")\n-\t(match_operand:QI 1 \"general_operand\" \"iRqiSd*Rmm\"))]\n-  \"\"\n-  \"if (m32c_prepare_move (operands, QImode)) DONE;\"\n-  )\n-\n-\n-(define_insn \"movhi_op\"\n-  [(set (match_operand:HI 0 \"m32c_nonimmediate_operand\"\n-\t\t\t  \"=SF,Rhi*Rmm, Rhi*Rmm,     Sd, SdSs,   *Rcr, RhiSd*Rmm, <, RhiSd*Rmm, <, *Rcr\")\n-\t(match_operand:HI 1 \"m32c_any_operand\"\n-\t\t\t  \" Rhi*Rmm,SF, iRhi*RmmSdSs, i, Rhi*Rmm, RhiSd*Rmm, *Rcr, iRhiSd*Rmm, >, *Rcr, >\"))]\n-  \"m32c_mov_ok (operands, HImode)\"\n-  \"@\n-   ste.w\\t%1,%0\n-   lde.w\\t%1,%0\n-   mov.w\\t%1,%0\n-   mov.w\\t%1,%0\n-   mov.w\\t%1,%0\n-   ldc\\t%1,%0\n-   stc\\t%1,%0\n-   push.w\\t%1\n-   pop.w\\t%0\n-   pushc\\t%1\n-   popc\\t%0\"\n-  [(set_attr \"flags\" \"sz,sz,sz,sz,sz,n,n,n,n,n,n\")]\n-  )\n-\n-(define_expand \"movhi\"\n-  [(set (match_operand:HI 0 \"m32c_nonimmediate_operand\" \"=RhiSd*Rmm\")\n-\t(match_operand:HI 1 \"m32c_any_operand\" \"iRhiSd*Rmm\"))]\n-  \"\"\n-  \"if (m32c_prepare_move (operands, HImode)) DONE;\"\n-  )\n-\n-\n-(define_insn \"movpsi_op\"\n-  [(set (match_operand:PSI 0 \"m32c_nonimmediate_operand\"\n-\t\t\t   \"=Raa, SdRmmRpi,  Rcl,  RpiSd*Rmm, <,       <, Rcl, RpiRaa*Rmm\")\n-\t(match_operand:PSI 1 \"m32c_any_operand\"\n-\t\t\t   \"sIU3, iSdRmmRpi, iRpiSd*Rmm, Rcl, Rpi*Rmm, Rcl, >, >\"))]\n-  \"TARGET_A24 && m32c_mov_ok (operands, PSImode)\"\n-  \"@\n-   mov.l:s\\t%1,%0\n-   mov.l\\t%1,%0\n-   ldc\\t%1,%0\n-   stc\\t%1,%0\n-   push.l\\t%1\n-   pushc\\t%1\n-   popc\\t%0\n-   #\"\n-  [(set_attr \"flags\" \"sz,sz,n,n,n,n,n,*\")]\n-  )\n-\n-\n-;; The intention here is to combine the add with the move to create an\n-;; indexed move.  GCC doesn't always figure this out itself.\n-\n-(define_peephole2\n-  [(set (match_operand:HPSI 0 \"register_operand\" \"\")\n-\t(plus:HPSI (match_operand:HPSI 1 \"register_operand\" \"\")\n-\t\t   (match_operand:HPSI 2 \"immediate_operand\" \"\")))\n-   (set (match_operand:QHSI 3 \"nonimmediate_operand\" \"\")\n-\t(mem:QHSI (match_operand:HPSI 4 \"register_operand\" \"\")))]\n-  \"REGNO (operands[0]) == REGNO (operands[1])\n-   && REGNO (operands[0]) == REGNO (operands[4])\n-   && (rtx_equal_p (operands[0], operands[3])\n-       || (dead_or_set_p (peep2_next_insn (1), operands[4])\n-          && ! reg_mentioned_p (operands[0], operands[3])))\"\n-  [(set (match_dup 3)\n-\t(mem:QHSI (plus:HPSI (match_dup 1)\n-\t\t\t     (match_dup 2))))]\n-  \"\")\n-\n-(define_peephole2\n-  [(set (match_operand:HPSI 0 \"register_operand\" \"\")\n-\t(plus:HPSI (match_operand:HPSI 1 \"register_operand\" \"\")\n-\t\t   (match_operand:HPSI 2 \"immediate_operand\" \"\")))\n-   (set (mem:QHSI (match_operand:HPSI 4 \"register_operand\" \"\"))\n-\t(match_operand:QHSI 3 \"m32c_any_operand\" \"\"))]\n-  \"REGNO (operands[0]) == REGNO (operands[1])\n-   && REGNO (operands[0]) == REGNO (operands[4])\n-   && dead_or_set_p (peep2_next_insn (1), operands[4])\n-   && ! reg_mentioned_p (operands[0], operands[3])\"\n-  [(set (mem:QHSI (plus:HPSI (match_dup 1)\n-\t\t\t     (match_dup 2)))\n-\t(match_dup 3))]\n-  \"\")\n-\n-; Peephole to generate SImode mov instructions for storing an\n-; immediate double data to a memory location.\n-(define_peephole2\n-  [(set (match_operand:HI 0 \"memory_operand\" \"\")\n-        (match_operand:HI 1 \"const_int_operand\" \"\"))\n-   (set (match_operand:HI 2 \"memory_operand\" \"\")\n-        (match_operand:HI 3 \"const_int_operand\" \"\"))]\n-   \"TARGET_A24 && m32c_immd_dbl_mov (operands, HImode)\"\n-   [(set (match_dup 4) (match_dup 5))]\n-   \"\"\n-)\n-\n-; Some PSI moves must be split.\n-(define_split\n-  [(set (match_operand:PSI 0 \"m32c_nonimmediate_operand\" \"\")\n-\t(match_operand:PSI 1 \"m32c_any_operand\" \"\"))]\n-  \"reload_completed && m32c_split_psi_p (operands)\"\n-  [(set (match_dup 2)\n-\t(match_dup 3))\n-   (set (match_dup 4)\n-\t(match_dup 5))]\n-  \"m32c_split_move (operands, PSImode, 3);\"\n-  )\n-\n-(define_expand \"movpsi\"\n-  [(set (match_operand:PSI 0 \"m32c_nonimmediate_operand\" \"\")\n-\t(match_operand:PSI 1 \"m32c_any_operand\" \"\"))]\n-  \"\"\n-  \"if (m32c_prepare_move (operands, PSImode)) DONE;\"\n-  )\n-\n-\n-\n-(define_expand \"movsi\"\n-  [(set (match_operand:SI 0 \"m32c_nonimmediate_operand\" \"=RsiSd*Rmm\")\n-\t(match_operand:SI 1 \"m32c_any_operand\" \"iRsiSd*Rmm\"))]\n-  \"\"\n-  \"if (m32c_split_move (operands, SImode, 0)) DONE;\"\n-  )\n-\n-; All SI moves are split if TARGET_A16\n-(define_insn_and_split \"movsi_splittable\"\n-  [(set (match_operand:SI 0 \"m32c_nonimmediate_operand\" \"=RsiRaa<*Rmm,  RsiRaaSd*Rmm,  Ss\")\n-\t(match_operand:SI 1 \"m32c_any_operand\" \"iRsiRaaSd*Rmm,  iRsiRaa>*Rmm,  RsiRaa*Rmm\"))]\n-  \"TARGET_A16\"\n-  \"#\"\n-  \"TARGET_A16\"\n-  [(pc)]\n-  \"m32c_split_move (operands, SImode, 1); DONE;\"\n-  )\n-\n-; The movsi pattern doesn't always match because sometimes the modes\n-; don't match.\n-(define_insn \"push_a01_l\"\n-  [(set (mem:SI (pre_dec:PSI (reg:PSI SP_REGNO)))\n-\t(match_operand:SI 0 \"a_operand\" \"Raa\"))]\n-  \"\"\n-  \"push.l\\t%0\"\n-  [(set_attr \"flags\" \"n\")]\n-  )\n-\n-(define_insn \"movsi_24\"\n-  [(set (match_operand:SI 0 \"m32c_nonimmediate_operand\"  \"=Rsi*Rmm,   Sd,       RsiSd*Rmm,     <\")\n-\t(match_operand:SI 1 \"m32c_any_operand\" \"iRsiSd*Rmm, iRsi*Rmm, >, iRsiRaaSd*Rmm\"))]\n-  \"TARGET_A24\"\n-  \"@\n-   mov.l\\t%1,%0\n-   mov.l\\t%1,%0\n-   #\n-   push.l\\t%1\"\n-  [(set_attr \"flags\" \"sz,sz,*,n\")]\n-  )\n-\n-(define_expand \"movdi\"\n-  [(set (match_operand:DI 0 \"m32c_nonimmediate_operand\" \"=RdiSd*Rmm\")\n-\t(match_operand:DI 1 \"m32c_any_operand\" \"iRdiSd*Rmm\"))]\n-  \"\"\n-  \"if (m32c_split_move (operands, DImode, 0)) DONE;\"\n-  )\n-\n-(define_insn_and_split \"movdi_splittable\"\n-  [(set (match_operand:DI 0 \"m32c_nonimmediate_operand\" \"=Rdi<*Rmm,RdiSd*Rmm\")\n-\t(match_operand:DI 1 \"m32c_any_operand\" \"iRdiSd*Rmm,iRdi>*Rmm\"))]\n-  \"\"\n-  \"#\"\n-  \"reload_completed\"\n-  [(pc)]\n-  \"m32c_split_move (operands, DImode, 1); DONE;\"\n-  )\n-\n-\n-\n-\n-(define_insn \"pushqi\"\n-  [(set (mem:QI (pre_dec:PSI (reg:PSI SP_REGNO)))\n-        (match_operand:QI 0 \"mrai_operand\" \"iRqiSd*Rmm\"))]\n-  \"\"\n-  \"push.b\\t%0\"\n-  [(set_attr \"flags\" \"n\")]\n-  )\n-\n-(define_expand \"pushhi\"\n-  [(set (mem:HI (pre_dec:PSI (reg:PSI SP_REGNO)))\n-        (match_operand:HI 0 \"\" \"\"))]\n-  \"\"\n-  \"if (TARGET_A16)\n-     gen_pushhi_16 (operands[0]);\n-   else\n-     gen_pushhi_24 (operands[0]);\n-   DONE;\"\n-  )\n-\n-(define_insn \"pushhi_16\"\n-  [(set (mem:HI (pre_dec:HI (reg:HI SP_REGNO)))\n-        (match_operand:HI 0 \"mrai_operand\" \"iRhiSd*Rmm,Rcr\"))]\n-  \"TARGET_A16\"\n-  \"@\n-   push.w\\t%0\n-   pushc\\t%0\"\n-  [(set_attr \"flags\" \"n,n\")]\n-  )\n-\n-(define_insn \"pushhi_24\"\n-  [(set (mem:HI (pre_dec:PSI (reg:PSI SP_REGNO)))\n-        (match_operand:HI 0 \"mrai_operand\" \"iRhiSd*Rmm\"))]\n-  \"TARGET_A24\"\n-  \"push.w\\t%0\"\n-  [(set_attr \"flags\" \"n\")]\n-  )\n-\n-;(define_insn \"pushpi\"\n-;  [(set (mem:PSI (pre_dec:PSI (reg:PSI SP_REGNO)))\n-;        (match_operand:PI 0 \"mrai_operand\" \"iRaa,Rcr\"))]\n-;  \"TARGET_A24\"\n-;  \"@\n-;   push.l\\t%0\n-;   pushc\\t%0\"\n-;  )\n-\n-(define_insn \"pushsi\"\n-  [(set (mem:SI (pre_dec:PSI (reg:PSI SP_REGNO)))\n-        (match_operand:SI 0 \"mrai_operand\" \"iRsiSd*Rmm\"))]\n-  \"TARGET_A24\"\n-  \"push.l\\t%0\"\n-  [(set_attr \"flags\" \"n\")]\n-  )\n-\n-(define_expand \"pophi\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"=RhiSd*Rmm,Rcr\")\n-        (mem:HI (post_inc:HI (reg:HI SP_REGNO))))]\n-  \"\"\n-  \"if (TARGET_A16)\n-     gen_pophi_16 (operands[0]);\n-   else\n-     gen_pophi_24 (operands[0]);\n-   DONE;\"\n-  )\n-\n-(define_insn \"pophi_16\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"=RhiSd*Rmm,Rcr\")\n-        (mem:HI (post_inc:HI (reg:HI SP_REGNO))))]\n-  \"TARGET_A16\"\n-  \"@\n-   pop.w\\t%0\n-   popc\\t%0\"\n-  [(set_attr \"flags\" \"n,n\")]\n-  )\n-\n-(define_insn \"pophi_24\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"=RhiSd*Rmm\")\n-        (mem:HI (post_inc:PSI (reg:PSI SP_REGNO))))]\n-  \"TARGET_A24\"\n-  \"pop.w\\t%0\"\n-  [(set_attr \"flags\" \"n\")]\n-  )\n-\n-(define_insn \"poppsi\"\n-  [(set (match_operand:PSI 0 \"cr_operand\" \"=Rcl\")\n-        (mem:PSI (post_inc:PSI (reg:PSI SP_REGNO))))]\n-  \"TARGET_A24\"\n-  \"popc\\t%0\"\n-  [(set_attr \"flags\" \"n\")]\n-  )\n-\n-\n-;; Rhl used here as an HI-mode Rxl\n-(define_insn \"extendqihi2\"\n-[(set (match_operand:HI 0 \"m32c_nonimmediate_operand\" \"=RhlSd*Rmm\")\n-\t(sign_extend:HI (match_operand:QI 1 \"mra_operand\" \"0\")))]\n-  \"\"\n-  \"exts.b\\t%1\"\n-  [(set_attr \"flags\" \"sz\")]\n-  )\n-\n-(define_insn \"extendhisi2\"\n-  [(set (match_operand:SI 0 \"register_operand\" \"=R03\")\n-\t(sign_extend:SI (match_operand:HI 1 \"r0123_operand\" \"0\")))]\n-  \"\"\n-  \"*\n-   if (REGNO(operands[0]) == 0) return \\\"exts.w\\t%1\\\";\n-   else return \\\"mov.w r1,r3 | sha.w #-8,r3 | sha.w #-7,r3\\\";\"\n-  [(set_attr \"flags\" \"x\")]\n-  )\n-\n-(define_insn \"extendhipsi2\"\n-  [(set (match_operand:PSI 0 \"register_operand\" \"=R03\")\n-\t(sign_extend:PSI (match_operand:HI 1 \"register_operand\" \"0\")))]\n-  \"\"\n-  \"*\n-   if (REGNO(operands[0]) == 0) return \\\"exts.w\\t%1\\\";\n-   else return \\\"mov.w r1,r3 | sha.w #-8,r3 | sha.w #-7,r3\\\";\"\n-  [(set_attr \"flags\" \"x\")]\n-  )\n-\n-(define_insn \"extendpsisi2\"\n-  [(set (match_operand:SI 0 \"mr_operand\" \"=R03Sd*Rmm\")\n-\t(sign_extend:SI (match_operand:PSI 1 \"mr_operand\" \"0\")))]\n-  \"\"\n-  \"; expand psi %1 to si %0\"\n-  [(set_attr \"flags\" \"n\")]\n-  )\n-\n-(define_insn \"zero_extendpsisi2\"\n-  [(set (match_operand:SI 0 \"mr_operand\" \"=R03Sd*Rmm\")\n-\t(zero_extend:SI (match_operand:PSI 1 \"mr_operand\" \"0\")))]\n-  \"\"\n-  \"; expand psi %1 to si %0\"\n-  [(set_attr \"flags\" \"n\")]\n-  )\n-\n-(define_insn \"zero_extendhipsi2\"\n-  [(set (match_operand:PSI 0 \"register_operand\" \"=Raa\")\n-\t(truncate:PSI (zero_extend:SI (match_operand:HI 1 \"register_operand\" \"R03\"))))]\n-  \"\"\n-  \"mov.w\\t%1,%0\"\n-  [(set_attr \"flags\" \"sz\")]\n-  )\n-\n-(define_insn \"zero_extendhisi2\"\n-  [(set (match_operand:SI 0 \"m32c_nonimmediate_operand\" \"=RsiSd\")\n-\t(zero_extend:SI (match_operand:HI 1 \"nonimmediate_operand\" \"0\")))]\n-  \"\"\n-  \"mov.w\\t#0,%H0\"\n-  [(set_attr \"flags\" \"x\")]\n-  )\n-\n-(define_insn \"zero_extendqihi2\"\n-  [(set (match_operand:HI 0 \"m32c_nonimmediate_operand\" \"=?Rhl,RhiSd*Rmm\")\n-\t(zero_extend:HI (match_operand:QI 1 \"nonimmediate_operand\" \"0,0\")))]\n-  \"\"\n-  \"@\n-   mov.b\\t#0,%H0\n-   and.w\\t#255,%0\"\n-  [(set_attr \"flags\" \"x,x\")]\n-  )\n-\n-(define_insn \"truncsipsi2_16\"\n-  [(set (match_operand:PSI 0 \"m32c_nonimmediate_operand\" \"=RsiRadSd*Rmm,Raa,Rcr,RsiSd*Rmm\")\n-\t(truncate:PSI (match_operand:SI 1 \"nonimmediate_operand\" \"0,RsiSd*Rmm,RsiSd*Rmm,Rcr\")))]\n-  \"TARGET_A16\"\n-  \"@\n-   ; no-op trunc si %1 to psi %0\n-   #\n-   ldc\\t%1,%0\n-   stc\\t%1,%0\"\n-  [(set_attr \"flags\" \"n,*,n,n\")]\n-  )\n-\n-(define_insn \"trunchiqi2\"\n-  [(set (match_operand:QI 0 \"m32c_nonimmediate_operand\" \"=RqiRmmSd\")\n-\t(truncate:QI (match_operand:HI 1 \"mra_qi_operand\" \"0\")))]\n-  \"\"\n-  \"; no-op trunc hi %1 to qi %0\"\n-  [(set_attr \"flags\" \"n\")]\n-  )\n-\n-(define_insn \"truncsipsi2_24\"\n-  [(set (match_operand:PSI 0              \"m32c_nonimmediate_operand\" \"=RsiSd*Rmm,Raa,!Rcl,RsiSd*Rmm\")\n-\t(truncate:PSI (match_operand:SI 1 \"m32c_nonimmediate_operand\" \"0,RsiSd*Rmm,RsiSd*Rmm,!Rcl\")))]\n-  \"TARGET_A24\"\n-  \"@\n-   ; no-op trunc si %1 to psi %0\n-   mov.l\\t%1,%0\n-   ldc\\t%1,%0\n-   stc\\t%1,%0\"\n-  [(set_attr \"flags\" \"n,sz,n,n\")]\n-  )\n-\n-(define_expand \"truncsipsi2\"\n-  [(set (match_operand:PSI 0 \"m32c_nonimmediate_operand\" \"=RsiRadSd*Rmm,Raa,Rcr,RsiSd*Rmm\")\n-\t(truncate:PSI (match_operand:SI 1 \"m32c_nonimmediate_operand\" \"0,RsiSd*Rmm,RsiSd*Rmm,Rcr\")))]\n-  \"\"\n-  \"\"\n-  )\n-\n-(define_expand \"reload_inqi\"\n-  [(set (match_operand:QI 2 \"\" \"=&Rqi\")\n-\t(match_operand:QI 1 \"\" \"\"))\n-   (set (match_operand:QI 0 \"\" \"\")\n-\t(match_dup 2))\n-   ]\n-  \"\"\n-  \"\")\n-\n-(define_expand \"reload_outqi\"\n-  [(set (match_operand:QI 2 \"\" \"=&Rqi\")\n-\t(match_operand:QI 1 \"\" \"\"))\n-   (set (match_operand:QI 0 \"\" \"\")\n-\t(match_dup 2))\n-   ]\n-  \"\"\n-  \"\")\n-\n-(define_expand \"reload_inhi\"\n-  [(set (match_operand:HI 2 \"\" \"=&Rhi\")\n-\t(match_operand:HI 1 \"\" \"\"))\n-   (set (match_operand:HI 0 \"\" \"\")\n-\t(match_dup 2))\n-   ]\n-  \"\"\n-  \"\")\n-\n-(define_expand \"reload_outhi\"\n-  [(set (match_operand:HI 2 \"\" \"=&Rhi\")\n-\t(match_operand:HI 1 \"\" \"\"))\n-   (set (match_operand:HI 0 \"\" \"\")\n-\t(match_dup 2))\n-   ]\n-  \"\"\n-  \"\")\ndiff --git a/gcc/config/m32c/muldiv.md b/gcc/config/m32c/muldiv.md\ndeleted file mode 100644\nindex 4affab8e71b..00000000000\n--- a/gcc/config/m32c/muldiv.md\n+++ /dev/null\n@@ -1,287 +0,0 @@\n-;; Machine Descriptions for R8C/M16C/M32C\n-;; Copyright (C) 2005-2026 Free Software Foundation, Inc.\n-;; Contributed by Red Hat.\n-;;\n-;; This file is part of GCC.\n-;;\n-;; GCC is free software; you can redistribute it and/or modify it\n-;; under the terms of the GNU General Public License as published\n-;; by the Free Software Foundation; either version 3, or (at your\n-;; option) any later version.\n-;;\n-;; GCC is distributed in the hope that it will be useful, but WITHOUT\n-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n-;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n-;; License for more details.\n-;;\n-;; You should have received a copy of the GNU General Public License\n-;; along with GCC; see the file COPYING3.  If not see\n-;; <http://www.gnu.org/licenses/>.\n-\n-;; multiply and divide\n-\n-; Here is the pattern for the const_int.\n-(define_insn \"mulqihi3_c\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"=RhiSd,??Rmm\")\n-        (mult:HI (sign_extend:HI (match_operand:QI 1 \"mra_operand\" \"%0,0\"))\n-                 (match_operand 2 \"immediate_operand\" \"i,i\")))]\n-  \"\"\n-  \"mul.b\\t%2,%1\"\n-  [(set_attr \"flags\" \"o\")]\n-)\n-\n-; Here is the pattern for registers and such.\n-(define_insn \"mulqihi3_r\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"=RhiSd,RhiSd,??Rmm,??Rmm,Raa,Raa\")\n-        (mult:HI (sign_extend:HI (match_operand:QI 1 \"mra_operand\" \"%0,0,0,0,0,0\"))\n-                 (sign_extend:HI (match_operand:QI 2 \"mra_operand\" \"RqiSd,?Rmm,RqiSd,?Rmm,RhlSd,?Rmm\"))))]\n-  \"\"\n-  \"mul.b\\t%2,%1\"\n-  [(set_attr \"flags\" \"o\")]\n-)\n-\n-; Don't try to sign_extend a const_int.  Same for all other multiplies.\n-(define_expand \"mulqihi3\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"=RhiSd,RhiSd,??Rmm,??Rmm,Raa,Raa\")\n-        (mult:HI (sign_extend:HI (match_operand:QI 1 \"mra_operand\" \"%0,0,0,0,0,0\"))\n-                 (match_operand:QI 2 \"mra_operand\" \"RqiSd,?Rmm,RqiSd,?Rmm,RhlSd,?Rmm\")))]\n-  \"\"\n-  \"{ if (GET_MODE (operands[2]) != VOIDmode)\n-      operands[2] = gen_rtx_SIGN_EXTEND (HImode, operands[2]); }\"\n-)\n-\n-(define_insn \"umulqihi3_c\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"=RhiSd,??Rmm\")\n-        (mult:HI (zero_extend:HI (match_operand:QI 1 \"mra_operand\" \"%0,0\"))\n-                 (match_operand 2 \"immediate_operand\" \"i,i\")))]\n-  \"\"\n-  \"mulu.b\\t%U2,%1\"\n-  [(set_attr \"flags\" \"o\")]\n-)\n-\n-(define_insn \"umulqihi3_r\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"=RhiSd,RhiSd,??Rmm,??Rmm,Raa,Raa\")\n-        (mult:HI (zero_extend:HI (match_operand:QI 1 \"mra_operand\" \"%0,0,0,0,0,0\"))\n-                 (zero_extend:HI (match_operand:QI 2 \"mra_operand\" \"RqiSd,?Rmm,RqiSd,?Rmm,RhlSd,?Rmm\"))))]\n-  \"\"\n-  \"mulu.b\\t%U2,%1\"\n-  [(set_attr \"flags\" \"o\")]\n-)\n-\n-(define_expand \"umulqihi3\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"=RhiSd,RhiSd,??Rmm,??Rmm,Raa,Raa\")\n-        (mult:HI (zero_extend:HI (match_operand:QI 1 \"mra_operand\" \"%0,0,0,0,0,0\"))\n-                 (match_operand:QI 2 \"mra_operand\" \"RqiSd,?Rmm,RqiSd,?Rmm,RhlSd,?Rmm\")))]\n-  \"\"\n-  \"{ if (GET_MODE (operands[2]) != VOIDmode)\n-      operands[2] = gen_rtx_ZERO_EXTEND (HImode, operands[2]); }\"\n-)\n-\n-(define_insn \"mulhisi3_c\"\n-  [(set (match_operand:SI 0 \"ra_operand\" \"=Rsi\")\n-        (mult:SI (sign_extend:SI (match_operand:HI 1 \"mra_operand\" \"%0\"))\n-                 (match_operand:HI 2 \"immediate_operand\" \"i\")))]\n-  \"\"\n-  \"mul.w\\t%2,%1\"\n-  [(set_attr \"flags\" \"o\")]\n-)\n-\n-(define_insn \"mulhisi3_r\"\n-  [(set (match_operand:SI 0 \"mra_operand\" \"=Rsi,Rsi\")\n-        (mult:SI (sign_extend:SI (match_operand:HI 1 \"mra_operand\" \"%0,0\"))\n-                 (sign_extend:SI (match_operand:HI 2 \"mra_operand\" \"RhiSd,?Rmm\"))))]\n-  \"\"\n-  \"mul.w\\t%2,%1\"\n-  [(set_attr \"flags\" \"o\")]\n-)\n-\n-(define_expand \"mulhisi3\"\n-  [(set (match_operand:SI 0 \"mra_operand\" \"=RsiSd,RsiSd,??Rmm,??Rmm\")\n-        (mult:SI (sign_extend:SI (match_operand:HI 1 \"mra_operand\" \"%0,0,0,0\"))\n-                 (match_operand:HI 2 \"mra_operand\" \"RhiSd,?Rmm,RhiSd,?Rmm\")))]\n-  \"\"\n-  \"{ if (GET_MODE (operands[2]) != VOIDmode)\n-      operands[2] = gen_rtx_SIGN_EXTEND (SImode, operands[2]); }\"\n-)\n-\n-(define_insn \"umulhisi3_c\"\n-  [(set (match_operand:SI 0 \"ra_operand\" \"=Rsi\")\n-        (mult:SI (zero_extend:SI (match_operand:HI 1 \"mra_operand\" \"%0\"))\n-                 (match_operand 2 \"immediate_operand\" \"i\")))]\n-  \"\"\n-  \"mulu.w\\t%u2,%1\"\n-  [(set_attr \"flags\" \"o\")]\n-)\n-\n-(define_insn \"umulhisi3_r\"\n-  [(set (match_operand:SI 0 \"mra_operand\" \"=Rsi,Rsi\")\n-        (mult:SI (zero_extend:SI (match_operand:HI 1 \"mra_operand\" \"%0,0\"))\n-                 (zero_extend:SI (match_operand:HI 2 \"mra_operand\" \"RhiSd,?Rmm\"))))]\n-  \"\"\n-  \"mulu.w\\t%u2,%1\"\n-  [(set_attr \"flags\" \"o\")]\n-)\n-\n-(define_expand \"umulhisi3\"\n-  [(set (match_operand:SI 0 \"mra_operand\" \"=RsiSd,RsiSd,??Rmm,??Rmm\")\n-        (mult:SI (zero_extend:SI (match_operand:HI 1 \"mra_operand\" \"%0,0,0,0\"))\n-                 (match_operand:HI 2 \"mra_operand\" \"RhiSd,?Rmm,RhiSd,?Rmm\")))]\n-  \"\"\n-  \"{ if (GET_MODE (operands[2]) != VOIDmode)\n-      operands[2] = gen_rtx_ZERO_EXTEND (SImode, operands[2]); }\"\n-)\n-\n-\n-; GCC expects to be able to multiply pointer-sized integers too, but\n-; fortunately it only multiplies by powers of two, although sometimes\n-; they're negative.\n-(define_insn \"mulpsi3_op\"\n-  [(set (match_operand:PSI 0 \"mra_operand\" \"=RsiSd\")\n-\t(mult:PSI (match_operand:PSI 1 \"mra_operand\" \"%0\")\n-\t\t  (match_operand 2 \"m32c_psi_scale\" \"Ilb\")))]\n-  \"TARGET_A24\"\n-  \"shl.l\\t%b2,%0\"\n-  [(set_attr \"flags\" \"szc\")]\n-  )\n-\n-(define_expand \"mulpsi3\"\n-  [(set (match_operand:PSI 0 \"mra_operand\" \"=RsiSd\")\n-\t(mult:PSI (match_operand:PSI 1 \"mra_operand\" \"%0\")\n-\t\t  (match_operand 2 \"m32c_psi_scale\" \"Ilb\")))]\n-  \"TARGET_A24\"\n-  \"if (GET_CODE (operands[2]) != CONST_INT\n-       || ! m32c_psi_scale (operands[2], PSImode))\n-     {\n-       m32c_expand_neg_mulpsi3 (operands);\n-       DONE;\n-     }\"\n-  )\n-\n-(define_insn \"mulsi3\"\n-  [(set (match_operand:SI 0 \"r0123_operand\" \"=R02,R02\")\n-        (mult:SI (match_operand:SI 1 \"r0123_operand\" \"%0,0\")\n-                 (match_operand:SI 2 \"mra_operand\" \"RsiSd,?Rmm\")))]\n-  \"TARGET_M32C\"\n-  \"mul.l\\t%2,%1\"\n-  [(set_attr \"flags\" \"o\")]\n-)\n-\n-(define_expand \"divmodqi4\"\n-  [(set (match_dup 4)\n-\t(sign_extend:HI (match_operand:QI 1 \"register_operand\" \"0,0\")))\n-   (parallel [(set (match_operand:QI 0 \"register_operand\" \"=R0w,R0w\")\n-\t\t   (div:QI (match_dup 4)\n-\t\t\t   (match_operand:QI 2 \"general_operand\" \"iRqiSd,?Rmm\")))\n-\t      (set (match_operand:QI 3 \"register_operand\" \"=&R0h,&R0h\")\n-\t\t   (mod:QI (match_dup 4) (match_dup 2)))\n-\t      ])]\n-  \"0\"\n-  \"operands[4] = gen_reg_rtx (HImode);\"\n-  )\n-\n-(define_insn \"divmodqi4_n\"\n-  [(set (match_operand:QI 0 \"register_operand\" \"=R0l,R0l\")\n-\t(div:QI (match_operand:HI 1 \"register_operand\" \"R0w,R0w\")\n-\t\t(match_operand:QI 2 \"general_operand\" \"iRqiSd,?Rmm\")))\n-   (set (match_operand:QI 3 \"register_operand\" \"=R0h,R0h\")\n-\t(mod:QI (match_dup 1) (match_dup 2)))\n-   ]\n-  \"0\"\n-  \"div.b\\t%2\"\n-  [(set_attr \"flags\" \"o\")]\n-  )\n-\n-(define_expand \"udivmodqi4\"\n-  [(set (match_dup 4)\n-\t(zero_extend:HI (match_operand:QI 1 \"register_operand\" \"0,0\")))\n-   (parallel [(set (match_operand:QI 0 \"register_operand\" \"=R0l,R0l\")\n-\t\t   (udiv:QI (match_dup 4)\n-\t\t\t   (match_operand:QI 2 \"general_operand\" \"iRqiSd,?Rmm\")))\n-\t      (set (match_operand:QI 3 \"register_operand\" \"=&R0h,&R0h\")\n-\t\t   (umod:QI (match_dup 4) (match_dup 2)))\n-\t      ])]\n-  \"0\"\n-  \"operands[4] = gen_reg_rtx (HImode);\"\n-  )\n-\n-(define_insn \"udivmodqi4_n\"\n-  [(set (match_operand:QI 0 \"register_operand\" \"=R0l,R0l\")\n-\t(udiv:QI (match_operand:HI 1 \"register_operand\" \"R0w,R0w\")\n-\t\t(match_operand:QI 2 \"general_operand\" \"iRqiSd,?Rmm\")))\n-   (set (match_operand:QI 3 \"register_operand\" \"=R0h,R0h\")\n-\t(umod:QI (match_dup 1) (match_dup 2)))\n-   ]\n-  \"0\"\n-  \"divu.b\\t%2\"\n-  [(set_attr \"flags\" \"o\")]\n-  )\n-\n-(define_expand \"divmodhi4\"\n-  [(set (match_dup 4)\n-\t(sign_extend:SI (match_operand:HI 1 \"register_operand\" \"0,0\")))\n-   (parallel [(set (match_operand:HI 0 \"register_operand\" \"=R0w,R0w\")\n-\t\t   (div:HI (match_dup 4)\n-\t\t\t   (match_operand:HI 2 \"general_operand\" \"iRhiSd,?Rmm\")))\n-\t      (set (match_operand:HI 3 \"register_operand\" \"=R2w,R2w\")\n-\t\t   (mod:HI (match_dup 4) (match_dup 2)))\n-\t      ])]\n-  \"\"\n-  \"operands[4] = gen_reg_rtx (SImode);\"\n-  )\n-\n-(define_insn \"divmodhi4_n\"\n-  [(set (match_operand:HI 0 \"m32c_r0_operand\" \"=R0w,R0w\")\n-\t(div:HI (match_operand:SI 1 \"m32c_r0_operand\" \"R02,R02\")\n-\t\t(match_operand:HI 2 \"m32c_notr2_operand\" \"iR1wR3wRaaSd,?Rmm\")))\n-   (set (match_operand:HI 3 \"m32c_r2_operand\" \"=R2w,R2w\")\n-\t(mod:HI (match_dup 1) (match_dup 2)))\n-   ]\n-  \"\"\n-  \"div.w\\t%2\"\n-  [(set_attr \"flags\" \"o\")]\n-  )\n-\n-(define_expand \"udivmodhi4\"\n-  [(set (match_dup 4)\n-\t(zero_extend:SI (match_operand:HI 1 \"register_operand\" \"0,0\")))\n-   (parallel [(set (match_operand:HI 0 \"register_operand\" \"=R0w,R0w\")\n-\t\t   (udiv:HI (match_dup 4)\n-\t\t\t   (match_operand:HI 2 \"general_operand\" \"iRhiSd,?Rmm\")))\n-\t      (set (match_operand:HI 3 \"register_operand\" \"=R2w,R2w\")\n-\t\t   (umod:HI (match_dup 4) (match_dup 2)))\n-\t      ])]\n-  \"\"\n-  \"operands[4] = gen_reg_rtx (SImode);\"\n-  )\n-\n-(define_insn \"udivmodhi4_n\"\n-  [(set (match_operand:HI 0 \"m32c_r0_operand\" \"=R0w,R0w\")\n-\t(udiv:HI (match_operand:SI 1 \"m32c_r0_operand\" \"R02,R02\")\n-\t\t(match_operand:HI 2 \"m32c_notr2_operand\" \"iR1wR3wRaaSd,?Rmm\")))\n-   (set (match_operand:HI 3 \"m32c_r2_operand\" \"=R2w,R2w\")\n-\t(umod:HI (match_dup 1) (match_dup 2)))\n-   ]\n-  \"\"\n-  \"divu.w\\t%2\"\n-  [(set_attr \"flags\" \"o\")]\n-  )\n-\n-(define_insn \"divsi3\"\n-  [(set (match_operand:SI 0 \"r0123_operand\" \"=R02,R02\")\n-        (div:SI (match_operand:SI 1 \"r0123_operand\" \"0,0\")\n-                (match_operand:SI 2 \"mra_operand\" \"RsiSd,?Rmm\")))]\n-  \"TARGET_M32C\"\n-  \"div.l\\t%2\"\n-  [(set_attr \"flags\" \"o\")]\n-)\n-\n-(define_insn \"udivsi3\"\n-  [(set (match_operand:SI 0 \"r0123_operand\" \"=R02,R02\")\n-        (udiv:SI (match_operand:SI 1 \"r0123_operand\" \"0,0\")\n-                 (match_operand:SI 2 \"mra_operand\" \"RsiSd,?Rmm\")))]\n-  \"TARGET_M32C\"\n-  \"divu.l\\t%2\"\n-  [(set_attr \"flags\" \"o\")]\n-)\n-\n-\ndiff --git a/gcc/config/m32c/predicates.md b/gcc/config/m32c/predicates.md\ndeleted file mode 100644\nindex b8382c9a359..00000000000\n--- a/gcc/config/m32c/predicates.md\n+++ /dev/null\n@@ -1,294 +0,0 @@\n-;; Machine Descriptions for R8C/M16C/M32C\n-;; Copyright (C) 2005-2026 Free Software Foundation, Inc.\n-;; Contributed by Red Hat.\n-;;\n-;; This file is part of GCC.\n-;;\n-;; GCC is free software; you can redistribute it and/or modify it\n-;; under the terms of the GNU General Public License as published\n-;; by the Free Software Foundation; either version 3, or (at your\n-;; option) any later version.\n-;;\n-;; GCC is distributed in the hope that it will be useful, but WITHOUT\n-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n-;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n-;; License for more details.\n-;;\n-;; You should have received a copy of the GNU General Public License\n-;; along with GCC; see the file COPYING3.  If not see\n-;; <http://www.gnu.org/licenses/>.\n-\n-;; Predicates\n-\n-; TRUE for any valid operand.  We do this because general_operand\n-; refuses to match volatile memory refs.\n-\n-(define_predicate \"m32c_any_operand\"\n-  (ior (match_operand 0 \"general_operand\")\n-       (match_code \"mem,const_int,const_double\"))\n-  {\n-    return ! m32c_illegal_subreg_p (op);\n-  }\n-)\n-\n-; Likewise for nonimmediate_operand.\n-\n-(define_predicate \"m32c_nonimmediate_operand\"\n-  (ior (match_operand 0 \"nonimmediate_operand\")\n-       (match_code \"mem\"))\n-  {\n-    return ! m32c_illegal_subreg_p (op);\n-  }\n-)\n-\n-; TRUE if the operand is a pseudo-register.\n-(define_predicate \"m32c_pseudo\"\n-  (ior (and (match_code \"reg\")\n-\t    (match_test \"REGNO(op) >= FIRST_PSEUDO_REGISTER\"))\n-       (and (match_code \"subreg\")\n-\t    (and (match_test \"GET_CODE (XEXP (op, 0)) == REG\")\n-\t\t (match_test \"REGNO(XEXP (op,0)) >= FIRST_PSEUDO_REGISTER\")))))\n-       \n-\n-; Returning true causes many predicates to NOT match.  We allow\n-; subregs for type changing, but not for size changing.\n-(define_predicate \"m32c_wide_subreg\"\n-  (and (match_code \"subreg\")\n-       (not (match_operand 0 \"m32c_pseudo\")))\n-  {\n-    unsigned int sizeo = GET_MODE_SIZE (GET_MODE (op));\n-    unsigned int sizei = GET_MODE_SIZE (GET_MODE (XEXP (op, 0)));\n-    sizeo = (sizeo + UNITS_PER_WORD - 1) / UNITS_PER_WORD;\n-    sizei = (sizei + UNITS_PER_WORD - 1) / UNITS_PER_WORD;\n-    return sizeo != sizei;\n-  })\n-\n-; TRUE for r0 through r3, or a pseudo that reload could put in r0\n-; through r3 (likewise for the next couple too)\n-(define_predicate \"r0123_operand\"\n-  (ior (match_operand 0 \"m32c_pseudo\" \"\")\n-       (and (match_code \"reg\")\n-\t    (match_test \"REGNO(op) <= R3_REGNO\"))))\n-\n-; TRUE for r0\n-(define_predicate \"m32c_r0_operand\"\n-  (ior (match_operand 0 \"m32c_pseudo\" \"\")\n-       (and (match_code \"reg\")\n-\t    (match_test \"REGNO(op) == R0_REGNO\"))))\n-\n-; TRUE for r1\n-(define_predicate \"m32c_r1_operand\"\n-  (ior (match_operand 0 \"m32c_pseudo\" \"\")\n-       (and (match_code \"reg\")\n-\t    (match_test \"REGNO(op) == R1_REGNO\"))))\n-\n-; TRUE for HL_CLASS (r0 or r1)\n-(define_predicate \"m32c_hl_operand\"\n-  (ior (match_operand 0 \"m32c_pseudo\" \"\")\n-       (and (match_code \"reg\")\n-\t    (match_test \"REGNO(op) == R0_REGNO || REGNO(op) == R1_REGNO\"))))\n-\n-\n-; TRUE for r2\n-(define_predicate \"m32c_r2_operand\"\n-  (ior (match_operand 0 \"m32c_pseudo\" \"\")\n-       (and (match_code \"reg\")\n-\t    (match_test \"REGNO(op) == R2_REGNO\"))))\n-\n-; TRUE for r3\n-(define_predicate \"m32c_r3_operand\"\n-  (ior (match_operand 0 \"m32c_pseudo\" \"\")\n-       (and (match_code \"reg\")\n-\t    (match_test \"REGNO(op) == R3_REGNO\"))))\n-\n-; TRUE for any general operand except r2.\n-(define_predicate \"m32c_notr2_operand\"\n-  (and (match_operand 0 \"general_operand\")\n-       (ior (not (match_code \"reg\"))\n-\t    (match_test \"REGNO(op) != R2_REGNO\"))))\n-\n-; TRUE for the stack pointer.\n-(define_predicate \"m32c_sp_operand\"\n-  (ior (match_operand 0 \"m32c_pseudo\" \"\")\n-       (and (match_code \"reg\")\n-\t    (match_test \"REGNO(op) == SP_REGNO\"))))\n-\n-; TRUE for control registers.\n-(define_predicate \"cr_operand\"\n-  (match_code \"reg\")\n-  \"return (REGNO (op) >= SB_REGNO\n-           && REGNO (op) <= FLG_REGNO);\")\n-\n-; TRUE for $a0 or $a1.\n-(define_predicate \"a_operand\"\n-  (and (match_code \"reg\")\n-       (match_test \"REGNO (op) == A0_REGNO || REGNO (op) == A1_REGNO\")))\n-\n-; TRUE for $a0 or $a1 or a pseudo\n-(define_predicate \"ap_operand\"\n-  (ior (match_operand 0 \"m32c_pseudo\" \"\")\n-       (and (match_code \"reg\")\n-\t    (match_test \"REGNO (op) == A0_REGNO || REGNO (op) == A1_REGNO\"))))\n-\n-; TRUE for r0 through r3, or a0 or a1.\n-(define_predicate \"ra_operand\"\n-  (and (and (match_operand 0 \"register_operand\" \"\")\n-\t    (not (match_operand 1 \"cr_operand\" \"\")))\n-       (not (match_operand 2 \"m32c_wide_subreg\" \"\"))))\n-\n-; Likewise, plus TRUE for memory references.\n-(define_predicate \"mra_operand\"\n-  (and (and (match_operand 0 \"m32c_nonimmediate_operand\" \"\")\n-\t    (not (match_operand 1 \"cr_operand\" \"\")))\n-       (not (match_operand 2 \"m32c_wide_subreg\" \"\"))))\n-\n-; Likewise, plus TRUE for subregs.\n-(define_predicate \"mras_operand\"\n-  (and (match_operand 0 \"nonimmediate_operand\" \"\")\n-       (not (match_operand 1 \"cr_operand\" \"\"))))\n-\n-; As above, but no push/pop operations\n-(define_predicate \"mra_nopp_operand\"\n-  (match_operand 0 \"mra_operand\" \"\")\n-{\n-  if (GET_CODE (op) == MEM\n-      && (GET_CODE (XEXP (op, 0)) == PRE_DEC\n-\t  || (GET_CODE (XEXP (op, 0)) == POST_INC)))\n-    return 0;\n-  return 1;\n-})\n-\n-; TRUE for memory, r0..r3, a0..a1, or immediates.\n-(define_predicate \"mrai_operand\"\n-  (and (and (match_operand 0 \"m32c_any_operand\" \"\")\n-\t    (not (match_operand 1 \"cr_operand\" \"\")))\n-       (not (match_operand 2 \"m32c_wide_subreg\" \"\"))))\n-\n-; Likewise, plus true for subregs.\n-(define_predicate \"mrasi_operand\"\n-  (and (match_operand 0 \"general_operand\" \"\")\n-       (not (match_operand 1 \"cr_operand\" \"\"))))\n-\n-; TRUE for r0..r3 or memory.\n-(define_predicate \"mr_operand\"\n-  (and (match_operand 0 \"mra_operand\" \"\")\n-       (not (match_operand 1 \"a_operand\" \"\"))))\n-\n-; TRUE for a0..a1 or memory.\n-(define_predicate \"ma_operand\"\n-  (ior (match_operand 0 \"a_operand\" \"\")\n-       (match_operand 1 \"memory_operand\" \"\")))\n-\n-; TRUE for memory operands that are not indexed\n-(define_predicate \"memsym_operand\"\n-  (and (match_operand 0 \"memory_operand\" \"\")\n-       (match_test \"satisfies_constraint_Si (op)\")))\n-\n-; TRUE for memory operands with small integer addresses\n-(define_predicate \"memimmed_operand\"\n-  (and (match_operand 0 \"memory_operand\" \"\")\n-       (match_test \"satisfies_constraint_Sp (op)\")))\n-\n-; TRUE for r1h.  This is complicated since r1h isn't a register GCC\n-; normally knows about.\n-(define_predicate \"r1h_operand\"\n-  (match_code \"zero_extract\")\n-  {\n-    rtx reg = XEXP (op, 0);\n-    rtx size = XEXP (op, 1);\n-    rtx pos = XEXP (op, 2);\n-    return (GET_CODE (reg) == REG\n-\t    && REGNO (reg) == R1_REGNO\n-\t    && GET_CODE (size) == CONST_INT\n-\t    && INTVAL (size) == 8\n-\t    && GET_CODE (pos) == CONST_INT\n-\t    && INTVAL (pos) == 8);\n-  })\n-\n-; TRUE if we can shift by this amount.  Constant shift counts have a\n-; limited range.\n-(define_predicate \"shiftcount_operand\"\n-  (ior (match_operand 0 \"mra_operand\" \"\")\n-       (and (match_operand 2 \"const_int_operand\" \"\")\n-\t    (match_test \"INTVAL (op) >= -8 && INTVAL (op) && INTVAL (op) <= 8\"))))\n-(define_predicate \"longshiftcount_operand\"\n-  (ior (match_operand 0 \"mra_operand\" \"\")\n-       (and (match_operand 2 \"const_int_operand\" \"\")\n-\t    (match_test \"INTVAL (op) >= -32 && INTVAL (op) && INTVAL (op) <= 32\"))))\n-\n-; TRUE for r0..r3, a0..a1, or sp.\n-(define_predicate \"mra_or_sp_operand\"\n-  (and (ior (match_operand 0 \"mra_operand\")\n-\t    (match_operand 1 \"m32c_sp_operand\"))\n-       (not (match_operand 2 \"m32c_wide_subreg\" \"\"))))\n-\n-\n-; TRUE for r2 or r3.\n-(define_predicate \"m32c_r2r3_operand\"\n-  (ior (and (match_code \"reg\")\n-\t    (ior (match_test \"REGNO(op) == R2_REGNO\")\n-\t\t (match_test \"REGNO(op) == R3_REGNO\")))\n-       (and (match_code \"subreg\")\n-\t    (match_test \"GET_CODE (XEXP (op, 0)) == REG && (REGNO (XEXP (op, 0)) == R2_REGNO || REGNO (XEXP (op, 0)) == R3_REGNO)\"))))\n-\n-; Likewise, plus TRUE for a0..a1.\n-(define_predicate \"m32c_r2r3a_operand\"\n-  (ior (match_operand 0 \"m32c_r2r3_operand\" \"\")\n-       (match_operand 0 \"a_operand\" \"\")))\n-\n-; These two are only for movqi - no subreg limit\n-(define_predicate \"mra_qi_operand\"\n-  (and (and (match_operand 0 \"m32c_nonimmediate_operand\" \"\")\n-\t    (not (match_operand 1 \"cr_operand\" \"\")))\n-       (not (match_operand 1 \"m32c_r2r3a_operand\" \"\"))))\n-\n-(define_predicate \"mrai_qi_operand\"\n-  (and (and (match_operand 0 \"m32c_any_operand\" \"\")\n-\t    (not (match_operand 1 \"cr_operand\" \"\")))\n-       (not (match_operand 1 \"m32c_r2r3a_operand\" \"\"))))\n-\n-(define_predicate \"a_qi_operand\"\n-  (ior (match_operand 0 \"m32c_pseudo\" \"\")\n-       (match_operand 1 \"a_operand\" \"\")))\n-\n-; TRUE for comparisons we support.\n-(define_predicate \"m32c_cmp_operator\"\n-  (match_code \"eq,ne,gt,gtu,lt,ltu,ge,geu,le,leu\"))\n-\n-(define_predicate \"m32c_eqne_operator\"\n-  (match_code \"eq,ne\"))\n-\n-; TRUE for mem0\n-(define_predicate \"m32c_mem0_operand\"\n-  (ior (match_operand 0 \"m32c_pseudo\" \"\")\n-       (and (match_code \"reg\")\n-\t    (match_test \"REGNO(op) == MEM0_REGNO\"))))\n-\n-; TRUE for things the call patterns can return.\n-(define_predicate \"m32c_return_operand\"\n-  (ior (match_operand 0 \"m32c_r0_operand\")\n-       (ior (match_operand 0 \"m32c_mem0_operand\")\n-\t    (match_code \"parallel\"))))\n-\n-; TRUE for constants we can multiply pointers by\n-(define_predicate \"m32c_psi_scale\"\n-  (and (match_operand 0 \"const_int_operand\")\n-       (match_test \"satisfies_constraint_Ilb (op)\")))\n-\n-; TRUE for one bit set (bit) or clear (mask) out of N bits.\n-\n-(define_predicate \"m32c_1bit8_operand\"\n-  (and (match_operand 0 \"const_int_operand\")\n-       (match_test \"satisfies_constraint_Ilb (op)\")))\n-\n-(define_predicate \"m32c_1bit16_operand\"\n-  (and (match_operand 0 \"const_int_operand\")\n-       (match_test \"satisfies_constraint_Ilw (op)\")))\n-\n-(define_predicate \"m32c_1mask8_operand\"\n-  (and (match_operand 0 \"const_int_operand\")\n-       (match_test \"satisfies_constraint_ImB (op)\")))\n-\n-(define_predicate \"m32c_1mask16_operand\"\n-  (and (match_operand 0 \"const_int_operand\")\n-       (match_test \"satisfies_constraint_Imw (op)\")))\ndiff --git a/gcc/config/m32c/prologue.md b/gcc/config/m32c/prologue.md\ndeleted file mode 100644\nindex 922e8cad6a6..00000000000\n--- a/gcc/config/m32c/prologue.md\n+++ /dev/null\n@@ -1,201 +0,0 @@\n-;; Machine Descriptions for R8C/M16C/M32C\n-;; Copyright (C) 2005-2026 Free Software Foundation, Inc.\n-;; Contributed by Red Hat.\n-;;\n-;; This file is part of GCC.\n-;;\n-;; GCC is free software; you can redistribute it and/or modify it\n-;; under the terms of the GNU General Public License as published\n-;; by the Free Software Foundation; either version 3, or (at your\n-;; option) any later version.\n-;;\n-;; GCC is distributed in the hope that it will be useful, but WITHOUT\n-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n-;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n-;; License for more details.\n-;;\n-;; You should have received a copy of the GNU General Public License\n-;; along with GCC; see the file COPYING3.  If not see\n-;; <http://www.gnu.org/licenses/>.\n-\n-;; Prologue and epilogue patterns\n-\n-(define_expand \"prologue\"\n-  [(const_int 1)]\n-  \"\"\n-  \"m32c_emit_prologue(); DONE;\"\n-  )\n-\n-; For the next two, operands[0] is the amount of stack space we want\n-; to reserve.\n-\n-; We assume dwarf2out will process each set in sequence.\n-(define_insn \"prologue_enter_16\"\n-  [(set (mem:HI (plus:HI (reg:HI SP_REGNO) (const_int -2)))\n-\t(reg:HI FB_REGNO))\n-   (set (reg:HI FB_REGNO)\n-\t(plus:HI (reg:HI SP_REGNO) (const_int -2)))\n-   (set (reg:HI SP_REGNO)\n-\t(minus:HI (reg:HI SP_REGNO)\n-\t           (match_operand 0 \"const_int_operand\" \"i\")))\n-   ]\n-  \"TARGET_A16\"\n-  {\n-    /* This is due to binutils bug gas/4659.  */\n-    if (INTVAL (operands[0]) == 2)\n-      return \"enter\\t#0\";\n-    return \"enter\\t%0-2\";\n-  }\n-  [(set_attr \"flags\" \"x\")]\n-  )\n-\n-(define_insn \"prologue_enter_24\"\n-  [(set (mem:SI (plus:PSI (reg:PSI SP_REGNO) (const_int -4)))\n-\t(reg:SI FB_REGNO))\n-   (set (reg:PSI FB_REGNO)\n-\t(plus:PSI (reg:PSI SP_REGNO) (const_int -4)))\n-   (set (reg:PSI SP_REGNO)\n-\t(minus:PSI (reg:PSI SP_REGNO)\n-\t           (match_operand 0 \"const_int_operand\" \"i\")))\n-   ]\n-  \"TARGET_A24\"\n-  {\n-    /* This is due to binutils bug gas/4659.  */\n-    if (INTVAL (operands[0]) == 4)\n-      return \"enter\\t#0\";\n-    return \"enter\\t%0-4\";\n-  }\n-  [(set_attr \"flags\" \"x\")]\n-  )\n-\n-; Just a comment, for debugging the assembler output.\n-(define_insn \"prologue_end\"\n-  [(unspec_volatile [(const_int 0)] UNS_PROLOGUE_END)]\n-  \"\"\n-  \"; end of prologue\"\n-  [(set_attr \"flags\" \"n\")]\n-  )\n-\n-\n-\n-(define_expand \"epilogue\"\n-  [(const_int 1)]\n-  \"\"\n-  \"m32c_emit_epilogue(); DONE;\"\n-  )\n-\n-(define_expand \"eh_return\"\n-  [(match_operand:PSI 0 \"\" \"\")]\n-  \"\"\n-  \"m32c_emit_eh_epilogue(operands[0]);\n-   emit_barrier ();\n-   DONE;\"\n-  )\n-\n-(define_insn \"eh_epilogue\"\n-  [(set (pc)\n-\t(unspec_volatile [(match_operand 0 \"m32c_r1_operand\" \"\")\n-\t\t\t  (match_operand 1 \"m32c_r0_operand\" \"\")\n-\t\t\t  ] UNS_EH_EPILOGUE))\n-   (return)]\n-  \"\"\n-  \"jmp.a\\t__m32c_eh_return\"\n-  [(set_attr \"flags\" \"x\")]\n-  )\n-\n-(define_insn \"epilogue_exitd_16\"\n-  [(set (reg:HI SP_REGNO)\n-\t(plus:HI (reg:HI FB_REGNO)\n-\t      (const_int 2)))\n-   (set (reg:HI FB_REGNO)\n-\t(mem:HI (reg:HI FB_REGNO)))\n-   (return)\n-   ]\n-  \"TARGET_A16\"\n-  \"exitd\"\n-  [(set_attr \"flags\" \"x\")]\n-  )\n-\n-(define_insn \"epilogue_reit_16\"\n-  [(set (reg:HI SP_REGNO)\n-\t(plus:HI (reg:HI SP_REGNO)\n-\t      (const_int 4)))\n-   (return)\n-   ]\n-  \"TARGET_A16\"\n-  \"reit\"\n-  [(set_attr \"flags\" \"x\")]\n-  )\n-\n-(define_insn \"epilogue_exitd_24\"\n-  [(set (reg:PSI SP_REGNO)\n-\t(plus:PSI (reg:PSI FB_REGNO)\n-\t      (const_int 4)))\n-   (set (reg:PSI FB_REGNO)\n-\t(mem:PSI (reg:PSI FB_REGNO)))\n-   (return)\n-   ]\n-  \"TARGET_A24\"\n-  \"exitd\"\n-  [(set_attr \"flags\" \"x\")]\n-  )\n-\n-(define_insn \"epilogue_reit_24\"\n-  [(set (reg:PSI SP_REGNO)\n-\t(plus:PSI (reg:PSI SP_REGNO)\n-\t      (const_int 6)))\n-   (return)\n-   ]\n-  \"TARGET_A24\"\n-  \"reit\"\n-  [(set_attr \"flags\" \"x\")]\n-  )\n-\n-(define_insn \"epilogue_freit\"\n-  [(unspec [(const_int 0)] UNS_FREIT)\n-   (return)\n-   ]\n-  \"\"\n-  \"freit\"\n-  [(set_attr \"flags\" \"x\")]\n-  )\n-\n-(define_insn \"epilogue_rts\"\n-  [(return)\n-   ]\n-  \"\"\n-  \"rts\"\n-  [(set_attr \"flags\" \"x\")]\n-  )\n-\n-(define_insn \"epilogue_start\"\n-  [(unspec_volatile [(const_int 0)] UNS_EPILOGUE_START)]\n-  \"\"\n-  \"; start of epilogue\"\n-  [(set_attr \"flags\" \"n\")]\n-  )\n-\n-\n-; These are used by the prologue/epilogue code.\n-\n-(define_insn \"pushm\"\n-  [(unspec [(match_operand 0 \"const_int_operand\" \"i\")] UNS_PUSHM)]\n-  \"\"\n-  \"pushm\\t%p0\"\n-  [(set_attr \"flags\" \"n\")]\n-  )\n-\n-(define_insn \"popm\"\n-  [(unspec [(match_operand 0 \"const_int_operand\" \"i\")] UNS_POPM)]\n-  \"\"\n-  \"popm\\t%p0\"\n-  [(set_attr \"flags\" \"n\")]\n-  )\n-\n-(define_insn \"fset_b\"\n-  [(unspec [(const_int 0)] UNS_FSETB)]\n-  \"\"\n-  \"fset\\tB\"\n-  [(set_attr \"flags\" \"n\")]\n-  )\n-\ndiff --git a/gcc/config/m32c/shift.md b/gcc/config/m32c/shift.md\ndeleted file mode 100644\nindex c80bf401cb1..00000000000\n--- a/gcc/config/m32c/shift.md\n+++ /dev/null\n@@ -1,351 +0,0 @@\n-;; Machine Descriptions for R8C/M16C/M32C\n-;; Copyright (C) 2005-2026 Free Software Foundation, Inc.\n-;; Contributed by Red Hat.\n-;;\n-;; This file is part of GCC.\n-;;\n-;; GCC is free software; you can redistribute it and/or modify it\n-;; under the terms of the GNU General Public License as published\n-;; by the Free Software Foundation; either version 3, or (at your\n-;; option) any later version.\n-;;\n-;; GCC is distributed in the hope that it will be useful, but WITHOUT\n-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n-;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n-;; License for more details.\n-;;\n-;; You should have received a copy of the GNU General Public License\n-;; along with GCC; see the file COPYING3.  If not see\n-;; <http://www.gnu.org/licenses/>.\n-\n-;; bit shifting\n-\n-; Shifts are unusual for m32c.  We only support shifting in one\n-; \"direction\" but the shift count is signed.  Also, immediate shift\n-; counts have a limited range, and variable shift counts have to be in\n-; $r1h which GCC normally doesn't even know about.\n-\n-; Other than compensating for the above, the patterns below are pretty\n-; straightforward.\n-\n-(define_insn \"ashlqi3_i\"\n-  [(set (match_operand:QI 0 \"mra_operand\" \"=RqiSd*Rmm,RqiSd*Rmm\")\n-\t(ashift:QI (match_operand:QI 1 \"mra_operand\" \"0,0\")\n-\t\t   (match_operand:QI 2 \"mrai_operand\" \"In4,RqiSd\")))\n-   (clobber (match_scratch:HI 3 \"=X,R1w\"))]\n-  \"\"\n-  \"@\n-   sha.b\\t%2,%0\n-   mov.b\\t%2,r1h\\n\\tsha.b\\tr1h,%0\"\n-  [(set_attr \"flags\" \"oszc,oszc\")]\n-  )\n-\n-(define_insn \"ashrqi3_i\"\n-  [(set (match_operand:QI 0 \"mra_operand\" \"=RqiSd*Rmm,RqiSd*Rmm\")\n-\t(ashiftrt:QI (match_operand:QI 1 \"mra_operand\" \"0,0\")\n-\t\t     (neg:QI (match_operand:QI 2 \"mrai_operand\" \"In4,RqiSd\"))))\n-   (clobber (match_scratch:HI 3 \"=X,R1w\"))]\n-  \"\"\n-  \"@\n-   sha.b\\t%2,%0\n-   mov.b\\t%2,r1h\\n\\tsha.b\\tr1h,%0\"\n-  [(set_attr \"flags\" \"oszc,oszc\")]\n-  )\n-\n-(define_insn \"lshrqi3_i\"\n-  [(set (match_operand:QI 0 \"mra_operand\" \"=RqiSd*Rmm,RqiSd*Rmm\")\n-\t(lshiftrt:QI (match_operand:QI 1 \"mra_operand\" \"0,0\")\n-\t\t     (neg:QI (match_operand:QI 2 \"mrai_operand\" \"In4,RqiSd\"))))\n-   (clobber (match_scratch:HI 3 \"=X,R1w\"))]\n-  \"\"\n-  \"@\n-   shl.b\\t%2,%0\n-   mov.b\\t%2,r1h\\n\\tshl.b\\tr1h,%0\"\n-  [(set_attr \"flags\" \"szc,szc\")]\n-  )\n-\n-\n-(define_expand \"ashlqi3\"\n-  [(parallel [(set (match_operand:QI 0 \"mra_operand\" \"\")\n-\t(ashift:QI (match_operand:QI 1 \"mra_operand\" \"\")\n-\t\t   (match_operand:QI 2 \"general_operand\" \"\")))\n-   (clobber (match_scratch:HI 3 \"\"))])]\n-  \"\"\n-  \"if (m32c_prepare_shift (operands, 1, ASHIFT))\n-     DONE;\"\n-  )\n-\n-(define_expand \"ashrqi3\"\n-  [(parallel [(set (match_operand:QI 0 \"mra_operand\" \"\")\n-\t(ashiftrt:QI (match_operand:QI 1 \"mra_operand\" \"\")\n-\t\t     (neg:QI (match_operand:QI 2 \"general_operand\" \"\"))))\n-   (clobber (match_scratch:HI 3 \"\"))])]\n-  \"\"\n-  \"if (m32c_prepare_shift (operands, -1, ASHIFTRT))\n-     DONE;\"\n-  )\n-\n-(define_expand \"lshrqi3\"\n-  [(parallel [(set (match_operand:QI 0 \"mra_operand\" \"\")\n-\t\t   (lshiftrt:QI (match_operand:QI 1 \"mra_operand\" \"\")\n-\t\t\t\t(neg:QI (match_operand:QI 2 \"general_operand\" \"\"))))\n-\t      (clobber (match_scratch:HI 3 \"\"))])]\n-  \"\"\n-  \"if (m32c_prepare_shift (operands, -1, LSHIFTRT))\n-     DONE;\"\n-  )\n-\n-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n-\n-(define_insn \"ashlhi3_i\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"=SdRhi*Rmm,SdRhi*Rmm\")\n-\t(ashift:HI (match_operand:HI 1 \"mra_operand\" \"0,0\")\n-\t\t   (match_operand:QI 2 \"mrai_operand\" \"In4,RqiSd\")))\n-   (clobber (match_scratch:HI 3 \"=X,R1w\"))]\n-  \"\"\n-  \"@\n-   sha.w\\t%2,%0\n-   mov.b\\t%2,r1h\\n\\tsha.w\\tr1h,%0\"\n-  [(set_attr \"flags\" \"oszc,oszc\")]\n-  )\n-\n-(define_insn \"ashrhi3_i\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"=SdRhi*Rmm,SdRhi*Rmm\")\n-\t(ashiftrt:HI (match_operand:HI 1 \"mra_operand\" \"0,0\")\n-\t\t     (neg:QI (match_operand:QI 2 \"mrai_operand\" \"In4,RqiSd\"))))\n-   (clobber (match_scratch:HI 3 \"=X,R1w\"))]\n-  \"\"\n-  \"@\n-   sha.w\\t%2,%0\n-   mov.b\\t%2,r1h\\n\\tsha.w\\tr1h,%0\"\n-  [(set_attr \"flags\" \"oszc,oszc\")]\n-  )\n-\n-(define_insn \"lshrhi3_i\"\n-  [(set (match_operand:HI 0 \"mra_operand\" \"=RhiSd*Rmm,RhiSd*Rmm\")\n-\t(lshiftrt:HI (match_operand:HI 1 \"mra_operand\" \"0,0\")\n-\t\t     (neg:QI (match_operand:QI 2 \"mrai_operand\" \"In4,RqiSd\"))))\n-   (clobber (match_scratch:HI 3 \"=X,R1w\"))]\n-  \"\"\n-  \"@\n-   shl.w\\t%2,%0\n-   mov.b\\t%2,r1h\\n\\tshl.w\\tr1h,%0\"\n-  [(set_attr \"flags\" \"szc,szc\")]\n-  )\n-\n-\n-(define_expand \"ashlhi3\"\n-  [(parallel [(set (match_operand:HI 0 \"mra_operand\" \"\")\n-\t\t   (ashift:HI (match_operand:HI 1 \"mra_operand\" \"\")\n-\t\t\t      (match_operand:QI 2 \"general_operand\" \"\")))\n-\t      (clobber (match_scratch:HI 3 \"\"))])]\n-  \"\"\n-  \"if (m32c_prepare_shift (operands, 1, ASHIFT))\n-     DONE;\"\n-  )\n-\n-(define_expand \"ashrhi3\"\n-  [(parallel [(set (match_operand:HI 0 \"mra_operand\" \"\")\n-\t\t   (ashiftrt:HI (match_operand:HI 1 \"mra_operand\" \"\")\n-\t\t\t\t(neg:QI (match_operand:QI 2 \"general_operand\" \"\"))))\n-\t      (clobber (match_scratch:HI 3 \"\"))])]\n-  \"\"\n-  \"if (m32c_prepare_shift (operands, -1, ASHIFTRT))\n-     DONE;\"\n-  )\n-\n-(define_expand \"lshrhi3\"\n-  [(parallel [(set (match_operand:HI 0 \"mra_operand\" \"\")\n-\t\t   (lshiftrt:HI (match_operand:HI 1 \"mra_operand\" \"\")\n-\t\t\t\t(neg:QI (match_operand:QI 2 \"general_operand\" \"\"))))\n-\t      (clobber (match_scratch:HI 3 \"\"))])]\n-  \"\"\n-  \"if (m32c_prepare_shift (operands, -1, LSHIFTRT))\n-     DONE;\"\n-  )\n-\n-\n-\n-\n-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n-\n-\n-(define_insn \"ashlpsi3_i\"\n-  [(set (match_operand:PSI 0 \"mra_operand\" \"=R02RaaSd*Rmm,R02RaaSd*Rmm\")\n-\t(ashift:PSI (match_operand:PSI 1 \"mra_operand\" \"0,0\")\n-\t\t    (match_operand:QI 2 \"shiftcount_operand\" \"In4,RqiSd\")))\n-   (clobber (match_scratch:HI 3 \"=X,R1w\"))]\n-  \"TARGET_A24\"\n-  \"@\n-   sha.l\\t%2,%0\n-   mov.b\\t%2,r1h\\n\\tsha.l\\tr1h,%0\"\n-  [(set_attr \"flags\" \"oszc,oszc\")]\n-  )\n-\n-(define_insn \"ashrpsi3_i\"\n-  [(set (match_operand:PSI 0 \"mra_operand\" \"=R02RaaSd*Rmm,R02RaaSd*Rmm\")\n-\t(ashiftrt:PSI (match_operand:PSI 1 \"mra_operand\" \"0,0\")\n-\t\t      (neg:QI (match_operand:QI 2 \"shiftcount_operand\" \"In4,RqiSd\"))))\n-   (clobber (match_scratch:HI 3 \"=X,R1w\"))]\n-  \"TARGET_A24\"\n-  \"@\n-   sha.l\\t%2,%0\n-   mov.b\\t%2,r1h\\n\\tsha.l\\tr1h,%0\"\n-  [(set_attr \"flags\" \"oszc,oszc\")]\n-  )\n-\n-(define_insn \"lshrpsi3_i\"\n-  [(set (match_operand:PSI 0 \"mra_operand\" \"=R02RaaSd,??Rmm\")\n-\t(lshiftrt:PSI (match_operand:PSI 1 \"mra_operand\" \"0,0\")\n-\t\t      (neg:QI (match_operand:QI 2 \"shiftcount_operand\" \"In4,RqiSd\"))))\n-   (clobber (match_scratch:HI 3 \"=X,R1w\"))]\n-  \"TARGET_A24\"\n-  \"@\n-   shl.l\\t%2,%0\n-   mov.b\\t%2,r1h\\n\\tshl.l\\tr1h,%0\"\n-  [(set_attr \"flags\" \"szc,szc\")]\n-  )\n-\n-\n-(define_expand \"ashlpsi3\"\n-  [(parallel [(set (match_operand:PSI 0 \"mra_operand\" \"\")\n-\t\t   (ashift:PSI (match_operand:PSI 1 \"mra_operand\" \"\")\n-\t\t\t       (match_operand:QI 2 \"shiftcount_operand\" \"\")))\n-\t      (clobber (match_scratch:HI 3 \"\"))])]\n-  \"TARGET_A24\"\n-  \"if (m32c_prepare_shift (operands, 1, ASHIFT))\n-     DONE;\"\n-  )\n-\n-(define_expand \"ashrpsi3\"\n-  [(parallel [(set (match_operand:PSI 0 \"mra_operand\" \"\")\n-\t\t   (ashiftrt:PSI (match_operand:PSI 1 \"mra_operand\" \"\")\n-\t\t\t\t (neg:QI (match_operand:QI 2 \"shiftcount_operand\" \"\"))))\n-\t      (clobber (match_scratch:HI 3 \"\"))])]\n-  \"TARGET_A24\"\n-  \"if (m32c_prepare_shift (operands, -1, ASHIFTRT))\n-     DONE;\"\n-  )\n-\n-(define_expand \"lshrpsi3\"\n-  [(parallel [(set (match_operand:PSI 0 \"mra_operand\" \"\")\n-\t\t   (lshiftrt:PSI (match_operand:PSI 1 \"mra_operand\" \"\")\n-\t\t\t\t (neg:QI (match_operand:QI 2 \"shiftcount_operand\" \"\"))))\n-\t      (clobber (match_scratch:HI 3 \"\"))])]\n-  \"TARGET_A24\"\n-  \"if (m32c_prepare_shift (operands, -1, LSHIFTRT))\n-     DONE;\"\n-  )\n-\n-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n-\n-; The m16c has a maximum shift count of -16..16, even when in a\n-; register.  It's optimal to use multiple shifts of -8..8 rather than\n-; loading larger constants into R1H multiple time.  The m32c can shift\n-; -32..32 either via immediates or in registers.  Hence, separate\n-; patterns.\n-\n-\n-(define_insn \"ashlsi3_16\"\n-  [(set (match_operand:SI 0 \"r0123_operand\" \"=R03,R03\")\n-\t(ashift:SI (match_operand:SI 1 \"r0123_operand\" \"0,0\")\n-\t\t   (match_operand:QI 2 \"shiftcount_operand\" \"In4,RqiSd\")))\n-   (clobber (match_scratch:HI 3 \"=X,R1w\"))]\n-  \"TARGET_A16\"\n-  \"@\n-   sha.l\\t%2,%0\n-   mov.b\\t%2,r1h\\n\\tsha.l\\tr1h,%0\"\n-  [(set_attr \"flags\" \"oszc,oszc\")]\n-  )\n-\n-(define_insn \"ashrsi3_16\"\n-  [(set (match_operand:SI 0 \"r0123_operand\" \"=R03,R03\")\n-\t(ashiftrt:SI (match_operand:SI 1 \"r0123_operand\" \"0,0\")\n-\t\t     (neg:QI (match_operand:QI 2 \"shiftcount_operand\" \"In4,RqiSd\"))))\n-   (clobber (match_scratch:HI 3 \"=X,R1w\"))]\n-  \"TARGET_A16\"\n-  \"@\n-   sha.l\\t%2,%0\n-   mov.b\\t%2,r1h\\n\\tsha.l\\tr1h,%0\"\n-  [(set_attr \"flags\" \"oszc,oszc\")]\n-  )\n-\n-(define_insn \"lshrsi3_16\"\n-  [(set (match_operand:SI 0 \"r0123_operand\" \"=R03,R03\")\n-\t(lshiftrt:SI (match_operand:SI 1 \"r0123_operand\" \"0,0\")\n-\t\t     (neg:QI (match_operand:QI 2 \"shiftcount_operand\" \"In4,RqiSd\"))))\n-   (clobber (match_scratch:HI 3 \"=X,R1w\"))]\n-  \"TARGET_A16\"\n-  \"@\n-   shl.l\\t%2,%0\n-   mov.b\\t%2,r1h\\n\\tshl.l\\tr1h,%0\"\n-  [(set_attr \"flags\" \"szc,szc\")]\n-  )\n-\n-\n-\n-(define_insn \"ashlsi3_24\"\n-  [(set (match_operand:SI 0 \"r0123_operand\" \"=R03,R03\")\n-\t(ashift:SI (match_operand:SI 1 \"r0123_operand\" \"0,0\")\n-\t\t   (match_operand:QI 2 \"longshiftcount_operand\" \"In6,RqiSd\")))\n-   (clobber (match_scratch:HI 3 \"=X,R1w\"))]\n-  \"TARGET_A24\"\n-  \"@\n-   sha.l\\t%2,%0\n-   mov.b\\t%2,r1h\\n\\tsha.l\\tr1h,%0\"\n-  )\n-\n-(define_insn \"ashrsi3_24\"\n-  [(set (match_operand:SI 0 \"r0123_operand\" \"=R03,R03\")\n-\t(ashiftrt:SI (match_operand:SI 1 \"r0123_operand\" \"0,0\")\n-\t\t     (neg:QI (match_operand:QI 2 \"longshiftcount_operand\" \"In6,RqiSd\"))))\n-   (clobber (match_scratch:HI 3 \"=X,R1w\"))]\n-  \"TARGET_A24\"\n-  \"@\n-   sha.l\\t%2,%0\n-   mov.b\\t%2,r1h\\n\\tsha.l\\tr1h,%0\"\n-  )\n-\n-(define_insn \"lshrsi3_24\"\n-  [(set (match_operand:SI 0 \"r0123_operand\" \"=R03,R03\")\n-\t(lshiftrt:SI (match_operand:SI 1 \"r0123_operand\" \"0,0\")\n-\t\t     (neg:QI (match_operand:QI 2 \"longshiftcount_operand\" \"In6,RqiSd\"))))\n-   (clobber (match_scratch:HI 3 \"=X,R1w\"))]\n-  \"TARGET_A24\"\n-  \"@\n-   shl.l\\t%2,%0\n-   mov.b\\t%2,r1h\\n\\tshl.l\\tr1h,%0\"\n-  )\n-\n-\n-\n-\n-(define_expand \"ashlsi3\"\n-  [(parallel [(set (match_operand:SI 0 \"r0123_operand\" \"\")\n-\t\t   (ashift:SI (match_operand:SI 1 \"r0123_operand\" \"\")\n-\t\t\t      (match_operand:QI 2 \"mrai_operand\" \"\")))\n-\t      (clobber (match_scratch:HI 3 \"\"))])]\n-  \"\"\n-  \"if (m32c_prepare_shift (operands, 1, ASHIFT))\n-     DONE;\"\n-  )\n-\n-(define_expand \"ashrsi3\"\n-  [(parallel [(set (match_operand:SI 0 \"r0123_operand\" \"\")\n-\t\t   (ashiftrt:SI (match_operand:SI 1 \"r0123_operand\" \"\")\n-\t\t\t\t(neg:QI (match_operand:QI 2 \"mrai_operand\" \"\"))))\n-\t      (clobber (match_scratch:HI 3 \"\"))])]\n-  \"\"\n-  \"if (m32c_prepare_shift (operands, -1, ASHIFTRT))\n-     DONE;\"\n-  )\n-\n-(define_expand \"lshrsi3\"\n-  [(parallel [(set (match_operand:SI 0 \"r0123_operand\" \"\")\n-\t\t   (lshiftrt:SI (match_operand:SI 1 \"r0123_operand\" \"\")\n-\t\t\t\t(neg:QI (match_operand:QI 2 \"mrai_operand\" \"\"))))\n-\t      (clobber (match_scratch:HI 3 \"\"))])]\n-  \"\"\n-  \"if (m32c_prepare_shift (operands, -1, LSHIFTRT))\n-     DONE;\"\n-  )\ndiff --git a/gcc/config/m32c/t-m32c b/gcc/config/m32c/t-m32c\ndeleted file mode 100644\nindex b3431b7a31e..00000000000\n--- a/gcc/config/m32c/t-m32c\n+++ /dev/null\n@@ -1,42 +0,0 @@\n-# Target Makefile Fragment for R8C/M16C/M32C\n-# Copyright (C) 2005-2026 Free Software Foundation, Inc.\n-# Contributed by Red Hat.\n-#\n-# This file is part of GCC.\n-#\n-# GCC is free software; you can redistribute it and/or modify it\n-# under the terms of the GNU General Public License as published\n-# by the Free Software Foundation; either version 3, or (at your\n-# option) any later version.\n-#\n-# GCC is distributed in the hope that it will be useful, but WITHOUT\n-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n-# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n-# License for more details.\n-#\n-# You should have received a copy of the GNU General Public License\n-# along with GCC; see the file COPYING3.  If not see\n-# <http://www.gnu.org/licenses/>.\n-\n-# target-specific files\n-\n-md_file = $(srcdir)/common.md md\n-\n-MD_FILES = m32c constraints predicates addsub bitops blkmov cond jump minmax mov muldiv prologue shift\n-\n-# Doing it this way lets the gen* programs report the right line numbers.\n-\n-md : $(MD_FILES:%=$(srcdir)/config/m32c/%.md) $(srcdir)/config/m32c/t-m32c\n-\tfor md in $(MD_FILES); do \\\n-\t  echo \"(include \\\"$(srcdir)/config/m32c/$$md.md\\\")\"; \\\n-\tdone > md\n-\n-m32c-pragma.o: $(srcdir)/config/m32c/m32c-pragma.cc $(RTL_H) $(TREE_H) $(CONFIG_H) $(TM_H)\n-\t$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<\n-\n-# We support four CPU series, but R8C and M16C share one multilib, and\n-# M32C and M32CM share another.\n-\n-MULTILIB_OPTIONS = mcpu=m32cm\n-MULTILIB_DIRNAMES = m32cm\n-MULTILIB_MATCHES = mcpu?m32cm=mcpu?m32c mcpu?r8c=mcpu?m16c\ndiff --git a/gcc/config/microblaze/microblaze.opt.urls b/gcc/config/microblaze/microblaze.opt.urls\nindex a62891a65c5..122bf3514a5 100644\n--- a/gcc/config/microblaze/microblaze.opt.urls\n+++ b/gcc/config/microblaze/microblaze.opt.urls\n@@ -10,7 +10,7 @@ msmall-divides\n UrlSuffix(gcc/MicroBlaze-Options.html#index-msmall-divides)\n \n mcpu=\n-UrlSuffix(gcc/MicroBlaze-Options.html#index-mcpu_003d-3)\n+UrlSuffix(gcc/MicroBlaze-Options.html#index-mcpu_003d-2)\n \n mmemcpy\n UrlSuffix(gcc/MicroBlaze-Options.html#index-mmemcpy-1)\ndiff --git a/gcc/config/msp430/msp430.cc b/gcc/config/msp430/msp430.cc\nindex a9e565e9e58..d78430f9368 100644\n--- a/gcc/config/msp430/msp430.cc\n+++ b/gcc/config/msp430/msp430.cc\n@@ -3165,8 +3165,7 @@ msp430_expand_epilogue (int is_eh)\n   emit_jump_insn (gen_msp430_return ());\n }\n \n-/* Implements EH_RETURN_STACKADJ_RTX.  Saved and used later in\n-   m32c_emit_eh_epilogue.  */\n+/* Implements EH_RETURN_STACKADJ_RTX.  */\n rtx\n msp430_eh_return_stackadj_rtx (void)\n {\ndiff --git a/gcc/config/msp430/msp430.opt.urls b/gcc/config/msp430/msp430.opt.urls\nindex 88791fe28e6..b08d0ef0228 100644\n--- a/gcc/config/msp430/msp430.opt.urls\n+++ b/gcc/config/msp430/msp430.opt.urls\n@@ -1,7 +1,7 @@\n ; Autogenerated by regenerate-opt-urls.py from gcc/config/msp430/msp430.opt and generated HTML\n \n msim\n-UrlSuffix(gcc/MSP430-Options.html#index-msim-5)\n+UrlSuffix(gcc/MSP430-Options.html#index-msim-4)\n \n mtiny-printf\n UrlSuffix(gcc/MSP430-Options.html#index-mtiny-printf)\ndiff --git a/gcc/config/nds32/nds32.opt.urls b/gcc/config/nds32/nds32.opt.urls\nindex 6f81b46161a..4250942ae09 100644\n--- a/gcc/config/nds32/nds32.opt.urls\n+++ b/gcc/config/nds32/nds32.opt.urls\n@@ -76,7 +76,7 @@ march=\n UrlSuffix(gcc/NDS32-Options.html#index-march_003d-1)\n \n mcpu=\n-UrlSuffix(gcc/NDS32-Options.html#index-mcpu_003d-4)\n+UrlSuffix(gcc/NDS32-Options.html#index-mcpu_003d-3)\n \n mconfig-fpu=\n UrlSuffix(gcc/NDS32-Options.html#index-mconfig-fpu_003d)\ndiff --git a/gcc/config/rl78/rl78.opt.urls b/gcc/config/rl78/rl78.opt.urls\nindex 18e0f0421d6..41539afb961 100644\n--- a/gcc/config/rl78/rl78.opt.urls\n+++ b/gcc/config/rl78/rl78.opt.urls\n@@ -1,7 +1,7 @@\n ; Autogenerated by regenerate-opt-urls.py from gcc/config/rl78/rl78.opt and generated HTML\n \n msim\n-UrlSuffix(gcc/RL78-Options.html#index-msim-6)\n+UrlSuffix(gcc/RL78-Options.html#index-msim-5)\n \n mmul=\n UrlSuffix(gcc/RL78-Options.html#index-mmul-1)\ndiff --git a/gcc/config/rs6000/sysv4.opt.urls b/gcc/config/rs6000/sysv4.opt.urls\nindex 5ed170ea892..223ddc5bf71 100644\n--- a/gcc/config/rs6000/sysv4.opt.urls\n+++ b/gcc/config/rs6000/sysv4.opt.urls\n@@ -48,7 +48,7 @@ msdata\n UrlSuffix(gcc/RS_002f6000-and-PowerPC-Options.html#index-msdata-3)\n \n msim\n-UrlSuffix(gcc/RS_002f6000-and-PowerPC-Options.html#index-msim-7)\n+UrlSuffix(gcc/RS_002f6000-and-PowerPC-Options.html#index-msim-6)\n \n mads\n UrlSuffix(gcc/RS_002f6000-and-PowerPC-Options.html#index-mads)\ndiff --git a/gcc/config/rx/elf.opt.urls b/gcc/config/rx/elf.opt.urls\nindex c43973a9d49..fcfb915edc7 100644\n--- a/gcc/config/rx/elf.opt.urls\n+++ b/gcc/config/rx/elf.opt.urls\n@@ -1,7 +1,7 @@\n ; Autogenerated by regenerate-opt-urls.py from gcc/config/rx/elf.opt and generated HTML\n \n msim\n-UrlSuffix(gcc/RX-Options.html#index-msim-8)\n+UrlSuffix(gcc/RX-Options.html#index-msim-7)\n \n mas100-syntax\n UrlSuffix(gcc/RX-Options.html#index-mas100-syntax)\ndiff --git a/gcc/config/stormy16/stormy16.opt.urls b/gcc/config/stormy16/stormy16.opt.urls\nindex 6f47d4c5c18..abbd926722f 100644\n--- a/gcc/config/stormy16/stormy16.opt.urls\n+++ b/gcc/config/stormy16/stormy16.opt.urls\n@@ -1,5 +1,5 @@\n ; Autogenerated by regenerate-opt-urls.py from gcc/config/stormy16/stormy16.opt and generated HTML\n \n msim\n-UrlSuffix(gcc/Xstormy16-Options.html#index-msim-10)\n+UrlSuffix(gcc/Xstormy16-Options.html#index-msim-9)\n \ndiff --git a/gcc/config/visium/visium.opt.urls b/gcc/config/visium/visium.opt.urls\nindex 80c9bd5e2ac..47f4b7c20cf 100644\n--- a/gcc/config/visium/visium.opt.urls\n+++ b/gcc/config/visium/visium.opt.urls\n@@ -4,7 +4,7 @@ mdebug\n UrlSuffix(gcc/Visium-Options.html#index-mdebug-2)\n \n msim\n-UrlSuffix(gcc/Visium-Options.html#index-msim-9)\n+UrlSuffix(gcc/Visium-Options.html#index-msim-8)\n \n mfpu\n UrlSuffix(gcc/Visium-Options.html#index-mfpu-5)\ndiff --git a/gcc/configure b/gcc/configure\nindex ef780a23c2f..a5c078e13ac 100755\n--- a/gcc/configure\n+++ b/gcc/configure\n@@ -31852,7 +31852,7 @@ esac\n # ??? Once 2.11 is released, probably need to add first known working\n # version to the per-target configury.\n case \"$cpu_type\" in\n-  aarch64 | alpha | arc | arm | avr | bfin | cris | csky | i386 | loongarch | m32c \\\n+  aarch64 | alpha | arc | arm | avr | bfin | cris | csky | i386 | loongarch \\\n   | m68k | microblaze | mips | nds32 | pa | riscv | rs6000 | score | sparc \\\n   | visium | xstormy16 | xtensa | ft32)\n     insn=\"nop\"\ndiff --git a/gcc/configure.ac b/gcc/configure.ac\nindex cdf2997cb5f..90a22f7e7f1 100644\n--- a/gcc/configure.ac\n+++ b/gcc/configure.ac\n@@ -5629,7 +5629,7 @@ esac\n # ??? Once 2.11 is released, probably need to add first known working\n # version to the per-target configury.\n case \"$cpu_type\" in\n-  aarch64 | alpha | arc | arm | avr | bfin | cris | csky | i386 | loongarch | m32c \\\n+  aarch64 | alpha | arc | arm | avr | bfin | cris | csky | i386 | loongarch \\\n   | m68k | microblaze | mips | nds32 | pa | riscv | rs6000 | score | sparc \\\n   | visium | xstormy16 | xtensa | ft32)\n     insn=\"nop\"\ndiff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi\nindex 47e0865c676..c9c4afd3c2b 100644\n--- a/gcc/doc/extend.texi\n+++ b/gcc/doc/extend.texi\n@@ -1379,7 +1379,7 @@ As an extension, GNU C supports named address spaces as\n defined in the N1275 draft of ISO/IEC DTR 18037.  Support for named\n address spaces in GCC will evolve as the draft technical report\n changes.  Calling conventions for any target might also change.  At\n-present, only the AVR, M32C, PRU, RL78, and x86 targets support\n+present, only the AVR, PRU, RL78, and x86 targets support\n address spaces other than the generic address space.\n \n Address space identifiers may be used exactly like any other C type\n@@ -1558,15 +1558,6 @@ Attribute @code{progmem} is supported but works differently.\n \n @end itemize\n \n-@subsection M32C Named Address Spaces\n-@cindex @code{__far} M32C Named Address Spaces\n-\n-On the M32C target, with the R8C and M16C CPU variants, variables\n-qualified with @code{__far} are accessed using 32-bit addresses in\n-order to access memory beyond the first 64@tie{}Ki bytes.  If\n-@code{__far} is used with the M32CM or M32C CPU variants, it has no\n-effect.\n-\n @subsection PRU Named Address Spaces\n @cindex @code{__regio_symbol} PRU Named Address Spaces\n \n@@ -5709,7 +5700,6 @@ The default for the attribute is controlled by @option{-fzero-call-used-regs}.\n * H8/300 Attributes::\n * IA-64 Attributes::\n * LoongArch Attributes::\n-* M32C Attributes::\n * M32R/D Attributes::\n * m68k Attributes::\n * MicroBlaze Attributes::\n@@ -7383,78 +7373,6 @@ specially.  Currently the only supported values of @var{name} are\n @code{normal} and @code{extreme}.\n @end table\n \n-@anchor{M32C Function Attributes}\n-@node M32C Attributes\n-@subsubsection M32C Attributes\n-\n-These attributes are supported by the M32C back end:\n-\n-@table @code\n-@atindex @code{bank_switch}, M32C\n-@item bank_switch\n-This attribute applies to functions.\n-\n-When added to an interrupt handler with the M32C port, causes the\n-prologue and epilogue to use bank switching to preserve the registers\n-rather than saving them on the stack.\n-\n-@atindex @code{fast_interrupt}, M32C\n-@item fast_interrupt\n-This attribute applies to functions.\n-\n-Use this attribute on the M32C port to indicate that the specified\n-function is a fast interrupt handler.  This is just like the\n-@code{interrupt} attribute, except that @code{freit} is used to return\n-instead of @code{reit}.\n-\n-@atindex @code{function_vector}, M16C/M32C\n-@item function_vector\n-This attribute applies to functions.\n-\n-On M16C/M32C targets, the @code{function_vector} attribute declares a\n-special page subroutine call function. Use of this attribute reduces\n-the code size by 2 bytes for each call generated to the\n-subroutine. The argument to the attribute is the vector number entry\n-from the special page vector table which contains the 16 low-order\n-bits of the subroutine's entry address. Each vector table has special\n-page number (18 to 255) that is used in @code{jsrs} instructions.\n-Jump addresses of the routines are generated by adding 0x0F0000 (in\n-case of M16C targets) or 0xFF0000 (in case of M32C targets), to the\n-2-byte addresses set in the vector table. Therefore you need to ensure\n-that all the special page vector routines should get mapped within the\n-address range 0x0F0000 to 0x0FFFFF (for M16C) and 0xFF0000 to 0xFFFFFF\n-(for M32C).\n-\n-In the following example 2 bytes are saved for each call to\n-function @code{foo}.\n-\n-@smallexample\n-void foo (void) __attribute__((function_vector(0x18)));\n-void foo (void)\n-@{\n-@}\n-\n-void bar (void)\n-@{\n-    foo();\n-@}\n-@end smallexample\n-\n-If functions are defined in one file and are called in another file,\n-then be sure to write this declaration in both files.\n-\n-This attribute is ignored for R8C target.\n-\n-@atindex @code{interrupt}, M32C\n-@item interrupt\n-This attribute applies to functions.\n-\n-It indicates\n-that the specified function is an interrupt handler.  The compiler generates\n-function entry and exit sequences suitable for use in an interrupt handler\n-when this attribute is present.\n-@end table\n-\n @anchor{M32R/D Function Attributes}\n @anchor{M32R/D Variable Attributes}\n @node M32R/D Attributes\n@@ -10094,7 +10012,6 @@ option is specified.  @xref{OpenMP}, and @ref{OpenACC}.\n * AArch64 Pragmas::\n * ARM Pragmas::\n * LoongArch Pragmas::\n-* M32C Pragmas::\n * PRU Pragmas::\n * RS/6000 and PowerPC Pragmas::\n * S/390 Pragmas::\n@@ -10158,36 +10075,6 @@ Example:\n #pragma GCC target(\"strict-align\")\n @end smallexample\n \n-@node M32C Pragmas\n-@subsection M32C Pragmas\n-\n-@table @code\n-@cindex pragma, memregs\n-@item GCC memregs @var{number}\n-Overrides the command-line option @code{-memregs=} for the current\n-file.  Use with care!  This pragma must be before any function in the\n-file, and mixing different memregs values in different objects may\n-make them incompatible.  This pragma is useful when a\n-performance-critical function uses a memreg for temporary values,\n-as it may allow you to reduce the number of memregs used.\n-\n-@cindex pragma, address\n-@item ADDRESS @var{name} @var{address}\n-For any declared symbols matching @var{name}, this does three things\n-to that symbol: it forces the symbol to be located at the given\n-address (a number), it forces the symbol to be volatile, and it\n-changes the symbol's scope to be static.  This pragma exists for\n-compatibility with other compilers, but note that the common\n-@code{1234H} numeric syntax is not supported (use @code{0x1234}\n-instead).  Example:\n-\n-@smallexample\n-#pragma ADDRESS port3 0x103\n-char port3;\n-@end smallexample\n-\n-@end table\n-\n @node PRU Pragmas\n @subsection PRU Pragmas\n \ndiff --git a/gcc/doc/install.texi b/gcc/doc/install.texi\nindex 001d16fe67a..c54d487e834 100644\n--- a/gcc/doc/install.texi\n+++ b/gcc/doc/install.texi\n@@ -872,7 +872,7 @@ Here are the possible CPU types:\n @quotation\n aarch64, aarch64_be, alpha, alpha64, amdgcn, arc, arceb, arm, armeb, avr, bfin,\n bpf, cris, csky, epiphany, fido, fr30, frv, ft32, h8300, hppa, hppa2.0,\n-hppa64, i486, i686, ia64, iq2000, lm32, loongarch64, m32c, m32r, m32rle, m68k,\n+hppa64, i486, i686, ia64, iq2000, lm32, loongarch64, m32r, m32rle, m68k,\n mcore, microblaze, microblazeel, mips, mips64, mips64el, mips64octeon,\n mips64orion, mips64vr, mipsel, mipsisa32, mipsisa32r2, mipsisa64, mipsisa64r2,\n mipsisa64r2el, mipsisa64sb1, mipsisa64sr71k, mipstx39, mmix, mn10300, moxie,\n@@ -3999,8 +3999,6 @@ information have to.\n @item\n @uref{#lm32-x-uclinux,,lm32-*-uclinux}\n @item\n-@uref{#m32c-x-elf,,m32c-*-elf}\n-@item\n @uref{#m32r-x-elf,,m32r-*-elf}\n @item\n @uref{#m68k-x-x,,m68k-*-*}\n@@ -4618,14 +4616,6 @@ Same as @code{loongarch64-linux-gnuf64} for legacy support.\n More information about LoongArch can be found at\n @uref{https://github.com/loongson/LoongArch-Documentation}.\n \n-@html\n-<hr />\n-@end html\n-@anchor{m32c-x-elf}\n-@heading m32c-*-elf\n-Renesas M32C processor.\n-This configuration is intended for embedded systems.\n-\n @html\n <hr />\n @end html\ndiff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi\nindex 9207a021e64..8610c4c3c88 100644\n--- a/gcc/doc/invoke.texi\n+++ b/gcc/doc/invoke.texi\n@@ -1174,9 +1174,6 @@ Objective-C and Objective-C++ Dialects}.\n @emph{LynxOS Options} (@ref{LynxOS Options})\n @gccoptlist{-mshared  -mthreads  -mlegacy-threads}\n \n-@emph{M32C Options} (@ref{M32C Options})\n-@gccoptlist{-mcpu=@var{cpu}  -msim  -memregs=@var{number}}\n-\n @emph{M32R/D Options} (@ref{M32R/D Options})\n @gccoptlist{-m32r2  -m32rx  -m32r\n -mdebug\n@@ -21191,7 +21188,6 @@ other compilers on the same platform.\n * LM32 Options::\n * LoongArch Options::\n * LynxOS Options::\n-* M32C Options::\n * M32R/D Options::\n * M680x0 Options::\n * MCore Options::\n@@ -27966,39 +27962,6 @@ Support legacy multi-threading.\n This option is incompatible with @option{-mthreads}.\n @end table\n \n-@node M32C Options\n-@subsection M32C Options\n-@cindex M32C options\n-\n-@table @gcctabopt\n-@opindex mcpu=\n-@item -mcpu=@var{name}\n-Select the CPU for which code is generated.  @var{name} may be one of\n-@samp{r8c} for the R8C/Tiny series, @samp{m16c} for the M16C (up to\n-/60) series, @samp{m32cm} for the M16C/80 series, or @samp{m32c} for\n-the M32C/80 series.\n-\n-@opindex msim\n-@opindex mno-sim\n-@item -msim\n-Specifies that the program will be run on the simulator.  This causes\n-an alternate runtime library to be linked in which supports, for\n-example, file I/O@.  You must not use this option when generating\n-programs that will run on real hardware; you must provide your own\n-runtime library for whatever I/O functions are needed.\n-\n-@opindex memregs=\n-@item -memregs=@var{number}\n-Specifies the number of memory-based pseudo-registers GCC uses\n-during code generation.  These pseudo-registers are used like real\n-registers, so there is a tradeoff between GCC's ability to fit the\n-code into available registers, and the performance penalty of using\n-memory instead of registers.  Note that all modules in a program must\n-be compiled with the same value for this option.  Because of that, you\n-must not use this option with GCC's default runtime libraries.\n-\n-@end table\n-\n @node M32R/D Options\n @subsection M32R/D Options\n @cindex M32R/D options\ndiff --git a/gcc/doc/md.texi b/gcc/doc/md.texi\nindex 6af646e3e01..c4fc53458d9 100644\n--- a/gcc/doc/md.texi\n+++ b/gcc/doc/md.texi\n@@ -2782,135 +2782,6 @@ now roughly the same as @samp{m} when not used together with @samp{<}\n or @samp{>}.\n @end table\n \n-@item M32C---@file{config/m32c/m32c.cc}\n-@table @code\n-@item Rsp\n-@itemx Rfb\n-@itemx Rsb\n-@samp{$sp}, @samp{$fb}, @samp{$sb}.\n-\n-@item Rcr\n-Any control register, when they're 16 bits wide (nothing if control\n-registers are 24 bits wide)\n-\n-@item Rcl\n-Any control register, when they're 24 bits wide.\n-\n-@item R0w\n-@itemx R1w\n-@itemx R2w\n-@itemx R3w\n-$r0, $r1, $r2, $r3.\n-\n-@item R02\n-$r0 or $r2, or $r2r0 for 32 bit values.\n-\n-@item R13\n-$r1 or $r3, or $r3r1 for 32 bit values.\n-\n-@item Rdi\n-A register that can hold a 64 bit value.\n-\n-@item Rhl\n-$r0 or $r1 (registers with addressable high/low bytes)\n-\n-@item R23\n-$r2 or $r3\n-\n-@item Raa\n-Address registers\n-\n-@item Raw\n-Address registers when they're 16 bits wide.\n-\n-@item Ral\n-Address registers when they're 24 bits wide.\n-\n-@item Rqi\n-Registers that can hold QI values.\n-\n-@item Rad\n-Registers that can be used with displacements ($a0, $a1, $sb).\n-\n-@item Rsi\n-Registers that can hold 32 bit values.\n-\n-@item Rhi\n-Registers that can hold 16 bit values.\n-\n-@item Rhc\n-Registers chat can hold 16 bit values, including all control\n-registers.\n-\n-@item Rra\n-$r0 through R1, plus $a0 and $a1.\n-\n-@item Rfl\n-The flags register.\n-\n-@item Rmm\n-The memory-based pseudo-registers $mem0 through $mem15.\n-\n-@item Rpi\n-Registers that can hold pointers (16 bit registers for r8c, m16c; 24\n-bit registers for m32cm, m32c).\n-\n-@item Rpa\n-Matches multiple registers in a PARALLEL to form a larger register.\n-Used to match function return values.\n-\n-@item Is3\n-@minus{}8 @dots{} 7\n-\n-@item IS1\n-@minus{}128 @dots{} 127\n-\n-@item IS2\n-@minus{}32768 @dots{} 32767\n-\n-@item IU2\n-0 @dots{} 65535\n-\n-@item In4\n-@minus{}8 @dots{} @minus{}1 or 1 @dots{} 8\n-\n-@item In5\n-@minus{}16 @dots{} @minus{}1 or 1 @dots{} 16\n-\n-@item In6\n-@minus{}32 @dots{} @minus{}1 or 1 @dots{} 32\n-\n-@item IM2\n-@minus{}65536 @dots{} @minus{}1\n-\n-@item Ilb\n-An 8 bit value with exactly one bit set.\n-\n-@item Ilw\n-A 16 bit value with exactly one bit set.\n-\n-@item Sd\n-The common src/dest memory addressing modes.\n-\n-@item Sa\n-Memory addressed using $a0 or $a1.\n-\n-@item Si\n-Memory addressed with immediate addresses.\n-\n-@item Ss\n-Memory addressed using the stack pointer ($sp).\n-\n-@item Sf\n-Memory addressed using the frame base register ($fb).\n-\n-@item Ss\n-Memory addressed using the small base register ($sb).\n-\n-@item S1\n-$r1h\n-@end table\n-\n @item LoongArch---@file{config/loongarch/constraints.md}\n @table @code\n @item f\ndiff --git a/gcc/explow.cc b/gcc/explow.cc\nindex 2d228d199e9..755c1d2e6dc 100644\n--- a/gcc/explow.cc\n+++ b/gcc/explow.cc\n@@ -898,7 +898,7 @@ promote_mode (const_tree type ATTRIBUTE_UNUSED, machine_mode mode,\n \n   /* FIXME: this is the same logic that was there until GCC 4.4, but we\n      probably want to test POINTERS_EXTEND_UNSIGNED even if PROMOTE_MODE\n-     is not defined.  The affected targets are M32C, S390, SPARC.  */\n+     is not defined.  The affected targets are S390, SPARC.  */\n #ifdef PROMOTE_MODE\n   code = TREE_CODE (type);\n   unsignedp = *punsignedp;\ndiff --git a/gcc/regenerate-opt-urls.py b/gcc/regenerate-opt-urls.py\nindex 967968ece68..bd28d9c0b0f 100755\n--- a/gcc/regenerate-opt-urls.py\n+++ b/gcc/regenerate-opt-urls.py\n@@ -245,7 +245,6 @@ TARGET_SPECIFIC_PAGES = {\n     'gcc/HPPA-Options.html' : 'gcc/config/pa/',\n     'gcc/IA-64-Options.html' : 'gcc/config/ia64/',\n     'gcc/LoongArch-Options.html' : 'gcc/config/loongarch/',\n-    'gcc/M32C-Options.html' : 'gcc/config/m32c/',\n     'gcc/M32R_002fD-Options.html' : 'gcc/config/m32r/',\n     'gcc/M680x0-Options.html' : 'gcc/config/m68k/',\n     'gcc/MCore-Options.html' : 'gcc/config/mcore/',\ndiff --git a/gcc/testsuite/gcc.c-torture/compile/20000804-1.c b/gcc/testsuite/gcc.c-torture/compile/20000804-1.c\nindex c6f6497b7a7..6fddddf1149 100644\n--- a/gcc/testsuite/gcc.c-torture/compile/20000804-1.c\n+++ b/gcc/testsuite/gcc.c-torture/compile/20000804-1.c\n@@ -2,7 +2,6 @@\n    statement to force a 'long long' (64-bits) to go in a register.  */\n /* { dg-do assemble } */\n /* { dg-skip-if \"\" { { i?86-*-* x86_64-*-* } && { ia32 && { ! nonpic } } } } */\n-/* { dg-skip-if \"No 64-bit registers\" { m32c-*-* } } */\n /* { dg-skip-if \"Not enough 64-bit registers\" { pdp11-*-* } { \"-O0\" } { \"\" } } */\n /* { dg-xfail-if \"Inconsistent constraint on asm\" { csky-*-* } { \"-O0\" } { \"\" } } */\n /* { dg-xfail-if \"Inconsistent constraint on asm\" { bpf-*-* } { \"-O0\" } { \"\" } } */\ndiff --git a/gcc/testsuite/gcc.c-torture/compile/20001226-1.c b/gcc/testsuite/gcc.c-torture/compile/20001226-1.c\nindex 234cdbf1b14..ce92bfb6ee9 100644\n--- a/gcc/testsuite/gcc.c-torture/compile/20001226-1.c\n+++ b/gcc/testsuite/gcc.c-torture/compile/20001226-1.c\n@@ -1,7 +1,6 @@\n /* { dg-do assemble } */\n /* { dg-skip-if \"too much code for avr\" { \"avr-*-*\" } } */\n /* { dg-skip-if \"too much code for pdp11\" { \"pdp11-*-*\" } } */\n-/* { dg-skip-if \"\" { m32c-*-* } } */\n /* { dg-skip-if \"jumps too far for eBPF\" { bpf-*-* } } */\n /* { dg-timeout-factor 4.0 } */\n \ndiff --git a/gcc/testsuite/gcc.c-torture/compile/limits-stringlit.c b/gcc/testsuite/gcc.c-torture/compile/limits-stringlit.c\nindex 0828fc35aef..4b80b632d9f 100644\n--- a/gcc/testsuite/gcc.c-torture/compile/limits-stringlit.c\n+++ b/gcc/testsuite/gcc.c-torture/compile/limits-stringlit.c\n@@ -1,4 +1,4 @@\n-/* { dg-skip-if \"Array too big\" { avr-*-* m32c-*-* pdp11-*-* msp430-*-* } } */ \n+/* { dg-skip-if \"Array too big\" { avr-*-* pdp11-*-* msp430-*-* } } */ \n \n #define STR2 \"012345678901234567890123456789012345678901234567890123456789\\\n 0123456789012345678901234567890123456789\"\ndiff --git a/gcc/testsuite/gcc.c-torture/execute/20020404-1.c b/gcc/testsuite/gcc.c-torture/execute/20020404-1.c\nindex 95b0adc0244..1ca679afa21 100644\n--- a/gcc/testsuite/gcc.c-torture/execute/20020404-1.c\n+++ b/gcc/testsuite/gcc.c-torture/execute/20020404-1.c\n@@ -1,6 +1,5 @@\n /* { dg-require-effective-target int32plus } */\n /* { dg-additional-options \"-std=gnu17\" } */\n-/* { dg-skip-if \"pointers can be truncated\" { m32c-*-* } } */\n /* Extracted from GDB sources. */\n \n void abort (void);\ndiff --git a/gcc/testsuite/gcc.dg/20020312-2.c b/gcc/testsuite/gcc.dg/20020312-2.c\nindex 16a04c17ba9..1764062a7b6 100644\n--- a/gcc/testsuite/gcc.dg/20020312-2.c\n+++ b/gcc/testsuite/gcc.dg/20020312-2.c\n@@ -95,8 +95,6 @@ extern void abort (void);\n # define PIC_REG  \"r12\"\n #elif defined(__x86_64__)\n /* No pic register.  */\n-#elif defined(__m32c__)\n-/* No pic register.  */\n #elif defined (__frv__)\n # ifdef __FRV_FDPIC__\n #  define PIC_REG \"gr15\"\ndiff --git a/gcc/testsuite/gcc.dg/max-1.c b/gcc/testsuite/gcc.dg/max-1.c\nindex 9823dca597e..d4f68261bcf 100644\n--- a/gcc/testsuite/gcc.dg/max-1.c\n+++ b/gcc/testsuite/gcc.dg/max-1.c\n@@ -4,8 +4,6 @@\n /* { dg-options \"-O1 \" } */\n /* Option -fno-tree-lrs removed By Andrew MacLeod since it is no longer \n    supported in the compiler beginning with GCC 4.3.  */\n-/* m32c has varying sized pointers */\n-/* { dg-skip-if \"\" { \"m32c-*-*\" } { \"*\" } { \"-mcpu=m32c\" \"-mcpu=m32cm\" } } */\n \n __extension__ typedef __INTPTR_TYPE__ intptr_t;\n \ndiff --git a/gcc/testsuite/gcc.dg/torture/pr26565.c b/gcc/testsuite/gcc.dg/torture/pr26565.c\nindex 12332d4f6ed..6b7bde169c8 100644\n--- a/gcc/testsuite/gcc.dg/torture/pr26565.c\n+++ b/gcc/testsuite/gcc.dg/torture/pr26565.c\n@@ -1,6 +1,4 @@\n /* { dg-do run } */\n-/* m32c is already packed.  */\n-/* { dg-skip-if \"\" { \"m32c-*-*\" } } */\n \n void *memcpy(void *dest, const void *src, __SIZE_TYPE__ n);\n \ndiff --git a/gcc/testsuite/gcc.dg/tree-ssa/reassoc-32.c b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-32.c\nindex 545f316bebd..2a73cf7b963 100644\n--- a/gcc/testsuite/gcc.dg/tree-ssa/reassoc-32.c\n+++ b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-32.c\n@@ -1,4 +1,4 @@\n-/* { dg-do run { target { ! \"m68k*-*-* mmix*-*-* bfin*-*-* v850*-*-* moxie*-*-* cris*-*-* m32c*-*-* fr30*-*-* mcore*-*-* powerpc*-*-* xtensa*-*-*\"} } } */\n+/* { dg-do run { target { ! \"m68k*-*-* mmix*-*-* bfin*-*-* v850*-*-* moxie*-*-* cris*-*-* fr30*-*-* mcore*-*-* powerpc*-*-* xtensa*-*-*\"} } } */\n \n /* { dg-options \"-O2 -fno-inline -fdump-tree-reassoc1-details --param logical-op-non-short-circuit=1 -fno-bit-tests\" } */\n /* { dg-additional-options \"-mbranch-cost=2\" { target branch_cost } } */\ndiff --git a/gcc/testsuite/gcc.dg/tree-ssa/reassoc-33.c b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-33.c\nindex a89e0689e7b..f44754ca970 100644\n--- a/gcc/testsuite/gcc.dg/tree-ssa/reassoc-33.c\n+++ b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-33.c\n@@ -1,4 +1,4 @@\n-/* { dg-do run { target { ! \"m68k*-*-* mmix*-*-* bfin*-*-* v850*-*-* moxie*-*-* cris*-*-* m32c*-*-* fr30*-*-* mcore*-*-* powerpc*-*-* xtensa*-*-* hppa*-*-* or1k-*-*-* pru*-*-*\"} } } */\n+/* { dg-do run { target { ! \"m68k*-*-* mmix*-*-* bfin*-*-* v850*-*-* moxie*-*-* cris*-*-* fr30*-*-* mcore*-*-* powerpc*-*-* xtensa*-*-* hppa*-*-* or1k-*-*-* pru*-*-*\"} } } */\n \n /* { dg-options \"-O2 -fno-inline -fdump-tree-reassoc1-details --param logical-op-non-short-circuit=1\" } */\n /* { dg-additional-options \"-mbranch-cost=2\" { target branch_cost } } */\ndiff --git a/gcc/testsuite/gcc.dg/tree-ssa/reassoc-34.c b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-34.c\nindex 1c4041b7484..dfa6d51b35a 100644\n--- a/gcc/testsuite/gcc.dg/tree-ssa/reassoc-34.c\n+++ b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-34.c\n@@ -1,4 +1,4 @@\n-/* { dg-do run { target { ! \"m68k*-*-* mmix*-*-* bfin*-*-* v850*-*-* moxie*-*-* cris*-*-* m32c*-*-* fr30*-*-* mcore*-*-* powerpc*-*-* xtensa*-*-* hppa*-*-* or1k*-*-* pru*-*-*\"} } } */\n+/* { dg-do run { target { ! \"m68k*-*-* mmix*-*-* bfin*-*-* v850*-*-* moxie*-*-* cris*-*-* fr30*-*-* mcore*-*-* powerpc*-*-* xtensa*-*-* hppa*-*-* or1k*-*-* pru*-*-*\"} } } */\n \n /* { dg-options \"-O2 -fno-inline -fdump-tree-reassoc1-details --param logical-op-non-short-circuit=1\" } */\n /* { dg-additional-options \"-mbranch-cost=2\" { target branch_cost } } */\ndiff --git a/gcc/testsuite/gcc.dg/tree-ssa/reassoc-35.c b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-35.c\nindex a81846c1722..3813cbac65b 100644\n--- a/gcc/testsuite/gcc.dg/tree-ssa/reassoc-35.c\n+++ b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-35.c\n@@ -1,4 +1,4 @@\n-/* { dg-do run { target { ! \"m68k*-*-* mmix*-*-* bfin*-*-* v850*-*-* moxie*-*-* cris*-*-* m32c*-*-* fr30*-*-* mcore*-*-* powerpc*-*-* xtensa*-*-* hppa*-*-* or1k*-*-* pru*-*-*\"} } } */\n+/* { dg-do run { target { ! \"m68k*-*-* mmix*-*-* bfin*-*-* v850*-*-* moxie*-*-* cris*-*-* fr30*-*-* mcore*-*-* powerpc*-*-* xtensa*-*-* hppa*-*-* or1k*-*-* pru*-*-*\"} } } */\n \n /* { dg-options \"-O2 -fno-inline -fdump-tree-reassoc1-details --param logical-op-non-short-circuit=1\" } */\n /* { dg-additional-options \"-mbranch-cost=2\" { target branch_cost } } */\ndiff --git a/gcc/testsuite/gcc.dg/tree-ssa/reassoc-36.c b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-36.c\nindex a0489b9c4f7..83a1e258046 100644\n--- a/gcc/testsuite/gcc.dg/tree-ssa/reassoc-36.c\n+++ b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-36.c\n@@ -1,4 +1,4 @@\n-/* { dg-do run { target { ! \"m68k*-*-* mmix*-*-* bfin*-*-* v850*-*-* moxie*-*-* cris*-*-* m32c*-*-* fr30*-*-* mcore*-*-* powerpc*-*-* xtensa*-*-* hppa*-*-* or1k*-*-* pru*-*-*\"} } } */\n+/* { dg-do run { target { ! \"m68k*-*-* mmix*-*-* bfin*-*-* v850*-*-* moxie*-*-* cris*-*-* fr30*-*-* mcore*-*-* powerpc*-*-* xtensa*-*-* hppa*-*-* or1k*-*-* pru*-*-*\"} } } */\n \n /* { dg-options \"-O2 -fno-inline -fdump-tree-reassoc1-details --param logical-op-non-short-circuit=1\" } */\n /* { dg-additional-options \"-mbranch-cost=2\" { target branch_cost } } */\ndiff --git a/gcc/testsuite/gcc.dg/utf-array-short-wchar.c b/gcc/testsuite/gcc.dg/utf-array-short-wchar.c\nindex 81b452a33a1..c286f270720 100644\n--- a/gcc/testsuite/gcc.dg/utf-array-short-wchar.c\n+++ b/gcc/testsuite/gcc.dg/utf-array-short-wchar.c\n@@ -35,9 +35,9 @@ const char32_t\ts32_4[]\t= u8\"ab\";\t/* { dg-error \"from a string literal with type\n \n const char32_t\ts32_5[0] = U\"ab\";\t/* { dg-warning \" is too long\" } */\n const char32_t\ts32_6[1] = U\"ab\";\t/* { dg-warning \" is too long\" } */\n-const char32_t\ts32_7[2] = U\"ab\";\t/* { dg-warning \" is too long\" \"\" { target \"m32c-*-*\" } } */\n-const char32_t\ts32_8[3] = U\"ab\";\t/* { dg-warning \" is too long\" \"\" { target \"m32c-*-*\" } } */\n-const char32_t\ts32_9[4] = U\"ab\";\t/* { dg-warning \" is too long\" \"\" { target \"m32c-*-*\" } } */\n+const char32_t\ts32_7[2] = U\"ab\";\n+const char32_t\ts32_8[3] = U\"ab\";\n+const char32_t\ts32_9[4] = U\"ab\";\n \n const wchar_t\tsw_0[]\t= \"ab\";\t\t/* { dg-error \"from a string literal with type array of .char.\" } */\n const wchar_t\tsw_1[]\t= u\"ab\";\ndiff --git a/gcc/testsuite/gcc.dg/utf-array.c b/gcc/testsuite/gcc.dg/utf-array.c\nindex 7f0cb915e04..0e8024901d9 100644\n--- a/gcc/testsuite/gcc.dg/utf-array.c\n+++ b/gcc/testsuite/gcc.dg/utf-array.c\n@@ -35,9 +35,9 @@ const char32_t\ts32_4[]\t= u8\"ab\";\t/* { dg-error \"from a string literal with type\n \n const char32_t\ts32_5[0] = U\"ab\";\t/* { dg-warning \" is too long\" } */\n const char32_t\ts32_6[1] = U\"ab\";\t/* { dg-warning \" is too long\" } */\n-const char32_t\ts32_7[2] = U\"ab\";\t/* { dg-warning \" is too long\" \"\" { target \"m32c-*-*\" } } */\n-const char32_t\ts32_8[3] = U\"ab\";\t/* { dg-warning \" is too long\" \"\" { target \"m32c-*-*\" } } */\n-const char32_t\ts32_9[4] = U\"ab\";\t/* { dg-warning \" is too long\" \"\" { target \"m32c-*-*\" } } */\n+const char32_t\ts32_7[2] = U\"ab\";\n+const char32_t\ts32_8[3] = U\"ab\";\n+const char32_t\ts32_9[4] = U\"ab\";\n \n const wchar_t\tsw_0[]\t= \"ab\";\t\t/* { dg-error \"from a string literal with type array of .char.\" } */\n const wchar_t\tsw_1[]\t= u\"ab\";\t/* { dg-error \"from a string literal with type array of\" \"\" { target { ! wchar_t_char16_t_compatible } } } */\ndiff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp\nindex 55775d036cd..ee06aa05f29 100644\n--- a/gcc/testsuite/lib/target-supports.exp\n+++ b/gcc/testsuite/lib/target-supports.exp\n@@ -670,7 +670,6 @@ proc check_effective_target_variadic_mi_thunk { } {\n \t || [istarget h8300-*-*]\n \t || [istarget iq2000-*-*]\n \t || [istarget lm32-*-*]\n-\t || [istarget m32c-*-*]\n \t || [istarget m32r-*-*]\n \t || [istarget mcore-*-*]\n \t || [istarget moxie-*-*]\n@@ -860,7 +859,6 @@ proc check_profiling_available { test_what } {\n \t     || [istarget fido-*-elf]\n \t     || [istarget h8300-*-*]\n \t     || [istarget lm32-*-*]\n-\t     || [istarget m32c-*-elf]\n \t     || [istarget m68k-*-elf]\n \t     || [istarget m68k-*-uclinux*]\n \t     || [istarget mips*-*-elf*]\n@@ -9218,7 +9216,6 @@ proc check_effective_target_natural_alignment_32 { } {\n \t   || [istarget rl78-*-*]\n \t   || [istarget pdp11-*-*]\n \t   || [istarget msp430-*-*]\n-\t   || [istarget m32c-*-*]\n \t   || [istarget cris-*-*] } {\n \t   return 0\n \t } else {\ndiff --git a/libgcc/config.host b/libgcc/config.host\nindex ac10ccc4340..f97340481a0 100644\n--- a/libgcc/config.host\n+++ b/libgcc/config.host\n@@ -81,10 +81,6 @@ unwind_header=unwind-generic.h\n # Set default cpu_type so it can be updated in each machine entry.\n cpu_type=`echo ${host} | sed 's/-.*$//'`\n case ${host} in\n-m32c*-*-*)\n-        cpu_type=m32c\n-\ttmake_file=t-fdpbit\n-        ;;\n aarch64*-*-*)\n \tcpu_type=aarch64\n \t;;\n@@ -1567,9 +1563,6 @@ am33_2.0-*-linux*)\n \textra_parts=\"crtbegin.o crtend.o crtbeginS.o crtendS.o\"\n \ttmake_file=\"$tmake_file t-fdpbit\"\n \t;;\n-m32c-*-elf*)\n-\ttmake_file=\"$tmake_file m32c/t-m32c\"\n- \t;;\n nvptx-*)\n \ttmake_file=\"$tmake_file nvptx/t-nvptx\"\n \textra_parts=\"crt0.o\"\ndiff --git a/libgcc/config/m32c/lib1funcs.S b/libgcc/config/m32c/lib1funcs.S\ndeleted file mode 100644\nindex f60cdc9eb86..00000000000\n--- a/libgcc/config/m32c/lib1funcs.S\n+++ /dev/null\n@@ -1,230 +0,0 @@\n-/* libgcc routines for R8C/M16C/M32C\n-   Copyright (C) 2005-2026 Free Software Foundation, Inc.\n-   Contributed by Red Hat.\n-\n-   This file is part of GCC.\n-\n-   GCC is free software; you can redistribute it and/or modify it\n-   under the terms of the GNU General Public License as published\n-   by the Free Software Foundation; either version 3, or (at your\n-   option) any later version.\n-\n-   GCC is distributed in the hope that it will be useful, but WITHOUT\n-   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n-   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n-   License for more details.\n-\n-   Under Section 7 of GPL version 3, you are granted additional\n-   permissions described in the GCC Runtime Library Exception, version\n-   3.1, as published by the Free Software Foundation.\n-\n-   You should have received a copy of the GNU General Public License and\n-   a copy of the GCC Runtime Library Exception along with this program;\n-   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see\n-   <http://www.gnu.org/licenses/>.  */\n-\n-#if defined(__r8c_cpu__) || defined(__m16c_cpu__)\n-#define A16\n-#define A(n,w) n\n-#define W w\n-#else\n-#define A24\n-#define A(n,w) w\n-#define W l\n-#endif\n-\n-\n-#ifdef L__m32c_memregs\n-\n-/* Warning: these memory locations are used as a register bank.  They\n-   *must* end up consecutive in any final executable, so you may *not*\n-   use the otherwise obvious \".comm\" directive to allocate space for\n-   them. */\n-\n-\t.bss\n-\t.global\tmem0\n-mem0:\t.space\t1\n-\t.global\tmem1\n-mem1:\t.space\t1\n-\t.global\tmem2\n-mem2:\t.space\t1\n-\t.global\tmem3\n-mem3:\t.space\t1\n-\t.global\tmem4\n-mem4:\t.space\t1\n-\t.global\tmem5\n-mem5:\t.space\t1\n-\t.global\tmem6\n-mem6:\t.space\t1\n-\t.global\tmem7\n-mem7:\t.space\t1\n-\t.global\tmem8\n-mem8:\t.space\t1\n-\t.global\tmem9\n-mem9:\t.space\t1\n-\t.global\tmem10\n-mem10:\t.space\t1\n-\t.global\tmem11\n-mem11:\t.space\t1\n-\t.global\tmem12\n-mem12:\t.space\t1\n-\t.global\tmem13\n-mem13:\t.space\t1\n-\t.global\tmem14\n-mem14:\t.space\t1\n-\t.global\tmem15\n-mem15:\t.space\t1\n-\n-#endif\n-\n-#ifdef L__m32c_eh_return\n-\t.text\n-\t.global __m32c_eh_return\n-__m32c_eh_return:\t\n-\n-\t/* At this point, r0 has the stack adjustment, r1r3 has the\n-\t   address to return to.  The stack looks like this:\n-\n-\t   old_ra\n-\t   old_fp\n-\t   <- unwound sp\n-\t   ...\n-\t   fb\n-\t   through\n-\t   r0\n-\t   <- sp\n-\n-\t   What we need to do is restore all the registers, update the\n-\t   stack, and return to the right place.\n-\t*/\n-\n-\tstc\tsp,a0\n-\t\n-\tadd.W\tA(#16,#24),a0\n-\t/* a0 points to the current stack, just above the register\n-\t   save areas */\n-\n-\tmov.w\ta0,a1\n-\texts.w\tr0\n-\tsub.W\tA(r0,r2r0),a1\n-\tsub.W\tA(#3,#4),a1\n-\t/* a1 points to the new stack.  */\n-\n-\t/* This is for the \"rts\" below.  */\n-\tmov.w\tr1,[a1]\n-#ifdef A16\n-\tmov.w\tr2,r1\n-\tmov.b\tr1l,2[a1]\n-#else\n-\tmov.w\tr2,2[a1]\n-#endif\n-\n-\t/* This is for the \"popc sp\" below.  */\n-\tmov.W\ta1,[a0]\t\n-\n-\tpopm    r0,r1,r2,r3,a0,a1,sb,fb\n-\tpopc\tsp\n-\trts\n-#endif\n-\n-/* SImode arguments for SI foo(SI,SI) functions.  */\n-#ifdef A16\n-#define SAL  5[fb]\n-#define SAH  7[fb]\n-#define SBL  9[fb]\n-#define SBH 11[fb]\n-#else\n-#define SAL  8[fb]\n-#define SAH 10[fb]\n-#define SBL 12[fb]\n-#define SBH 14[fb]\n-#endif\n-\n-#ifdef L__m32c_mulsi3\n-\t.text\n-\t.global ___mulsi3\n-___mulsi3:\n-\tenter\t#0\n-\tpush.w\tr2\n-\tmov.w\tSAL,r0\n-\tmulu.w\tSBL,r0\t\t/* writes to r2r0 */\n-\tmov.w\tr0,mem0\n-\tmov.w\tr2,mem2\n-\tmov.w\tSAL,r0\n-\tmulu.w\tSBH,r0\t\t/* writes to r2r0 */\n-\tadd.w\tr0,mem2\n-\tmov.w\tSAH,r0\n-\tmulu.w\tSBL,r0\t\t/* writes to r2r0 */\n-\tadd.w\tr0,mem2\n-\tpop.w\tr2\n-\texitd\n-#endif\n-\n-#ifdef L__m32c_cmpsi2\n-\t.text\n-\t.global ___cmpsi2\n-___cmpsi2:\n-\tenter\t#0\n-\tcmp.w\tSBH,SAH\n-\tjgt\tcmpsi_gt\n-\tjlt\tcmpsi_lt\n-\tcmp.w\tSBL,SAL\n-\tjgt\tcmpsi_gt\n-\tjlt\tcmpsi_lt\n-\tmov.w\t#1,r0\n-\texitd\n-cmpsi_gt:\n-\tmov.w\t#2,r0\n-\texitd\n-cmpsi_lt:\n-\tmov.w\t#0,r0\n-\texitd\n-#endif\n-\n-#ifdef L__m32c_ucmpsi2\n-\t.text\n-\t.global ___ucmpsi2\n-___ucmpsi2:\n-\tenter\t#0\n-\tcmp.w\tSBH,SAH\n-\tjgtu\tcmpsi_gt\n-\tjltu\tcmpsi_lt\n-\tcmp.w\tSBL,SAL\n-\tjgtu\tcmpsi_gt\n-\tjltu\tcmpsi_lt\n-\tmov.w\t#1,r0\n-\texitd\n-cmpsi_gt:\n-\tmov.w\t#2,r0\n-\texitd\n-cmpsi_lt:\n-\tmov.w\t#0,r0\n-\texitd\n-#endif\n-\n-#ifdef L__m32c_jsri16\n-\t.text\n-#ifdef A16\n-\t.global\tm32c_jsri16\n-m32c_jsri16:\n-\tadd.w\t#-1, sp\n-\n-\t/* Read the address (16 bits) and return address (24 bits) off\n-\tthe stack.  */\n-\tmov.w\t4[sp], r0\n-\tmov.w\t1[sp], r3\n-\tmov.b\t3[sp], a0 /* This zero-extends, so the high byte has\n-\t\t\t     zero in it.  */\n-\n-\t/* Write the return address, then new address, to the stack.  */\n-\tmov.w\ta0, 1[sp] /* Just to get the zero in 2[sp].  */\n-\tmov.w\tr0, 0[sp]\n-\tmov.w\tr3, 3[sp]\n-\tmov.b\ta0, 5[sp]\n-\n-\t/* This \"returns\" to the target address, leaving the pending\n-\treturn address on the stack.  */\n-\trts\n-#endif\n-\n-#endif\ndiff --git a/libgcc/config/m32c/lib2funcs.c b/libgcc/config/m32c/lib2funcs.c\ndeleted file mode 100644\nindex 796f2a45d2d..00000000000\n--- a/libgcc/config/m32c/lib2funcs.c\n+++ /dev/null\n@@ -1,147 +0,0 @@\n-/* libgcc routines for R8C/M16C/M32C\n-   Copyright (C) 2005-2026 Free Software Foundation, Inc.\n-   Contributed by Red Hat.\n-\n-   This file is part of GCC.\n-\n-   GCC is free software; you can redistribute it and/or modify it\n-   under the terms of the GNU General Public License as published\n-   by the Free Software Foundation; either version 3, or (at your\n-   option) any later version.\n-\n-   GCC is distributed in the hope that it will be useful, but WITHOUT\n-   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n-   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n-   License for more details.\n-\n-   Under Section 7 of GPL version 3, you are granted additional\n-   permissions described in the GCC Runtime Library Exception, version\n-   3.1, as published by the Free Software Foundation.\n-\n-   You should have received a copy of the GNU General Public License and\n-   a copy of the GCC Runtime Library Exception along with this program;\n-   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see\n-   <http://www.gnu.org/licenses/>.  */\n-\n-typedef          int  sint32_type   __attribute__ ((mode (SI)));\n-typedef unsigned int  uint32_type   __attribute__ ((mode (SI)));\n-typedef int           word_type     __attribute__ ((mode (__word__)));\n-\n-uint32_type udivmodsi4 (uint32_type, uint32_type, word_type);\n-sint32_type __divsi3   (sint32_type, sint32_type);\n-sint32_type __modsi3   (sint32_type, sint32_type);\n-\n-uint32_type\n-udivmodsi4 (uint32_type num, uint32_type den, word_type modwanted)\n-{\n-  uint32_type bit = 1;\n-  uint32_type res = 0;\n-\n-  while (den < num && bit && !(den & (1L << 31)))\n-    {\n-      den <<= 1;\n-      bit <<= 1;\n-    }\n-  while (bit)\n-    {\n-      if (num >= den)\n-\t{\n-\t  num -= den;\n-\t  res |= bit;\n-\t}\n-      bit >>= 1;\n-      den >>= 1;\n-    }\n-  if (modwanted)\n-    return num;\n-  return res;\n-}\n-\n-sint32_type\n-__divsi3 (sint32_type a, sint32_type b)\n-{\n-  word_type neg = 0;\n-  sint32_type res;\n-\n-  if (a < 0)\n-    {\n-      a = -a;\n-      neg = !neg;\n-    }\n-\n-  if (b < 0)\n-    {\n-      b = -b;\n-      neg = !neg;\n-    }\n-\n-  res = udivmodsi4 (a, b, 0);\n-\n-  if (neg)\n-    res = -res;\n-\n-  return res;\n-}\n-\n-sint32_type\n-__modsi3 (sint32_type a, sint32_type b)\n-{\n-  word_type neg = 0;\n-  sint32_type res;\n-\n-  if (a < 0)\n-    {\n-      a = -a;\n-      neg = 1;\n-    }\n-\n-  if (b < 0)\n-    b = -b;\n-\n-  res = udivmodsi4 (a, b, 1);\n-\n-  if (neg)\n-    res = -res;\n-\n-  return res;\n-}\n-\n-/* See the comment by the definition of LIBGCC2_UNITS_PER_WORD in\n-   m32c.h for why we are creating extra versions of some of the\n-   functions defined in libgcc2.c.  */\n-\n-#define LIBGCC2_UNITS_PER_WORD 2\n-\n-#define L_clzsi2\n-#define L_ctzsi2\n-#define L_ffssi2\n-#define L_paritysi2\n-#define L_popcountsi2\n-\n-#include \"libgcc2.c\"\n-\n-uint32_type\n-__udivsi3 (uint32_type a, uint32_type b)\n-{\n-  return udivmodsi4 (a, b, 0);\n-}\n-\n-uint32_type\n-__umoddi3 (uint32_type a, uint32_type b)\n-{\n-  return udivmodsi4 (a, b, 1);\n-}\n-\n-/* Returns the number of leading redundant sign bits in X.\n-   I.e. the number of bits following the most significant bit which are\n-   identical to it.  There are no special cases for 0 or other values.  */\n-\n-int\n-__clrsbhi2 (word_type x)\n-{\n-  if (x < 0)\n-    x = ~x;\n-  if (x == 0)\n-    return 15;\n-  return __builtin_clz (x) - 1;\n-}\ndiff --git a/libgcc/config/m32c/t-m32c b/libgcc/config/m32c/t-m32c\ndeleted file mode 100644\nindex dac99ec652f..00000000000\n--- a/libgcc/config/m32c/t-m32c\n+++ /dev/null\n@@ -1,13 +0,0 @@\n-LIB1ASMSRC = m32c/lib1funcs.S\n-\n-LIB1ASMFUNCS = \\\n-\t__m32c_memregs \\\n-\t__m32c_eh_return \\\n-\t__m32c_mulsi3 \\\n-\t__m32c_cmpsi2 \\\n-\t__m32c_ucmpsi2 \\\n-\t__m32c_jsri16\n-\n-LIB2ADD = $(srcdir)/config/m32c/lib2funcs.c \\\n-\t  $(srcdir)/config/m32c/trapv.c\n-\ndiff --git a/libgcc/config/m32c/trapv.c b/libgcc/config/m32c/trapv.c\ndeleted file mode 100644\nindex 27cfc01b85d..00000000000\n--- a/libgcc/config/m32c/trapv.c\n+++ /dev/null\n@@ -1,42 +0,0 @@\n-/* 16-bit trapping arithmetic routines for R8C/M16C/M32C\n-   Copyright (C) 2009-2026 Free Software Foundation, Inc.\n-   Contributed by Red Hat.\n-\n-   This file is part of GCC.\n-\n-   GCC is free software; you can redistribute it and/or modify it\n-   under the terms of the GNU General Public License as published\n-   by the Free Software Foundation; either version 3, or (at your\n-   option) any later version.\n-\n-   GCC is distributed in the hope that it will be useful, but WITHOUT\n-   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n-   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public\n-   License for more details.\n-\n-   Under Section 7 of GPL version 3, you are granted additional\n-   permissions described in the GCC Runtime Library Exception, version\n-   3.1, as published by the Free Software Foundation.\n-\n-   You should have received a copy of the GNU General Public License and\n-   a copy of the GCC Runtime Library Exception along with this program;\n-   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see\n-   <http://www.gnu.org/licenses/>.  */\n-\n-/* See the comment by the definition of LIBGCC2_UNITS_PER_WORD in\n-   m32c.h for why we are creating extra versions of some of the\n-   functions defined in libgcc2.c.\n-\n-   Note - this file is separate from lib2funcs.c so that the following\n-   functions will appear in the their object file.  This is necessary\n-   because they call abort() which is defined in the C library whereas\n-   the functions in lib2funcs.c are completely self sufficient.  */\n-\n-#define LIBGCC2_UNITS_PER_WORD 2\n-\n-#define L_mulvsi3\n-#define L_negvsi2\n-#define L_addvsi3\n-#define L_subvsi3\n-\n-#include \"libgcc2.c\"\ndiff --git a/libgcc/config/rl78/lib2div.c b/libgcc/config/rl78/lib2div.c\nindex 5ba3b3ed197..6298c6860a7 100644\n--- a/libgcc/config/rl78/lib2div.c\n+++ b/libgcc/config/rl78/lib2div.c\n@@ -35,7 +35,7 @@ typedef int           word_type     __attribute__ ((mode (__word__)));\n #define C3(a,b,c) C3B(a,b,c)\n \n /* See the comment by the definition of LIBGCC2_UNITS_PER_WORD in\n-   m32c.h for why we are creating extra versions of some of the\n+   msp430.h for why we are creating extra versions of some of the\n    functions defined in libgcc2.c.  */\n \n #define LIBGCC2_UNITS_PER_WORD 2\n","prefixes":["GCC17-stage1"]}