Skip to content

Commit c3f9b73

Browse files
committed
[AArch64] Treat fp128 G_FNEG like G_FABS
These fp128 G_FNEG operations should be treated more like G_FABS, where the operation is lowered to simple integer arithmetic. All other operations are the same between the two ActionDefinitionsBuilders.
1 parent 6dcd0d4 commit c3f9b73

File tree

2 files changed

+46
-29
lines changed

2 files changed

+46
-29
lines changed

llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -242,11 +242,10 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
242242
.clampScalar(1, s32, s64)
243243
.widenScalarToNextPow2(0);
244244

245-
getActionDefinitionsBuilder({G_FADD, G_FSUB, G_FMUL, G_FDIV, G_FMA, G_FNEG,
246-
G_FSQRT, G_FMAXNUM, G_FMINNUM, G_FMAXIMUM,
247-
G_FMINIMUM, G_FCEIL, G_FFLOOR, G_FRINT,
248-
G_FNEARBYINT, G_INTRINSIC_TRUNC,
249-
G_INTRINSIC_ROUND, G_INTRINSIC_ROUNDEVEN})
245+
getActionDefinitionsBuilder(
246+
{G_FADD, G_FSUB, G_FMUL, G_FDIV, G_FMA, G_FSQRT, G_FMAXNUM, G_FMINNUM,
247+
G_FMAXIMUM, G_FMINIMUM, G_FCEIL, G_FFLOOR, G_FRINT, G_FNEARBYINT,
248+
G_INTRINSIC_TRUNC, G_INTRINSIC_ROUND, G_INTRINSIC_ROUNDEVEN})
250249
.legalFor({MinFPScalar, s32, s64, v2s32, v4s32, v2s64})
251250
.legalIf([=](const LegalityQuery &Query) {
252251
const auto &Ty = Query.Types[0];
@@ -260,7 +259,7 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
260259
.clampNumElements(0, v2s64, v2s64)
261260
.moreElementsToNextPow2(0);
262261

263-
getActionDefinitionsBuilder(G_FABS)
262+
getActionDefinitionsBuilder({G_FABS, G_FNEG})
264263
.legalFor({MinFPScalar, s32, s64, v2s32, v4s32, v2s64})
265264
.legalIf([=](const LegalityQuery &Query) {
266265
const auto &Ty = Query.Types[0];

llvm/test/CodeGen/AArch64/arm64-fp128.ll

Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
; RUN: llc -mtriple=arm64-linux-gnu -verify-machineinstrs -global-isel -global-isel-abort=2 < %s 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
44

55
; CHECK-GI: warning: Instruction selection used fallback path for test_neg_sub
6-
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_neg
7-
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for vec_neg
86

97
define fp128 @test_add(fp128 %lhs, fp128 %rhs) {
108
; CHECK-LABEL: test_add:
@@ -405,15 +403,23 @@ define fp128 @test_neg_sub(fp128 %in) {
405403
}
406404

407405
define fp128 @test_neg(fp128 %in) {
408-
; CHECK-LABEL: test_neg:
409-
; CHECK: // %bb.0:
410-
; CHECK-NEXT: str q0, [sp, #-16]!
411-
; CHECK-NEXT: .cfi_def_cfa_offset 16
412-
; CHECK-NEXT: ldrb w8, [sp, #15]
413-
; CHECK-NEXT: eor w8, w8, #0x80
414-
; CHECK-NEXT: strb w8, [sp, #15]
415-
; CHECK-NEXT: ldr q0, [sp], #16
416-
; CHECK-NEXT: ret
406+
; CHECK-SD-LABEL: test_neg:
407+
; CHECK-SD: // %bb.0:
408+
; CHECK-SD-NEXT: str q0, [sp, #-16]!
409+
; CHECK-SD-NEXT: .cfi_def_cfa_offset 16
410+
; CHECK-SD-NEXT: ldrb w8, [sp, #15]
411+
; CHECK-SD-NEXT: eor w8, w8, #0x80
412+
; CHECK-SD-NEXT: strb w8, [sp, #15]
413+
; CHECK-SD-NEXT: ldr q0, [sp], #16
414+
; CHECK-SD-NEXT: ret
415+
;
416+
; CHECK-GI-LABEL: test_neg:
417+
; CHECK-GI: // %bb.0:
418+
; CHECK-GI-NEXT: mov x8, v0.d[1]
419+
; CHECK-GI-NEXT: mov v0.d[0], v0.d[0]
420+
; CHECK-GI-NEXT: eor x8, x8, #0x8000000000000000
421+
; CHECK-GI-NEXT: mov v0.d[1], x8
422+
; CHECK-GI-NEXT: ret
417423
%ret = fneg fp128 %in
418424
ret fp128 %ret
419425
}
@@ -1497,18 +1503,30 @@ define <2 x fp128> @vec_neg_sub(<2 x fp128> %in) {
14971503
}
14981504

14991505
define <2 x fp128> @vec_neg(<2 x fp128> %in) {
1500-
; CHECK-LABEL: vec_neg:
1501-
; CHECK: // %bb.0:
1502-
; CHECK-NEXT: stp q0, q1, [sp, #-32]!
1503-
; CHECK-NEXT: .cfi_def_cfa_offset 32
1504-
; CHECK-NEXT: ldrb w8, [sp, #15]
1505-
; CHECK-NEXT: eor w8, w8, #0x80
1506-
; CHECK-NEXT: strb w8, [sp, #15]
1507-
; CHECK-NEXT: ldrb w8, [sp, #31]
1508-
; CHECK-NEXT: eor w8, w8, #0x80
1509-
; CHECK-NEXT: strb w8, [sp, #31]
1510-
; CHECK-NEXT: ldp q0, q1, [sp], #32
1511-
; CHECK-NEXT: ret
1506+
; CHECK-SD-LABEL: vec_neg:
1507+
; CHECK-SD: // %bb.0:
1508+
; CHECK-SD-NEXT: stp q0, q1, [sp, #-32]!
1509+
; CHECK-SD-NEXT: .cfi_def_cfa_offset 32
1510+
; CHECK-SD-NEXT: ldrb w8, [sp, #15]
1511+
; CHECK-SD-NEXT: eor w8, w8, #0x80
1512+
; CHECK-SD-NEXT: strb w8, [sp, #15]
1513+
; CHECK-SD-NEXT: ldrb w8, [sp, #31]
1514+
; CHECK-SD-NEXT: eor w8, w8, #0x80
1515+
; CHECK-SD-NEXT: strb w8, [sp, #31]
1516+
; CHECK-SD-NEXT: ldp q0, q1, [sp], #32
1517+
; CHECK-SD-NEXT: ret
1518+
;
1519+
; CHECK-GI-LABEL: vec_neg:
1520+
; CHECK-GI: // %bb.0:
1521+
; CHECK-GI-NEXT: mov x8, v0.d[1]
1522+
; CHECK-GI-NEXT: mov x9, v1.d[1]
1523+
; CHECK-GI-NEXT: mov v0.d[0], v0.d[0]
1524+
; CHECK-GI-NEXT: mov v1.d[0], v1.d[0]
1525+
; CHECK-GI-NEXT: eor x8, x8, #0x8000000000000000
1526+
; CHECK-GI-NEXT: eor x9, x9, #0x8000000000000000
1527+
; CHECK-GI-NEXT: mov v0.d[1], x8
1528+
; CHECK-GI-NEXT: mov v1.d[1], x9
1529+
; CHECK-GI-NEXT: ret
15121530
%ret = fneg <2 x fp128> %in
15131531
ret <2 x fp128> %ret
15141532
}

0 commit comments

Comments
 (0)