A gcc_jit_extended_asm represents an extended asm
statement: a
series of low-level instructions inside a function that convert inputs
to outputs.
To avoid having an API entrypoint with a very large number of
parameters, an extended asm
statement is made in stages:
an initial call to create the gcc_jit_extended_asm,
followed by calls to add operands and set other properties of the
statement.
There are two API entrypoints for creating a gcc_jit_extended_asm:
asm
statement with
no control flow, and
asm goto
.
For example, to create the equivalent of:
asm ("mov %1, %0\n\t" "add $1, %0" : "=r" (dst) : "r" (src));
the following API calls could be used:
gcc_jit_extended_asm *ext_asm = gcc_jit_block_add_extended_asm (block, NULL, "mov %1, %0\n\t" "add $1, %0"); gcc_jit_extended_asm_add_output_operand (ext_asm, NULL, "=r", dst); gcc_jit_extended_asm_add_input_operand (ext_asm, NULL, "r", gcc_jit_lvalue_as_rvalue (src));
|
As in the C syntax, operands can be given symbolic names to avoid having to number them. For example, to create the equivalent of:
asm ("bsfl %[aMask], %[aIndex]" : [aIndex] "=r" (Index) : [aMask] "r" (Mask) : "cc");
the following API calls could be used:
gcc_jit_extended_asm *ext_asm = gcc_jit_block_add_extended_asm (block, NULL, "bsfl %[aMask], %[aIndex]"); gcc_jit_extended_asm_add_output_operand (ext_asm, "aIndex", "=r", index); gcc_jit_extended_asm_add_input_operand (ext_asm, "aMask", "r", gcc_jit_param_as_rvalue (mask)); gcc_jit_extended_asm_add_clobber (ext_asm, "cc");
Create a gcc_jit_extended_asm for an extended asm
statement
with no control flow (i.e. without the goto
qualifier).
The parameter asm_template
corresponds to the AssemblerTemplate
within C’s extended asm
syntax. It must be non-NULL. The call takes
a copy of the underlying string, so it is valid to pass in a pointer to
an on-stack buffer.
Create a gcc_jit_extended_asm for an extended asm
statement
that may perform jumps, and use it to terminate the given block.
This is equivalent to the goto
qualifier in C’s extended asm
syntax.
For example, to create the equivalent of:
asm goto ("btl %1, %0\n\t" "jc %l[carry]" : // No outputs : "r" (p1), "r" (p2) : "cc" : carry);
the following API calls could be used:
const char *asm_template = (use_name ? /* Label referred to by name: "%l[carry]". */ ("btl %1, %0\n\t" "jc %l[carry]") : /* Label referred to numerically: "%l2". */ ("btl %1, %0\n\t" "jc %l2")); gcc_jit_extended_asm *ext_asm = gcc_jit_block_end_with_extended_asm_goto (b_start, NULL, asm_template, 1, &b_carry, b_fallthru); gcc_jit_extended_asm_add_input_operand (ext_asm, NULL, "r", gcc_jit_param_as_rvalue (p1)); gcc_jit_extended_asm_add_input_operand (ext_asm, NULL, "r", gcc_jit_param_as_rvalue (p2)); gcc_jit_extended_asm_add_clobber (ext_asm, "cc");
here referencing a gcc_jit_block named “carry”.
num_goto_blocks
must be >= 0.
goto_blocks
must be non-NULL. This corresponds to the GotoLabels
parameter within C’s extended asm
syntax. The block names can be
referenced within the assembler template.
fallthrough_block
can be NULL. If non-NULL, it specifies the block
to fall through to after the statement.
|
Set whether the gcc_jit_extended_asm has side-effects, equivalent to the volatile4 qualifier in C’s extended asm syntax.
For example, to create the equivalent of:
asm volatile ("rdtsc\n\t" // Returns the time in EDX:EAX. "shl $32, %%rdx\n\t" // Shift the upper bits left. "or %%rdx, %0" // 'Or' in the lower bits. : "=a" (msr) : : "rdx");
the following API calls could be used:
gcc_jit_extended_asm *ext_asm = gcc_jit_block_add_extended_asm (block, NULL, "rdtsc\n\t" /* Returns the time in EDX:EAX. */ "shl $32, %%rdx\n\t" /* Shift the upper bits left. */ "or %%rdx, %0"); /* 'Or' in the lower bits. */ gcc_jit_extended_asm_set_volatile_flag (ext_asm, 1); gcc_jit_extended_asm_add_output_operand (ext_asm, NULL, "=a", msr); gcc_jit_extended_asm_add_clobber (ext_asm, "rdx");
where the gcc_jit_extended_asm is flagged as volatile.
Set the equivalent of the
inline5
qualifier in C’s extended asm
syntax.
Add an output operand to the extended asm
statement. See the
Output Operands6
section of the documentation of the C syntax.
asm_symbolic_name
corresponds to the asmSymbolicName
component of C’s
extended asm
syntax. It can be NULL. If non-NULL it specifies the
symbolic name for the operand.
constraint
corresponds to the constraint
component of C’s extended
asm
syntax. It must be non-NULL.
dest
corresponds to the cvariablename
component of C’s extended
asm
syntax. It must be non-NULL.
// Example with a NULL symbolic name, the equivalent of: // : "=r" (dst) gcc_jit_extended_asm_add_output_operand (ext_asm, NULL, "=r", dst); // Example with a symbolic name ("aIndex"), the equivalent of: // : [aIndex] "=r" (index) gcc_jit_extended_asm_add_output_operand (ext_asm, "aIndex", "=r", index);
This function can’t be called on an asm goto
as such instructions can’t
have outputs; see the
Goto Labels7
section of GCC’s “Extended Asm” documentation.
Add an input operand to the extended asm
statement. See the
Input Operands8
section of the documentation of the C syntax.
asm_symbolic_name
corresponds to the asmSymbolicName
component of C’s
extended asm
syntax. It can be NULL. If non-NULL it specifies the
symbolic name for the operand.
constraint
corresponds to the constraint
component of C’s extended
asm
syntax. It must be non-NULL.
src
corresponds to the cexpression
component of C’s extended
asm
syntax. It must be non-NULL.
// Example with a NULL symbolic name, the equivalent of: // : "r" (src) gcc_jit_extended_asm_add_input_operand (ext_asm, NULL, "r", gcc_jit_lvalue_as_rvalue (src)); // Example with a symbolic name ("aMask"), the equivalent of: // : [aMask] "r" (Mask) gcc_jit_extended_asm_add_input_operand (ext_asm, "aMask", "r", gcc_jit_lvalue_as_rvalue (mask));
Add victim to the list of registers clobbered by the extended asm
statement. It must be non-NULL. See the
Clobbers and Scratch Registers9
section of the documentation of the C syntax.
Statements with multiple clobbers will require multiple calls, one per clobber.
For example:
gcc_jit_extended_asm_add_clobber (ext_asm, "r0"); gcc_jit_extended_asm_add_clobber (ext_asm, "cc"); gcc_jit_extended_asm_add_clobber (ext_asm, "memory");
A gcc_jit_extended_asm is a gcc_jit_object “owned” by the block’s context. The following upcast is available:
Upcast from extended asm
to object.
https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#Volatile
https://gcc.gnu.org/onlinedocs/gcc/Size-of-an-asm.html#Size-of-an-asm
https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#OutputOperands
https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#GotoLabels
https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#InputOperands
https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#Clobbers-and-Scratch-Registers#