Skip to content

Commit 35114ad

Browse files
committed
[ARM][SDAG] Add llvm.lround half promotion.
Similar to llvm#161088, add llvm.lround and llvm.llround promotion.
1 parent e457097 commit 35114ad

File tree

4 files changed

+45
-10
lines changed

4 files changed

+45
-10
lines changed

llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3765,6 +3765,8 @@ bool DAGTypeLegalizer::SoftPromoteHalfOperand(SDNode *N, unsigned OpNo) {
37653765
case ISD::FP_TO_UINT:
37663766
case ISD::LRINT:
37673767
case ISD::LLRINT:
3768+
case ISD::LROUND:
3769+
case ISD::LLROUND:
37683770
Res = SoftPromoteHalfOp_Op0WithStrict(N);
37693771
break;
37703772
case ISD::FP_TO_SINT_SAT:

llvm/lib/Target/ARM/ARMISelLowering.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1353,6 +1353,7 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
13531353
setOperationAction(ISD::FLOG10, MVT::f16, Promote);
13541354
setOperationAction(ISD::FLOG2, MVT::f16, Promote);
13551355
setOperationAction(ISD::LRINT, MVT::f16, Expand);
1356+
setOperationAction(ISD::LROUND, MVT::f16, Expand);
13561357

13571358
setOperationAction(ISD::FROUND, MVT::f16, Legal);
13581359
setOperationAction(ISD::FROUNDEVEN, MVT::f16, Legal);

llvm/test/CodeGen/ARM/llround-conv.ll

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
22
; RUN: llc < %s -mtriple=armv7-none-eabi -float-abi=soft | FileCheck %s --check-prefixes=CHECK,CHECK-SOFT
33
; RUN: llc < %s -mtriple=armv7-none-eabihf -mattr=+vfp2 -float-abi=hard | FileCheck %s --check-prefixes=CHECK,CHECK-NOFP16
4+
; RUN: llc < %s -mtriple=armv8-none-eabihf -mattr=+fp-armv8 -float-abi=hard | FileCheck %s --check-prefixes=CHECK,CHECK-FPv8
45
; RUN: llc < %s -mtriple=armv8-none-eabihf -mattr=+fp-armv8,+fullfp16 -float-abi=hard | FileCheck %s --check-prefixes=CHECK,CHECK-FP16
56

67
define i64 @testmsxh_builtin(half %x) {
@@ -22,6 +23,14 @@ define i64 @testmsxh_builtin(half %x) {
2223
; CHECK-NOFP16-NEXT: bl llroundf
2324
; CHECK-NOFP16-NEXT: pop {r11, pc}
2425
;
26+
; CHECK-FPv8-LABEL: testmsxh_builtin:
27+
; CHECK-FPv8: @ %bb.0: @ %entry
28+
; CHECK-FPv8-NEXT: .save {r11, lr}
29+
; CHECK-FPv8-NEXT: push {r11, lr}
30+
; CHECK-FPv8-NEXT: vcvtb.f32.f16 s0, s0
31+
; CHECK-FPv8-NEXT: bl llroundf
32+
; CHECK-FPv8-NEXT: pop {r11, pc}
33+
;
2534
; CHECK-FP16-LABEL: testmsxh_builtin:
2635
; CHECK-FP16: @ %bb.0: @ %entry
2736
; CHECK-FP16-NEXT: .save {r11, lr}

llvm/test/CodeGen/ARM/lround-conv.ll

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,39 @@
44
; RUN: llc < %s -mtriple=armv8-none-eabihf -mattr=+fp-armv8 -float-abi=hard | FileCheck %s --check-prefixes=CHECK,CHECK-FPv8
55
; RUN: llc < %s -mtriple=armv8-none-eabihf -mattr=+fp-armv8,+fullfp16 -float-abi=hard | FileCheck %s --check-prefixes=CHECK,CHECK-FP16
66

7-
;define i32 @testmswh_builtin(half %x) {
8-
;entry:
9-
; %0 = tail call i32 @llvm.lround.i32.f16(half %x)
10-
; ret i32 %0
11-
;}
7+
define i32 @testmswh_builtin(half %x) {
8+
; CHECK-SOFT-LABEL: testmswh_builtin:
9+
; CHECK-SOFT: @ %bb.0: @ %entry
10+
; CHECK-SOFT-NEXT: .save {r11, lr}
11+
; CHECK-SOFT-NEXT: push {r11, lr}
12+
; CHECK-SOFT-NEXT: bl __aeabi_h2f
13+
; CHECK-SOFT-NEXT: pop {r11, lr}
14+
; CHECK-SOFT-NEXT: b lroundf
15+
;
16+
; CHECK-NOFP16-LABEL: testmswh_builtin:
17+
; CHECK-NOFP16: @ %bb.0: @ %entry
18+
; CHECK-NOFP16-NEXT: .save {r11, lr}
19+
; CHECK-NOFP16-NEXT: push {r11, lr}
20+
; CHECK-NOFP16-NEXT: vmov r0, s0
21+
; CHECK-NOFP16-NEXT: bl __aeabi_h2f
22+
; CHECK-NOFP16-NEXT: vmov s0, r0
23+
; CHECK-NOFP16-NEXT: pop {r11, lr}
24+
; CHECK-NOFP16-NEXT: b lroundf
25+
;
26+
; CHECK-FPv8-LABEL: testmswh_builtin:
27+
; CHECK-FPv8: @ %bb.0: @ %entry
28+
; CHECK-FPv8-NEXT: vcvtb.f32.f16 s0, s0
29+
; CHECK-FPv8-NEXT: b lroundf
30+
;
31+
; CHECK-FP16-LABEL: testmswh_builtin:
32+
; CHECK-FP16: @ %bb.0: @ %entry
33+
; CHECK-FP16-NEXT: vcvta.s32.f16 s0, s0
34+
; CHECK-FP16-NEXT: vmov r0, s0
35+
; CHECK-FP16-NEXT: bx lr
36+
entry:
37+
%0 = tail call i32 @llvm.lround.i32.f16(half %x)
38+
ret i32 %0
39+
}
1240

1341
define i32 @testmsws_builtin(float %x) {
1442
; CHECK-LABEL: testmsws_builtin:
@@ -40,8 +68,3 @@ entry:
4068
ret i32 %0
4169
}
4270

43-
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
44-
; CHECK-FP16: {{.*}}
45-
; CHECK-FPv8: {{.*}}
46-
; CHECK-NOFP16: {{.*}}
47-
; CHECK-SOFT: {{.*}}

0 commit comments

Comments
 (0)