- (1)
- This clause specifies rules regarding access to machine instructions from
within an Ada program.
Implementation Requirements
- (2)
- The implementation shall support machine code insertions (see
13.8) or intrinsic subprograms (see 6.3.1)
(or both). Implementation-defined attributes shall be provided to allow the
use of Ada entities as operands.
Implementation Advice
- (3)
- 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.
- (4)
- The interfacing pragmas (see Annex B) should support
interface to assembler; the default assembler should be associated with the
convention identifier Assembler.
- (5)
- 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
- (6)
- 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.
- (7)
- 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.
- (8)
- The implementation shall document the subprogram calling conventions
associated with the convention identifiers available for use with the
interfacing pragmas (Ada and Assembler, at a minimum), including register
saving, exception propagation, parameter passing, and function value
returning.
- (9)
- 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
- (10)
- The implementation should ensure that little or no overhead is
associated with calling intrinsic and machine-code subprograms.
- (11)
- 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:
- (12)
- Atomic read-modify-write operations -- e.g., test and set,
compare and swap, decrement and test, enqueue/dequeue.
- (13)
- Standard numeric functions -- e.g., sin, log.
- (14)
- String manipulation operations -- e.g., translate and test.
- (15)
- Vector operations -- e.g., compare vector against thresholds.
- (16)
- Direct operations on I/O ports.
-- Email comments, additions, corrections, gripes, kudos, etc. to:
Magnus Kempe -- Magnus.Kempe@di.epfl.ch
Copyright statement
Page last generated: 95-03-12