Hi all,
This is somewhat a continuation of the previous effort [1] to bring nanoMIPS support upstream. We would like to move our toolchain releases [2] to something more closer to the upstream GCC. As part of that, we are interested in feedback from the community if the current approach of code sharing between nanoMIPS and MIPS backend is viable for future upstream inclusion? The RFC presented here contains enough to produce the nanomips-elf toolchain when paired with [3], [4], [5]. It targets a little-endian bare metal environment using p32 ABI with soft-float. Any feedback on it will be appreciated. Best regards, Dragan References: [1] https://gcc.gnu.org/legacy-ml/gcc/2018-05/msg00012.html [2] https://github.com/MediaTek-Labs/nanomips-gnu-toolchain/releases/tag/nanoMIPS-2021.07-01 [3] https://github.com/MediaTek-Labs/newlib/tree/mtk/newlib250 [4] https://github.com/MediaTek-Labs/binutils-gdb/tree/mtk/binutils_v9 [5] https://github.com/MediaTek-Labs/binutils-gdb/tree/mtk/gold_v7 (Robert Suchanek) (Toma Tabacu) (Matthew Fortune) (Zoran Jovanovic) (Prachi Godbole) (Faraz Shahbazker) (Steve Ellcey) (Jack Romo) (Stefan Markovic) (Sara Popadic) (Mihailo Stojanovic) (Dragan Mladjenovic) Avoid references to register names in instruction output patterns Make mips-classic.md entry point for mips*-*-* targets Add nanoMIPS support Add test cases for nanoMIPS Fix unhelpful messages for disabled options Enable MIPS DSP rev3 ASE for nanoMIPS Add documentation for nanoMIPS config.sub | 3 +- config/mt-nanomips (new) | 6 + configure | 9 +- configure.ac | 9 +- contrib/test_installed | 3 +- gcc/config.gcc | 65 + gcc/config/mips/constraints.md | 57 +- gcc/config/mips/genopt-nanomips.sh (new +x) | 74 + gcc/config/mips/i7200.md (new) | 142 + gcc/config/mips/micromips.md | 12 +- gcc/config/mips/mips-classic.md (new) | 142 + gcc/config/mips/mips-dsp.md | 17 +- gcc/config/mips/mips-ftypes.def | 1 + gcc/config/mips/mips-opts.h | 8 + gcc/config/mips/mips-protos.h | 81 +- gcc/config/mips/mips.c | 3697 +++++++++++++++-- gcc/config/mips/mips.h | 456 +- gcc/config/mips/mips.md | 1043 +++-- gcc/config/mips/mips.opt | 126 +- gcc/config/mips/nanomips-cpus.def (new) | 41 + gcc/config/mips/nanomips-tables.opt (new) | 40 + gcc/config/mips/nanomips.h (new) | 349 ++ gcc/config/mips/nanomips.md (new) | 285 ++ gcc/config/mips/nanomips.opt (new) | 60 + gcc/config/mips/predicates.md | 246 +- gcc/config/mips/t-nanomips (new) | 23 + gcc/config/mips/t-nanomips-elf (new) | 36 + gcc/configure | 8 + gcc/configure.ac | 6 + gcc/doc/extend.texi | 124 + gcc/doc/invoke.texi | 367 ++ gcc/doc/md.texi | 71 + gcc/opt-suggestions.c | 3 + gcc/optc-gen.awk | 5 +- gcc/opts.c | 4 + .../gcc.target/nanomips/addiu48-1.c (new) | 12 + .../gcc.target/nanomips/addiu48-2.c (new) | 12 + .../gcc.target/nanomips/beqic-1.c (new) | 13 + .../gcc.target/nanomips/bgeiuc-1.c (new) | 31 + .../gcc.target/nanomips/bltc-1.c (new) | 28 + .../gcc.target/nanomips/bltic-1.c (new) | 11 + .../gcc.target/nanomips/bltiuc-1.c (new) | 19 + .../gcc.target/nanomips/bnec-1.c (new) | 11 + .../gcc.target/nanomips/bneic-1.c (new) | 11 + .../gcc.target/nanomips/bnezc-1.c (new) | 18 + .../gcc.target/nanomips/branch-2.c (new) | 13 + .../gcc.target/nanomips/branch-3.c (new) | 12 + .../gcc.target/nanomips/branch-4.c (new) | 12 + .../gcc.target/nanomips/branch-5.c (new) | 11 + .../gcc.target/nanomips/branch-helper.h (new) | 107 + .../gcc.target/nanomips/bswap-1.c (new) | 10 + .../gcc.target/nanomips/bswap-2.c (new) | 9 + .../gcc.target/nanomips/bswap-3.c (new) | 13 + .../gcc.target/nanomips/bswap-4.c (new) | 9 + .../gcc.target/nanomips/cache-1.c (new) | 31 + .../gcc.target/nanomips/call-saved-1.c (new) | 14 + .../gcc.target/nanomips/clear-cache-1.c (new) | 13 + .../gcc.target/nanomips/constraint-m.c (new) | 9 + .../gcc.target/nanomips/dpaq_sa_l_w.c (new) | 51 + .../gcc.target/nanomips/dpsq_sa_l_w.c (new) | 37 + .../gcc.target/nanomips/dsp-ctrl.c (new) | 69 + .../gcc.target/nanomips/dsp-lhxs.c (new) | 11 + .../gcc.target/nanomips/dsp-no-lhx.c (new) | 11 + .../gcc.target/nanomips/ext-5.c (new) | 12 + .../gcc.target/nanomips/ext-7.c (new) | 11 + .../gcc.target/nanomips/ext_ins.c (new) | 25 + .../nanomips/fixed-scalar-type.c (new) | 218 + .../nanomips/fixed-vector-type.c (new) | 133 + .../gcc.target/nanomips/fp-alloca.c (new) | 16 + .../gcc.target/nanomips/gprel-1.c (new) | 20 + .../hazard-barrier-return-attribute.c (new) | 19 + .../nanomips/inline-memcpy-1.c (new) | 16 + .../nanomips/inline-memcpy-2.c (new) | 15 + .../gcc.target/nanomips/ins-1.c (new) | 17 + .../gcc.target/nanomips/ins-2.c (new) | 17 + .../gcc.target/nanomips/jump-table-1.c (new) | 38 + .../gcc.target/nanomips/jump-table.c (new) | 21 + .../gcc.target/nanomips/length-1.c (new) | 13 + .../gcc.target/nanomips/length-2.c (new) | 11 + .../gcc.target/nanomips/lhxs.c (new) | 11 + .../gcc.target/nanomips/li48-1.c (new) | 11 + .../gcc.target/nanomips/li48-2.c (new) | 12 + .../nanomips/libcall-abs-call.c (new) | 9 + .../gcc.target/nanomips/long-calls-pg.c (new) | 7 + .../gcc.target/nanomips/lwm-swm.c (new) | 17 + .../gcc.target/nanomips/lx-1.c (new) | 20 + .../gcc.target/nanomips/lx-3.c (new) | 15 + .../gcc.target/nanomips/madd-4.c (new) | 27 + .../gcc.target/nanomips/maddu-3.c (new) | 30 + .../gcc.target/nanomips/maddu-4.c (new) | 30 + .../gcc.target/nanomips/memcpy-1.c (new) | 20 + .../nanomips/mips-prepend-1.c (new) | 8 + .../nanomips/mips32-dsp-run.c (new) | 1063 +++++ .../gcc.target/nanomips/mips32-dspr2.c (new) | 541 +++ .../gcc.target/nanomips/movcc-1.c (new) | 19 + .../gcc.target/nanomips/movep-1.c (new) | 17 + .../gcc.target/nanomips/movep-2.c (new) | 13 + .../gcc.target/nanomips/msub-4.c (new) | 21 + .../gcc.target/nanomips/msubu-4.c (new) | 24 + .../gcc.target/nanomips/mulsize-1.c (new) | 10 + .../gcc.target/nanomips/mulsize-2.c (new) | 11 + .../gcc.target/nanomips/mulsize-3.c (new) | 12 + .../gcc.target/nanomips/mulsize-4.c (new) | 12 + .../gcc.target/nanomips/mulsize-5.c (new) | 13 + .../gcc.target/nanomips/mulsize-6.c (new) | 13 + .../nanomips-attr-nomicromips.c (new) | 3 + .../nanomips/nanomips-attr-nomips16.c (new) | 3 + .../nanomips/nanomips-dsp-accinit-2.c (new) | 23 + .../gcc.target/nanomips/nanomips-dsp.c (new) | 1160 ++++++ .../nanomips/nanomips-dspr3-type-1.c (new) | 30 + .../nanomips/nanomips-dspr3-type-2.c (new) | 12 + .../nanomips/nanomips-err-mabi32.c (new) | 4 + ...omips-models-func-extern-large-nmf.c (new) | 38 + .../nanomips-models-func-static-nmf.c (new) | 145 + ...ips-models-func-static-nopcrel-nmf.c (new) | 145 + ...nomips-models-module-nopcrel-nopid.c (new) | 6 + ...nanomips-models-module-nopcrel-pid.c (new) | 6 + ...nanomips-models-module-pcrel-nopid.c (new) | 6 + .../nanomips-models-module-pcrel-pid.c (new) | 6 + ...ps-models-var-access-got-large-nmf.c (new) | 15 + ...nomips-models-var-access-gprel-nmf.c (new) | 65 + ...ps-models-var-access-gprel-pid-nmf.c (new) | 72 + ...mips-models-var-access-nopcrel-nmf.c (new) | 80 + ...nomips-models-var-access-pcrel-nmf.c (new) | 76 + ...s-models-var-address-got-large-nmf.c (new) | 14 + ...omips-models-var-address-gprel-nmf.c (new) | 62 + ...s-models-var-address-gprel-pid-nmf.c (new) | 62 + ...ips-models-var-address-nopcrel-nmf.c (new) | 62 + ...omips-models-var-address-pcrel-nmf.c (new) | 62 + .../nanomips-module-default-pic1.c (new) | 6 + .../gcc.target/nanomips/nanomips.exp (new) | 880 ++++ .../gcc.target/nanomips/near-far-1.c (new) | 21 + .../gcc.target/nanomips/near-far-2.c (new) | 26 + .../gcc.target/nanomips/near-far-3.c (new) | 18 + .../gcc.target/nanomips/near-far-4.c (new) | 23 + gcc/testsuite/gcc.target/nanomips/nor.c (new) | 11 + .../gcc.target/nanomips/pr33755.c (new) | 29 + .../gcc.target/nanomips/pr35802.c (new) | 17 + .../gcc.target/nanomips/pr54240.c (new) | 27 + .../gcc.target/nanomips/pr55315.c (new) | 11 + .../gcc.target/nanomips/pr59137.c (new) | 33 + .../gcc.target/nanomips/pr65862-1.c (new) | 16 + .../gcc.target/nanomips/pr65862-2.c (new) | 31 + .../gcc.target/nanomips/pr68273.c (new) | 79 + .../gcc.target/nanomips/pr69129.c (new) | 29 + .../gcc.target/nanomips/reg-var-1.c (new) | 16 + .../gcc.target/nanomips/restore-1.c (new) | 19 + .../gcc.target/nanomips/restore-2.c (new) | 23 + .../gcc.target/nanomips/restore-jrc-1.c (new) | 10 + .../gcc.target/nanomips/scc-1.c (new) | 23 + .../gcc.target/nanomips/sdata-1.c (new) | 62 + .../gcc.target/nanomips/sdata-2.c (new) | 62 + .../gcc.target/nanomips/sdata-3.c (new) | 62 + .../gcc.target/nanomips/sdata-4.c (new) | 45 + .../gcc.target/nanomips/seqi-sltu-1.c (new) | 18 + .../gcc.target/nanomips/soft-float-1.c (new) | 8 + .../nanomips/ssdata-const-sf.c (new) | 7 + .../gcc.target/nanomips/sx-1.c (new) | 20 + .../gcc.target/nanomips/sx-2.c (new) | 14 + .../gcc.target/nanomips/teq-1.c (new) | 13 + .../gcc.target/nanomips/tne-1.c (new) | 12 + .../gcc.target/nanomips/union-zext.c (new) | 29 + .../gcc.target/nanomips/va-arg-1.c (new) | 48 + .../nanomips/var-multiword-misaligned.c (new) | 17 + gcc/testsuite/lib/scanasm.exp | 3 + gcc/testsuite/lib/target-supports.exp | 4 +- include/longlong.h | 9 +- libgcc/config.host | 21 + libgcc/config/mips/lib1funcs-nano.S (new) | 86 + libgcc/config/mips/t-nanomips (new) | 10 + libgcc/configure | 2 +- libgcc/configure.ac | 2 +- 172 files changed, 14043 insertions(+), 831 deletions(-) create mode 100644 config/mt-nanomips create mode 100755 gcc/config/mips/genopt-nanomips.sh create mode 100644 gcc/config/mips/i7200.md create mode 100644 gcc/config/mips/mips-classic.md create mode 100644 gcc/config/mips/nanomips-cpus.def create mode 100644 gcc/config/mips/nanomips-tables.opt create mode 100644 gcc/config/mips/nanomips.h create mode 100644 gcc/config/mips/nanomips.md create mode 100644 gcc/config/mips/nanomips.opt create mode 100644 gcc/config/mips/t-nanomips create mode 100644 gcc/config/mips/t-nanomips-elf create mode 100644 gcc/testsuite/gcc.target/nanomips/addiu48-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/addiu48-2.c create mode 100644 gcc/testsuite/gcc.target/nanomips/beqic-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/bgeiuc-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/bltc-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/bltic-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/bltiuc-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/bnec-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/bneic-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/bnezc-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/branch-2.c create mode 100644 gcc/testsuite/gcc.target/nanomips/branch-3.c create mode 100644 gcc/testsuite/gcc.target/nanomips/branch-4.c create mode 100644 gcc/testsuite/gcc.target/nanomips/branch-5.c create mode 100644 gcc/testsuite/gcc.target/nanomips/branch-helper.h create mode 100644 gcc/testsuite/gcc.target/nanomips/bswap-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/bswap-2.c create mode 100644 gcc/testsuite/gcc.target/nanomips/bswap-3.c create mode 100644 gcc/testsuite/gcc.target/nanomips/bswap-4.c create mode 100644 gcc/testsuite/gcc.target/nanomips/cache-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/call-saved-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/clear-cache-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/constraint-m.c create mode 100644 gcc/testsuite/gcc.target/nanomips/dpaq_sa_l_w.c create mode 100644 gcc/testsuite/gcc.target/nanomips/dpsq_sa_l_w.c create mode 100644 gcc/testsuite/gcc.target/nanomips/dsp-ctrl.c create mode 100644 gcc/testsuite/gcc.target/nanomips/dsp-lhxs.c create mode 100644 gcc/testsuite/gcc.target/nanomips/dsp-no-lhx.c create mode 100644 gcc/testsuite/gcc.target/nanomips/ext-5.c create mode 100644 gcc/testsuite/gcc.target/nanomips/ext-7.c create mode 100644 gcc/testsuite/gcc.target/nanomips/ext_ins.c create mode 100644 gcc/testsuite/gcc.target/nanomips/fixed-scalar-type.c create mode 100644 gcc/testsuite/gcc.target/nanomips/fixed-vector-type.c create mode 100644 gcc/testsuite/gcc.target/nanomips/fp-alloca.c create mode 100644 gcc/testsuite/gcc.target/nanomips/gprel-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/hazard-barrier-return-attribute.c create mode 100644 gcc/testsuite/gcc.target/nanomips/inline-memcpy-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/inline-memcpy-2.c create mode 100644 gcc/testsuite/gcc.target/nanomips/ins-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/ins-2.c create mode 100644 gcc/testsuite/gcc.target/nanomips/jump-table-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/jump-table.c create mode 100644 gcc/testsuite/gcc.target/nanomips/length-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/length-2.c create mode 100644 gcc/testsuite/gcc.target/nanomips/lhxs.c create mode 100644 gcc/testsuite/gcc.target/nanomips/li48-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/li48-2.c create mode 100644 gcc/testsuite/gcc.target/nanomips/libcall-abs-call.c create mode 100644 gcc/testsuite/gcc.target/nanomips/long-calls-pg.c create mode 100644 gcc/testsuite/gcc.target/nanomips/lwm-swm.c create mode 100644 gcc/testsuite/gcc.target/nanomips/lx-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/lx-3.c create mode 100644 gcc/testsuite/gcc.target/nanomips/madd-4.c create mode 100644 gcc/testsuite/gcc.target/nanomips/maddu-3.c create mode 100644 gcc/testsuite/gcc.target/nanomips/maddu-4.c create mode 100644 gcc/testsuite/gcc.target/nanomips/memcpy-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/mips-prepend-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/mips32-dsp-run.c create mode 100644 gcc/testsuite/gcc.target/nanomips/mips32-dspr2.c create mode 100644 gcc/testsuite/gcc.target/nanomips/movcc-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/movep-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/movep-2.c create mode 100644 gcc/testsuite/gcc.target/nanomips/msub-4.c create mode 100644 gcc/testsuite/gcc.target/nanomips/msubu-4.c create mode 100644 gcc/testsuite/gcc.target/nanomips/mulsize-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/mulsize-2.c create mode 100644 gcc/testsuite/gcc.target/nanomips/mulsize-3.c create mode 100644 gcc/testsuite/gcc.target/nanomips/mulsize-4.c create mode 100644 gcc/testsuite/gcc.target/nanomips/mulsize-5.c create mode 100644 gcc/testsuite/gcc.target/nanomips/mulsize-6.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-attr-nomicromips.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-attr-nomips16.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-dsp-accinit-2.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-dsp.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-dspr3-type-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-dspr3-type-2.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-err-mabi32.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-models-func-extern-large-nmf.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-models-func-static-nmf.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-models-func-static-nopcrel-nmf.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-models-module-nopcrel-nopid.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-models-module-nopcrel-pid.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-models-module-pcrel-nopid.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-models-module-pcrel-pid.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-models-var-access-got-large-nmf.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-models-var-access-gprel-nmf.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-models-var-access-gprel-pid-nmf.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-models-var-access-nopcrel-nmf.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-models-var-access-pcrel-nmf.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-models-var-address-got-large-nmf.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-models-var-address-gprel-nmf.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-models-var-address-gprel-pid-nmf.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-models-var-address-nopcrel-nmf.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-models-var-address-pcrel-nmf.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips-module-default-pic1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nanomips.exp create mode 100644 gcc/testsuite/gcc.target/nanomips/near-far-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/near-far-2.c create mode 100644 gcc/testsuite/gcc.target/nanomips/near-far-3.c create mode 100644 gcc/testsuite/gcc.target/nanomips/near-far-4.c create mode 100644 gcc/testsuite/gcc.target/nanomips/nor.c create mode 100644 gcc/testsuite/gcc.target/nanomips/pr33755.c create mode 100644 gcc/testsuite/gcc.target/nanomips/pr35802.c create mode 100644 gcc/testsuite/gcc.target/nanomips/pr54240.c create mode 100644 gcc/testsuite/gcc.target/nanomips/pr55315.c create mode 100644 gcc/testsuite/gcc.target/nanomips/pr59137.c create mode 100644 gcc/testsuite/gcc.target/nanomips/pr65862-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/pr65862-2.c create mode 100644 gcc/testsuite/gcc.target/nanomips/pr68273.c create mode 100644 gcc/testsuite/gcc.target/nanomips/pr69129.c create mode 100644 gcc/testsuite/gcc.target/nanomips/reg-var-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/restore-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/restore-2.c create mode 100644 gcc/testsuite/gcc.target/nanomips/restore-jrc-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/scc-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/sdata-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/sdata-2.c create mode 100644 gcc/testsuite/gcc.target/nanomips/sdata-3.c create mode 100644 gcc/testsuite/gcc.target/nanomips/sdata-4.c create mode 100644 gcc/testsuite/gcc.target/nanomips/seqi-sltu-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/soft-float-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/ssdata-const-sf.c create mode 100644 gcc/testsuite/gcc.target/nanomips/sx-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/sx-2.c create mode 100644 gcc/testsuite/gcc.target/nanomips/teq-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/tne-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/union-zext.c create mode 100644 gcc/testsuite/gcc.target/nanomips/va-arg-1.c create mode 100644 gcc/testsuite/gcc.target/nanomips/var-multiword-misaligned.c create mode 100644 libgcc/config/mips/lib1funcs-nano.S create mode 100644 libgcc/config/mips/t-nanomips -- 2.17.1