Skip to content

Conversation

beetrees
Copy link
Contributor

@beetrees beetrees commented Sep 1, 2025

Update the test to use utils/update_llc_test_checks.py, and add a check for fneg. Prerequisite to #156343.

@llvmbot
Copy link
Member

llvmbot commented Sep 1, 2025

@llvm/pr-subscribers-backend-arm

Author: None (beetrees)

Changes

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 --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]

@nikic nikic enabled auto-merge (squash) September 1, 2025 15:46
@nikic nikic merged commit 1fae86d into llvm:main Sep 1, 2025
11 checks passed
@beetrees beetrees deleted the update-arm-fp16-promote-test branch September 1, 2025 16:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants