@c Copyright (C) 2000-2016 Free Software Foundation, Inc.
@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
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
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
prevailing AT&T/SVR4/ELF/Solaris style notation.  HLASM-style directives
are @emph{not} supported for the most part, with the exception of those
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 thesse symbolic names, @code{@value{AS}} can detect simple
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
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
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
always imply the use of base+displacement.

Many of the usual forms of address constants / address literals
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
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
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
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
standard @code{@value{AS}} directive .equ can be used to the same effect.

@item .ltorg
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
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
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
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
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).
