[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