[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Get the opcode that is associated with an instruction.
Get the destination value that is associated with an instruction. Returns NULL if the instruction does not have a destination.
Get the first argument value that is associated with an instruction. Returns NULL if the instruction does not have a first argument value.
Get the second argument value that is associated with an instruction. Returns NULL if the instruction does not have a second argument value.
Get the label for a branch target from an instruction. Returns NULL if the instruction does not have a branch target.
Get the function for a call instruction. Returns NULL if the instruction does not refer to a called function.
Get the function pointer for a native call instruction. Returns NULL if the instruction does not refer to a native function call.
Get the diagnostic name for a function call. Returns NULL if the instruction does not have a diagnostic name.
Get the signature for a function call instruction. Returns NULL if the instruction is not a function call.
Returns a non-zero value if the destination for insn is
actually a source value. This can happen with instructions
such as jit_insn_store_relative
where the instruction
needs three source operands, and the real destination is a
side-effect on one of the sources.
Start a new basic block within the function func and give it the specified label. Returns zero if out of memory.
If the contents of label are jit_label_undefined
, then this
function will allocate a new label for this block. Otherwise it will
reuse the specified label from a previous branch instruction.
Start a new basic block within the function func and give it the specified label but attempt to reuse the last block if it is empty. Returns zero if out of memory.
If the contents of label are jit_label_undefined
, then this
function will allocate a new label for this block. Otherwise it will
reuse the specified label from a previous branch instruction.
Start a new basic block, without giving it an explicit label. Returns a non-zero value on success.
Emits "no operation" instruction. You may want to do that if you need
an empty block to move it with jit_insn_move_blocks_XXX
later.
If you will not put empty instruction between two labels, both labels
will point to the same block, and block moving will fail.
Load the contents of value into a new temporary, essentially duplicating the value. Constants are not duplicated.
This is the same as jit_insn_load
, but the name may better
reflect how it is used in some front ends.
If value is of type sbyte
, byte
, short
,
ushort
, a structure, or a union, then make a copy of it and
return the temporary copy. Otherwise return value as-is.
This is useful where you want to use value directly without duplicating it first. However, certain types usually cannot be operated on directly without first copying them elsewhere. This function will do that whenever necessary.
Store the contents of value at the location referred to by
dest. The dest should be a jit_value_t
representing a
local variable or temporary. Use jit_insn_store_relative
to store
to a location referred to by a pointer.
Load a value of the specified type from the effective address
(value + offset)
, where value is a pointer.
Store value at the effective address (dest + offset)
,
where dest is a pointer. Returns a non-zero value on success.
Add the constant offset to the specified pointer value.
This is functionally identical to calling jit_insn_add
, but
the JIT can optimize the code better if it knows that the addition
is being used to perform a relative adjustment on a pointer.
In particular, multiple relative adjustments on the same pointer
can be collapsed into a single adjustment.
Load an element of type elem_type from position index within
the array starting at base_addr. The effective address of the
array element is base_addr + index * sizeof(elem_type)
.
Load the effective address of an element of type elem_type at
position index within the array starting at base_addr.
Essentially, this computes the expression
base_addr + index * sizeof(elem_type)
, but
may be more efficient than performing the steps with jit_insn_mul
and jit_insn_add
.
Store value at position index of the array starting at
base_addr. The effective address of the storage location is
base_addr + index * sizeof(jit_value_get_type(value))
.
Check value to see if it is NULL. If it is, then throw the
built-in JIT_RESULT_NULL_REFERENCE
exception.
Add two values together and return the result in a new temporary value.
Add two values together and return the result in a new temporary value. Throw an exception if overflow occurs.
Subtract two values and return the result in a new temporary value.
Subtract two values and return the result in a new temporary value. Throw an exception if overflow occurs.
Multiply two values and return the result in a new temporary value.
Multiply two values and return the result in a new temporary value. Throw an exception if overflow occurs.
Divide two values and return the quotient in a new temporary value. Throws an exception on division by zero or arithmetic error (an arithmetic error is one where the minimum possible signed integer value is divided by -1).
Divide two values and return the remainder in a new temporary value. Throws an exception on division by zero or arithmetic error (an arithmetic error is one where the minimum possible signed integer value is divided by -1).
Divide two values and return the remainder in a new temporary value.
Throws an exception on division by zero or arithmetic error
(an arithmetic error is one where the minimum possible signed
integer value is divided by -1). This function is identical to
jit_insn_rem
, except that it uses IEEE rules for computing
the remainder of floating-point values.
Negate a value and return the result in a new temporary value.
Bitwise AND two values and return the result in a new temporary value.
Bitwise OR two values and return the result in a new temporary value.
Bitwise XOR two values and return the result in a new temporary value.
Bitwise NOT a value and return the result in a new temporary value.
Perform a bitwise left shift on two values and return the result in a new temporary value.
Perform a bitwise right shift on two values and return the result in a new temporary value. This performs a signed shift on signed operators, and an unsigned shift on unsigned operands.
Perform a bitwise right shift on two values and return the result in a new temporary value. This performs an unsigned shift on both signed and unsigned operands.
Perform a bitwise right shift on two values and return the result in a new temporary value. This performs an signed shift on both signed and unsigned operands.
Compare two values for equality and return the result in a new temporary value.
Compare two values for inequality and return the result in a new temporary value.
Compare two values for less than and return the result in a new temporary value.
Compare two values for less than or equal and return the result in a new temporary value.
Compare two values for greater than and return the result in a new temporary value.
Compare two values for greater than or equal and return the result in a new temporary value.
Compare two values, and return a -1, 0, or 1 result. If either value is "not a number", then -1 is returned.
Compare two values, and return a -1, 0, or 1 result. If either value is "not a number", then 1 is returned.
Convert a value into a boolean 0 or 1 result of type jit_type_int
.
Convert a value into a boolean 1 or 0 result of type jit_type_int
(i.e. the inverse of jit_insn_to_bool
).
Apply a mathematical function to floating-point arguments.
Round value1 up towads positive infinity.
Round value1 down towards negative infinity.
Round value1 to the nearest integer. Half-way cases are rounded to the even number.
Round value1 to the nearest integer. Half-way cases are rounded away from zero.
Round value1 towards zero.
Test a floating point value for not a number, finite, or infinity.
Calculate the absolute value, minimum, maximum, or sign of the specified values.
Terminate the current block by branching unconditionally to a specific label. Returns zero if out of memory.
Terminate the current block by branching to a specific label if the specified value is non-zero. Returns zero if out of memory.
If value refers to a conditional expression that was created
by jit_insn_eq
, jit_insn_ne
, etc, then the conditional
expression will be replaced by an appropriate conditional branch
instruction.
Terminate the current block by branching to a specific label if the specified value is zero. Returns zero if out of memory.
If value refers to a conditional expression that was created
by jit_insn_eq
, jit_insn_ne
, etc, then the conditional
expression will be followed by an appropriate conditional branch
instruction, instead of a value load.
Branch to a label from the labels table. The value is the
index of the label. It is allowed to have identical labels in the table.
If an entry in the table has jit_label_undefined
value then it is
replaced with a newly allocated label.
Get the address of a value into a new temporary.
Get the address of label into a new temporary. This is typically used for exception handling, to track where in a function an exception was actually thrown.
Convert the contents of a value into a new type, with optional overflow checking.
Call the function jit_func, which may or may not be translated yet. The name is for diagnostic purposes only, and can be NULL.
If signature is NULL, then the actual signature of jit_func is used in its place. This is the usual case. However, if the function takes a variable number of arguments, then you may need to construct an explicit signature for the non-fixed argument values.
The flags parameter specifies additional information about the type of call to perform:
JIT_CALL_NOTHROW
The function never throws exceptions.
JIT_CALL_NORETURN
The function will never return directly to its caller. It may however return to the caller indirectly by throwing an exception that the caller catches.
JIT_CALL_TAIL
Apply tail call optimizations, as the result of this function call will be immediately returned from the containing function. Tail calls are only appropriate when the signature of the called function matches the callee, and none of the parameters point to local variables.
If jit_func has already been compiled, then jit_insn_call
may be able to intuit some of the above flags for itself. Otherwise
it is up to the caller to determine when the flags may be appropriate.
Call a function via an indirect pointer.
Call a function via an indirect pointer. This version differs from
jit_insn_call_indirect
in that we assume that value
contains a pointer that resulted from calling
jit_function_to_vtable_pointer
. Indirect vtable pointer
calls may be more efficient on some platforms than regular indirect calls.
Output an instruction that calls an external native function. The name is for diagnostic purposes only, and can be NULL.
Output an instruction that calls an intrinsic function. The descriptor contains the following fields:
return_type
The type of value that is returned from the intrinsic.
ptr_result_type
This should be NULL for an ordinary intrinsic, or the result type if the intrinsic reports exceptions.
arg1_type
The type of the first argument.
arg2_type
The type of the second argument, or NULL for a unary intrinsic.
If all of the arguments are constant, then jit_insn_call_intrinsic
will call the intrinsic directly to calculate the constant result.
If the constant computation will result in an exception, then
code is output to cause the exception at runtime.
The name is for diagnostic purposes only, and can be NULL.
Output an instruction that notes that the contents of value can be found in the register reg at this point in the code.
You normally wouldn’t call this yourself - it is used internally by the CPU back ends to set up the function’s entry frame and the values of registers on return from a subroutine call.
Output an instruction that notes that the contents of value can be found in the stack frame at frame_offset at this point in the code.
You normally wouldn’t call this yourself - it is used internally by the CPU back ends to set up the function’s entry frame.
Output an instruction that copies the contents of value into the register reg at this point in the code. This is typically used just before making an outgoing subroutine call.
You normally wouldn’t call this yourself - it is used internally by the CPU back ends to set up the registers for a subroutine call.
Output an instruction that notes that the contents of value should be stored in the stack frame at frame_offset at this point in the code.
You normally wouldn’t call this yourself - it is used internally by the CPU back ends to set up an outgoing frame for tail calls.
Output an instruction that notes that the contents of value
can be found in the register reg at this point in the code.
This is similar to jit_insn_incoming_reg
, except that it
refers to return values, not parameter values.
You normally wouldn’t call this yourself - it is used internally by the CPU back ends to handle returns from subroutine calls.
Output an instruction to set up for a nested function call. The nested_level value will be -1 to call a child, zero to call a sibling of func, 1 to call a sibling of the parent, 2 to call a sibling of the grandparent, etc. If reg is not -1, then it indicates the register to receive the parent frame information. If reg is -1, then the frame information will be pushed on the stack.
You normally wouldn’t call this yourself - it is used internally by the CPU back ends to set up the parameters for a nested subroutine call.
Flush a small structure return value out of registers and back into the local variable frame. You normally wouldn’t call this yourself - it is used internally by the CPU back ends to handle structure returns from functions.
Import value from an outer nested scope into func. Returns the effective address of the value for local access via a pointer. Returns NULL if out of memory or the value is not accessible via a parent, grandparent, or other ancestor of func.
Push a value onto the function call stack, in preparation for a call. You normally wouldn’t call this yourself - it is used internally by the CPU back ends to set up the stack for a subroutine call.
Push *value
onto the function call stack, in preparation for a call.
This is normally used for returning struct
and union
values where you have the effective address of the structure, rather
than the structure’s contents, in value.
You normally wouldn’t call this yourself - it is used internally by the CPU back ends to set up the stack for a subroutine call.
Set the parameter slot at offset in the outgoing parameter area
to value. This may be used instead of jit_insn_push
if it is more efficient to store directly to the stack than to push.
The outgoing parameter area is allocated within the frame when
the function is first entered.
You normally wouldn’t call this yourself - it is used internally by the CPU back ends to set up the stack for a subroutine call.
Same as jit_insn_set_param_ptr
, except that the parameter is
at *value
.
Push the interpreter’s return area pointer onto the stack. You normally wouldn’t call this yourself - it is used internally by the CPU back ends to set up the stack for a subroutine call.
Pop num_items items from the function call stack. You normally wouldn’t call this yourself - it is used by CPU back ends to clean up the stack after calling a subroutine. The size of an item is specific to the back end (it could be bytes, words, or some other measurement).
This is similar to jit_insn_pop_stack
, except that it tries to
defer the pop as long as possible. Multiple subroutine calls may
result in parameters collecting up on the stack, and only being popped
at the next branch or label instruction. You normally wouldn’t
call this yourself - it is used by CPU back ends.
Flush any deferred items that were scheduled for popping by
jit_insn_defer_pop_stack
if there are num_items
or more items scheduled. You normally wouldn’t call this
yourself - it is used by CPU back ends to clean up the stack just
prior to a subroutine call when too many items have collected up.
Calling jit_insn_flush_defer_pop(func, 0)
will flush
all deferred items.
Output an instruction to return value as the function’s result.
If value is NULL, then the function is assumed to return
void
. If the function returns a structure, this will copy
the value into the memory at the structure return address.
Output an instruction to return *value
as the function’s result.
This is normally used for returning struct
and union
values where you have the effective address of the structure, rather
than the structure’s contents, in value.
Add an instruction to return a default value if control reaches this point. This is typically used at the end of a function to ensure that all paths return to the caller. Returns zero if out of memory, 1 if a default return was added, and 2 if a default return was not needed.
Note: if this returns 1, but the function signature does not return
void
, then it indicates that a higher-level language error
has occurred and the function should be abandoned.
Throw a pointer value as an exception object. This can also be used to "rethrow" an object from a catch handler that is not interested in handling the exception.
Get an object that represents the current position in the code,
and all of the functions that are currently on the call stack.
This is equivalent to calling jit_exception_get_stack_trace
,
and is normally used just prior to jit_insn_throw
to record
the location of the exception that is being thrown.
Get the value that holds the most recent thrown exception. This is
typically used in catch
clauses.
Notify the function building process that func contains
some form of catch
clause for catching exceptions. This must
be called before any instruction that is covered by a try
,
ideally at the start of the function output process.
Start the catcher block for func. There should be exactly one
catcher block for any function that involves a try
. All
exceptions that are thrown within the function will cause control
to jump to this point. Returns a value that holds the exception
that was thrown.
Branch to label if the program counter where an exception occurred does not fall between start_label and end_label.
Rethrow the current exception because it cannot be handled by
any of the catch
blocks in the current function.
Note: this is intended for use within catcher blocks. It should not
be used to rethrow exceptions in response to programmer requests
(e.g. throw;
in C#). The jit_insn_throw
function
should be used for that purpose.
Start a finally
clause.
Return from the finally
clause to where it was called from.
This is usually the last instruction in a finally
clause.
Call a finally
clause.
Define the start of a filter. Filters are embedded subroutines within
functions that are used to filter exceptions in catch
blocks.
A filter subroutine takes a single argument (usually a pointer) and returns a single result (usually a boolean). The filter has complete access to the local variables of the function, and can use any of them in the filtering process.
This function returns a temporary value of the specified type, indicating the parameter that is supplied to the filter.
Return from a filter subroutine with the specified value
as
its result.
Call the filter subroutine at label, passing it value as its argument. This function returns a value of the specified type, indicating the filter’s result.
Copy the size bytes of memory at src to dest. It is assumed that the source and destination do not overlap.
Copy the size bytes of memory at src to dest. This is save to use if the source and destination overlap.
Set the size bytes at dest to value.
Allocate size bytes of memory from the stack.
Move all of the blocks between from_label (inclusive) and
to_label (exclusive) to the end of the current function.
This is typically used to move the expression in a while
loop to the end of the body, where it can be executed more
efficiently.
Move all of the blocks between from_label (inclusive) and to_label (exclusive) to the start of the current function. This is typically used to move initialization code to the head of the function.
Mark the current position in func as corresponding to the
specified bytecode offset. This value will be returned
by jit_stack_trace_get_offset
, and is useful for associating
code positions with source line numbers.
Initialize an iterator to point to the first instruction in block.
Initialize an iterator to point to the last instruction in block.
Get the next instruction in an iterator’s block. Returns NULL when there are no further instructions in the block.
Get the previous instruction in an iterator’s block. Returns NULL when there are no further instructions in the block.
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This document was generated on September 17, 2016 using texi2html 5.0.