C.1 Access to Machine Operations
This subclause specifies rules regarding access to
machine instructions from within an Ada program.
Implementation Requirements
The implementation shall support
machine code insertions (see
13.8) or intrinsic
subprograms (see
6.3.1) (or both). The implementation
shall allow the use of Ada entities as operands for such machine code
insertions or intrinsic subprograms.
Implementation Advice
The machine code or intrinsics support should allow
access to all operations normally available to assembly language programmers
for the target environment, including privileged instructions, if any.
The
support for interfacing aspects (see
Annex B)
should include interface to assembler; the default assembler should be
associated with the convention identifier Assembler.
If an entity is exported to assembly language, then
the implementation should allocate it at an addressable location, and
should ensure that it is retained by the linking process, even if not
otherwise referenced from the Ada code. The implementation should assume
that any call to a machine code or assembler subprogram is allowed to
read or update every object that is specified as exported.
Documentation Requirements
The implementation shall document the overhead associated
with calling machine-code or intrinsic subprograms, as compared to a
fully-inlined call, and to a regular out-of-line call.
The implementation shall document the types of the
package System.Machine_Code usable for machine code insertions, and the
attributes to be used in machine code insertions for references to Ada
entities.
The implementation shall document the subprogram
calling conventions associated with the convention identifiers available
for use with the Convention aspect (Ada and Assembler, at a minimum),
including register saving, exception propagation, parameter passing,
and function value returning.
For exported and imported subprograms, the implementation
shall document the mapping between the Link_Name string, if specified,
or the Ada designator, if not, and the external link name used for such
a subprogram.
Implementation Advice
The implementation should ensure that little or no
overhead is associated with calling intrinsic and machine-code subprograms.
It is recommended that
intrinsic subprograms be provided for convenient access to any machine
operations that provide special capabilities or efficiency and that are
not otherwise available through the language constructs. Examples of
such instructions include:
Atomic read-modify-write operations — for
example, test and set, compare and swap, decrement and test, enqueue/dequeue.
Standard numeric functions — for example,
sin, log.
String manipulation operations — for example,
translate and test.
Vector operations — for example, compare
vector against thresholds.
Direct operations on I/O ports.
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe