[00/11] New backend for the TI PRU processor

Message ID 20180613185805.7833-1-dimitar@dinux.eu
Headers show
Series
  • New backend for the TI PRU processor
Related show

Message

Dimitar Dimitrov June 13, 2018, 6:57 p.m.
Hi,

I would like to contribute a port for the TI PRU I/O processor [1], [2].

PRU is naturally 32-bit, but it is presented as 8-bit CPU for the GCC port.
This is needed in order to take advantage of the efficient PRU ISA modes
for addressing HW subregs [3].

The binutils port has been merged. I will post patches for newlib
and simulator.

The last two patches are the only ones modifying GCC core code.

Logs from running the GCC testsuite using PRU simulator [4] are uploaded here:
  http://dinux.eu/gnupru/testresults/index.html

Note that the listed C ABI failures are due to bugs in the vendor's
proprietary toolchain I'm running the test against. GCC produces correct code
in those cases.

I could not implement full ABI compatibility [5] with the TI proprietary
toolchain. One significant reason is that different data and code
pointer sizes do not seem to be well accepted [6]. At the very least, it
would require major core changes in GCC core. So I have implemented a
compromise:
  * -mabi=gnu the default mode, with full C language support, but with
    a few deviations from TI ABI.
  * -mabi=ti mode, where any non-ABI compliant source expression causes a
     compile error.

Regards,
Dimitar

[1] http://processors.wiki.ti.com/index.php/PRU-ICSS
[2] http://beagleboard.org/pru
[3] http://gcc.gnu.org/ml/gcc/2017-01/msg00217.html
[4] https://github.com/dinuxbg/gnupru/tree/master/testing
[5] https://github.com/dinuxbg/gnupru/wiki/ABI
[6] http://gcc.gnu.org/ml/gcc/2012-04/msg00870.html


