xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/fp16-args.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -float-abi soft -mattr=+fp16 < %s | FileCheck %s --check-prefix=CHECK --check-prefix=SOFT
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -float-abi hard -mattr=+fp16 < %s | FileCheck %s --check-prefix=CHECK --check-prefix=HARD
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5*9880d681SAndroid Build Coastguard Workertarget triple = "armv7a--none-eabi"
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workerdefine float @foo(float %a.coerce, float %b.coerce) {
8*9880d681SAndroid Build Coastguard Workerentry:
9*9880d681SAndroid Build Coastguard Worker  %0 = bitcast float %a.coerce to i32
10*9880d681SAndroid Build Coastguard Worker  %tmp.0.extract.trunc = trunc i32 %0 to i16
11*9880d681SAndroid Build Coastguard Worker  %1 = bitcast i16 %tmp.0.extract.trunc to half
12*9880d681SAndroid Build Coastguard Worker  %2 = bitcast float %b.coerce to i32
13*9880d681SAndroid Build Coastguard Worker  %tmp1.0.extract.trunc = trunc i32 %2 to i16
14*9880d681SAndroid Build Coastguard Worker  %3 = bitcast i16 %tmp1.0.extract.trunc to half
15*9880d681SAndroid Build Coastguard Worker  %4 = fadd half %1, %3
16*9880d681SAndroid Build Coastguard Worker  %5 = bitcast half %4 to i16
17*9880d681SAndroid Build Coastguard Worker  %tmp5.0.insert.ext = zext i16 %5 to i32
18*9880d681SAndroid Build Coastguard Worker  %6 = bitcast i32 %tmp5.0.insert.ext to float
19*9880d681SAndroid Build Coastguard Worker  ret float %6
20*9880d681SAndroid Build Coastguard Worker; CHECK: foo:
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker; SOFT: vmov    {{s[0-9]+}}, r1
23*9880d681SAndroid Build Coastguard Worker; SOFT: vmov    {{s[0-9]+}}, r0
24*9880d681SAndroid Build Coastguard Worker; SOFT: vcvtb.f32.f16   {{s[0-9]+}}, {{s[0-9]+}}
25*9880d681SAndroid Build Coastguard Worker; SOFT: vcvtb.f32.f16   {{s[0-9]+}}, {{s[0-9]+}}
26*9880d681SAndroid Build Coastguard Worker; SOFT: vadd.f32        {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
27*9880d681SAndroid Build Coastguard Worker; SOFT: vcvtb.f16.f32   {{s[0-9]+}}, {{s[0-9]+}}
28*9880d681SAndroid Build Coastguard Worker; SOFT: vmov    r0, {{s[0-9]+}}
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker; HARD-NOT: vmov
31*9880d681SAndroid Build Coastguard Worker; HARD-NOT: uxth
32*9880d681SAndroid Build Coastguard Worker; HARD: vcvtb.f32.f16   {{s[0-9]+}}, s1
33*9880d681SAndroid Build Coastguard Worker; HARD: vcvtb.f32.f16   {{s[0-9]+}}, s0
34*9880d681SAndroid Build Coastguard Worker; HARD: vadd.f32        {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
35*9880d681SAndroid Build Coastguard Worker; HARD: vcvtb.f16.f32   [[SREG:s[0-9]+]], {{s[0-9]+}}
36*9880d681SAndroid Build Coastguard Worker; HARD-NEXT: vmov            [[REG0:r[0-9]+]], [[SREG]]
37*9880d681SAndroid Build Coastguard Worker; HARD-NEXT: uxth            [[REG1:r[0-9]+]], [[REG0]]
38*9880d681SAndroid Build Coastguard Worker; HARD-NEXT: vmov            s0, [[REG1]]
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker; CHECK: bx lr
41*9880d681SAndroid Build Coastguard Worker}
42