mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
6cdb5ec3bc
Summary: Rework the GMIR documentation to focus more on the end user than the implementation and tie it in to the MIR document. There was also some out-of-date information which has been removed. The quality of the GenericOpcode reference is highly variable and drops sharply as I worked through them all but we've got to start somewhere :-). It would be great if others could expand on this too as there is an awful lot to get through. Also fix a typo in the definition of G_FLOG. Previously, the comments said we had two base-2's (G_FLOG and G_FLOG2). Reviewers: aemerson, volkan, rovka, arsenm Reviewed By: rovka Subscribers: wdng, arphaman, jfb, Petar.Avramovic, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D69545
793 lines
23 KiB
ReStructuredText
793 lines
23 KiB
ReStructuredText
========================================
|
|
Machine IR (MIR) Format Reference Manual
|
|
========================================
|
|
|
|
.. contents::
|
|
:local:
|
|
|
|
.. warning::
|
|
This is a work in progress.
|
|
|
|
Introduction
|
|
============
|
|
|
|
This document is a reference manual for the Machine IR (MIR) serialization
|
|
format. MIR is a human readable serialization format that is used to represent
|
|
LLVM's :ref:`machine specific intermediate representation
|
|
<machine code representation>`.
|
|
|
|
The MIR serialization format is designed to be used for testing the code
|
|
generation passes in LLVM.
|
|
|
|
Overview
|
|
========
|
|
|
|
The MIR serialization format uses a YAML container. YAML is a standard
|
|
data serialization language, and the full YAML language spec can be read at
|
|
`yaml.org
|
|
<http://www.yaml.org/spec/1.2/spec.html#Introduction>`_.
|
|
|
|
A MIR file is split up into a series of `YAML documents`_. The first document
|
|
can contain an optional embedded LLVM IR module, and the rest of the documents
|
|
contain the serialized machine functions.
|
|
|
|
.. _YAML documents: http://www.yaml.org/spec/1.2/spec.html#id2800132
|
|
|
|
MIR Testing Guide
|
|
=================
|
|
|
|
You can use the MIR format for testing in two different ways:
|
|
|
|
- You can write MIR tests that invoke a single code generation pass using the
|
|
``-run-pass`` option in llc.
|
|
|
|
- You can use llc's ``-stop-after`` option with existing or new LLVM assembly
|
|
tests and check the MIR output of a specific code generation pass.
|
|
|
|
Testing Individual Code Generation Passes
|
|
-----------------------------------------
|
|
|
|
The ``-run-pass`` option in llc allows you to create MIR tests that invoke just
|
|
a single code generation pass. When this option is used, llc will parse an
|
|
input MIR file, run the specified code generation pass(es), and output the
|
|
resulting MIR code.
|
|
|
|
You can generate an input MIR file for the test by using the ``-stop-after`` or
|
|
``-stop-before`` option in llc. For example, if you would like to write a test
|
|
for the post register allocation pseudo instruction expansion pass, you can
|
|
specify the machine copy propagation pass in the ``-stop-after`` option, as it
|
|
runs just before the pass that we are trying to test:
|
|
|
|
``llc -stop-after=machine-cp bug-trigger.ll > test.mir``
|
|
|
|
If the same pass is run multiple times, a run index can be included
|
|
after the name with a comma.
|
|
|
|
``llc -stop-after=dead-mi-elimination,1 bug-trigger.ll > test.mir``
|
|
|
|
After generating the input MIR file, you'll have to add a run line that uses
|
|
the ``-run-pass`` option to it. In order to test the post register allocation
|
|
pseudo instruction expansion pass on X86-64, a run line like the one shown
|
|
below can be used:
|
|
|
|
``# RUN: llc -o - %s -mtriple=x86_64-- -run-pass=postrapseudos | FileCheck %s``
|
|
|
|
The MIR files are target dependent, so they have to be placed in the target
|
|
specific test directories (``lib/CodeGen/TARGETNAME``). They also need to
|
|
specify a target triple or a target architecture either in the run line or in
|
|
the embedded LLVM IR module.
|
|
|
|
Simplifying MIR files
|
|
^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
The MIR code coming out of ``-stop-after``/``-stop-before`` is very verbose;
|
|
Tests are more accessible and future proof when simplified:
|
|
|
|
- Use the ``-simplify-mir`` option with llc.
|
|
|
|
- Machine function attributes often have default values or the test works just
|
|
as well with default values. Typical candidates for this are: `alignment:`,
|
|
`exposesReturnsTwice`, `legalized`, `regBankSelected`, `selected`.
|
|
The whole `frameInfo` section is often unnecessary if there is no special
|
|
frame usage in the function. `tracksRegLiveness` on the other hand is often
|
|
necessary for some passes that care about block livein lists.
|
|
|
|
- The (global) `liveins:` list is typically only interesting for early
|
|
instruction selection passes and can be removed when testing later passes.
|
|
The per-block `liveins:` on the other hand are necessary if
|
|
`tracksRegLiveness` is true.
|
|
|
|
- Branch probability data in block `successors:` lists can be dropped if the
|
|
test doesn't depend on it. Example:
|
|
`successors: %bb.1(0x40000000), %bb.2(0x40000000)` can be replaced with
|
|
`successors: %bb.1, %bb.2`.
|
|
|
|
- MIR code contains a whole IR module. This is necessary because there are
|
|
no equivalents in MIR for global variables, references to external functions,
|
|
function attributes, metadata, debug info. Instead some MIR data references
|
|
the IR constructs. You can often remove them if the test doesn't depend on
|
|
them.
|
|
|
|
- Alias Analysis is performed on IR values. These are referenced by memory
|
|
operands in MIR. Example: `:: (load 8 from %ir.foobar, !alias.scope !9)`.
|
|
If the test doesn't depend on (good) alias analysis the references can be
|
|
dropped: `:: (load 8)`
|
|
|
|
- MIR blocks can reference IR blocks for debug printing, profile information
|
|
or debug locations. Example: `bb.42.myblock` in MIR references the IR block
|
|
`myblock`. It is usually possible to drop the `.myblock` reference and simply
|
|
use `bb.42`.
|
|
|
|
- If there are no memory operands or blocks referencing the IR then the
|
|
IR function can be replaced by a parameterless dummy function like
|
|
`define @func() { ret void }`.
|
|
|
|
- It is possible to drop the whole IR section of the MIR file if it only
|
|
contains dummy functions (see above). The .mir loader will create the
|
|
IR functions automatically in this case.
|
|
|
|
.. _limitations:
|
|
|
|
Limitations
|
|
-----------
|
|
|
|
Currently the MIR format has several limitations in terms of which state it
|
|
can serialize:
|
|
|
|
- The target-specific state in the target-specific ``MachineFunctionInfo``
|
|
subclasses isn't serialized at the moment.
|
|
|
|
- The target-specific ``MachineConstantPoolValue`` subclasses (in the ARM and
|
|
SystemZ backends) aren't serialized at the moment.
|
|
|
|
- The ``MCSymbol`` machine operands don't support temporary or local symbols.
|
|
|
|
- A lot of the state in ``MachineModuleInfo`` isn't serialized - only the CFI
|
|
instructions and the variable debug information from MMI is serialized right
|
|
now.
|
|
|
|
These limitations impose restrictions on what you can test with the MIR format.
|
|
For now, tests that would like to test some behaviour that depends on the state
|
|
of temporary or local ``MCSymbol`` operands or the exception handling state in
|
|
MMI, can't use the MIR format. As well as that, tests that test some behaviour
|
|
that depends on the state of the target specific ``MachineFunctionInfo`` or
|
|
``MachineConstantPoolValue`` subclasses can't use the MIR format at the moment.
|
|
|
|
High Level Structure
|
|
====================
|
|
|
|
.. _embedded-module:
|
|
|
|
Embedded Module
|
|
---------------
|
|
|
|
When the first YAML document contains a `YAML block literal string`_, the MIR
|
|
parser will treat this string as an LLVM assembly language string that
|
|
represents an embedded LLVM IR module.
|
|
Here is an example of a YAML document that contains an LLVM module:
|
|
|
|
.. code-block:: llvm
|
|
|
|
define i32 @inc(i32* %x) {
|
|
entry:
|
|
%0 = load i32, i32* %x
|
|
%1 = add i32 %0, 1
|
|
store i32 %1, i32* %x
|
|
ret i32 %1
|
|
}
|
|
|
|
.. _YAML block literal string: http://www.yaml.org/spec/1.2/spec.html#id2795688
|
|
|
|
Machine Functions
|
|
-----------------
|
|
|
|
The remaining YAML documents contain the machine functions. This is an example
|
|
of such YAML document:
|
|
|
|
.. code-block:: text
|
|
|
|
---
|
|
name: inc
|
|
tracksRegLiveness: true
|
|
liveins:
|
|
- { reg: '$rdi' }
|
|
callSites:
|
|
- { bb: 0, offset: 3, fwdArgRegs:
|
|
- { arg: 0, reg: '$edi' } }
|
|
body: |
|
|
bb.0.entry:
|
|
liveins: $rdi
|
|
|
|
$eax = MOV32rm $rdi, 1, _, 0, _
|
|
$eax = INC32r killed $eax, implicit-def dead $eflags
|
|
MOV32mr killed $rdi, 1, _, 0, _, $eax
|
|
CALL64pcrel32 @foo <regmask...>
|
|
RETQ $eax
|
|
...
|
|
|
|
The document above consists of attributes that represent the various
|
|
properties and data structures in a machine function.
|
|
|
|
The attribute ``name`` is required, and its value should be identical to the
|
|
name of a function that this machine function is based on.
|
|
|
|
The attribute ``body`` is a `YAML block literal string`_. Its value represents
|
|
the function's machine basic blocks and their machine instructions.
|
|
|
|
The attribute ``callSites`` is a representation of call site information which
|
|
keeps track of call instructions and registers used to transfer call arguments.
|
|
|
|
Machine Instructions Format Reference
|
|
=====================================
|
|
|
|
The machine basic blocks and their instructions are represented using a custom,
|
|
human readable serialization language. This language is used in the
|
|
`YAML block literal string`_ that corresponds to the machine function's body.
|
|
|
|
A source string that uses this language contains a list of machine basic
|
|
blocks, which are described in the section below.
|
|
|
|
Machine Basic Blocks
|
|
--------------------
|
|
|
|
A machine basic block is defined in a single block definition source construct
|
|
that contains the block's ID.
|
|
The example below defines two blocks that have an ID of zero and one:
|
|
|
|
.. code-block:: text
|
|
|
|
bb.0:
|
|
<instructions>
|
|
bb.1:
|
|
<instructions>
|
|
|
|
A machine basic block can also have a name. It should be specified after the ID
|
|
in the block's definition:
|
|
|
|
.. code-block:: text
|
|
|
|
bb.0.entry: ; This block's name is "entry"
|
|
<instructions>
|
|
|
|
The block's name should be identical to the name of the IR block that this
|
|
machine block is based on.
|
|
|
|
.. _block-references:
|
|
|
|
Block References
|
|
^^^^^^^^^^^^^^^^
|
|
|
|
The machine basic blocks are identified by their ID numbers. Individual
|
|
blocks are referenced using the following syntax:
|
|
|
|
.. code-block:: text
|
|
|
|
%bb.<id>
|
|
|
|
Example:
|
|
|
|
.. code-block:: llvm
|
|
|
|
%bb.0
|
|
|
|
The following syntax is also supported, but the former syntax is preferred for
|
|
block references:
|
|
|
|
.. code-block:: text
|
|
|
|
%bb.<id>[.<name>]
|
|
|
|
Example:
|
|
|
|
.. code-block:: llvm
|
|
|
|
%bb.1.then
|
|
|
|
Successors
|
|
^^^^^^^^^^
|
|
|
|
The machine basic block's successors have to be specified before any of the
|
|
instructions:
|
|
|
|
.. code-block:: text
|
|
|
|
bb.0.entry:
|
|
successors: %bb.1.then, %bb.2.else
|
|
<instructions>
|
|
bb.1.then:
|
|
<instructions>
|
|
bb.2.else:
|
|
<instructions>
|
|
|
|
The branch weights can be specified in brackets after the successor blocks.
|
|
The example below defines a block that has two successors with branch weights
|
|
of 32 and 16:
|
|
|
|
.. code-block:: text
|
|
|
|
bb.0.entry:
|
|
successors: %bb.1.then(32), %bb.2.else(16)
|
|
|
|
.. _bb-liveins:
|
|
|
|
Live In Registers
|
|
^^^^^^^^^^^^^^^^^
|
|
|
|
The machine basic block's live in registers have to be specified before any of
|
|
the instructions:
|
|
|
|
.. code-block:: text
|
|
|
|
bb.0.entry:
|
|
liveins: $edi, $esi
|
|
|
|
The list of live in registers and successors can be empty. The language also
|
|
allows multiple live in register and successor lists - they are combined into
|
|
one list by the parser.
|
|
|
|
Miscellaneous Attributes
|
|
^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
The attributes ``IsAddressTaken``, ``IsLandingPad`` and ``Alignment`` can be
|
|
specified in brackets after the block's definition:
|
|
|
|
.. code-block:: text
|
|
|
|
bb.0.entry (address-taken):
|
|
<instructions>
|
|
bb.2.else (align 4):
|
|
<instructions>
|
|
bb.3(landing-pad, align 4):
|
|
<instructions>
|
|
|
|
.. TODO: Describe the way the reference to an unnamed LLVM IR block can be
|
|
preserved.
|
|
|
|
``Alignment`` is specified in bytes, and must be a power of two.
|
|
|
|
.. _mir-instructions:
|
|
|
|
Machine Instructions
|
|
--------------------
|
|
|
|
A machine instruction is composed of a name,
|
|
:ref:`machine operands <machine-operands>`,
|
|
:ref:`instruction flags <instruction-flags>`, and machine memory operands.
|
|
|
|
The instruction's name is usually specified before the operands. The example
|
|
below shows an instance of the X86 ``RETQ`` instruction with a single machine
|
|
operand:
|
|
|
|
.. code-block:: text
|
|
|
|
RETQ $eax
|
|
|
|
However, if the machine instruction has one or more explicitly defined register
|
|
operands, the instruction's name has to be specified after them. The example
|
|
below shows an instance of the AArch64 ``LDPXpost`` instruction with three
|
|
defined register operands:
|
|
|
|
.. code-block:: text
|
|
|
|
$sp, $fp, $lr = LDPXpost $sp, 2
|
|
|
|
The instruction names are serialized using the exact definitions from the
|
|
target's ``*InstrInfo.td`` files, and they are case sensitive. This means that
|
|
similar instruction names like ``TSTri`` and ``tSTRi`` represent different
|
|
machine instructions.
|
|
|
|
.. _instruction-flags:
|
|
|
|
Instruction Flags
|
|
^^^^^^^^^^^^^^^^^
|
|
|
|
The flag ``frame-setup`` or ``frame-destroy`` can be specified before the
|
|
instruction's name:
|
|
|
|
.. code-block:: text
|
|
|
|
$fp = frame-setup ADDXri $sp, 0, 0
|
|
|
|
.. code-block:: text
|
|
|
|
$x21, $x20 = frame-destroy LDPXi $sp
|
|
|
|
.. _registers:
|
|
|
|
Bundled Instructions
|
|
^^^^^^^^^^^^^^^^^^^^
|
|
|
|
The syntax for bundled instructions is the following:
|
|
|
|
.. code-block:: text
|
|
|
|
BUNDLE implicit-def $r0, implicit-def $r1, implicit $r2 {
|
|
$r0 = SOME_OP $r2
|
|
$r1 = ANOTHER_OP internal $r0
|
|
}
|
|
|
|
The first instruction is often a bundle header. The instructions between ``{``
|
|
and ``}`` are bundled with the first instruction.
|
|
|
|
.. _mir-registers:
|
|
|
|
Registers
|
|
---------
|
|
|
|
Registers are one of the key primitives in the machine instructions
|
|
serialization language. They are primarily used in the
|
|
:ref:`register machine operands <register-operands>`,
|
|
but they can also be used in a number of other places, like the
|
|
:ref:`basic block's live in list <bb-liveins>`.
|
|
|
|
The physical registers are identified by their name and by the '$' prefix sigil.
|
|
They use the following syntax:
|
|
|
|
.. code-block:: text
|
|
|
|
$<name>
|
|
|
|
The example below shows three X86 physical registers:
|
|
|
|
.. code-block:: text
|
|
|
|
$eax
|
|
$r15
|
|
$eflags
|
|
|
|
The virtual registers are identified by their ID number and by the '%' sigil.
|
|
They use the following syntax:
|
|
|
|
.. code-block:: text
|
|
|
|
%<id>
|
|
|
|
Example:
|
|
|
|
.. code-block:: text
|
|
|
|
%0
|
|
|
|
The null registers are represented using an underscore ('``_``'). They can also be
|
|
represented using a '``$noreg``' named register, although the former syntax
|
|
is preferred.
|
|
|
|
.. _machine-operands:
|
|
|
|
Machine Operands
|
|
----------------
|
|
|
|
There are seventeen different kinds of machine operands, and all of them can be
|
|
serialized.
|
|
|
|
Immediate Operands
|
|
^^^^^^^^^^^^^^^^^^
|
|
|
|
The immediate machine operands are untyped, 64-bit signed integers. The
|
|
example below shows an instance of the X86 ``MOV32ri`` instruction that has an
|
|
immediate machine operand ``-42``:
|
|
|
|
.. code-block:: text
|
|
|
|
$eax = MOV32ri -42
|
|
|
|
An immediate operand is also used to represent a subregister index when the
|
|
machine instruction has one of the following opcodes:
|
|
|
|
- ``EXTRACT_SUBREG``
|
|
|
|
- ``INSERT_SUBREG``
|
|
|
|
- ``REG_SEQUENCE``
|
|
|
|
- ``SUBREG_TO_REG``
|
|
|
|
In case this is true, the Machine Operand is printed according to the target.
|
|
|
|
For example:
|
|
|
|
In AArch64RegisterInfo.td:
|
|
|
|
.. code-block:: text
|
|
|
|
def sub_32 : SubRegIndex<32>;
|
|
|
|
If the third operand is an immediate with the value ``15`` (target-dependent
|
|
value), based on the instruction's opcode and the operand's index the operand
|
|
will be printed as ``%subreg.sub_32``:
|
|
|
|
.. code-block:: text
|
|
|
|
%1:gpr64 = SUBREG_TO_REG 0, %0, %subreg.sub_32
|
|
|
|
For integers > 64bit, we use a special machine operand, ``MO_CImmediate``,
|
|
which stores the immediate in a ``ConstantInt`` using an ``APInt`` (LLVM's
|
|
arbitrary precision integers).
|
|
|
|
.. TODO: Describe the FPIMM immediate operands.
|
|
|
|
.. _register-operands:
|
|
|
|
Register Operands
|
|
^^^^^^^^^^^^^^^^^
|
|
|
|
The :ref:`register <registers>` primitive is used to represent the register
|
|
machine operands. The register operands can also have optional
|
|
:ref:`register flags <register-flags>`,
|
|
:ref:`a subregister index <subregister-indices>`,
|
|
and a reference to the tied register operand.
|
|
The full syntax of a register operand is shown below:
|
|
|
|
.. code-block:: text
|
|
|
|
[<flags>] <register> [ :<subregister-idx-name> ] [ (tied-def <tied-op>) ]
|
|
|
|
This example shows an instance of the X86 ``XOR32rr`` instruction that has
|
|
5 register operands with different register flags:
|
|
|
|
.. code-block:: text
|
|
|
|
dead $eax = XOR32rr undef $eax, undef $eax, implicit-def dead $eflags, implicit-def $al
|
|
|
|
.. _register-flags:
|
|
|
|
Register Flags
|
|
~~~~~~~~~~~~~~
|
|
|
|
The table below shows all of the possible register flags along with the
|
|
corresponding internal ``llvm::RegState`` representation:
|
|
|
|
.. list-table::
|
|
:header-rows: 1
|
|
|
|
* - Flag
|
|
- Internal Value
|
|
|
|
* - ``implicit``
|
|
- ``RegState::Implicit``
|
|
|
|
* - ``implicit-def``
|
|
- ``RegState::ImplicitDefine``
|
|
|
|
* - ``def``
|
|
- ``RegState::Define``
|
|
|
|
* - ``dead``
|
|
- ``RegState::Dead``
|
|
|
|
* - ``killed``
|
|
- ``RegState::Kill``
|
|
|
|
* - ``undef``
|
|
- ``RegState::Undef``
|
|
|
|
* - ``internal``
|
|
- ``RegState::InternalRead``
|
|
|
|
* - ``early-clobber``
|
|
- ``RegState::EarlyClobber``
|
|
|
|
* - ``debug-use``
|
|
- ``RegState::Debug``
|
|
|
|
* - ``renamable``
|
|
- ``RegState::Renamable``
|
|
|
|
.. _subregister-indices:
|
|
|
|
Subregister Indices
|
|
~~~~~~~~~~~~~~~~~~~
|
|
|
|
The register machine operands can reference a portion of a register by using
|
|
the subregister indices. The example below shows an instance of the ``COPY``
|
|
pseudo instruction that uses the X86 ``sub_8bit`` subregister index to copy 8
|
|
lower bits from the 32-bit virtual register 0 to the 8-bit virtual register 1:
|
|
|
|
.. code-block:: text
|
|
|
|
%1 = COPY %0:sub_8bit
|
|
|
|
The names of the subregister indices are target specific, and are typically
|
|
defined in the target's ``*RegisterInfo.td`` file.
|
|
|
|
Constant Pool Indices
|
|
^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
A constant pool index (CPI) operand is printed using its index in the
|
|
function's ``MachineConstantPool`` and an offset.
|
|
|
|
For example, a CPI with the index 1 and offset 8:
|
|
|
|
.. code-block:: text
|
|
|
|
%1:gr64 = MOV64ri %const.1 + 8
|
|
|
|
For a CPI with the index 0 and offset -12:
|
|
|
|
.. code-block:: text
|
|
|
|
%1:gr64 = MOV64ri %const.0 - 12
|
|
|
|
A constant pool entry is bound to a LLVM IR ``Constant`` or a target-specific
|
|
``MachineConstantPoolValue``. When serializing all the function's constants the
|
|
following format is used:
|
|
|
|
.. code-block:: text
|
|
|
|
constants:
|
|
- id: <index>
|
|
value: <value>
|
|
alignment: <alignment>
|
|
isTargetSpecific: <target-specific>
|
|
|
|
where:
|
|
- ``<index>`` is a 32-bit unsigned integer;
|
|
- ``<value>`` is a `LLVM IR Constant
|
|
<https://www.llvm.org/docs/LangRef.html#constants>`_;
|
|
- ``<alignment>`` is a 32-bit unsigned integer specified in bytes, and must be
|
|
power of two;
|
|
- ``<target-specific>`` is either true or false.
|
|
|
|
Example:
|
|
|
|
.. code-block:: text
|
|
|
|
constants:
|
|
- id: 0
|
|
value: 'double 3.250000e+00'
|
|
alignment: 8
|
|
- id: 1
|
|
value: 'g-(LPC0+8)'
|
|
alignment: 4
|
|
isTargetSpecific: true
|
|
|
|
Global Value Operands
|
|
^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
The global value machine operands reference the global values from the
|
|
:ref:`embedded LLVM IR module <embedded-module>`.
|
|
The example below shows an instance of the X86 ``MOV64rm`` instruction that has
|
|
a global value operand named ``G``:
|
|
|
|
.. code-block:: text
|
|
|
|
$rax = MOV64rm $rip, 1, _, @G, _
|
|
|
|
The named global values are represented using an identifier with the '@' prefix.
|
|
If the identifier doesn't match the regular expression
|
|
`[-a-zA-Z$._][-a-zA-Z$._0-9]*`, then this identifier must be quoted.
|
|
|
|
The unnamed global values are represented using an unsigned numeric value with
|
|
the '@' prefix, like in the following examples: ``@0``, ``@989``.
|
|
|
|
Target-dependent Index Operands
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
A target index operand is a target-specific index and an offset. The
|
|
target-specific index is printed using target-specific names and a positive or
|
|
negative offset.
|
|
|
|
For example, the ``amdgpu-constdata-start`` is associated with the index ``0``
|
|
in the AMDGPU backend. So if we have a target index operand with the index 0
|
|
and the offset 8:
|
|
|
|
.. code-block:: text
|
|
|
|
$sgpr2 = S_ADD_U32 _, target-index(amdgpu-constdata-start) + 8, implicit-def _, implicit-def _
|
|
|
|
Jump-table Index Operands
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
A jump-table index operand with the index 0 is printed as following:
|
|
|
|
.. code-block:: text
|
|
|
|
tBR_JTr killed $r0, %jump-table.0
|
|
|
|
A machine jump-table entry contains a list of ``MachineBasicBlocks``. When serializing all the function's jump-table entries, the following format is used:
|
|
|
|
.. code-block:: text
|
|
|
|
jumpTable:
|
|
kind: <kind>
|
|
entries:
|
|
- id: <index>
|
|
blocks: [ <bbreference>, <bbreference>, ... ]
|
|
|
|
where ``<kind>`` is describing how the jump table is represented and emitted (plain address, relocations, PIC, etc.), and each ``<index>`` is a 32-bit unsigned integer and ``blocks`` contains a list of :ref:`machine basic block references <block-references>`.
|
|
|
|
Example:
|
|
|
|
.. code-block:: text
|
|
|
|
jumpTable:
|
|
kind: inline
|
|
entries:
|
|
- id: 0
|
|
blocks: [ '%bb.3', '%bb.9', '%bb.4.d3' ]
|
|
- id: 1
|
|
blocks: [ '%bb.7', '%bb.7', '%bb.4.d3', '%bb.5' ]
|
|
|
|
External Symbol Operands
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
An external symbol operand is represented using an identifier with the ``&``
|
|
prefix. The identifier is surrounded with ""'s and escaped if it has any
|
|
special non-printable characters in it.
|
|
|
|
Example:
|
|
|
|
.. code-block:: text
|
|
|
|
CALL64pcrel32 &__stack_chk_fail, csr_64, implicit $rsp, implicit-def $rsp
|
|
|
|
MCSymbol Operands
|
|
^^^^^^^^^^^^^^^^^
|
|
|
|
A MCSymbol operand is holding a pointer to a ``MCSymbol``. For the limitations
|
|
of this operand in MIR, see :ref:`limitations <limitations>`.
|
|
|
|
The syntax is:
|
|
|
|
.. code-block:: text
|
|
|
|
EH_LABEL <mcsymbol Ltmp1>
|
|
|
|
CFIIndex Operands
|
|
^^^^^^^^^^^^^^^^^
|
|
|
|
A CFI Index operand is holding an index into a per-function side-table,
|
|
``MachineFunction::getFrameInstructions()``, which references all the frame
|
|
instructions in a ``MachineFunction``. A ``CFI_INSTRUCTION`` may look like it
|
|
contains multiple operands, but the only operand it contains is the CFI Index.
|
|
The other operands are tracked by the ``MCCFIInstruction`` object.
|
|
|
|
The syntax is:
|
|
|
|
.. code-block:: text
|
|
|
|
CFI_INSTRUCTION offset $w30, -16
|
|
|
|
which may be emitted later in the MC layer as:
|
|
|
|
.. code-block:: text
|
|
|
|
.cfi_offset w30, -16
|
|
|
|
IntrinsicID Operands
|
|
^^^^^^^^^^^^^^^^^^^^
|
|
|
|
An Intrinsic ID operand contains a generic intrinsic ID or a target-specific ID.
|
|
|
|
The syntax for the ``returnaddress`` intrinsic is:
|
|
|
|
.. code-block:: text
|
|
|
|
$x0 = COPY intrinsic(@llvm.returnaddress)
|
|
|
|
Predicate Operands
|
|
^^^^^^^^^^^^^^^^^^
|
|
|
|
A Predicate operand contains an IR predicate from ``CmpInst::Predicate``, like
|
|
``ICMP_EQ``, etc.
|
|
|
|
For an int eq predicate ``ICMP_EQ``, the syntax is:
|
|
|
|
.. code-block:: text
|
|
|
|
%2:gpr(s32) = G_ICMP intpred(eq), %0, %1
|
|
|
|
.. TODO: Describe the parsers default behaviour when optional YAML attributes
|
|
are missing.
|
|
.. TODO: Describe the syntax for virtual register YAML definitions.
|
|
.. TODO: Describe the machine function's YAML flag attributes.
|
|
.. TODO: Describe the syntax for the register mask machine operands.
|
|
.. TODO: Describe the frame information YAML mapping.
|
|
.. TODO: Describe the syntax of the stack object machine operands and their
|
|
YAML definitions.
|
|
.. TODO: Describe the syntax of the block address machine operands.
|
|
.. TODO: Describe the syntax of the metadata machine operands, and the
|
|
instructions debug location attribute.
|
|
.. TODO: Describe the syntax of the register live out machine operands.
|
|
.. TODO: Describe the syntax of the machine memory operands.
|