| # RUN: llc -march=hexagon -mcpu=hexagonv68 -mattr=+hvxv68,+hvx-length128b \ |
| # RUN: -run-pass hexagon-qfp-optimizer -disable-qfp-opt-mul=false %s -o - | FileCheck %s --check-prefix=MUL-ENABLED |
| # RUN: llc -march=hexagon -mcpu=hexagonv68 -mattr=+hvxv68,+hvx-length128b \ |
| # RUN: -run-pass hexagon-qfp-optimizer %s -o - | FileCheck %s --check-prefix=DEFAULT |
| # MUL-ENABLED-LABEL: name: qfpAdd32 |
| # MUL-ENABLED: V6_vconv_sf_qf32 |
| # MUL-ENABLED-NEXT: V6_vadd_qf32_mix |
| # MUL-ENABLED-NEXT: V6_vconv_sf_qf32 |
| # MUL-ENABLED-NEXT: V6_vS32Ub_ai |
| # MUL-ENABLED-NEXT: V6_vadd_qf32 |
| # DEFAULT-LABEL: name: qfpAdd32 |
| # DEFAULT: V6_vconv_sf_qf32 |
| # DEFAULT-NEXT: V6_vadd_qf32_mix |
| # DEFAULT-NEXT: V6_vconv_sf_qf32 |
| # DEFAULT-NEXT: V6_vS32Ub_ai |
| # DEFAULT-NEXT: V6_vadd_qf32 |
| --- |
| name: qfpAdd32 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $r0, $r1, $r2, $r3 |
| %0:intregs = COPY $r0 |
| %1:intregs = COPY $r1 |
| %2:intregs = COPY $r2 |
| %3:intregs = COPY $r3 |
| %4:hvxvr = V6_vL32Ub_ai %0:intregs, 0 |
| %5:hvxvr = V6_vL32Ub_ai %1:intregs, 0 |
| %6:hvxvr = V6_vadd_sf %4:hvxvr, %5:hvxvr |
| %7:hvxvr = V6_vconv_sf_qf32 %6:hvxvr |
| %8:hvxvr = V6_vadd_sf %5:hvxvr, %7:hvxvr |
| %9:hvxvr = V6_vconv_sf_qf32 %8:hvxvr |
| V6_vS32Ub_ai %2:intregs, 0, %9:hvxvr |
| %10:hvxvr = V6_vadd_sf %7:hvxvr, %9:hvxvr |
| %11:hvxvr = V6_vconv_sf_qf32 %10:hvxvr |
| V6_vS32Ub_ai %3:intregs, 0, %11:hvxvr |
| ... |
| # MUL-ENABLED-LABEL: name: qfpAdd16 |
| # MUL-ENABLED: V6_vconv_hf_qf16 |
| # MUL-ENABLED-NEXT: V6_vadd_qf16_mix |
| # MUL-ENABLED-NEXT: V6_vconv_hf_qf16 |
| # MUL-ENABLED-NEXT: V6_vS32Ub_ai |
| # MUL-ENABLED-NEXT: V6_vadd_qf16 |
| # DEFAULT-LABEL: name: qfpAdd16 |
| # DEFAULT: V6_vconv_hf_qf16 |
| # DEFAULT-NEXT: V6_vadd_qf16_mix |
| # DEFAULT-NEXT: V6_vconv_hf_qf16 |
| # DEFAULT-NEXT: V6_vS32Ub_ai |
| # DEFAULT-NEXT: V6_vadd_qf16 |
| --- |
| name: qfpAdd16 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $r0, $r1, $r2, $r3 |
| %0:intregs = COPY $r0 |
| %1:intregs = COPY $r1 |
| %2:intregs = COPY $r2 |
| %3:intregs = COPY $r3 |
| %4:hvxvr = V6_vL32Ub_ai %0:intregs, 0 |
| %5:hvxvr = V6_vL32Ub_ai %1:intregs, 0 |
| %6:hvxvr = V6_vadd_hf %4:hvxvr, %5:hvxvr |
| %7:hvxvr = V6_vconv_hf_qf16 %6:hvxvr |
| %8:hvxvr = V6_vadd_hf %5:hvxvr, %7:hvxvr |
| %9:hvxvr = V6_vconv_hf_qf16 %8:hvxvr |
| V6_vS32Ub_ai %2:intregs, 0, %9:hvxvr |
| %10:hvxvr = V6_vadd_hf %7:hvxvr, %9:hvxvr |
| %11:hvxvr = V6_vconv_hf_qf16 %10:hvxvr |
| V6_vS32Ub_ai %3:intregs, 0, %11:hvxvr |
| ... |
| # MUL-ENABLED-LABEL: name: qfpSub32 |
| # MUL-ENABLED: V6_vconv_sf_qf32 |
| # MUL-ENABLED-NEXT: V6_vsub_qf32_mix |
| # MUL-ENABLED-NEXT: V6_vconv_sf_qf32 |
| # MUL-ENABLED-NEXT: V6_vS32Ub_ai |
| # MUL-ENABLED-NEXT: V6_vsub_qf32 |
| # DEFAULT-LABEL: name: qfpSub32 |
| # DEFAULT: V6_vconv_sf_qf32 |
| # DEFAULT-NEXT: V6_vsub_qf32_mix |
| # DEFAULT-NEXT: V6_vconv_sf_qf32 |
| # DEFAULT-NEXT: V6_vS32Ub_ai |
| # DEFAULT-NEXT: V6_vsub_qf32 |
| --- |
| name: qfpSub32 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $r0, $r1, $r2, $r3 |
| %0:intregs = COPY $r0 |
| %1:intregs = COPY $r1 |
| %2:intregs = COPY $r2 |
| %3:intregs = COPY $r3 |
| %4:hvxvr = V6_vL32Ub_ai %0:intregs, 0 |
| %5:hvxvr = V6_vL32Ub_ai %1:intregs, 0 |
| %6:hvxvr = V6_vsub_sf %4:hvxvr, %5:hvxvr |
| %7:hvxvr = V6_vconv_sf_qf32 %6:hvxvr |
| %8:hvxvr = V6_vsub_sf %7:hvxvr, %5:hvxvr |
| %9:hvxvr = V6_vconv_sf_qf32 %8:hvxvr |
| V6_vS32Ub_ai %2:intregs, 0, %9:hvxvr |
| %10:hvxvr = V6_vsub_sf %7:hvxvr, %9:hvxvr |
| %11:hvxvr = V6_vconv_sf_qf32 %10:hvxvr |
| V6_vS32Ub_ai %3:intregs, 0, %11:hvxvr |
| ... |
| # MUL-ENABLED-LABEL: name: qfpSub16 |
| # MUL-ENABLED: V6_vconv_hf_qf16 |
| # MUL-ENABLED-NEXT: V6_vsub_qf16_mix |
| # MUL-ENABLED-NEXT: V6_vconv_hf_qf16 |
| # MUL-ENABLED-NEXT: V6_vS32Ub_ai |
| # MUL-ENABLED-NEXT: V6_vsub_qf16 |
| # DEFAULT-LABEL: name: qfpSub16 |
| # DEFAULT: V6_vconv_hf_qf16 |
| # DEFAULT-NEXT: V6_vsub_qf16_mix |
| # DEFAULT-NEXT: V6_vconv_hf_qf16 |
| # DEFAULT-NEXT: V6_vS32Ub_ai |
| # DEFAULT-NEXT: V6_vsub_qf16 |
| --- |
| name: qfpSub16 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $r0, $r1, $r2, $r3 |
| %0:intregs = COPY $r0 |
| %1:intregs = COPY $r1 |
| %2:intregs = COPY $r2 |
| %3:intregs = COPY $r3 |
| %4:hvxvr = V6_vL32Ub_ai %0:intregs, 0 |
| %5:hvxvr = V6_vL32Ub_ai %1:intregs, 0 |
| %6:hvxvr = V6_vsub_hf %4:hvxvr, %5:hvxvr |
| %7:hvxvr = V6_vconv_hf_qf16 %6:hvxvr |
| %8:hvxvr = V6_vsub_hf %7:hvxvr, %5:hvxvr |
| %9:hvxvr = V6_vconv_hf_qf16 %8:hvxvr |
| V6_vS32Ub_ai %2:intregs, 0, %9:hvxvr |
| %10:hvxvr = V6_vsub_hf %7:hvxvr, %9:hvxvr |
| %11:hvxvr = V6_vconv_hf_qf16 %10:hvxvr |
| V6_vS32Ub_ai %3:intregs, 0, %11:hvxvr |
| ... |
| # MUL-ENABLED-LABEL: name: qfpMul32 |
| # MUL-ENABLED: V6_vmpy_qf32_sf |
| # MUL-ENABLED-NEXT: V6_vconv_sf_qf32 |
| # MUL-ENABLED-NEXT: V6_vmpy_qf32_sf |
| # MUL-ENABLED-NEXT: V6_vconv_sf_qf32 |
| # MUL-ENABLED-NEXT: V6_vmpy_qf32 |
| # MUL-ENABLED-NEXT: V6_vS32Ub_ai |
| # DEFAULT-LABEL: name: qfpMul32 |
| # DEFAULT: V6_vmpy_qf32_sf |
| # DEFAULT-NEXT: V6_vconv_sf_qf32 |
| # DEFAULT-NEXT: V6_vmpy_qf32_sf |
| # DEFAULT-NEXT: V6_vconv_sf_qf32 |
| # DEFAULT-NEXT: V6_vmpy_qf32_sf |
| # DEFAULT-NEXT: V6_vS32Ub_ai |
| --- |
| name: qfpMul32 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $r0, $r1, $r2, $r3 |
| %0:intregs = COPY $r0 |
| %1:intregs = COPY $r1 |
| %2:intregs = COPY $r2 |
| %3:intregs = COPY $r3 |
| %4:hvxvr = V6_vL32Ub_ai %0:intregs, 0 |
| %5:hvxvr = V6_vL32Ub_ai %1:intregs, 0 |
| %6:hvxvr = V6_vL32Ub_ai %2:intregs, 0 |
| %7:hvxvr = V6_vmpy_qf32_sf %4:hvxvr, %5:hvxvr |
| %8:hvxvr = V6_vconv_sf_qf32 %7:hvxvr |
| %9:hvxvr = V6_vmpy_qf32_sf %5:hvxvr, %6:hvxvr |
| %10:hvxvr = V6_vconv_sf_qf32 %9:hvxvr |
| %11:hvxvr = V6_vmpy_qf32_sf %8:hvxvr, %10:hvxvr |
| V6_vS32Ub_ai %3:intregs, 0, %11:hvxvr |
| ... |
| # MUL-ENABLED-LABEL: name: qfpMul16 |
| # MUL-ENABLED: V6_vconv_hf_qf16 |
| # MUL-ENABLED-NEXT: V6_vmpy_qf16_mix_hf |
| # MUL-ENABLED-NEXT: V6_vconv_hf_qf16 |
| # MUL-ENABLED-NEXT: V6_vS32Ub_ai |
| # MUL-ENABLED-NEXT: V6_vmpy_qf16 |
| # DEFAULT-LABEL: name: qfpMul16 |
| # DEFAULT: V6_vconv_hf_qf16 |
| # DEFAULT-NEXT: V6_vmpy_qf16_hf |
| # DEFAULT-NEXT: V6_vconv_hf_qf16 |
| # DEFAULT-NEXT: V6_vS32Ub_ai |
| # DEFAULT-NEXT: V6_vmpy_qf16_hf |
| --- |
| name: qfpMul16 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $r0, $r1, $r2, $r3 |
| %0:intregs = COPY $r0 |
| %1:intregs = COPY $r1 |
| %2:intregs = COPY $r2 |
| %3:intregs = COPY $r3 |
| %4:hvxvr = V6_vL32Ub_ai %0:intregs, 0 |
| %5:hvxvr = V6_vL32Ub_ai %1:intregs, 0 |
| %6:hvxvr = V6_vmpy_qf16_hf %4:hvxvr, %5:hvxvr |
| %7:hvxvr = V6_vconv_hf_qf16 %6:hvxvr |
| %8:hvxvr = V6_vmpy_qf16_hf %5:hvxvr, %7:hvxvr |
| %9:hvxvr = V6_vconv_hf_qf16 %8:hvxvr |
| V6_vS32Ub_ai %2:intregs, 0, %9:hvxvr |
| %10:hvxvr = V6_vmpy_qf16_hf %7:hvxvr, %9:hvxvr |
| %11:hvxvr = V6_vconv_hf_qf16 %10:hvxvr |
| V6_vS32Ub_ai %3:intregs, 0, %11:hvxvr |