aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/Target/RISCV/RISCVGISelInteger.rccdesc
diff options
context:
space:
mode:
Diffstat (limited to 'backend/lib/Target/RISCV/RISCVGISelInteger.rccdesc')
-rw-r--r--backend/lib/Target/RISCV/RISCVGISelInteger.rccdesc1396
1 files changed, 1396 insertions, 0 deletions
diff --git a/backend/lib/Target/RISCV/RISCVGISelInteger.rccdesc b/backend/lib/Target/RISCV/RISCVGISelInteger.rccdesc
new file mode 100644
index 0000000..d217460
--- /dev/null
+++ b/backend/lib/Target/RISCV/RISCVGISelInteger.rccdesc
@@ -0,0 +1,1396 @@
+selection_rules:
+ -
+ id: select_g_implicit_def
+ priority: 100
+ match:
+ opcode: G_IMPLICIT_DEF
+ apply:
+ instructions:
+ - opcode: IMPLICIT_DEF
+ root: true
+ operands: [{ operand: 0 }]
+ -
+ id: select_g_sext_s64_s32
+ priority: 500
+ match:
+ opcode: G_SEXT
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 32 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ apply:
+ instructions:
+ - opcode: ADDIW
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { immediate: 0 }]
+ -
+ id: select_g_sext_s64_s16
+ priority: 400
+ match:
+ opcode: G_SEXT
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 16 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ apply:
+ temporaries:
+ - { id: extended, type_from_operand: 0 }
+ instructions:
+ - opcode: SLLI
+ root: true
+ operands:
+ - { temporary: extended, flags: [define] }
+ - { operand: 1 }
+ - { immediate: 48 }
+ - opcode: SRAI
+ root: false
+ operands:
+ - { operand: 0 }
+ - { temporary: extended, flags: [use] }
+ - { immediate: 48 }
+ -
+ id: select_g_sext_s32_s16
+ priority: 400
+ match:
+ opcode: G_SEXT
+ result_type: { kind: scalar, bits: 32 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 16 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ apply:
+ temporaries:
+ - { id: extended, type_from_operand: 0 }
+ instructions:
+ - opcode: SLLIW
+ root: true
+ operands:
+ - { temporary: extended, flags: [define] }
+ - { operand: 1 }
+ - { immediate: 16 }
+ - opcode: SRAIW
+ root: false
+ operands:
+ - { operand: 0 }
+ - { temporary: extended, flags: [use] }
+ - { immediate: 16 }
+ -
+ id: select_g_zext_s64_s32_zba
+ priority: 500
+ match:
+ opcode: G_ZEXT
+ result_type: { kind: scalar, bits: 64 }
+ target_predicates: [zba]
+ operand_types:
+ - { index: 1, kind: scalar, bits: 32 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ apply:
+ instructions:
+ - opcode: ADD_UW
+ root: true
+ operands:
+ - { operand: 0 }
+ - { operand: 1 }
+ - { physical_register: X0, flags: [use] }
+ -
+ id: select_g_zext_s64_s32
+ priority: 400
+ match:
+ opcode: G_ZEXT
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 32 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ apply:
+ temporaries:
+ - { id: extended, type_from_operand: 0 }
+ instructions:
+ - opcode: SLLI
+ root: true
+ operands:
+ - { temporary: extended, flags: [define] }
+ - { operand: 1 }
+ - { immediate: 32 }
+ - opcode: SRLI
+ root: false
+ operands:
+ - { operand: 0 }
+ - { temporary: extended, flags: [use] }
+ - { immediate: 32 }
+ -
+ id: select_g_zext_s64_s16
+ priority: 400
+ match:
+ opcode: G_ZEXT
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 16 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ apply:
+ temporaries:
+ - { id: extended, type_from_operand: 0 }
+ instructions:
+ - opcode: SLLI
+ root: true
+ operands:
+ - { temporary: extended, flags: [define] }
+ - { operand: 1 }
+ - { immediate: 48 }
+ - opcode: SRLI
+ root: false
+ operands:
+ - { operand: 0 }
+ - { temporary: extended, flags: [use] }
+ - { immediate: 48 }
+ -
+ id: select_g_zext_s32_s16
+ priority: 400
+ match:
+ opcode: G_ZEXT
+ result_type: { kind: scalar, bits: 32 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 16 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ apply:
+ temporaries:
+ - { id: extended, type_from_operand: 0 }
+ instructions:
+ - opcode: SLLIW
+ root: true
+ operands:
+ - { temporary: extended, flags: [define] }
+ - { operand: 1 }
+ - { immediate: 16 }
+ - opcode: SRLIW
+ root: false
+ operands:
+ - { operand: 0 }
+ - { temporary: extended, flags: [use] }
+ - { immediate: 16 }
+ -
+ id: select_g_sext_inreg_s64_32
+ priority: 500
+ match:
+ opcode: G_SEXT_INREG
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ operand_immediates:
+ - index: 2
+ ranges: [{ min: 32, max: 32 }]
+ apply:
+ instructions:
+ - opcode: ADDIW
+ root: true
+ operands:
+ - { operand: 0 }
+ - { operand: 1 }
+ - { immediate: 0 }
+ -
+ id: select_g_ptr_add_immediate
+ priority: 400
+ match:
+ opcode: G_PTR_ADD
+ result_type: { kind: pointer, bits: 64 }
+ operand_types:
+ - { index: 1, kind: pointer, bits: 64 }
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ operand_def_constants:
+ - index: 2
+ ranges: [{ min: -2048, max: 2047 }]
+ apply:
+ instructions:
+ - opcode: ADDI
+ root: true
+ operands:
+ - { operand: 0 }
+ - { operand: 1 }
+ - { captured_immediate: 2 }
+ erase_operand_definitions: [2]
+ -
+ id: select_g_ptrmask_immediate
+ priority: 400
+ match:
+ opcode: G_PTRMASK
+ result_type: { kind: pointer, bits: 64 }
+ operand_types:
+ - { index: 1, kind: pointer, bits: 64 }
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ operand_def_constants:
+ - index: 2
+ ranges: [{ min: -2048, max: 2047 }]
+ apply:
+ instructions:
+ - opcode: ANDI
+ root: true
+ operands:
+ - { operand: 0 }
+ - { operand: 1 }
+ - { captured_immediate: 2 }
+ erase_operand_definitions: [2]
+ -
+ id: select_g_ptr_add_register
+ priority: 100
+ match:
+ opcode: G_PTR_ADD
+ result_type: { kind: pointer, bits: 64 }
+ operand_types:
+ - { index: 1, kind: pointer, bits: 64 }
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ - { index: 2, bank: GPR }
+ apply:
+ instructions:
+ - opcode: ADD
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { operand: 2 }]
+ -
+ id: select_g_ptrmask_register
+ priority: 100
+ match:
+ opcode: G_PTRMASK
+ result_type: { kind: pointer, bits: 64 }
+ operand_types:
+ - { index: 1, kind: pointer, bits: 64 }
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ - { index: 2, bank: GPR }
+ apply:
+ instructions:
+ - opcode: AND
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { operand: 2 }]
+ -
+ id: select_g_add_immediate
+ priority: 400
+ match:
+ opcode: G_ADD
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ operand_def_constants:
+ - index: 2
+ ranges: [{ min: -2048, max: 2047 }]
+ apply:
+ instructions:
+ - opcode: ADDI
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { captured_immediate: 2 }]
+ erase_operand_definitions: [2]
+ -
+ id: select_g_and_immediate
+ priority: 400
+ match:
+ opcode: G_AND
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ operand_def_constants:
+ - index: 2
+ ranges: [{ min: -2048, max: 2047 }]
+ apply:
+ instructions:
+ - opcode: ANDI
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { captured_immediate: 2 }]
+ erase_operand_definitions: [2]
+ -
+ id: select_g_or_immediate
+ priority: 400
+ match:
+ opcode: G_OR
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ operand_def_constants:
+ - index: 2
+ ranges: [{ min: -2048, max: 2047 }]
+ apply:
+ instructions:
+ - opcode: ORI
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { captured_immediate: 2 }]
+ erase_operand_definitions: [2]
+ -
+ id: select_g_xor_immediate
+ priority: 400
+ match:
+ opcode: G_XOR
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ operand_def_constants:
+ - index: 2
+ ranges: [{ min: -2048, max: 2047 }]
+ apply:
+ instructions:
+ - opcode: XORI
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { captured_immediate: 2 }]
+ erase_operand_definitions: [2]
+ -
+ id: select_g_add_register
+ priority: 100
+ match:
+ opcode: G_ADD
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ - { index: 2, bank: GPR }
+ apply:
+ instructions:
+ - opcode: ADD
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { operand: 2 }]
+ -
+ id: select_g_sub_register
+ priority: 100
+ match:
+ opcode: G_SUB
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ - { index: 2, bank: GPR }
+ apply:
+ instructions:
+ - opcode: SUB
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { operand: 2 }]
+ -
+ id: select_g_mul_register
+ priority: 100
+ match:
+ opcode: G_MUL
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ - { index: 2, bank: GPR }
+ apply:
+ instructions:
+ - opcode: MUL
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { operand: 2 }]
+ -
+ id: select_g_smulh_register
+ priority: 100
+ match:
+ opcode: G_SMULH
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ - { index: 2, bank: GPR }
+ apply:
+ instructions:
+ - opcode: MULH
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { operand: 2 }]
+ -
+ id: select_g_umulh_register
+ priority: 100
+ match:
+ opcode: G_UMULH
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ - { index: 2, bank: GPR }
+ apply:
+ instructions:
+ - opcode: MULHU
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { operand: 2 }]
+ -
+ id: select_g_sdiv_register
+ priority: 100
+ match:
+ opcode: G_SDIV
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ - { index: 2, bank: GPR }
+ apply:
+ instructions:
+ - opcode: DIV
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { operand: 2 }]
+ -
+ id: select_g_udiv_register
+ priority: 100
+ match:
+ opcode: G_UDIV
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ - { index: 2, bank: GPR }
+ apply:
+ instructions:
+ - opcode: DIVU
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { operand: 2 }]
+ -
+ id: select_g_srem_register
+ priority: 100
+ match:
+ opcode: G_SREM
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ - { index: 2, bank: GPR }
+ apply:
+ instructions:
+ - opcode: REM
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { operand: 2 }]
+ -
+ id: select_g_urem_register
+ priority: 100
+ match:
+ opcode: G_UREM
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ - { index: 2, bank: GPR }
+ apply:
+ instructions:
+ - opcode: REMU
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { operand: 2 }]
+ -
+ id: select_g_and_register
+ priority: 100
+ match:
+ opcode: G_AND
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ - { index: 2, bank: GPR }
+ apply:
+ instructions:
+ - opcode: AND
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { operand: 2 }]
+ -
+ id: select_g_or_register
+ priority: 100
+ match:
+ opcode: G_OR
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ - { index: 2, bank: GPR }
+ apply:
+ instructions:
+ - opcode: OR
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { operand: 2 }]
+ -
+ id: select_g_xor_register
+ priority: 100
+ match:
+ opcode: G_XOR
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ - { index: 2, bank: GPR }
+ apply:
+ instructions:
+ - opcode: XOR
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { operand: 2 }]
+ -
+ id: select_g_sllw
+ priority: 100
+ match:
+ opcode: G_SLLW
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ - { index: 2, bank: GPR }
+ apply:
+ instructions:
+ - opcode: SLLW
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { operand: 2 }]
+ -
+ id: select_g_sraw
+ priority: 100
+ match:
+ opcode: G_SRAW
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ - { index: 2, bank: GPR }
+ apply:
+ instructions:
+ - opcode: SRAW
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { operand: 2 }]
+ -
+ id: select_g_srlw
+ priority: 100
+ match:
+ opcode: G_SRLW
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ - { index: 2, bank: GPR }
+ apply:
+ instructions:
+ - opcode: SRLW
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { operand: 2 }]
+ -
+ id: select_g_divw
+ priority: 100
+ match:
+ opcode: G_DIVW
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ - { index: 2, bank: GPR }
+ apply:
+ instructions:
+ - opcode: DIVW
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { operand: 2 }]
+ -
+ id: select_g_divuw
+ priority: 100
+ match:
+ opcode: G_DIVUW
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ - { index: 2, bank: GPR }
+ apply:
+ instructions:
+ - opcode: DIVUW
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { operand: 2 }]
+ -
+ id: select_g_remuw
+ priority: 100
+ match:
+ opcode: G_REMUW
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ - { index: 2, bank: GPR }
+ apply:
+ instructions:
+ - opcode: REMUW
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { operand: 2 }]
+ -
+ id: select_g_fcvt_w_rv64_s32
+ priority: 100
+ match:
+ opcode: G_FCVT_W_RV64
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 32 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: FPR }
+ apply:
+ instructions:
+ - opcode: FCVT_W_S
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { operand: 2 }]
+ -
+ id: select_g_fcvt_w_rv64_s64
+ priority: 100
+ match:
+ opcode: G_FCVT_W_RV64
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: FPR }
+ apply:
+ instructions:
+ - opcode: FCVT_W_D
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { operand: 2 }]
+ -
+ id: select_g_fcvt_wu_rv64_s32
+ priority: 100
+ match:
+ opcode: G_FCVT_WU_RV64
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 32 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: FPR }
+ apply:
+ instructions:
+ - opcode: FCVT_WU_S
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { operand: 2 }]
+ -
+ id: select_g_fcvt_wu_rv64_s64
+ priority: 100
+ match:
+ opcode: G_FCVT_WU_RV64
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: FPR }
+ apply:
+ instructions:
+ - opcode: FCVT_WU_D
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }, { operand: 2 }]
+ -
+ id: select_g_fclass_s32
+ priority: 100
+ match:
+ opcode: G_FCLASS
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 32 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: FPR }
+ apply:
+ instructions:
+ - opcode: FCLASS_S
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }]
+ -
+ id: select_g_fclass_s64
+ priority: 100
+ match:
+ opcode: G_FCLASS
+ result_type: { kind: scalar, bits: 64 }
+ operand_types:
+ - { index: 1, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: FPR }
+ apply:
+ instructions:
+ - opcode: FCLASS_D
+ root: true
+ operands: [{ operand: 0 }, { operand: 1 }]
+ -
+ id: select_g_icmp_eq_zero
+ priority: 500
+ match:
+ opcode: G_ICMP
+ result_type: { kind: scalar, bits: 64 }
+ integer_predicate: { index: 1, value: eq }
+ operand_types:
+ - { index: 2, kind: any, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 2, bank: GPR }
+ operand_def_constants:
+ - index: 3
+ ranges: [{ min: 0, max: 0 }]
+ apply:
+ instructions:
+ - opcode: SLTIU
+ root: true
+ operands: [{ operand: 0 }, { operand: 2 }, { immediate: 1 }]
+ erase_operand_definitions: [3]
+ -
+ id: select_g_icmp_ne_zero
+ priority: 500
+ match:
+ opcode: G_ICMP
+ result_type: { kind: scalar, bits: 64 }
+ integer_predicate: { index: 1, value: ne }
+ operand_types:
+ - { index: 2, kind: any, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 2, bank: GPR }
+ operand_def_constants:
+ - index: 3
+ ranges: [{ min: 0, max: 0 }]
+ apply:
+ instructions:
+ - opcode: SLTU
+ root: true
+ operands:
+ - { operand: 0 }
+ - { physical_register: X0, flags: [use] }
+ - { operand: 2 }
+ erase_operand_definitions: [3]
+ -
+ id: select_g_icmp_ult_immediate
+ priority: 400
+ match:
+ opcode: G_ICMP
+ result_type: { kind: scalar, bits: 64 }
+ integer_predicate: { index: 1, value: ult }
+ operand_types:
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 2, bank: GPR }
+ operand_def_constants:
+ - index: 3
+ ranges: [{ min: -2048, max: 2047 }]
+ apply:
+ instructions:
+ - opcode: SLTIU
+ root: true
+ operands:
+ - { operand: 0 }
+ - { operand: 2 }
+ - { captured_immediate: 3 }
+ erase_operand_definitions: [3]
+ -
+ id: select_g_icmp_slt_immediate
+ priority: 400
+ match:
+ opcode: G_ICMP
+ result_type: { kind: scalar, bits: 64 }
+ integer_predicate: { index: 1, value: slt }
+ operand_types:
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 2, bank: GPR }
+ operand_def_constants:
+ - index: 3
+ ranges: [{ min: -2048, max: 2047 }]
+ apply:
+ instructions:
+ - opcode: SLTI
+ root: true
+ operands:
+ - { operand: 0 }
+ - { operand: 2 }
+ - { captured_immediate: 3 }
+ erase_operand_definitions: [3]
+ -
+ id: select_g_icmp_ugt_immediate
+ priority: 400
+ match:
+ opcode: G_ICMP
+ result_type: { kind: scalar, bits: 64 }
+ integer_predicate: { index: 1, value: ugt }
+ operand_types:
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 2, bank: GPR }
+ operand_def_constants:
+ - index: 3
+ ranges:
+ - { min: -2049, max: -2 }
+ - { min: 1, max: 2046 }
+ apply:
+ temporaries:
+ - { id: compare, type_from_operand: 2 }
+ instructions:
+ - opcode: SLTIU
+ root: true
+ operands:
+ - { temporary: compare, flags: [define] }
+ - { operand: 2 }
+ - { captured_immediate: 3, transform: plus_one }
+ - opcode: XORI
+ root: false
+ operands:
+ - { operand: 0 }
+ - { temporary: compare, flags: [use] }
+ - { immediate: 1 }
+ erase_operand_definitions: [3]
+ -
+ id: select_g_select_gpr
+ priority: 100
+ match:
+ opcode: G_SELECT
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 1, bank: GPR }
+ - { index: 2, bank: GPR }
+ - { index: 3, bank: GPR }
+ apply:
+ instructions:
+ - opcode: Select_GPR_Using_CC_GPR
+ root: true
+ operands:
+ - { operand: 0 }
+ - { complex: select_condition_lhs, operand: 1 }
+ - { complex: select_condition_rhs, operand: 1 }
+ - { complex: select_condition_code, operand: 1 }
+ - { operand: 2 }
+ - { operand: 3 }
+ -
+ id: select_g_icmp_sgt_immediate
+ priority: 400
+ match:
+ opcode: G_ICMP
+ result_type: { kind: scalar, bits: 64 }
+ integer_predicate: { index: 1, value: sgt }
+ operand_types:
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 2, bank: GPR }
+ operand_def_constants:
+ - index: 3
+ ranges:
+ - { min: -2049, max: -1 }
+ - { min: 1, max: 2046 }
+ apply:
+ temporaries:
+ - { id: compare, type_from_operand: 2 }
+ instructions:
+ - opcode: SLTI
+ root: true
+ operands:
+ - { temporary: compare, flags: [define] }
+ - { operand: 2 }
+ - { captured_immediate: 3, transform: plus_one }
+ - opcode: XORI
+ root: false
+ operands:
+ - { operand: 0 }
+ - { temporary: compare, flags: [use] }
+ - { immediate: 1 }
+ erase_operand_definitions: [3]
+ -
+ id: select_g_icmp_eq_immediate
+ priority: 400
+ match:
+ opcode: G_ICMP
+ result_type: { kind: scalar, bits: 64 }
+ integer_predicate: { index: 1, value: eq }
+ operand_types:
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 2, bank: GPR }
+ operand_def_constants:
+ - index: 3
+ ranges: [{ min: -2047, max: 2048 }]
+ apply:
+ temporaries:
+ - { id: difference, type_from_operand: 2 }
+ instructions:
+ - opcode: ADDI
+ root: true
+ operands:
+ - { temporary: difference, flags: [define] }
+ - { operand: 2 }
+ - { captured_immediate: 3, transform: negate }
+ - opcode: SLTIU
+ root: false
+ operands:
+ - { operand: 0 }
+ - { temporary: difference, flags: [use] }
+ - { immediate: 1 }
+ erase_operand_definitions: [3]
+ -
+ id: select_g_icmp_ne_immediate
+ priority: 400
+ match:
+ opcode: G_ICMP
+ result_type: { kind: scalar, bits: 64 }
+ integer_predicate: { index: 1, value: ne }
+ operand_types:
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 2, bank: GPR }
+ operand_def_constants:
+ - index: 3
+ ranges: [{ min: -2047, max: 2048 }]
+ apply:
+ temporaries:
+ - { id: difference, type_from_operand: 2 }
+ instructions:
+ - opcode: ADDI
+ root: true
+ operands:
+ - { temporary: difference, flags: [define] }
+ - { operand: 2 }
+ - { captured_immediate: 3, transform: negate }
+ - opcode: SLTU
+ root: false
+ operands:
+ - { operand: 0 }
+ - { physical_register: X0, flags: [use] }
+ - { temporary: difference, flags: [use] }
+ erase_operand_definitions: [3]
+ -
+ id: select_g_icmp_ule_immediate
+ priority: 400
+ match:
+ opcode: G_ICMP
+ result_type: { kind: scalar, bits: 64 }
+ integer_predicate: { index: 1, value: ule }
+ operand_types:
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 2, bank: GPR }
+ operand_def_constants:
+ - index: 3
+ ranges:
+ - { min: -2049, max: -2 }
+ - { min: 1, max: 2046 }
+ apply:
+ instructions:
+ - opcode: SLTIU
+ root: true
+ operands:
+ - { operand: 0 }
+ - { operand: 2 }
+ - { captured_immediate: 3, transform: plus_one }
+ erase_operand_definitions: [3]
+ -
+ id: select_g_icmp_sle_immediate
+ priority: 400
+ match:
+ opcode: G_ICMP
+ result_type: { kind: scalar, bits: 64 }
+ integer_predicate: { index: 1, value: sle }
+ operand_types:
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 2, bank: GPR }
+ operand_def_constants:
+ - index: 3
+ ranges:
+ - { min: -2049, max: -1 }
+ - { min: 1, max: 2046 }
+ apply:
+ instructions:
+ - opcode: SLTI
+ root: true
+ operands:
+ - { operand: 0 }
+ - { operand: 2 }
+ - { captured_immediate: 3, transform: plus_one }
+ erase_operand_definitions: [3]
+ -
+ id: select_g_icmp_uge_immediate
+ priority: 400
+ match:
+ opcode: G_ICMP
+ result_type: { kind: scalar, bits: 64 }
+ integer_predicate: { index: 1, value: uge }
+ operand_types:
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 2, bank: GPR }
+ operand_def_constants:
+ - index: 3
+ ranges: [{ min: -2048, max: 2047 }]
+ apply:
+ temporaries:
+ - { id: compare, type_from_operand: 2 }
+ instructions:
+ - opcode: SLTIU
+ root: true
+ operands:
+ - { temporary: compare, flags: [define] }
+ - { operand: 2 }
+ - { captured_immediate: 3 }
+ - opcode: XORI
+ root: false
+ operands:
+ - { operand: 0 }
+ - { temporary: compare, flags: [use] }
+ - { immediate: 1 }
+ erase_operand_definitions: [3]
+ -
+ id: select_g_icmp_sge_immediate
+ priority: 400
+ match:
+ opcode: G_ICMP
+ result_type: { kind: scalar, bits: 64 }
+ integer_predicate: { index: 1, value: sge }
+ operand_types:
+ - { index: 2, kind: scalar, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 2, bank: GPR }
+ operand_def_constants:
+ - index: 3
+ ranges: [{ min: -2048, max: 2047 }]
+ apply:
+ temporaries:
+ - { id: compare, type_from_operand: 2 }
+ instructions:
+ - opcode: SLTI
+ root: true
+ operands:
+ - { temporary: compare, flags: [define] }
+ - { operand: 2 }
+ - { captured_immediate: 3 }
+ - opcode: XORI
+ root: false
+ operands:
+ - { operand: 0 }
+ - { temporary: compare, flags: [use] }
+ - { immediate: 1 }
+ erase_operand_definitions: [3]
+ -
+ id: select_g_icmp_ult_register
+ priority: 100
+ match:
+ opcode: G_ICMP
+ result_type: { kind: scalar, bits: 64 }
+ integer_predicate: { index: 1, value: ult }
+ operand_types:
+ - { index: 2, kind: any, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 2, bank: GPR }
+ - { index: 3, bank: GPR }
+ apply:
+ instructions:
+ - opcode: SLTU
+ root: true
+ operands: [{ operand: 0 }, { operand: 2 }, { operand: 3 }]
+ -
+ id: select_g_icmp_slt_register
+ priority: 100
+ match:
+ opcode: G_ICMP
+ result_type: { kind: scalar, bits: 64 }
+ integer_predicate: { index: 1, value: slt }
+ operand_types:
+ - { index: 2, kind: any, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 2, bank: GPR }
+ - { index: 3, bank: GPR }
+ apply:
+ instructions:
+ - opcode: SLT
+ root: true
+ operands: [{ operand: 0 }, { operand: 2 }, { operand: 3 }]
+ -
+ id: select_g_icmp_ugt_register
+ priority: 100
+ match:
+ opcode: G_ICMP
+ result_type: { kind: scalar, bits: 64 }
+ integer_predicate: { index: 1, value: ugt }
+ operand_types:
+ - { index: 2, kind: any, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 2, bank: GPR }
+ - { index: 3, bank: GPR }
+ apply:
+ instructions:
+ - opcode: SLTU
+ root: true
+ operands: [{ operand: 0 }, { operand: 3 }, { operand: 2 }]
+ -
+ id: select_g_icmp_sgt_register
+ priority: 100
+ match:
+ opcode: G_ICMP
+ result_type: { kind: scalar, bits: 64 }
+ integer_predicate: { index: 1, value: sgt }
+ operand_types:
+ - { index: 2, kind: any, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 2, bank: GPR }
+ - { index: 3, bank: GPR }
+ apply:
+ instructions:
+ - opcode: SLT
+ root: true
+ operands: [{ operand: 0 }, { operand: 3 }, { operand: 2 }]
+ -
+ id: select_g_icmp_eq_register
+ priority: 100
+ match:
+ opcode: G_ICMP
+ result_type: { kind: scalar, bits: 64 }
+ integer_predicate: { index: 1, value: eq }
+ operand_types:
+ - { index: 2, kind: any, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 2, bank: GPR }
+ - { index: 3, bank: GPR }
+ apply:
+ temporaries:
+ - { id: difference, type_from_operand: 2 }
+ instructions:
+ - opcode: XOR
+ root: true
+ operands:
+ - { temporary: difference, flags: [define] }
+ - { operand: 2 }
+ - { operand: 3 }
+ - opcode: SLTIU
+ root: false
+ operands:
+ - { operand: 0 }
+ - { temporary: difference, flags: [use] }
+ - { immediate: 1 }
+ -
+ id: select_g_icmp_ne_register
+ priority: 100
+ match:
+ opcode: G_ICMP
+ result_type: { kind: scalar, bits: 64 }
+ integer_predicate: { index: 1, value: ne }
+ operand_types:
+ - { index: 2, kind: any, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 2, bank: GPR }
+ - { index: 3, bank: GPR }
+ apply:
+ temporaries:
+ - { id: difference, type_from_operand: 2 }
+ instructions:
+ - opcode: XOR
+ root: true
+ operands:
+ - { temporary: difference, flags: [define] }
+ - { operand: 2 }
+ - { operand: 3 }
+ - opcode: SLTU
+ root: false
+ operands:
+ - { operand: 0 }
+ - { physical_register: X0, flags: [use] }
+ - { temporary: difference, flags: [use] }
+ -
+ id: select_g_icmp_ule_register
+ priority: 100
+ match:
+ opcode: G_ICMP
+ result_type: { kind: scalar, bits: 64 }
+ integer_predicate: { index: 1, value: ule }
+ operand_types:
+ - { index: 2, kind: any, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 2, bank: GPR }
+ - { index: 3, bank: GPR }
+ apply:
+ temporaries:
+ - { id: compare, type_from_operand: 2 }
+ instructions:
+ - opcode: SLTU
+ root: true
+ operands:
+ - { temporary: compare, flags: [define] }
+ - { operand: 3 }
+ - { operand: 2 }
+ - opcode: XORI
+ root: false
+ operands:
+ - { operand: 0 }
+ - { temporary: compare, flags: [use] }
+ - { immediate: 1 }
+ -
+ id: select_g_icmp_sle_register
+ priority: 100
+ match:
+ opcode: G_ICMP
+ result_type: { kind: scalar, bits: 64 }
+ integer_predicate: { index: 1, value: sle }
+ operand_types:
+ - { index: 2, kind: any, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 2, bank: GPR }
+ - { index: 3, bank: GPR }
+ apply:
+ temporaries:
+ - { id: compare, type_from_operand: 2 }
+ instructions:
+ - opcode: SLT
+ root: true
+ operands:
+ - { temporary: compare, flags: [define] }
+ - { operand: 3 }
+ - { operand: 2 }
+ - opcode: XORI
+ root: false
+ operands:
+ - { operand: 0 }
+ - { temporary: compare, flags: [use] }
+ - { immediate: 1 }
+ -
+ id: select_g_icmp_uge_register
+ priority: 100
+ match:
+ opcode: G_ICMP
+ result_type: { kind: scalar, bits: 64 }
+ integer_predicate: { index: 1, value: uge }
+ operand_types:
+ - { index: 2, kind: any, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 2, bank: GPR }
+ - { index: 3, bank: GPR }
+ apply:
+ temporaries:
+ - { id: compare, type_from_operand: 2 }
+ instructions:
+ - opcode: SLTU
+ root: true
+ operands:
+ - { temporary: compare, flags: [define] }
+ - { operand: 2 }
+ - { operand: 3 }
+ - opcode: XORI
+ root: false
+ operands:
+ - { operand: 0 }
+ - { temporary: compare, flags: [use] }
+ - { immediate: 1 }
+ -
+ id: select_g_icmp_sge_register
+ priority: 100
+ match:
+ opcode: G_ICMP
+ result_type: { kind: scalar, bits: 64 }
+ integer_predicate: { index: 1, value: sge }
+ operand_types:
+ - { index: 2, kind: any, bits: 64 }
+ operand_banks:
+ - { index: 0, bank: GPR }
+ - { index: 2, bank: GPR }
+ - { index: 3, bank: GPR }
+ apply:
+ temporaries:
+ - { id: compare, type_from_operand: 2 }
+ instructions:
+ - opcode: SLT
+ root: true
+ operands:
+ - { temporary: compare, flags: [define] }
+ - { operand: 2 }
+ - { operand: 3 }
+ - opcode: XORI
+ root: false
+ operands:
+ - { operand: 0 }
+ - { temporary: compare, flags: [use] }
+ - { immediate: 1 }