Dimitar Dimitrov (11):
  Initial TI PRU GCC port
  Initial TI PRU libgcc port
  testsuite: Add PRU tests
  testsuite: Add check for overflowed IMEM region to testsuite
  testsuite: Add check for unsupported TI ABI PRU features to testsuite
  testsuite: Remove PRU from test cases requiring hosted environment
  testsuite: Define PRU stack usage
  testsuite: Mark that PRU has one-cycle jumps
  testsuite: Mark that PRU uses all function pointer bits
  Fix LRA to handle multi-word eliminable registers
  Increase MAX_MAX_OPERANDS limit

 configure.ac                                       |    7 +
 gcc/common/config/pru/pru-common.c                 |   36 +
 gcc/config.gcc                                     |    9 +
 gcc/config/pru/alu-zext.md                         |  178 ++
 gcc/config/pru/constraints.md                      |   88 +
 gcc/config/pru/predicates.md                       |  220 ++
 gcc/config/pru/pru-ldst-multiple.ml                |  144 +
 gcc/config/pru/pru-opts.h                          |   31 +
 gcc/config/pru/pru-passes.c                        |  230 ++
 gcc/config/pru/pru-pragma.c                        |   90 +
 gcc/config/pru/pru-protos.h                        |   70 +
 gcc/config/pru/pru.c                               | 2985 ++++++++++++++++++++
 gcc/config/pru/pru.h                               |  551 ++++
 gcc/config/pru/pru.md                              |  905 ++++++
 gcc/config/pru/pru.opt                             |   53 +
 gcc/config/pru/t-pru                               |   31 +
 gcc/doc/extend.texi                                |   20 +
 gcc/doc/invoke.texi                                |   55 +
 gcc/doc/md.texi                                    |   22 +
 gcc/genoutput.c                                    |    2 +-
 gcc/lra-eliminations.c                             |   14 +-
 gcc/testsuite/g++.old-deja/g++.abi/ptrmem.C        |    2 +-
 gcc/testsuite/gcc.c-torture/execute/20101011-1.c   |    3 +
 gcc/testsuite/gcc.dg/20020312-2.c                  |    2 +
 gcc/testsuite/gcc.dg/stack-usage-1.c               |    2 +
 gcc/testsuite/gcc.dg/tree-ssa/20040204-1.c         |    2 +-
 gcc/testsuite/gcc.dg/tree-ssa/reassoc-33.c         |    2 +-
 gcc/testsuite/gcc.dg/tree-ssa/reassoc-34.c         |    2 +-
 gcc/testsuite/gcc.dg/tree-ssa/reassoc-35.c         |    2 +-
 gcc/testsuite/gcc.dg/tree-ssa/reassoc-36.c         |    2 +-
 gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-14.c      |    2 +-
 gcc/testsuite/gcc.target/pru/abi-arg-struct.c      |  164 ++
 gcc/testsuite/gcc.target/pru/ashiftrt.c            |   13 +
 gcc/testsuite/gcc.target/pru/builtins-1.c          |   12 +
 gcc/testsuite/gcc.target/pru/builtins-error.c      |    6 +
 gcc/testsuite/gcc.target/pru/clearbit.c            |   13 +
 gcc/testsuite/gcc.target/pru/loop-asm.c            |   19 +
 gcc/testsuite/gcc.target/pru/loop-dowhile.c        |   45 +
 gcc/testsuite/gcc.target/pru/loop-hi-1.c           |   38 +
 gcc/testsuite/gcc.target/pru/loop-hi-2.c           |   17 +
 gcc/testsuite/gcc.target/pru/loop-qi-1.c           |   38 +
 gcc/testsuite/gcc.target/pru/loop-qi-2.c           |   17 +
 gcc/testsuite/gcc.target/pru/loop-short-1.c        |   53 +
 gcc/testsuite/gcc.target/pru/loop-short-2.c        |   21 +
 gcc/testsuite/gcc.target/pru/loop-si-1.c           |   41 +
 gcc/testsuite/gcc.target/pru/loop-si-2.c           |   20 +
 .../gcc.target/pru/loop-u8_pcrel_overflow.c        |   42 +
 gcc/testsuite/gcc.target/pru/loop-ubyte-1.c        |   30 +
 gcc/testsuite/gcc.target/pru/loop-ubyte-2.c        |   18 +
 .../pru/lra-framepointer-fragmentation-1.c         |   33 +
 .../pru/lra-framepointer-fragmentation-2.c         |   61 +
 gcc/testsuite/gcc.target/pru/mabi-ti-1.c           |   10 +
 gcc/testsuite/gcc.target/pru/mabi-ti-2.c           |   15 +
 gcc/testsuite/gcc.target/pru/mabi-ti-3.c           |   12 +
 gcc/testsuite/gcc.target/pru/mabi-ti-4.c           |   14 +
 gcc/testsuite/gcc.target/pru/mabi-ti-5.c           |   33 +
 gcc/testsuite/gcc.target/pru/mabi-ti-6.c           |   12 +
 gcc/testsuite/gcc.target/pru/mabi-ti-7.c           |   21 +
 gcc/testsuite/gcc.target/pru/pr64366.c             |  128 +
 gcc/testsuite/gcc.target/pru/pragma-ctable_entry.c |   22 +
 gcc/testsuite/gcc.target/pru/pru.exp               |   41 +
 gcc/testsuite/gcc.target/pru/qbbc-1.c              |   29 +
 gcc/testsuite/gcc.target/pru/qbbc-2.c              |   15 +
 gcc/testsuite/gcc.target/pru/qbbc-3.c              |   15 +
 gcc/testsuite/gcc.target/pru/qbbs-1.c              |   29 +
 gcc/testsuite/gcc.target/pru/qbbs-2.c              |   15 +
 gcc/testsuite/gcc.target/pru/setbit.c              |   13 +
 .../gcc.target/pru/zero_extend-and-hisi.c          |   16 +
 .../gcc.target/pru/zero_extend-and-qihi.c          |   16 +
 .../gcc.target/pru/zero_extend-and-qisi.c          |   16 +
 gcc/testsuite/gcc.target/pru/zero_extend-hisi.c    |   43 +
 gcc/testsuite/gcc.target/pru/zero_extend-qihi.c    |   43 +
 gcc/testsuite/gcc.target/pru/zero_extend-qisi.c    |   43 +
 gcc/testsuite/lib/gcc-dg.exp                       |   16 +
 gcc/testsuite/lib/target-supports.exp              |   12 +-
 gcc/testsuite/lib/target-utils.exp                 |   12 +
 libgcc/config.host                                 |    7 +
 libgcc/config/pru/asri.c                           |   33 +
 libgcc/config/pru/eqd.c                            |   45 +
 libgcc/config/pru/eqf.c                            |   45 +
 libgcc/config/pru/ged.c                            |   45 +
 libgcc/config/pru/gef.c                            |   45 +
 libgcc/config/pru/gtd.c                            |   45 +
 libgcc/config/pru/gtf.c                            |   45 +
 libgcc/config/pru/led.c                            |   45 +
 libgcc/config/pru/lef.c                            |   45 +
 libgcc/config/pru/lib2bitcountHI.c                 |   43 +
 libgcc/config/pru/lib2divHI.c                      |   42 +
 libgcc/config/pru/lib2divQI.c                      |   42 +
 libgcc/config/pru/lib2divSI.c                      |   48 +
 libgcc/config/pru/libgcc-eabi.ver                  |   88 +
 libgcc/config/pru/ltd.c                            |   45 +
 libgcc/config/pru/ltf.c                            |   45 +
 libgcc/config/pru/mpyll.S                          |   57 +
 libgcc/config/pru/pru-abi.h                        |  109 +
 libgcc/config/pru/pru-asm.h                        |   35 +
 libgcc/config/pru/pru-divmod.h                     |  117 +
 libgcc/config/pru/sfp-machine.h                    |  125 +
 libgcc/config/pru/t-pru                            |   50 +
 99 files changed, 8338 insertions(+), 12 deletions(-)
 create mode 100644 gcc/common/config/pru/pru-common.c
 create mode 100644 gcc/config/pru/alu-zext.md
 create mode 100644 gcc/config/pru/constraints.md
 create mode 100644 gcc/config/pru/predicates.md
 create mode 100644 gcc/config/pru/pru-ldst-multiple.ml
 create mode 100644 gcc/config/pru/pru-opts.h
 create mode 100644 gcc/config/pru/pru-passes.c
 create mode 100644 gcc/config/pru/pru-pragma.c
 create mode 100644 gcc/config/pru/pru-protos.h
 create mode 100644 gcc/config/pru/pru.c
 create mode 100644 gcc/config/pru/pru.h
 create mode 100644 gcc/config/pru/pru.md
 create mode 100644 gcc/config/pru/pru.opt
 create mode 100644 gcc/config/pru/t-pru
 create mode 100644 gcc/testsuite/gcc.target/pru/abi-arg-struct.c
 create mode 100644 gcc/testsuite/gcc.target/pru/ashiftrt.c
 create mode 100644 gcc/testsuite/gcc.target/pru/builtins-1.c
 create mode 100644 gcc/testsuite/gcc.target/pru/builtins-error.c
 create mode 100644 gcc/testsuite/gcc.target/pru/clearbit.c
 create mode 100644 gcc/testsuite/gcc.target/pru/loop-asm.c
 create mode 100644 gcc/testsuite/gcc.target/pru/loop-dowhile.c
 create mode 100644 gcc/testsuite/gcc.target/pru/loop-hi-1.c
 create mode 100644 gcc/testsuite/gcc.target/pru/loop-hi-2.c
 create mode 100644 gcc/testsuite/gcc.target/pru/loop-qi-1.c
 create mode 100644 gcc/testsuite/gcc.target/pru/loop-qi-2.c
 create mode 100644 gcc/testsuite/gcc.target/pru/loop-short-1.c
 create mode 100644 gcc/testsuite/gcc.target/pru/loop-short-2.c
 create mode 100644 gcc/testsuite/gcc.target/pru/loop-si-1.c
 create mode 100644 gcc/testsuite/gcc.target/pru/loop-si-2.c
 create mode 100644 gcc/testsuite/gcc.target/pru/loop-u8_pcrel_overflow.c
 create mode 100644 gcc/testsuite/gcc.target/pru/loop-ubyte-1.c
 create mode 100644 gcc/testsuite/gcc.target/pru/loop-ubyte-2.c
 create mode 100644 gcc/testsuite/gcc.target/pru/lra-framepointer-fragmentation-1.c
 create mode 100644 gcc/testsuite/gcc.target/pru/lra-framepointer-fragmentation-2.c
 create mode 100644 gcc/testsuite/gcc.target/pru/mabi-ti-1.c
 create mode 100644 gcc/testsuite/gcc.target/pru/mabi-ti-2.c
 create mode 100644 gcc/testsuite/gcc.target/pru/mabi-ti-3.c
 create mode 100644 gcc/testsuite/gcc.target/pru/mabi-ti-4.c
 create mode 100644 gcc/testsuite/gcc.target/pru/mabi-ti-5.c
 create mode 100644 gcc/testsuite/gcc.target/pru/mabi-ti-6.c
 create mode 100644 gcc/testsuite/gcc.target/pru/mabi-ti-7.c
 create mode 100644 gcc/testsuite/gcc.target/pru/pr64366.c
 create mode 100644 gcc/testsuite/gcc.target/pru/pragma-ctable_entry.c
 create mode 100644 gcc/testsuite/gcc.target/pru/pru.exp
 create mode 100644 gcc/testsuite/gcc.target/pru/qbbc-1.c
 create mode 100644 gcc/testsuite/gcc.target/pru/qbbc-2.c
 create mode 100644 gcc/testsuite/gcc.target/pru/qbbc-3.c
 create mode 100644 gcc/testsuite/gcc.target/pru/qbbs-1.c
 create mode 100644 gcc/testsuite/gcc.target/pru/qbbs-2.c
 create mode 100644 gcc/testsuite/gcc.target/pru/setbit.c
 create mode 100644 gcc/testsuite/gcc.target/pru/zero_extend-and-hisi.c
 create mode 100644 gcc/testsuite/gcc.target/pru/zero_extend-and-qihi.c
 create mode 100644 gcc/testsuite/gcc.target/pru/zero_extend-and-qisi.c
 create mode 100644 gcc/testsuite/gcc.target/pru/zero_extend-hisi.c
 create mode 100644 gcc/testsuite/gcc.target/pru/zero_extend-qihi.c
 create mode 100644 gcc/testsuite/gcc.target/pru/zero_extend-qisi.c
 create mode 100644 libgcc/config/pru/asri.c
 create mode 100644 libgcc/config/pru/eqd.c
 create mode 100644 libgcc/config/pru/eqf.c
 create mode 100644 libgcc/config/pru/ged.c
 create mode 100644 libgcc/config/pru/gef.c
 create mode 100644 libgcc/config/pru/gtd.c
 create mode 100644 libgcc/config/pru/gtf.c
 create mode 100644 libgcc/config/pru/led.c
 create mode 100644 libgcc/config/pru/lef.c
 create mode 100644 libgcc/config/pru/lib2bitcountHI.c
 create mode 100644 libgcc/config/pru/lib2divHI.c
 create mode 100644 libgcc/config/pru/lib2divQI.c
 create mode 100644 libgcc/config/pru/lib2divSI.c
 create mode 100644 libgcc/config/pru/libgcc-eabi.ver
 create mode 100644 libgcc/config/pru/ltd.c
 create mode 100644 libgcc/config/pru/ltf.c
 create mode 100644 libgcc/config/pru/mpyll.S
 create mode 100644 libgcc/config/pru/pru-abi.h
 create mode 100644 libgcc/config/pru/pru-asm.h
 create mode 100644 libgcc/config/pru/pru-divmod.h
 create mode 100644 libgcc/config/pru/sfp-machine.h
 create mode 100644 libgcc/config/pru/t-pru

-- 
2.11.0