Skip to content

Commit 646478f

Browse files
committed
[AArch64] Scalarize i128 add/sub/mul/and/or/xor vectors
This mirrors what we do for SDAG, scalarizing i128 vectors with add/sub/mul/and/or/xor operators.
1 parent c8ba317 commit 646478f

File tree

5 files changed

+395
-206
lines changed

5 files changed

+395
-206
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
149149
return Query.Types[0].getNumElements() <= 16;
150150
},
151151
0, s8)
152+
.scalarizeIf(scalarOrEltWiderThan(0, 64), 0)
152153
.moreElementsToNextPow2(0);
153154

154155
getActionDefinitionsBuilder({G_SHL, G_ASHR, G_LSHR})

llvm/test/CodeGen/AArch64/add.ll

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
22
; RUN: llc -mtriple=aarch64-none-eabi -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3-
; RUN: llc -mtriple=aarch64-none-eabi -global-isel -global-isel-abort=2 -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
4-
5-
; CHECK-GI: warning: Instruction selection used fallback path for v2i128
6-
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for v3i128
7-
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for v4i128
3+
; RUN: llc -mtriple=aarch64-none-eabi -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI
84

95
define i8 @i8(i8 %a, i8 %b) {
106
; CHECK-LABEL: i8:
@@ -480,21 +476,37 @@ entry:
480476
}
481477

482478
define <4 x i128> @v4i128(<4 x i128> %d, <4 x i128> %e) {
483-
; CHECK-LABEL: v4i128:
484-
; CHECK: // %bb.0: // %entry
485-
; CHECK-NEXT: ldp x8, x9, [sp]
486-
; CHECK-NEXT: ldp x11, x10, [sp, #16]
487-
; CHECK-NEXT: ldp x13, x12, [sp, #32]
488-
; CHECK-NEXT: adds x0, x0, x8
489-
; CHECK-NEXT: adc x1, x1, x9
490-
; CHECK-NEXT: ldp x8, x9, [sp, #48]
491-
; CHECK-NEXT: adds x2, x2, x11
492-
; CHECK-NEXT: adc x3, x3, x10
493-
; CHECK-NEXT: adds x4, x4, x13
494-
; CHECK-NEXT: adc x5, x5, x12
495-
; CHECK-NEXT: adds x6, x6, x8
496-
; CHECK-NEXT: adc x7, x7, x9
497-
; CHECK-NEXT: ret
479+
; CHECK-SD-LABEL: v4i128:
480+
; CHECK-SD: // %bb.0: // %entry
481+
; CHECK-SD-NEXT: ldp x8, x9, [sp]
482+
; CHECK-SD-NEXT: ldp x11, x10, [sp, #16]
483+
; CHECK-SD-NEXT: ldp x13, x12, [sp, #32]
484+
; CHECK-SD-NEXT: adds x0, x0, x8
485+
; CHECK-SD-NEXT: adc x1, x1, x9
486+
; CHECK-SD-NEXT: ldp x8, x9, [sp, #48]
487+
; CHECK-SD-NEXT: adds x2, x2, x11
488+
; CHECK-SD-NEXT: adc x3, x3, x10
489+
; CHECK-SD-NEXT: adds x4, x4, x13
490+
; CHECK-SD-NEXT: adc x5, x5, x12
491+
; CHECK-SD-NEXT: adds x6, x6, x8
492+
; CHECK-SD-NEXT: adc x7, x7, x9
493+
; CHECK-SD-NEXT: ret
494+
;
495+
; CHECK-GI-LABEL: v4i128:
496+
; CHECK-GI: // %bb.0: // %entry
497+
; CHECK-GI-NEXT: ldp x8, x9, [sp]
498+
; CHECK-GI-NEXT: ldp x10, x11, [sp, #16]
499+
; CHECK-GI-NEXT: ldp x12, x13, [sp, #32]
500+
; CHECK-GI-NEXT: adds x0, x0, x8
501+
; CHECK-GI-NEXT: adc x1, x1, x9
502+
; CHECK-GI-NEXT: ldp x8, x9, [sp, #48]
503+
; CHECK-GI-NEXT: adds x2, x2, x10
504+
; CHECK-GI-NEXT: adc x3, x3, x11
505+
; CHECK-GI-NEXT: adds x4, x4, x12
506+
; CHECK-GI-NEXT: adc x5, x5, x13
507+
; CHECK-GI-NEXT: adds x6, x6, x8
508+
; CHECK-GI-NEXT: adc x7, x7, x9
509+
; CHECK-GI-NEXT: ret
498510
entry:
499511
%s = add <4 x i128> %d, %e
500512
ret <4 x i128> %s

0 commit comments

Comments
 (0)