Retro68/binutils/gas/doc/c-i370.texi

201 lines
7.0 KiB
Plaintext
Raw Normal View History

2017-04-10 11:32:00 +00:00
@c Copyright (C) 2000-2017 Free Software Foundation, Inc.
2012-03-26 19:18:29 +00:00
@c This is part of the GAS manual.
@c For copying conditions, see the file as.texinfo.
@ifset GENERIC
@page
@node ESA/390-Dependent
@chapter ESA/390 Dependent Features
@end ifset
@ifclear GENERIC
@node Machine Dependencies
@chapter ESA/390 Dependent Features
@end ifclear
@cindex i370 support
@cindex ESA/390 support
@menu
* ESA/390 Notes:: Notes
* ESA/390 Options:: Options
* ESA/390 Syntax:: Syntax
* ESA/390 Floating Point:: Floating Point
* ESA/390 Directives:: ESA/390 Machine Directives
* ESA/390 Opcodes:: Opcodes
@end menu
@node ESA/390 Notes
@section Notes
The ESA/390 @code{@value{AS}} port is currently intended to be a back-end
for the @sc{gnu} @sc{cc} compiler. It is not HLASM compatible, although
it does support a subset of some of the HLASM directives. The only
supported binary file format is ELF; none of the usual MVS/VM/OE/USS
2012-03-26 19:18:29 +00:00
object file formats, such as ESD or XSD, are supported.
When used with the @sc{gnu} @sc{cc} compiler, the ESA/390 @code{@value{AS}}
will produce correct, fully relocated, functional binaries, and has been
used to compile and execute large projects. However, many aspects should
still be considered experimental; these include shared library support,
dynamically loadable objects, and any relocation other than the 31-bit
2012-03-26 19:18:29 +00:00
relocation.
@node ESA/390 Options
@section Options
@code{@value{AS}} has no machine-dependent command-line options for the ESA/390.
@cindex ESA/390 Syntax
@node ESA/390 Syntax
@section Syntax
The opcode/operand syntax follows the ESA/390 Principles of Operation
manual; assembler directives and general syntax are loosely based on the
2012-03-26 19:18:29 +00:00
prevailing AT&T/SVR4/ELF/Solaris style notation. HLASM-style directives
are @emph{not} supported for the most part, with the exception of those
2012-03-26 19:18:29 +00:00
described herein.
A leading dot in front of directives is optional, and the case of
directives is ignored; thus for example, .using and USING have the same
effect.
A colon may immediately follow a label definition. This is
simply for compatibility with how most assembly language programmers
write code.
@samp{#} is the line comment character.
@samp{;} can be used instead of a newline to separate statements.
Since @samp{$} has no special meaning, you may use it in symbol names.
Registers can be given the symbolic names r0..r15, fp0, fp2, fp4, fp6.
By using these symbolic names, @code{@value{AS}} can detect simple
2012-03-26 19:18:29 +00:00
syntax errors. The name rarg or r.arg is a synonym for r11, rtca or r.tca
for r12, sp, r.sp, dsa r.dsa for r13, lr or r.lr for r14, rbase or r.base
2012-03-26 19:18:29 +00:00
for r3 and rpgt or r.pgt for r4.
@samp{*} is the current location counter. Unlike @samp{.} it is always
relative to the last USING directive. Note that this means that
2012-03-26 19:18:29 +00:00
expressions cannot use multiplication, as any occurrence of @samp{*}
will be interpreted as a location counter.
All labels are relative to the last USING. Thus, branches to a label
2012-03-26 19:18:29 +00:00
always imply the use of base+displacement.
Many of the usual forms of address constants / address literals
2012-03-26 19:18:29 +00:00
are supported. Thus,
@example
.using *,r3
L r15,=A(some_routine)
LM r6,r7,=V(some_longlong_extern)
A r1,=F'12'
AH r0,=H'42'
ME r6,=E'3.1416'
MD r6,=D'3.14159265358979'
O r6,=XL4'cacad0d0'
.ltorg
@end example
should all behave as expected: that is, an entry in the literal
pool will be created (or reused if it already exists), and the
2012-03-26 19:18:29 +00:00
instruction operands will be the displacement into the literal pool
using the current base register (as last declared with the @code{.using}
directive).
@node ESA/390 Floating Point
@section Floating Point
@cindex floating point, ESA/390 (@sc{ieee})
@cindex ESA/390 floating point (@sc{ieee})
The assembler generates only @sc{ieee} floating-point numbers. The older
floating point formats are not supported.
@node ESA/390 Directives
@section ESA/390 Assembler Directives
@code{@value{AS}} for the ESA/390 supports all of the standard ELF/SVR4
2012-03-26 19:18:29 +00:00
assembler directives that are documented in the main part of this
documentation. Several additional directives are supported in order
to implement the ESA/390 addressing model. The most important of these
are @code{.using} and @code{.ltorg}
@cindex ESA/390-only directives
These are the additional directives in @code{@value{AS}} for the ESA/390:
@table @code
@item .dc
2012-03-26 19:18:29 +00:00
A small subset of the usual DC directive is supported.
@item .drop @var{regno}
Stop using @var{regno} as the base register. The @var{regno} must
have been previously declared with a @code{.using} directive in the
same section as the current section.
@item .ebcdic @var{string}
Emit the EBCDIC equivalent of the indicated string. The emitted string
will be null terminated. Note that the directives @code{.string} etc. emit
ascii strings by default.
@item EQU
The standard HLASM-style EQU directive is not supported; however, the
2012-03-26 19:18:29 +00:00
standard @code{@value{AS}} directive .equ can be used to the same effect.
@item .ltorg
2012-03-26 19:18:29 +00:00
Dump the literal pool accumulated so far; begin a new literal pool.
The literal pool will be written in the current section; in order to
generate correct assembly, a @code{.using} must have been previously
specified in the same section.
@item .using @var{expr},@var{regno}
Use @var{regno} as the base register for all subsequent RX, RS, and SS form
instructions. The @var{expr} will be evaluated to obtain the base address;
usually, @var{expr} will merely be @samp{*}.
This assembler allows two @code{.using} directives to be simultaneously
outstanding, one in the @code{.text} section, and one in another section
(typically, the @code{.data} section). This feature allows
dynamically loaded objects to be implemented in a relatively
straightforward way. A @code{.using} directive must always be specified
2012-03-26 19:18:29 +00:00
in the @code{.text} section; this will specify the base register that
will be used for branches in the @code{.text} section. A second
@code{.using} may be specified in another section; this will specify
the base register that is used for non-label address literals.
When a second @code{.using} is specified, then the subsequent
@code{.ltorg} must be put in the same section; otherwise an error will
2012-03-26 19:18:29 +00:00
result.
Thus, for example, the following code uses @code{r3} to address branch
targets and @code{r4} to address the literal pool, which has been written
2012-03-26 19:18:29 +00:00
to the @code{.data} section. The is, the constants @code{=A(some_routine)},
@code{=H'42'} and @code{=E'3.1416'} will all appear in the @code{.data}
section.
@example
.data
.using LITPOOL,r4
.text
BASR r3,0
.using *,r3
B START
.long LITPOOL
START:
L r4,4(,r3)
L r15,=A(some_routine)
LTR r15,r15
BNE LABEL
AH r0,=H'42'
LABEL:
ME r6,=E'3.1416'
.data
LITPOOL:
.ltorg
@end example
Note that this dual-@code{.using} directive semantics extends
and is not compatible with HLASM semantics. Note that this assembler
2012-03-26 19:18:29 +00:00
directive does not support the full range of HLASM semantics.
@end table
@node ESA/390 Opcodes
@section Opcodes
For detailed information on the ESA/390 machine instruction set, see
@cite{ESA/390 Principles of Operation} (IBM Publication Number DZ9AR004).