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 }