| # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py |
| # RUN: llc -mtriple=aarch64-- -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s |
| --- |
| # Check that we select a 32-bit GPR G_ADD into ADDWrr on GPR32. |
| # Also check that we constrain the register class of the COPY to GPR32. |
| name: add_s32_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $w0, $w1 |
| |
| ; CHECK-LABEL: name: add_s32_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0 |
| ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1 |
| ; CHECK: [[ADDWrr:%[0-9]+]]:gpr32 = ADDWrr [[COPY]], [[COPY1]] |
| ; CHECK: $w0 = COPY [[ADDWrr]] |
| %0(s32) = COPY $w0 |
| %1(s32) = COPY $w1 |
| %2(s32) = G_ADD %0, %1 |
| $w0 = COPY %2(s32) |
| ... |
| |
| --- |
| # Same as add_s32_gpr, for 64-bit operations. |
| name: add_s64_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $x0, $x1 |
| |
| ; CHECK-LABEL: name: add_s64_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0 |
| ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1 |
| ; CHECK: [[ADDXrr:%[0-9]+]]:gpr64 = ADDXrr [[COPY]], [[COPY1]] |
| ; CHECK: $x0 = COPY [[ADDXrr]] |
| %0(s64) = COPY $x0 |
| %1(s64) = COPY $x1 |
| %2(s64) = G_ADD %0, %1 |
| $x0 = COPY %2(s64) |
| ... |
| |
| --- |
| name: add_imm_s32_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $w0, $w1 |
| |
| ; CHECK-LABEL: name: add_imm_s32_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr32sp = COPY $w0 |
| ; CHECK: [[ADDWri:%[0-9]+]]:gpr32sp = ADDWri [[COPY]], 1, 0 |
| ; CHECK: $w0 = COPY [[ADDWri]] |
| %0(s32) = COPY $w0 |
| %1(s32) = G_CONSTANT i32 1 |
| %2(s32) = G_ADD %0, %1 |
| $w0 = COPY %2(s32) |
| ... |
| |
| --- |
| name: add_imm_s64_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $x0, $w1 |
| |
| ; CHECK-LABEL: name: add_imm_s64_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0 |
| ; CHECK: [[ADDXri:%[0-9]+]]:gpr64sp = ADDXri [[COPY]], 1, 0 |
| ; CHECK: $x0 = COPY [[ADDXri]] |
| %0(s64) = COPY $x0 |
| %1(s64) = G_CONSTANT i64 1 |
| %2(s64) = G_ADD %0, %1 |
| $x0 = COPY %2(s64) |
| ... |
| |
| --- |
| name: add_neg_s32_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $w1, $w2 |
| ; We should be able to turn the ADD into a SUB. |
| ; CHECK-LABEL: name: add_neg_s32_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr32sp = COPY $w1 |
| ; CHECK: [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[COPY]], 1, 0, implicit-def $nzcv |
| ; CHECK: $w2 = COPY [[SUBSWri]] |
| %0(s32) = COPY $w1 |
| %1(s32) = G_CONSTANT i32 -1 |
| %2(s32) = G_ADD %0, %1 |
| $w2 = COPY %2(s32) |
| ... |
| |
| --- |
| name: add_neg_s64_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $x0, $x1 |
| ; We should be able to turn the ADD into a SUB. |
| ; CHECK-LABEL: name: add_neg_s64_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0 |
| ; CHECK: [[SUBSXri:%[0-9]+]]:gpr64 = SUBSXri [[COPY]], 1, 0, implicit-def $nzcv |
| ; CHECK: $x0 = COPY [[SUBSXri]] |
| %0(s64) = COPY $x0 |
| %1(s64) = G_CONSTANT i64 -1 |
| %2(s64) = G_ADD %0, %1 |
| $x0 = COPY %2(s64) |
| ... |
| |
| --- |
| name: add_neg_invalid_immed_s32 |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $x0, $x1 |
| ; We can't select this if the value is out of range. |
| ; CHECK-LABEL: name: add_neg_invalid_immed_s32 |
| ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0 |
| ; CHECK: [[MOVi64imm:%[0-9]+]]:gpr64 = MOVi64imm -5000 |
| ; CHECK: [[ADDXrr:%[0-9]+]]:gpr64 = ADDXrr [[COPY]], [[MOVi64imm]] |
| ; CHECK: $x0 = COPY [[ADDXrr]] |
| %0(s64) = COPY $x0 |
| %1(s64) = G_CONSTANT i64 -5000 |
| %2(s64) = G_ADD %0, %1 |
| $x0 = COPY %2(s64) |
| ... |
| |
| --- |
| name: add_neg_invalid_immed_s64 |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $x0, $x1 |
| ; We can't select this if the value is out of range. |
| ; CHECK-LABEL: name: add_neg_invalid_immed_s64 |
| ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0 |
| ; CHECK: [[MOVi64imm:%[0-9]+]]:gpr64 = MOVi64imm -5000 |
| ; CHECK: [[ADDXrr:%[0-9]+]]:gpr64 = ADDXrr [[COPY]], [[MOVi64imm]] |
| ; CHECK: $x0 = COPY [[ADDXrr]] |
| %0(s64) = COPY $x0 |
| %1(s64) = G_CONSTANT i64 -5000 |
| %2(s64) = G_ADD %0, %1 |
| $x0 = COPY %2(s64) |
| ... |
| |
| --- |
| name: add_imm_0_s32 |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $x0, $x1 |
| ; We shouldn't get a SUB here, because "cmp wN, $0" and "cmp wN, #0" have |
| ; opposite effects on the C flag. |
| ; CHECK-LABEL: name: add_imm_0_s32 |
| ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0 |
| ; CHECK: [[ADDXri:%[0-9]+]]:gpr64sp = ADDXri [[COPY]], 0, 0 |
| ; CHECK: $x0 = COPY [[ADDXri]] |
| %0(s64) = COPY $x0 |
| %1(s64) = G_CONSTANT i64 0 |
| %2(s64) = G_ADD %0, %1 |
| $x0 = COPY %2(s64) |
| ... |
| |
| --- |
| name: add_imm_0_s64 |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $x0, $x1 |
| ; We shouldn't get a SUB here, because "cmp xN, $0" and "cmp xN, #0" have |
| ; opposite effects on the C flag. |
| ; CHECK-LABEL: name: add_imm_0_s64 |
| ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0 |
| ; CHECK: [[ADDXri:%[0-9]+]]:gpr64sp = ADDXri [[COPY]], 0, 0 |
| ; CHECK: $x0 = COPY [[ADDXri]] |
| %0(s64) = COPY $x0 |
| %1(s64) = G_CONSTANT i64 0 |
| %2(s64) = G_ADD %0, %1 |
| $x0 = COPY %2(s64) |
| ... |
| |
| --- |
| name: add_imm_s32_gpr_bb |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| ; CHECK-LABEL: name: add_imm_s32_gpr_bb |
| ; CHECK: bb.0: |
| ; CHECK: successors: %bb.1(0x80000000) |
| ; CHECK: [[COPY:%[0-9]+]]:gpr32sp = COPY $w0 |
| ; CHECK: B %bb.1 |
| ; CHECK: bb.1: |
| ; CHECK: [[ADDWri:%[0-9]+]]:gpr32sp = ADDWri [[COPY]], 1, 0 |
| ; CHECK: $w0 = COPY [[ADDWri]] |
| bb.0: |
| liveins: $w0, $w1 |
| successors: %bb.1 |
| |
| %0(s32) = COPY $w0 |
| %1(s32) = G_CONSTANT i32 1 |
| G_BR %bb.1 |
| |
| bb.1: |
| %2(s32) = G_ADD %0, %1 |
| $w0 = COPY %2(s32) |
| ... |
| |
| --- |
| # Same as add_s32_gpr, for G_SUB operations. |
| name: sub_s32_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $w0, $w1 |
| |
| ; CHECK-LABEL: name: sub_s32_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0 |
| ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1 |
| ; CHECK: [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr [[COPY]], [[COPY1]], implicit-def $nzcv |
| ; CHECK: $w0 = COPY [[SUBSWrr]] |
| %0(s32) = COPY $w0 |
| %1(s32) = COPY $w1 |
| %2(s32) = G_SUB %0, %1 |
| $w0 = COPY %2(s32) |
| ... |
| |
| --- |
| # Same as add_s64_gpr, for G_SUB operations. |
| name: sub_s64_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $x0, $x1 |
| |
| ; CHECK-LABEL: name: sub_s64_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0 |
| ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1 |
| ; CHECK: [[SUBSXrr:%[0-9]+]]:gpr64 = SUBSXrr [[COPY]], [[COPY1]], implicit-def $nzcv |
| ; CHECK: $x0 = COPY [[SUBSXrr]] |
| %0(s64) = COPY $x0 |
| %1(s64) = COPY $x1 |
| %2(s64) = G_SUB %0, %1 |
| $x0 = COPY %2(s64) |
| ... |
| |
| --- |
| # Same as add_s32_gpr, for G_OR operations. |
| name: or_s32_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $w0, $w1 |
| |
| ; CHECK-LABEL: name: or_s32_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0 |
| ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1 |
| ; CHECK: [[ORRWrr:%[0-9]+]]:gpr32 = ORRWrr [[COPY]], [[COPY1]] |
| ; CHECK: $w0 = COPY [[ORRWrr]] |
| %0(s32) = COPY $w0 |
| %1(s32) = COPY $w1 |
| %2(s32) = G_OR %0, %1 |
| $w0 = COPY %2(s32) |
| ... |
| |
| --- |
| # Same as add_s64_gpr, for G_OR operations. |
| name: or_s64_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $x0, $x1 |
| |
| ; CHECK-LABEL: name: or_s64_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0 |
| ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1 |
| ; CHECK: [[ORRXrr:%[0-9]+]]:gpr64 = ORRXrr [[COPY]], [[COPY1]] |
| ; CHECK: $x0 = COPY [[ORRXrr]] |
| %0(s64) = COPY $x0 |
| %1(s64) = COPY $x1 |
| %2(s64) = G_OR %0, %1 |
| $x0 = COPY %2(s64) |
| ... |
| |
| --- |
| # 64-bit G_OR on vector registers. |
| name: or_v2s32_fpr |
| legalized: true |
| regBankSelected: true |
| # |
| registers: |
| - { id: 0, class: fpr } |
| - { id: 1, class: fpr } |
| - { id: 2, class: fpr } |
| |
| # The actual OR does not matter as long as it is operating |
| # on 64-bit width vector. |
| body: | |
| bb.0: |
| liveins: $d0, $d1 |
| |
| ; CHECK-LABEL: name: or_v2s32_fpr |
| ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY $d0 |
| ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1 |
| ; CHECK: [[ORRv8i8_:%[0-9]+]]:fpr64 = ORRv8i8 [[COPY]], [[COPY1]] |
| ; CHECK: $d0 = COPY [[ORRv8i8_]] |
| %0(<2 x s32>) = COPY $d0 |
| %1(<2 x s32>) = COPY $d1 |
| %2(<2 x s32>) = G_OR %0, %1 |
| $d0 = COPY %2(<2 x s32>) |
| ... |
| |
| --- |
| # Same as add_s32_gpr, for G_AND operations. |
| name: and_s32_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $w0, $w1 |
| |
| ; CHECK-LABEL: name: and_s32_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0 |
| ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1 |
| ; CHECK: [[ANDWrr:%[0-9]+]]:gpr32 = ANDWrr [[COPY]], [[COPY1]] |
| ; CHECK: $w0 = COPY [[ANDWrr]] |
| %0(s32) = COPY $w0 |
| %1(s32) = COPY $w1 |
| %2(s32) = G_AND %0, %1 |
| $w0 = COPY %2(s32) |
| ... |
| |
| --- |
| # Same as add_s64_gpr, for G_AND operations. |
| name: and_s64_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $x0, $x1 |
| |
| ; CHECK-LABEL: name: and_s64_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0 |
| ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1 |
| ; CHECK: [[ANDXrr:%[0-9]+]]:gpr64 = ANDXrr [[COPY]], [[COPY1]] |
| ; CHECK: $x0 = COPY [[ANDXrr]] |
| %0(s64) = COPY $x0 |
| %1(s64) = COPY $x1 |
| %2(s64) = G_AND %0, %1 |
| $x0 = COPY %2(s64) |
| ... |
| |
| --- |
| # Same as add_s32_gpr, for G_SHL operations. |
| name: shl_s32_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $w0, $w1 |
| |
| ; CHECK-LABEL: name: shl_s32_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0 |
| ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1 |
| ; CHECK: [[LSLVWr:%[0-9]+]]:gpr32 = LSLVWr [[COPY]], [[COPY1]] |
| ; CHECK: $w0 = COPY [[LSLVWr]] |
| %0(s32) = COPY $w0 |
| %1(s32) = COPY $w1 |
| %2(s32) = G_SHL %0, %1 |
| $w0 = COPY %2(s32) |
| ... |
| |
| --- |
| name: shl_s32_64_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $w0, $x1 |
| |
| ; CHECK-LABEL: name: shl_s32_64_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0 |
| ; CHECK: [[COPY1:%[0-9]+]]:gpr64all = COPY $x1 |
| ; CHECK: [[COPY2:%[0-9]+]]:gpr32 = COPY [[COPY1]].sub_32 |
| ; CHECK: [[LSLVWr:%[0-9]+]]:gpr32 = LSLVWr [[COPY]], [[COPY2]] |
| ; CHECK: $w0 = COPY [[LSLVWr]] |
| %0(s32) = COPY $w0 |
| %1(s64) = COPY $x1 |
| %2(s32) = G_SHL %0, %1 |
| $w0 = COPY %2(s32) |
| ... |
| |
| --- |
| # Same as add_s64_gpr, for G_SHL operations. |
| name: shl_s64_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $x0, $x1 |
| |
| ; CHECK-LABEL: name: shl_s64_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0 |
| ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1 |
| ; CHECK: [[LSLVXr:%[0-9]+]]:gpr64 = LSLVXr [[COPY]], [[COPY1]] |
| ; CHECK: $x0 = COPY [[LSLVXr]] |
| %0(s64) = COPY $x0 |
| %1(s64) = COPY $x1 |
| %2(s64) = G_SHL %0, %1 |
| $x0 = COPY %2(s64) |
| ... |
| |
| --- |
| # Same as add_s32_gpr, for G_LSHR operations. |
| name: lshr_s32_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $w0, $w1 |
| |
| ; CHECK-LABEL: name: lshr_s32_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0 |
| ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1 |
| ; CHECK: [[LSRVWr:%[0-9]+]]:gpr32 = LSRVWr [[COPY]], [[COPY1]] |
| ; CHECK: $w0 = COPY [[LSRVWr]] |
| %0(s32) = COPY $w0 |
| %1(s32) = COPY $w1 |
| %2(s32) = G_LSHR %0, %1 |
| $w0 = COPY %2(s32) |
| ... |
| |
| --- |
| # Same as add_s64_gpr, for G_LSHR operations. |
| name: lshr_s64_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $x0, $x1 |
| |
| ; CHECK-LABEL: name: lshr_s64_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0 |
| ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1 |
| ; CHECK: [[LSRVXr:%[0-9]+]]:gpr64 = LSRVXr [[COPY]], [[COPY1]] |
| ; CHECK: $x0 = COPY [[LSRVXr]] |
| %0(s64) = COPY $x0 |
| %1(s64) = COPY $x1 |
| %2(s64) = G_LSHR %0, %1 |
| $x0 = COPY %2(s64) |
| ... |
| |
| --- |
| # Same as add_s32_gpr, for G_ASHR operations. |
| name: ashr_s32_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $w0, $w1 |
| |
| ; CHECK-LABEL: name: ashr_s32_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0 |
| ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1 |
| ; CHECK: [[ASRVWr:%[0-9]+]]:gpr32 = ASRVWr [[COPY]], [[COPY1]] |
| ; CHECK: $w0 = COPY [[ASRVWr]] |
| %0(s32) = COPY $w0 |
| %1(s32) = COPY $w1 |
| %2(s32) = G_ASHR %0, %1 |
| $w0 = COPY %2(s32) |
| ... |
| |
| --- |
| # Same as add_s64_gpr, for G_ASHR operations. |
| name: ashr_s64_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $x0, $x1 |
| |
| ; CHECK-LABEL: name: ashr_s64_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0 |
| ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1 |
| ; CHECK: [[ASRVXr:%[0-9]+]]:gpr64 = ASRVXr [[COPY]], [[COPY1]] |
| ; CHECK: $x0 = COPY [[ASRVXr]] |
| %0(s64) = COPY $x0 |
| %1(s64) = COPY $x1 |
| %2(s64) = G_ASHR %0, %1 |
| $x0 = COPY %2(s64) |
| ... |
| |
| --- |
| # Check that we select s32 GPR G_MUL. This is trickier than other binops because |
| # there is only MADDWrrr, and we have to use the WZR physreg. |
| name: mul_s32_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $w0, $w1 |
| |
| ; CHECK-LABEL: name: mul_s32_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0 |
| ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1 |
| ; CHECK: [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY]], [[COPY1]], $wzr |
| ; CHECK: $w0 = COPY [[MADDWrrr]] |
| %0(s32) = COPY $w0 |
| %1(s32) = COPY $w1 |
| %2(s32) = G_MUL %0, %1 |
| $w0 = COPY %2(s32) |
| ... |
| |
| --- |
| # Same as mul_s32_gpr for the s64 type. |
| name: mul_s64_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $x0, $x1 |
| |
| ; CHECK-LABEL: name: mul_s64_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0 |
| ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1 |
| ; CHECK: [[MADDXrrr:%[0-9]+]]:gpr64 = MADDXrrr [[COPY]], [[COPY1]], $xzr |
| ; CHECK: $x0 = COPY [[MADDXrrr]] |
| %0(s64) = COPY $x0 |
| %1(s64) = COPY $x1 |
| %2(s64) = G_MUL %0, %1 |
| $x0 = COPY %2(s64) |
| ... |
| |
| --- |
| # Same as mul_s32_gpr for the s64 type. |
| name: mulh_s64_gpr |
| legalized: true |
| regBankSelected: true |
| |
| |
| body: | |
| bb.0: |
| liveins: $x0, $x1 |
| |
| ; CHECK-LABEL: name: mulh_s64_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0 |
| ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1 |
| ; CHECK: [[SMULHrr:%[0-9]+]]:gpr64 = SMULHrr [[COPY]], [[COPY1]] |
| ; CHECK: [[UMULHrr:%[0-9]+]]:gpr64 = UMULHrr [[COPY]], [[COPY1]] |
| ; CHECK: $x0 = COPY [[SMULHrr]] |
| ; CHECK: $x0 = COPY [[UMULHrr]] |
| %0:gpr(s64) = COPY $x0 |
| %1:gpr(s64) = COPY $x1 |
| %2:gpr(s64) = G_SMULH %0, %1 |
| %3:gpr(s64) = G_UMULH %0, %1 |
| $x0 = COPY %2(s64) |
| $x0 = COPY %3(s64) |
| ... |
| |
| --- |
| # Same as add_s32_gpr, for G_SDIV operations. |
| name: sdiv_s32_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $w0, $w1 |
| |
| ; CHECK-LABEL: name: sdiv_s32_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0 |
| ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1 |
| ; CHECK: [[SDIVWr:%[0-9]+]]:gpr32 = SDIVWr [[COPY]], [[COPY1]] |
| ; CHECK: $w0 = COPY [[SDIVWr]] |
| %0(s32) = COPY $w0 |
| %1(s32) = COPY $w1 |
| %2(s32) = G_SDIV %0, %1 |
| $w0 = COPY %2(s32) |
| ... |
| |
| --- |
| # Same as add_s64_gpr, for G_SDIV operations. |
| name: sdiv_s64_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $x0, $x1 |
| |
| ; CHECK-LABEL: name: sdiv_s64_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0 |
| ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1 |
| ; CHECK: [[SDIVXr:%[0-9]+]]:gpr64 = SDIVXr [[COPY]], [[COPY1]] |
| ; CHECK: $x0 = COPY [[SDIVXr]] |
| %0(s64) = COPY $x0 |
| %1(s64) = COPY $x1 |
| %2(s64) = G_SDIV %0, %1 |
| $x0 = COPY %2(s64) |
| ... |
| |
| --- |
| # Same as add_s32_gpr, for G_UDIV operations. |
| name: udiv_s32_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $w0, $w1 |
| |
| ; CHECK-LABEL: name: udiv_s32_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0 |
| ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1 |
| ; CHECK: [[UDIVWr:%[0-9]+]]:gpr32 = UDIVWr [[COPY]], [[COPY1]] |
| ; CHECK: $w0 = COPY [[UDIVWr]] |
| %0(s32) = COPY $w0 |
| %1(s32) = COPY $w1 |
| %2(s32) = G_UDIV %0, %1 |
| $w0 = COPY %2(s32) |
| ... |
| |
| --- |
| # Same as add_s64_gpr, for G_UDIV operations. |
| name: udiv_s64_gpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: gpr } |
| - { id: 1, class: gpr } |
| - { id: 2, class: gpr } |
| |
| body: | |
| bb.0: |
| liveins: $x0, $x1 |
| |
| ; CHECK-LABEL: name: udiv_s64_gpr |
| ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0 |
| ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1 |
| ; CHECK: [[UDIVXr:%[0-9]+]]:gpr64 = UDIVXr [[COPY]], [[COPY1]] |
| ; CHECK: $x0 = COPY [[UDIVXr]] |
| %0(s64) = COPY $x0 |
| %1(s64) = COPY $x1 |
| %2(s64) = G_UDIV %0, %1 |
| $x0 = COPY %2(s64) |
| ... |
| |
| --- |
| # Check that we select a s32 FPR G_FADD into FADDSrr. |
| name: fadd_s32_fpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: fpr } |
| - { id: 1, class: fpr } |
| - { id: 2, class: fpr } |
| |
| body: | |
| bb.0: |
| liveins: $s0, $s1 |
| |
| ; CHECK-LABEL: name: fadd_s32_fpr |
| ; CHECK: [[COPY:%[0-9]+]]:fpr32 = COPY $s0 |
| ; CHECK: [[COPY1:%[0-9]+]]:fpr32 = COPY $s1 |
| ; CHECK: [[FADDSrr:%[0-9]+]]:fpr32 = FADDSrr [[COPY]], [[COPY1]] |
| ; CHECK: $s0 = COPY [[FADDSrr]] |
| %0(s32) = COPY $s0 |
| %1(s32) = COPY $s1 |
| %2(s32) = G_FADD %0, %1 |
| $s0 = COPY %2(s32) |
| ... |
| |
| --- |
| name: fadd_s64_fpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: fpr } |
| - { id: 1, class: fpr } |
| - { id: 2, class: fpr } |
| |
| body: | |
| bb.0: |
| liveins: $d0, $d1 |
| |
| ; CHECK-LABEL: name: fadd_s64_fpr |
| ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY $d0 |
| ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1 |
| ; CHECK: [[FADDDrr:%[0-9]+]]:fpr64 = FADDDrr [[COPY]], [[COPY1]] |
| ; CHECK: $d0 = COPY [[FADDDrr]] |
| %0(s64) = COPY $d0 |
| %1(s64) = COPY $d1 |
| %2(s64) = G_FADD %0, %1 |
| $d0 = COPY %2(s64) |
| ... |
| |
| --- |
| name: fsub_s32_fpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: fpr } |
| - { id: 1, class: fpr } |
| - { id: 2, class: fpr } |
| |
| body: | |
| bb.0: |
| liveins: $s0, $s1 |
| |
| ; CHECK-LABEL: name: fsub_s32_fpr |
| ; CHECK: [[COPY:%[0-9]+]]:fpr32 = COPY $s0 |
| ; CHECK: [[COPY1:%[0-9]+]]:fpr32 = COPY $s1 |
| ; CHECK: [[FSUBSrr:%[0-9]+]]:fpr32 = FSUBSrr [[COPY]], [[COPY1]] |
| ; CHECK: $s0 = COPY [[FSUBSrr]] |
| %0(s32) = COPY $s0 |
| %1(s32) = COPY $s1 |
| %2(s32) = G_FSUB %0, %1 |
| $s0 = COPY %2(s32) |
| ... |
| |
| --- |
| name: fsub_s64_fpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: fpr } |
| - { id: 1, class: fpr } |
| - { id: 2, class: fpr } |
| |
| body: | |
| bb.0: |
| liveins: $d0, $d1 |
| |
| ; CHECK-LABEL: name: fsub_s64_fpr |
| ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY $d0 |
| ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1 |
| ; CHECK: [[FSUBDrr:%[0-9]+]]:fpr64 = FSUBDrr [[COPY]], [[COPY1]] |
| ; CHECK: $d0 = COPY [[FSUBDrr]] |
| %0(s64) = COPY $d0 |
| %1(s64) = COPY $d1 |
| %2(s64) = G_FSUB %0, %1 |
| $d0 = COPY %2(s64) |
| ... |
| |
| --- |
| name: fmul_s32_fpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: fpr } |
| - { id: 1, class: fpr } |
| - { id: 2, class: fpr } |
| |
| body: | |
| bb.0: |
| liveins: $s0, $s1 |
| |
| ; CHECK-LABEL: name: fmul_s32_fpr |
| ; CHECK: [[COPY:%[0-9]+]]:fpr32 = COPY $s0 |
| ; CHECK: [[COPY1:%[0-9]+]]:fpr32 = COPY $s1 |
| ; CHECK: [[FMULSrr:%[0-9]+]]:fpr32 = FMULSrr [[COPY]], [[COPY1]] |
| ; CHECK: $s0 = COPY [[FMULSrr]] |
| %0(s32) = COPY $s0 |
| %1(s32) = COPY $s1 |
| %2(s32) = G_FMUL %0, %1 |
| $s0 = COPY %2(s32) |
| ... |
| |
| --- |
| name: fmul_s64_fpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: fpr } |
| - { id: 1, class: fpr } |
| - { id: 2, class: fpr } |
| |
| body: | |
| bb.0: |
| liveins: $d0, $d1 |
| |
| ; CHECK-LABEL: name: fmul_s64_fpr |
| ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY $d0 |
| ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1 |
| ; CHECK: [[FMULDrr:%[0-9]+]]:fpr64 = FMULDrr [[COPY]], [[COPY1]] |
| ; CHECK: $d0 = COPY [[FMULDrr]] |
| %0(s64) = COPY $d0 |
| %1(s64) = COPY $d1 |
| %2(s64) = G_FMUL %0, %1 |
| $d0 = COPY %2(s64) |
| ... |
| |
| --- |
| name: fdiv_s32_fpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: fpr } |
| - { id: 1, class: fpr } |
| - { id: 2, class: fpr } |
| |
| body: | |
| bb.0: |
| liveins: $s0, $s1 |
| |
| ; CHECK-LABEL: name: fdiv_s32_fpr |
| ; CHECK: [[COPY:%[0-9]+]]:fpr32 = COPY $s0 |
| ; CHECK: [[COPY1:%[0-9]+]]:fpr32 = COPY $s1 |
| ; CHECK: [[FDIVSrr:%[0-9]+]]:fpr32 = FDIVSrr [[COPY]], [[COPY1]] |
| ; CHECK: $s0 = COPY [[FDIVSrr]] |
| %0(s32) = COPY $s0 |
| %1(s32) = COPY $s1 |
| %2(s32) = G_FDIV %0, %1 |
| $s0 = COPY %2(s32) |
| ... |
| |
| --- |
| name: fdiv_s64_fpr |
| legalized: true |
| regBankSelected: true |
| |
| registers: |
| - { id: 0, class: fpr } |
| - { id: 1, class: fpr } |
| - { id: 2, class: fpr } |
| |
| body: | |
| bb.0: |
| liveins: $d0, $d1 |
| |
| ; CHECK-LABEL: name: fdiv_s64_fpr |
| ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY $d0 |
| ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1 |
| ; CHECK: [[FDIVDrr:%[0-9]+]]:fpr64 = FDIVDrr [[COPY]], [[COPY1]] |
| ; CHECK: $d0 = COPY [[FDIVDrr]] |
| %0(s64) = COPY $d0 |
| %1(s64) = COPY $d1 |
| %2(s64) = G_FDIV %0, %1 |
| $d0 = COPY %2(s64) |
| ... |
| --- |
| name: add_v8i16 |
| alignment: 4 |
| legalized: true |
| regBankSelected: true |
| tracksRegLiveness: true |
| registers: |
| - { id: 0, class: fpr } |
| - { id: 1, class: fpr } |
| - { id: 2, class: fpr } |
| machineFunctionInfo: {} |
| body: | |
| bb.1: |
| liveins: $q0, $q1 |
| |
| ; CHECK-LABEL: name: add_v8i16 |
| ; CHECK: liveins: $q0, $q1 |
| ; CHECK: [[COPY:%[0-9]+]]:fpr128 = COPY $q0 |
| ; CHECK: [[COPY1:%[0-9]+]]:fpr128 = COPY $q1 |
| ; CHECK: [[ADDv8i16_:%[0-9]+]]:fpr128 = ADDv8i16 [[COPY]], [[COPY1]] |
| ; CHECK: $q0 = COPY [[ADDv8i16_]] |
| ; CHECK: RET_ReallyLR implicit $q0 |
| %0:fpr(<8 x s16>) = COPY $q0 |
| %1:fpr(<8 x s16>) = COPY $q1 |
| %2:fpr(<8 x s16>) = G_ADD %0, %1 |
| $q0 = COPY %2(<8 x s16>) |
| RET_ReallyLR implicit $q0 |
| |
| ... |
| --- |
| name: add_v16i8 |
| alignment: 4 |
| legalized: true |
| regBankSelected: true |
| tracksRegLiveness: true |
| registers: |
| - { id: 0, class: fpr } |
| - { id: 1, class: fpr } |
| - { id: 2, class: fpr } |
| machineFunctionInfo: {} |
| body: | |
| bb.1: |
| liveins: $q0, $q1 |
| |
| ; CHECK-LABEL: name: add_v16i8 |
| ; CHECK: liveins: $q0, $q1 |
| ; CHECK: [[COPY:%[0-9]+]]:fpr128 = COPY $q0 |
| ; CHECK: [[COPY1:%[0-9]+]]:fpr128 = COPY $q1 |
| ; CHECK: [[ADDv16i8_:%[0-9]+]]:fpr128 = ADDv16i8 [[COPY]], [[COPY1]] |
| ; CHECK: $q0 = COPY [[ADDv16i8_]] |
| ; CHECK: RET_ReallyLR implicit $q0 |
| %0:fpr(<16 x s8>) = COPY $q0 |
| %1:fpr(<16 x s8>) = COPY $q1 |
| %2:fpr(<16 x s8>) = G_ADD %0, %1 |
| $q0 = COPY %2(<16 x s8>) |
| RET_ReallyLR implicit $q0 |
| |
| ... |
| --- |
| name: add_v4i16 |
| legalized: true |
| regBankSelected: true |
| tracksRegLiveness: true |
| body: | |
| bb.1: |
| liveins: $d0, $d1 |
| |
| ; CHECK-LABEL: name: add_v4i16 |
| ; CHECK: liveins: $d0, $d1 |
| ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY $d0 |
| ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1 |
| ; CHECK: [[ADDv4i16_:%[0-9]+]]:fpr64 = ADDv4i16 [[COPY]], [[COPY1]] |
| ; CHECK: $d0 = COPY [[ADDv4i16_]] |
| ; CHECK: RET_ReallyLR implicit $d0 |
| %0:fpr(<4 x s16>) = COPY $d0 |
| %1:fpr(<4 x s16>) = COPY $d1 |
| %2:fpr(<4 x s16>) = G_ADD %0, %1 |
| $d0 = COPY %2(<4 x s16>) |
| RET_ReallyLR implicit $d0 |
| ... |
| --- |
| name: or_v4i16 |
| legalized: true |
| regBankSelected: true |
| tracksRegLiveness: true |
| body: | |
| bb.1: |
| liveins: $d0, $d1 |
| |
| ; CHECK-LABEL: name: or_v4i16 |
| ; CHECK: liveins: $d0, $d1 |
| ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY $d0 |
| ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1 |
| ; CHECK: [[ORRv8i8_:%[0-9]+]]:fpr64 = ORRv8i8 [[COPY]], [[COPY1]] |
| ; CHECK: $d0 = COPY [[ORRv8i8_]] |
| ; CHECK: RET_ReallyLR implicit $d0 |
| %0:fpr(<4 x s16>) = COPY $d0 |
| %1:fpr(<4 x s16>) = COPY $d1 |
| %2:fpr(<4 x s16>) = G_OR %0, %1 |
| $d0 = COPY %2(<4 x s16>) |
| RET_ReallyLR implicit $d0 |
| ... |
| --- |
| name: xor_v4i16 |
| legalized: true |
| regBankSelected: true |
| tracksRegLiveness: true |
| body: | |
| bb.1: |
| liveins: $d0, $d1 |
| |
| ; CHECK-LABEL: name: xor_v4i16 |
| ; CHECK: liveins: $d0, $d1 |
| ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY $d0 |
| ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1 |
| ; CHECK: [[EORv8i8_:%[0-9]+]]:fpr64 = EORv8i8 [[COPY]], [[COPY1]] |
| ; CHECK: $d0 = COPY [[EORv8i8_]] |
| ; CHECK: RET_ReallyLR implicit $d0 |
| %0:fpr(<4 x s16>) = COPY $d0 |
| %1:fpr(<4 x s16>) = COPY $d1 |
| %2:fpr(<4 x s16>) = G_XOR %0, %1 |
| $d0 = COPY %2(<4 x s16>) |
| RET_ReallyLR implicit $d0 |
| ... |
| --- |
| name: mul_v4i16 |
| legalized: true |
| regBankSelected: true |
| tracksRegLiveness: true |
| body: | |
| bb.1: |
| liveins: $d0, $d1 |
| |
| ; CHECK-LABEL: name: mul_v4i16 |
| ; CHECK: liveins: $d0, $d1 |
| ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY $d0 |
| ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1 |
| ; CHECK: [[MULv4i16_:%[0-9]+]]:fpr64 = MULv4i16 [[COPY]], [[COPY1]] |
| ; CHECK: $d0 = COPY [[MULv4i16_]] |
| ; CHECK: RET_ReallyLR implicit $d0 |
| %0:fpr(<4 x s16>) = COPY $d0 |
| %1:fpr(<4 x s16>) = COPY $d1 |
| %2:fpr(<4 x s16>) = G_MUL %0, %1 |
| $d0 = COPY %2(<4 x s16>) |
| RET_ReallyLR implicit $d0 |
| ... |