[llvm] [ARM] Improve fp16-promote.ll test (NFC) (PR #156341)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 1 08:22:08 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-arm
Author: None (beetrees)
<details>
<summary>Changes</summary>
Update the test to use `utils/update_llc_test_checks.py`, and add a check for `fneg`.
---
Patch is 99.74 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/156341.diff
1 Files Affected:
- (modified) llvm/test/CodeGen/ARM/fp16-promote.ll (+1941-450)
``````````diff
diff --git a/llvm/test/CodeGen/ARM/fp16-promote.ll b/llvm/test/CodeGen/ARM/fp16-promote.ll
index 1bd01508808c8..800ee87b95ca8 100644
--- a/llvm/test/CodeGen/ARM/fp16-promote.ll
+++ b/llvm/test/CodeGen/ARM/fp16-promote.ll
@@ -1,20 +1,59 @@
-; RUN: llc -asm-verbose=false < %s -mattr=+vfp3,+fp16 | FileCheck -allow-deprecated-dag-overlap %s -check-prefix=CHECK-FP16 --check-prefix=CHECK-VFP -check-prefix=CHECK-ALL
-; RUN: llc -asm-verbose=false < %s | FileCheck -allow-deprecated-dag-overlap %s -check-prefix=CHECK-LIBCALL --check-prefix=CHECK-VFP -check-prefix=CHECK-ALL --check-prefix=CHECK-LIBCALL-VFP
-; RUN: llc -asm-verbose=false < %s -mattr=-fpregs | FileCheck -allow-deprecated-dag-overlap %s --check-prefix=CHECK-LIBCALL -check-prefix=CHECK-NOVFP -check-prefix=CHECK-ALL
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -asm-verbose=false < %s -mattr=+vfp3,+fp16 | FileCheck %s --check-prefixes=CHECK-ALL,CHECK-VFP,CHECK-FP16
+; RUN: llc -asm-verbose=false < %s | FileCheck %s --check-prefixes=CHECK-ALL,CHECK-LIBCALL,CHECK-VFP,CHECK-LIBCALL-VFP
+; RUN: llc -asm-verbose=false < %s -mattr=-fpregs | FileCheck %s --check-prefixes=CHECK-ALL,CHECK-LIBCALL,CHECK-NOVFP
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-n32"
target triple = "armv7---eabihf"
define void @test_fadd(ptr %p, ptr %q) #0 {
-; CHECK-ALL-LABEL: test_fadd:
-; CHECK-FP16: vcvtb.f32.f16
-; CHECK-FP16: vcvtb.f32.f16
-; CHECK-LIBCALL: bl __aeabi_h2f
-; CHECK-LIBCALL: bl __aeabi_h2f
-; CHECK-VFP: vadd.f32
-; CHECK-NOVFP: bl __aeabi_fadd
-; CHECK-FP16: vcvtb.f16.f32
-; CHECK-LIBCALL: bl __aeabi_f2h
+; CHECK-FP16-LABEL: test_fadd:
+; CHECK-FP16: ldrh r2, [r0]
+; CHECK-FP16-NEXT: ldrh r1, [r1]
+; CHECK-FP16-NEXT: vmov s0, r2
+; CHECK-FP16-NEXT: vmov s2, r1
+; CHECK-FP16-NEXT: vcvtb.f32.f16 s0, s0
+; CHECK-FP16-NEXT: vcvtb.f32.f16 s2, s2
+; CHECK-FP16-NEXT: vadd.f32 s0, s0, s2
+; CHECK-FP16-NEXT: vcvtb.f16.f32 s0, s0
+; CHECK-FP16-NEXT: vmov r1, s0
+; CHECK-FP16-NEXT: strh r1, [r0]
+; CHECK-FP16-NEXT: bx lr
+;
+; CHECK-LIBCALL-VFP-LABEL: test_fadd:
+; CHECK-LIBCALL-VFP: .save {r4, lr}
+; CHECK-LIBCALL-VFP-NEXT: push {r4, lr}
+; CHECK-LIBCALL-VFP-NEXT: .vsave {d8}
+; CHECK-LIBCALL-VFP-NEXT: vpush {d8}
+; CHECK-LIBCALL-VFP-NEXT: mov r4, r0
+; CHECK-LIBCALL-VFP-NEXT: ldrh r0, [r1]
+; CHECK-LIBCALL-VFP-NEXT: bl __aeabi_h2f
+; CHECK-LIBCALL-VFP-NEXT: ldrh r1, [r4]
+; CHECK-LIBCALL-VFP-NEXT: vmov s16, r0
+; CHECK-LIBCALL-VFP-NEXT: mov r0, r1
+; CHECK-LIBCALL-VFP-NEXT: bl __aeabi_h2f
+; CHECK-LIBCALL-VFP-NEXT: vmov s0, r0
+; CHECK-LIBCALL-VFP-NEXT: vadd.f32 s0, s0, s16
+; CHECK-LIBCALL-VFP-NEXT: vmov r0, s0
+; CHECK-LIBCALL-VFP-NEXT: bl __aeabi_f2h
+; CHECK-LIBCALL-VFP-NEXT: strh r0, [r4]
+; CHECK-LIBCALL-VFP-NEXT: vpop {d8}
+; CHECK-LIBCALL-VFP-NEXT: pop {r4, pc}
+;
+; CHECK-NOVFP-LABEL: test_fadd:
+; CHECK-NOVFP: .save {r4, r5, r11, lr}
+; CHECK-NOVFP-NEXT: push {r4, r5, r11, lr}
+; CHECK-NOVFP-NEXT: mov r4, r0
+; CHECK-NOVFP-NEXT: ldrh r0, [r1]
+; CHECK-NOVFP-NEXT: bl __aeabi_h2f
+; CHECK-NOVFP-NEXT: mov r5, r0
+; CHECK-NOVFP-NEXT: ldrh r0, [r4]
+; CHECK-NOVFP-NEXT: bl __aeabi_h2f
+; CHECK-NOVFP-NEXT: mov r1, r5
+; CHECK-NOVFP-NEXT: bl __aeabi_fadd
+; CHECK-NOVFP-NEXT: bl __aeabi_f2h
+; CHECK-NOVFP-NEXT: strh r0, [r4]
+; CHECK-NOVFP-NEXT: pop {r4, r5, r11, pc}
%a = load half, ptr %p, align 2
%b = load half, ptr %q, align 2
%r = fadd half %a, %b
@@ -23,15 +62,53 @@ define void @test_fadd(ptr %p, ptr %q) #0 {
}
define void @test_fsub(ptr %p, ptr %q) #0 {
-; CHECK-ALL-LABEL: test_fsub:
-; CHECK-FP16: vcvtb.f32.f16
-; CHECK-FP16: vcvtb.f32.f16
-; CHECK-LIBCALL: bl __aeabi_h2f
-; CHECK-LIBCALL: bl __aeabi_h2f
-; CHECK-VFP: vsub.f32
-; CHECK-NOVFP: bl __aeabi_fsub
-; CHECK-FP16: vcvtb.f16.f32
-; CHECK-LIBCALL: bl __aeabi_f2h
+; CHECK-FP16-LABEL: test_fsub:
+; CHECK-FP16: ldrh r2, [r0]
+; CHECK-FP16-NEXT: ldrh r1, [r1]
+; CHECK-FP16-NEXT: vmov s0, r2
+; CHECK-FP16-NEXT: vmov s2, r1
+; CHECK-FP16-NEXT: vcvtb.f32.f16 s0, s0
+; CHECK-FP16-NEXT: vcvtb.f32.f16 s2, s2
+; CHECK-FP16-NEXT: vsub.f32 s0, s0, s2
+; CHECK-FP16-NEXT: vcvtb.f16.f32 s0, s0
+; CHECK-FP16-NEXT: vmov r1, s0
+; CHECK-FP16-NEXT: strh r1, [r0]
+; CHECK-FP16-NEXT: bx lr
+;
+; CHECK-LIBCALL-VFP-LABEL: test_fsub:
+; CHECK-LIBCALL-VFP: .save {r4, lr}
+; CHECK-LIBCALL-VFP-NEXT: push {r4, lr}
+; CHECK-LIBCALL-VFP-NEXT: .vsave {d8}
+; CHECK-LIBCALL-VFP-NEXT: vpush {d8}
+; CHECK-LIBCALL-VFP-NEXT: mov r4, r0
+; CHECK-LIBCALL-VFP-NEXT: ldrh r0, [r1]
+; CHECK-LIBCALL-VFP-NEXT: bl __aeabi_h2f
+; CHECK-LIBCALL-VFP-NEXT: ldrh r1, [r4]
+; CHECK-LIBCALL-VFP-NEXT: vmov s16, r0
+; CHECK-LIBCALL-VFP-NEXT: mov r0, r1
+; CHECK-LIBCALL-VFP-NEXT: bl __aeabi_h2f
+; CHECK-LIBCALL-VFP-NEXT: vmov s0, r0
+; CHECK-LIBCALL-VFP-NEXT: vsub.f32 s0, s0, s16
+; CHECK-LIBCALL-VFP-NEXT: vmov r0, s0
+; CHECK-LIBCALL-VFP-NEXT: bl __aeabi_f2h
+; CHECK-LIBCALL-VFP-NEXT: strh r0, [r4]
+; CHECK-LIBCALL-VFP-NEXT: vpop {d8}
+; CHECK-LIBCALL-VFP-NEXT: pop {r4, pc}
+;
+; CHECK-NOVFP-LABEL: test_fsub:
+; CHECK-NOVFP: .save {r4, r5, r11, lr}
+; CHECK-NOVFP-NEXT: push {r4, r5, r11, lr}
+; CHECK-NOVFP-NEXT: mov r4, r0
+; CHECK-NOVFP-NEXT: ldrh r0, [r1]
+; CHECK-NOVFP-NEXT: bl __aeabi_h2f
+; CHECK-NOVFP-NEXT: mov r5, r0
+; CHECK-NOVFP-NEXT: ldrh r0, [r4]
+; CHECK-NOVFP-NEXT: bl __aeabi_h2f
+; CHECK-NOVFP-NEXT: mov r1, r5
+; CHECK-NOVFP-NEXT: bl __aeabi_fsub
+; CHECK-NOVFP-NEXT: bl __aeabi_f2h
+; CHECK-NOVFP-NEXT: strh r0, [r4]
+; CHECK-NOVFP-NEXT: pop {r4, r5, r11, pc}
%a = load half, ptr %p, align 2
%b = load half, ptr %q, align 2
%r = fsub half %a, %b
@@ -40,15 +117,53 @@ define void @test_fsub(ptr %p, ptr %q) #0 {
}
define void @test_fmul(ptr %p, ptr %q) #0 {
-; CHECK-ALL-LABEL: test_fmul:
-; CHECK-FP16: vcvtb.f32.f16
-; CHECK-FP16: vcvtb.f32.f16
-; CHECK-LIBCALL: bl __aeabi_h2f
-; CHECK-LIBCALL: bl __aeabi_h2f
-; CHECK-VFP: vmul.f32
-; CHECK-NOVFP: bl __aeabi_fmul
-; CHECK-FP16: vcvtb.f16.f32
-; CHECK-LIBCALL: bl __aeabi_f2h
+; CHECK-FP16-LABEL: test_fmul:
+; CHECK-FP16: ldrh r2, [r0]
+; CHECK-FP16-NEXT: ldrh r1, [r1]
+; CHECK-FP16-NEXT: vmov s0, r2
+; CHECK-FP16-NEXT: vmov s2, r1
+; CHECK-FP16-NEXT: vcvtb.f32.f16 s0, s0
+; CHECK-FP16-NEXT: vcvtb.f32.f16 s2, s2
+; CHECK-FP16-NEXT: vmul.f32 s0, s0, s2
+; CHECK-FP16-NEXT: vcvtb.f16.f32 s0, s0
+; CHECK-FP16-NEXT: vmov r1, s0
+; CHECK-FP16-NEXT: strh r1, [r0]
+; CHECK-FP16-NEXT: bx lr
+;
+; CHECK-LIBCALL-VFP-LABEL: test_fmul:
+; CHECK-LIBCALL-VFP: .save {r4, lr}
+; CHECK-LIBCALL-VFP-NEXT: push {r4, lr}
+; CHECK-LIBCALL-VFP-NEXT: .vsave {d8}
+; CHECK-LIBCALL-VFP-NEXT: vpush {d8}
+; CHECK-LIBCALL-VFP-NEXT: mov r4, r0
+; CHECK-LIBCALL-VFP-NEXT: ldrh r0, [r1]
+; CHECK-LIBCALL-VFP-NEXT: bl __aeabi_h2f
+; CHECK-LIBCALL-VFP-NEXT: ldrh r1, [r4]
+; CHECK-LIBCALL-VFP-NEXT: vmov s16, r0
+; CHECK-LIBCALL-VFP-NEXT: mov r0, r1
+; CHECK-LIBCALL-VFP-NEXT: bl __aeabi_h2f
+; CHECK-LIBCALL-VFP-NEXT: vmov s0, r0
+; CHECK-LIBCALL-VFP-NEXT: vmul.f32 s0, s0, s16
+; CHECK-LIBCALL-VFP-NEXT: vmov r0, s0
+; CHECK-LIBCALL-VFP-NEXT: bl __aeabi_f2h
+; CHECK-LIBCALL-VFP-NEXT: strh r0, [r4]
+; CHECK-LIBCALL-VFP-NEXT: vpop {d8}
+; CHECK-LIBCALL-VFP-NEXT: pop {r4, pc}
+;
+; CHECK-NOVFP-LABEL: test_fmul:
+; CHECK-NOVFP: .save {r4, r5, r11, lr}
+; CHECK-NOVFP-NEXT: push {r4, r5, r11, lr}
+; CHECK-NOVFP-NEXT: mov r4, r0
+; CHECK-NOVFP-NEXT: ldrh r0, [r1]
+; CHECK-NOVFP-NEXT: bl __aeabi_h2f
+; CHECK-NOVFP-NEXT: mov r5, r0
+; CHECK-NOVFP-NEXT: ldrh r0, [r4]
+; CHECK-NOVFP-NEXT: bl __aeabi_h2f
+; CHECK-NOVFP-NEXT: mov r1, r5
+; CHECK-NOVFP-NEXT: bl __aeabi_fmul
+; CHECK-NOVFP-NEXT: bl __aeabi_f2h
+; CHECK-NOVFP-NEXT: strh r0, [r4]
+; CHECK-NOVFP-NEXT: pop {r4, r5, r11, pc}
%a = load half, ptr %p, align 2
%b = load half, ptr %q, align 2
%r = fmul half %a, %b
@@ -57,15 +172,53 @@ define void @test_fmul(ptr %p, ptr %q) #0 {
}
define void @test_fdiv(ptr %p, ptr %q) #0 {
-; CHECK-ALL-LABEL: test_fdiv:
-; CHECK-FP16: vcvtb.f32.f16
-; CHECK-FP16: vcvtb.f32.f16
-; CHECK-LIBCALL: bl __aeabi_h2f
-; CHECK-LIBCALL: bl __aeabi_h2f
-; CHECK-VFP: vdiv.f32
-; CHECK-NOVFP: bl __aeabi_fdiv
-; CHECK-FP16: vcvtb.f16.f32
-; CHECK-LIBCALL: bl __aeabi_f2h
+; CHECK-FP16-LABEL: test_fdiv:
+; CHECK-FP16: ldrh r2, [r0]
+; CHECK-FP16-NEXT: ldrh r1, [r1]
+; CHECK-FP16-NEXT: vmov s0, r2
+; CHECK-FP16-NEXT: vmov s2, r1
+; CHECK-FP16-NEXT: vcvtb.f32.f16 s0, s0
+; CHECK-FP16-NEXT: vcvtb.f32.f16 s2, s2
+; CHECK-FP16-NEXT: vdiv.f32 s0, s0, s2
+; CHECK-FP16-NEXT: vcvtb.f16.f32 s0, s0
+; CHECK-FP16-NEXT: vmov r1, s0
+; CHECK-FP16-NEXT: strh r1, [r0]
+; CHECK-FP16-NEXT: bx lr
+;
+; CHECK-LIBCALL-VFP-LABEL: test_fdiv:
+; CHECK-LIBCALL-VFP: .save {r4, lr}
+; CHECK-LIBCALL-VFP-NEXT: push {r4, lr}
+; CHECK-LIBCALL-VFP-NEXT: .vsave {d8}
+; CHECK-LIBCALL-VFP-NEXT: vpush {d8}
+; CHECK-LIBCALL-VFP-NEXT: mov r4, r0
+; CHECK-LIBCALL-VFP-NEXT: ldrh r0, [r1]
+; CHECK-LIBCALL-VFP-NEXT: bl __aeabi_h2f
+; CHECK-LIBCALL-VFP-NEXT: ldrh r1, [r4]
+; CHECK-LIBCALL-VFP-NEXT: vmov s16, r0
+; CHECK-LIBCALL-VFP-NEXT: mov r0, r1
+; CHECK-LIBCALL-VFP-NEXT: bl __aeabi_h2f
+; CHECK-LIBCALL-VFP-NEXT: vmov s0, r0
+; CHECK-LIBCALL-VFP-NEXT: vdiv.f32 s0, s0, s16
+; CHECK-LIBCALL-VFP-NEXT: vmov r0, s0
+; CHECK-LIBCALL-VFP-NEXT: bl __aeabi_f2h
+; CHECK-LIBCALL-VFP-NEXT: strh r0, [r4]
+; CHECK-LIBCALL-VFP-NEXT: vpop {d8}
+; CHECK-LIBCALL-VFP-NEXT: pop {r4, pc}
+;
+; CHECK-NOVFP-LABEL: test_fdiv:
+; CHECK-NOVFP: .save {r4, r5, r11, lr}
+; CHECK-NOVFP-NEXT: push {r4, r5, r11, lr}
+; CHECK-NOVFP-NEXT: mov r4, r0
+; CHECK-NOVFP-NEXT: ldrh r0, [r1]
+; CHECK-NOVFP-NEXT: bl __aeabi_h2f
+; CHECK-NOVFP-NEXT: mov r5, r0
+; CHECK-NOVFP-NEXT: ldrh r0, [r4]
+; CHECK-NOVFP-NEXT: bl __aeabi_h2f
+; CHECK-NOVFP-NEXT: mov r1, r5
+; CHECK-NOVFP-NEXT: bl __aeabi_fdiv
+; CHECK-NOVFP-NEXT: bl __aeabi_f2h
+; CHECK-NOVFP-NEXT: strh r0, [r4]
+; CHECK-NOVFP-NEXT: pop {r4, r5, r11, pc}
%a = load half, ptr %p, align 2
%b = load half, ptr %q, align 2
%r = fdiv half %a, %b
@@ -74,14 +227,53 @@ define void @test_fdiv(ptr %p, ptr %q) #0 {
}
define void @test_frem(ptr %p, ptr %q) #0 {
-; CHECK-ALL-LABEL: test_frem:
-; CHECK-FP16: vcvtb.f32.f16
-; CHECK-FP16: vcvtb.f32.f16
-; CHECK-LIBCALL: bl __aeabi_h2f
-; CHECK-LIBCALL: bl __aeabi_h2f
-; CHECK-LIBCALL: bl fmodf
-; CHECK-FP16: vcvtb.f16.f32
-; CHECK-LIBCALL: bl __aeabi_f2h
+; CHECK-FP16-LABEL: test_frem:
+; CHECK-FP16: .save {r4, lr}
+; CHECK-FP16-NEXT: push {r4, lr}
+; CHECK-FP16-NEXT: mov r4, r0
+; CHECK-FP16-NEXT: ldrh r0, [r0]
+; CHECK-FP16-NEXT: ldrh r1, [r1]
+; CHECK-FP16-NEXT: vmov s0, r0
+; CHECK-FP16-NEXT: vmov s2, r1
+; CHECK-FP16-NEXT: vcvtb.f32.f16 s0, s0
+; CHECK-FP16-NEXT: vcvtb.f32.f16 s1, s2
+; CHECK-FP16-NEXT: bl fmodf
+; CHECK-FP16-NEXT: vcvtb.f16.f32 s0, s0
+; CHECK-FP16-NEXT: vmov r0, s0
+; CHECK-FP16-NEXT: strh r0, [r4]
+; CHECK-FP16-NEXT: pop {r4, pc}
+;
+; CHECK-LIBCALL-VFP-LABEL: test_frem:
+; CHECK-LIBCALL-VFP: .save {r4, r5, r11, lr}
+; CHECK-LIBCALL-VFP-NEXT: push {r4, r5, r11, lr}
+; CHECK-LIBCALL-VFP-NEXT: mov r4, r0
+; CHECK-LIBCALL-VFP-NEXT: ldrh r0, [r1]
+; CHECK-LIBCALL-VFP-NEXT: bl __aeabi_h2f
+; CHECK-LIBCALL-VFP-NEXT: mov r5, r0
+; CHECK-LIBCALL-VFP-NEXT: ldrh r0, [r4]
+; CHECK-LIBCALL-VFP-NEXT: bl __aeabi_h2f
+; CHECK-LIBCALL-VFP-NEXT: vmov s0, r0
+; CHECK-LIBCALL-VFP-NEXT: vmov s1, r5
+; CHECK-LIBCALL-VFP-NEXT: bl fmodf
+; CHECK-LIBCALL-VFP-NEXT: vmov r0, s0
+; CHECK-LIBCALL-VFP-NEXT: bl __aeabi_f2h
+; CHECK-LIBCALL-VFP-NEXT: strh r0, [r4]
+; CHECK-LIBCALL-VFP-NEXT: pop {r4, r5, r11, pc}
+;
+; CHECK-NOVFP-LABEL: test_frem:
+; CHECK-NOVFP: .save {r4, r5, r11, lr}
+; CHECK-NOVFP-NEXT: push {r4, r5, r11, lr}
+; CHECK-NOVFP-NEXT: mov r4, r0
+; CHECK-NOVFP-NEXT: ldrh r0, [r1]
+; CHECK-NOVFP-NEXT: bl __aeabi_h2f
+; CHECK-NOVFP-NEXT: mov r5, r0
+; CHECK-NOVFP-NEXT: ldrh r0, [r4]
+; CHECK-NOVFP-NEXT: bl __aeabi_h2f
+; CHECK-NOVFP-NEXT: mov r1, r5
+; CHECK-NOVFP-NEXT: bl fmodf
+; CHECK-NOVFP-NEXT: bl __aeabi_f2h
+; CHECK-NOVFP-NEXT: strh r0, [r4]
+; CHECK-NOVFP-NEXT: pop {r4, r5, r11, pc}
%a = load half, ptr %p, align 2
%b = load half, ptr %q, align 2
%r = frem half %a, %b
@@ -91,9 +283,9 @@ define void @test_frem(ptr %p, ptr %q) #0 {
define void @test_load_store(ptr %p, ptr %q) #0 {
; CHECK-ALL-LABEL: test_load_store:
-; CHECK-ALL-NEXT: .fnstart
-; CHECK-ALL: ldrh {{r[0-9]+}}, [{{r[0-9]+}}]
-; CHECK-ALL: strh {{r[0-9]+}}, [{{r[0-9]+}}]
+; CHECK-ALL: ldrh r0, [r0]
+; CHECK-ALL-NEXT: strh r0, [r1]
+; CHECK-ALL-NEXT: bx lr
%a = load half, ptr %p, align 2
store half %a, ptr %q
ret void
@@ -106,42 +298,48 @@ declare half @test_callee(half %a, half %b) #0
define half @test_call(half %a, half %b) #0 {
; CHECK-ALL-LABEL: test_call:
-; CHECK-ALL-NEXT: .fnstart
-; CHECK-ALL-NEXT: .save {r11, lr}
-; CHECK-ALL-NEXT: push {r11, lr}
-; CHECK-ALL-NEXT: bl test_callee
-; CHECK-ALL-NEXT: pop {r11, pc}
+; CHECK-ALL: .save {r11, lr}
+; CHECK-ALL-NEXT: push {r11, lr}
+; CHECK-ALL-NEXT: bl test_callee
+; CHECK-ALL-NEXT: pop {r11, pc}
%r = call half @test_callee(half %a, half %b)
ret half %r
}
define half @test_call_flipped(half %a, half %b) #0 {
-; CHECK-ALL-LABEL: test_call_flipped:
-; CHECK-ALL-NEXT: .fnstart
-; CHECK-ALL-NEXT: .save {r11, lr}
-; CHECK-ALL-NEXT: push {r11, lr}
-; CHECK-VFP-NEXT: vmov.f32 s2, s0
-; CHECK-VFP-NEXT: vmov.f32 s0, s1
-; CHECK-VFP-NEXT: vmov.f32 s1, s2
-; CHECK-NOVFP-NEXT: mov r2, r0
-; CHECK-NOVFP-NEXT: mov r0, r1
-; CHECK-NOVFP-NEXT: mov r1, r2
-; CHECK-ALL-NEXT: bl test_callee
-; CHECK-ALL-NEXT: pop {r11, pc}
+; CHECK-VFP-LABEL: test_call_flipped:
+; CHECK-VFP: .save {r11, lr}
+; CHECK-VFP-NEXT: push {r11, lr}
+; CHECK-VFP-NEXT: vmov.f32 s2, s0
+; CHECK-VFP-NEXT: vmov.f32 s0, s1
+; CHECK-VFP-NEXT: vmov.f32 s1, s2
+; CHECK-VFP-NEXT: bl test_callee
+; CHECK-VFP-NEXT: pop {r11, pc}
+;
+; CHECK-NOVFP-LABEL: test_call_flipped:
+; CHECK-NOVFP: .save {r11, lr}
+; CHECK-NOVFP-NEXT: push {r11, lr}
+; CHECK-NOVFP-NEXT: mov r2, r0
+; CHECK-NOVFP-NEXT: mov r0, r1
+; CHECK-NOVFP-NEXT: mov r1, r2
+; CHECK-NOVFP-NEXT: bl test_callee
+; CHECK-NOVFP-NEXT: pop {r11, pc}
%r = call half @test_callee(half %b, half %a)
ret half %r
}
define half @test_tailcall_flipped(half %a, half %b) #0 {
-; CHECK-ALL-LABEL: test_tailcall_flipped:
-; CHECK-ALL-NEXT: .fnstart
-; CHECK-VFP-NEXT: vmov.f32 s2, s0
-; CHECK-VFP-NEXT: vmov.f32 s0, s1
-; CHECK-VFP-NEXT: vmov.f32 s1, s2
-; CHECK-NOVFP-NEXT: mov r2, r0
-; CHECK-NOVFP-NEXT: mov r0, r1
-; CHECK-NOVFP-NEXT: mov r1, r2
-; CHECK-ALL-NEXT: b test_callee
+; CHECK-VFP-LABEL: test_tailcall_flipped:
+; CHECK-VFP: vmov.f32 s2, s0
+; CHECK-VFP-NEXT: vmov.f32 s0, s1
+; CHECK-VFP-NEXT: vmov.f32 s1, s2
+; CHECK-VFP-NEXT: b test_callee
+;
+; CHECK-NOVFP-LABEL: test_tailcall_flipped:
+; CHECK-NOVFP: mov r2, r0
+; CHECK-NOVFP-NEXT: mov r0, r1
+; CHECK-NOVFP-NEXT: mov r1, r2
+; CHECK-NOVFP-NEXT: b test_callee
%r = tail call half @test_callee(half %b, half %a)
ret half %r
}
@@ -150,10 +348,11 @@ define half @test_tailcall_flipped(half %a, half %b) #0 {
; No conversion is needed
define void @test_select(ptr %p, ptr %q, i1 zeroext %c) #0 {
; CHECK-ALL-LABEL: test_select:
-; CHECK-ALL: cmp {{r[0-9]+}}, #0
-; CHECK-ALL: movne {{r[0-9]+}}, {{r[0-9]+}}
-; CHECK-ALL: ldrh {{r[0-9]+}}, [{{r[0-9]+}}]
-; CHECK-ALL: strh {{r[0-9]+}}, [{{r[0-9]+}}]
+; CHECK-ALL: cmp r2, #0
+; CHECK-ALL-NEXT: movne r1, r0
+; CHECK-ALL-NEXT: ldrh r1, [r1]
+; CHECK-ALL-NEXT: strh r1, [r0]
+; CHECK-ALL-NEXT: bx lr
%a = load half, ptr %p, align 2
%b = load half, ptr %q, align 2
%r = select i1 %c, half %a, half %b
@@ -164,17 +363,53 @@ define void @test_select(ptr %p, ptr %q, i1 zeroext %c) #0 {
; Test only two variants of fcmp. These get translated to f32 vcmp
; instructions anyway.
define i1 @test_fcmp_une(ptr %p, ptr %q) #0 {
-; CHECK-ALL-LABEL: test_fcmp_une:
-; CHECK-FP16: vcvtb.f32.f16
-; CHECK-FP16: vcvtb.f32.f16
-; CHECK-LIBCALL: bl __aeabi_h2f
-; CHECK-LIBCALL: bl __aeabi_h2f
-; CHECK-VFP: vcmp.f32
-; CHECK-NOVFP: bl __aeabi_fcmpeq
-; CHECK-VFP-NEXT: vmrs APSR_nzcv, fpscr
-; CHECK-VFP-NEXT: movwne
-; CHECK-NOVFP-NEXT: clz r0, r0
-; CHECK-NOVFP-NEXT: lsr r0, r0, #5
+; CHECK-FP16-LABEL: test_fcmp_une:
+; CHECK-FP16: ldrh r2, [r0]
+; CHECK-FP16-NEXT: mov r0, #0
+; CHECK-FP16-NEXT: ldrh r1, [r1]
+; CHECK-FP16-NEXT: vmov s0, r2
+; CHECK-FP16-NEXT: vmov s2, r1
+; CHECK-FP16-NEXT: vcvtb.f32.f16 s0, s0
+; CHECK-FP16-NEXT: vcvtb.f32.f16 s2, s2
+; CHECK-FP16-NEXT: vcmp.f32 s0, s2
+; CHECK-FP16-NEXT: vmrs APSR_nzcv, fpscr
+; CHECK-FP16-NEXT: movwne r0, #1
+; CHECK-FP16-NEXT: bx lr
+;
+; CHECK-LIBCALL-VFP-LABEL: test_fcmp_une:
+; CHECK-LIBCALL-VFP: .save {r4, lr}
+; CHECK-LIBCALL-VFP-NEXT: push {r4, lr}
+; CHECK-LIBCALL-VFP-NEXT: .vsave {d8}
+; CHECK-LIBCALL-VFP-NEXT: vpush {d8}
+; CHECK-LIBCALL-VFP-NEXT: mov r4, r0
+; CHECK-LIBCALL-VFP-NEXT: ldrh r0, [r1]
+; CHECK-LIBCALL-VFP-NEXT: bl __aeabi_h2f
+; CHECK-LIBCALL-VFP-NEXT: ldrh r1, [r4]
+; CHECK-LIBCALL-VFP-NEXT: vmov s16, r0
+; CHECK-LIBCALL-VFP-NEXT: mov r0, r1
+; CHECK-LIBCALL-VFP-NEXT: bl __aeabi_h2f
+; CHECK-LIBCALL-VFP-NEXT: vmov s0, r0
+; CHECK-LIBCALL-VFP-NEXT: mov r0, #0
+; CHECK-LIBCALL-VFP-NEXT: vcmp.f32 s0, s16
+; CHECK-LIBCALL-VFP-NEXT: vmrs APSR_nzcv, fpscr
+; CHECK-LIBCALL-VFP-NEXT: movwne r0, #1
+; CHECK-LIBCALL-VFP-NEXT: vpop {d8}
+; CHECK-LIBCALL-VFP-NEXT: pop {r4, pc}
+;
+; CHECK-NOVFP-LABEL: test_fcmp_une:
+; CHECK-NOVFP: .save {r4, r5, r11, lr}
+; CHECK-NOVFP-NEXT: push {r4, r5, r11, lr}
+; CHECK-NOVFP-NEXT: mov r4, r0
+; CHECK-NOVFP-NEXT: ldrh r0, [r1]
+; CHECK-NOVFP-NEXT: bl __aeabi_h2f
+; CHECK-NOVFP-NEXT: mov r5, r0
+; CHECK-NOVFP-NEXT: ldrh r0, [r4]
+; CHECK-NOVFP-NEXT: bl __aeabi_h2f
+; CHECK-NOVFP-NEXT: mov r1, r5
+; CHECK-NOVFP-NEXT: bl __aeabi_fcmpeq
+; CHECK-NOVFP-NEXT: clz r0, r0
+; CHECK-NOVFP-NEXT: lsr r0, r0, #5
+; CHECK-NOVFP-NEXT: pop {r4, r5, r11, pc}
%a = load half, ptr %p, align 2
%b = load half, ptr %q, align 2
%r = fcmp une half %a, %b
@@ -182,15 +417,60 @@ define i1 @test_fcmp_une(ptr %p, ptr %q) #0 {
}
define i1 @test_fcmp_ueq(ptr %p, ptr %q) #0 {
-; CHECK-ALL-LABEL: test_fcmp_ueq:
-; CHECK-FP16: vcvtb.f32.f16
-; CHECK-FP16: vcvtb.f32.f16
-; CHECK-LIBCALL: bl __aeabi_h2f
-; CHECK-LIBCALL: bl __aeabi_h2f
-; CHECK-VFP: vcmp.f32
-; CHECK-NOVFP: bl __aeabi_fcmpeq
-; CHECK-FP16: vmrs APSR_nzcv, fpscr
-; CHECK-LIBCALL: movw{{ne|eq}}
+; CHECK-FP16-LABEL: test_fcmp_ueq:
+; CHECK-FP16: ldrh r2, [r0]
+; CHECK-FP16-NEXT: mov r0, #0
+; CHECK-FP16-NEXT: ldrh r1, [r1]
+; CHECK-FP16-NEXT: vmov s0, r2
+; CHECK-FP16-NEXT: vmov s2, r1
+; CHECK-FP16-NEXT: vcvtb.f32.f16 s0, s0
+; CHECK-FP16-NEXT: vcvtb.f32.f16 s2, s2
+; CHECK-FP16-NEXT: vcmp.f32 s0, s2
+; CHECK-FP16-NEXT: vmrs APSR_nzcv, fpscr
+; CHECK-FP16-NEXT: movweq r0, #1
+; CHECK-FP16-NEXT: movwvs r0, #1
+; CHECK-FP16-NEXT: bx lr
+;
+; CHECK-LIBCALL-VFP-LABEL: test_fcmp_ueq:
+; CHECK-LIBCALL-VFP: .save {r4, lr}
+; CHECK-LIBCALL-VFP-NEXT: push {r4, lr}
+; CHECK-LIBCALL-VFP-NEXT: .vsave {d8}
+; CHECK-LIBCALL-VFP-NEXT: vpush {d8}
+; CHECK-LIBCALL-VFP-NEXT: mov r4, r0
+; CHECK-LIBCALL-VFP-NEXT: ldrh r0, [r1]
+; CHECK-LIBCALL-VFP-NEXT: bl __aeabi_h2f
+; CHECK-LIBCALL-VFP-NEXT: ldrh r1, [r4]
+; CHECK-LIBCALL-VFP-NEXT: vmov s16, r0
+; CHECK-LIBCALL-VFP-NEXT: mov r0, r1
+; CHECK-LIBCALL-VFP-NEXT: bl __aeabi_h2f
+; CHECK-LIBCALL-VFP-NEXT: vmov s0, r0
+; CHECK-LIBCALL-VFP-NEXT: mov r0, #0
+; CHECK-LIBCALL-VFP-NEXT: vcmp.f...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/156341
More information about the llvm-commits
mailing list