1
A machine code insertion can be achieved by a call to a subprogram whose sequence_of_statements contains code_statements.
2
code_statement::= qualified_expression;
3
A code_statement is only allowed in the handled_sequence_of_statements (see 11.2) of a subprogram_body (see 6.3). If a subprogram_body (see 6.3) contains any code_statement (see 13.8)s, then within this subprogram_body (see 6.3) the only allowed form of statement is a code_statement (see 13.8) (labeled or not), the only allowed declarative_item (see 3.11)s are use_clause (see 8.4)s, and no exception_handler (see 11.2) is allowed (comments and pragmas are allowed as usual).
4
The qualified_expression is expected to be of any type.
5
The qualified_expression shall be of a type declared in package System.Machine_Code.
6
A code_statement shall appear only within the scope of a with_clause that mentions package System.Machine_Code.
7
The contents of the library package System.Machine_Code (if provided) are implementation defined. The meaning of code_statements is implementation defined. Typically, each qualified_expression represents a machine instruction or assembly directive.
8
An implementation may place restrictions on code_statements. An implementation is not required to provide package System.Machine_Code.
NOTES
9
15 An implementation may provide implementation−defined pragmas specifying register conventions and calling conventions.
10/2
16 Machine code functions are exempt from the rule that a return statement is required. In fact, return statements are forbidden, since only code_statements are allowed.
11
17 Intrinsic subprograms (see 6.3.1, "6.3.1 Conformance Rules") can also be used to achieve machine code insertions. Interface to assembly language can be achieved using the features in Annex B, "Annex B Interface to Other Languages".
12
Example of a code statement:
13
M : Mask; procedure Set_Mask; pragma Inline(Set_Mask);
14
procedure Set_Mask is use System.Machine_Code; −− assume "with System.Machine_Code;" appears somewhere above begin SI_Format'(Code => SSM, B => M'Base_Reg, D => M'Disp); −− Base_Reg and Disp are implementation−defined attributes end Set_Mask;