ff9350e750
* README: Add section discussing status of ELF ABI. * i370.c: Fix misc spelling mistakes. (i370_label_scan): Updated notes, exception handling. (i370_function_prolog): Simplify ELF stack handling. * i370.h: (FIXED_REGISTERS): Free up r12 for ELF. (STACK_GROWS_DOWNWARD): ELF stack grows down. (ASM_DECLARE_FUNCTION_NAME): Fix crazy malloc size. * i370.md: (movdi): Add notes. (floatsidf2): Use stack not rtca for scratch float area. (iorsi3): Correct operand constraints. * x-oe: Restore TAROUTOPTS which are used by pax. From-SVN: r29185
126 lines
4.9 KiB
Plaintext
126 lines
4.9 KiB
Plaintext
|
|
This directory contains code for building a compiler for the
|
|
32-bit ESA/390 architecture. It supports three different styles
|
|
of assembly:
|
|
|
|
-- MVS for use with the HLASM assembler
|
|
-- Open Edition (USS Unix System Services)
|
|
-- ELF/Linux for use with the binutils/gas GNU assembler.
|
|
|
|
|
|
Cross-compiling Hints
|
|
---------------------
|
|
When building a cross-compiler on AIX, set the environment variable CC
|
|
and be sure to set the -ma and -qcpluscmt flags; i.e.
|
|
|
|
export CC="cc -ma -qcpluscmt"
|
|
|
|
do this *before* running configure, e.g.
|
|
|
|
configure --target=i370-ibm-linux --prefix=/where/to/install/usr
|
|
|
|
The Objective-C and FORTRAN front ends don't build. To avoid looking at
|
|
errors, do only
|
|
|
|
make LANGUAGES=c
|
|
|
|
|
|
OpenEdition Hints
|
|
-----------------
|
|
The shell script "install" is handy for users of OpenEdition.
|
|
|
|
|
|
The ELF ABI
|
|
-----------
|
|
This compiler, in conjunction with the gas/binutils assembler, defines
|
|
a defacto ELF-based ABI for the ESA/390 architecture. Be warned: this
|
|
ABI has several major faults. It should be fixed. As it is fixed,
|
|
it is subject to change without warning. You should not commit to major
|
|
software systems without further exploring and fixing these problems.
|
|
Here are some of the problems:
|
|
|
|
-- No support for shared libraries or dynamically loadable objects.
|
|
This is because the compiler currently places address literals in
|
|
the text section. Although the GAS assembler supports a syntax for
|
|
USING that will place address literals in the data section, this forces
|
|
the use of two base registers, one for branches and one for the literal
|
|
pool. Work is needed to redesign the function prologue, epilogue and the
|
|
base register reloads to minimize the currently excessive use of reserved
|
|
registers.
|
|
|
|
I beleive the best solution would be to add a toc or plt, and extending
|
|
the meaning of the USING directive to encompass this. This would
|
|
allow the continued use of the human-readable and familiar practice
|
|
of using =A() and =F'' to denote address literals, as opposed to more
|
|
difficult jump-table notation.
|
|
|
|
-- the stackframe is almost twice as big as it needs to be.
|
|
|
|
-- currently, r15 is used to return 32-bit values. Because this is the
|
|
last register, it prevents 64-bit ints and small structures from being
|
|
returned in registers, forcing return in memory. It would be more
|
|
efficient to use r14 to return 32-bit values, and r14+r15 to return
|
|
64-bit values.
|
|
|
|
-- all arguments are currently passed in memory. It would be more efficient
|
|
to pass arguments in registers.
|
|
|
|
|
|
|
|
|
|
ChangeLog
|
|
---------
|
|
Oct98-Dec98 -- add ELF back end; work on getting ABI more or less functional.
|
|
98.12.05 -- fix numerous MVC bugs
|
|
99.02.06 -- multiply insn sometimes not generated when needed.
|
|
-- extendsidi bugs, bad literal values printed
|
|
-- remove broken adddi subdi patterns
|
|
99.02.15 -- add clrstrsi pattern
|
|
-- fix -O2 divide bug
|
|
99.03.04 -- base & index reg usage bugs
|
|
99.03.15 -- fixes for returning long longs and structs (struct value return)
|
|
99.03.29 -- fix handling & alignment of shorts
|
|
99.03.31 -- clobbered register 14 is not always clobbered
|
|
99.04.02 -- operand constraints for cmphi
|
|
99.04.07 -- function pointer fixes for call, call_value patterns,
|
|
function pointers derefed once too often.
|
|
99.04.14 -- add pattern to print double-wide int
|
|
-- check intval<4096 for misc operands
|
|
-- add clrstrsi pattern
|
|
-- movstrsi fixes
|
|
99.04.16 -- use r2 to pass args into r11 in subroutine call.
|
|
-- fixes to movsi; some operand combinations impossible;
|
|
rework constraints
|
|
-- start work on forward jump optimization
|
|
-- char alignment bug
|
|
99.04.25 -- add untyped_call pattern so that builtin_apply works
|
|
99.04.27 -- fixes to compare logical under mask
|
|
99.04.28 -- reg 2 is clobbered by calls
|
|
99.04.30 -- fix rare mulsi bug
|
|
99.04.30 -- add constraints so that all RS, SI, SS forms insns have valid
|
|
addressing modes
|
|
99.04.30 -- major condition code fixes. The old code was just way off
|
|
w.r.t. which insns set condition code, and the codes that
|
|
were set. The extent of this damage was unbeleivable.
|
|
99.05.01 -- restructuring of operand constraints on many patterns,
|
|
many lead to invalid instructions being genned.
|
|
99.05.02 -- float pt fixes
|
|
-- fix movdi issue bugs
|
|
99.05.03 -- fix divide insn; was dividing incorrectly
|
|
99.05.05 -- fix sign extension problems on andhi
|
|
-- deprecate some constraints
|
|
99.05.06 -- add set_attr insn lengths; fix misc litpool sizes
|
|
-- add notes about how unsigned jumps work (i.e.
|
|
arithmetic vs. logical vs. signed vs unsigned).
|
|
99.05.11 -- use insn length to predict forward branch target;
|
|
use relative branchining where possible,
|
|
remove un-needed base register reload.
|
|
99.05.15 -- fix movstrsi, clrstrsi, cmpstrsi patterns as per conversation
|
|
w/ Richard Henderson
|
|
|
|
|
|
|
|
|
|
|
|
|