Skip to content

Commit f3de63c

Browse files
authored
[SPARC] Use addxccc to do multiword addition when we have VIS3
Reviewers: brad0, s-barannikov, rorth Reviewed By: s-barannikov Pull Request: #135713
1 parent 0ce8ad6 commit f3de63c

File tree

4 files changed

+130
-0
lines changed

4 files changed

+130
-0
lines changed

llvm/lib/Target/Sparc/SparcISelLowering.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1737,6 +1737,11 @@ SparcTargetLowering::SparcTargetLowering(const TargetMachine &TM,
17371737
setOperationAction(ISD::SUBC, MVT::i32, Legal);
17381738
setOperationAction(ISD::SUBE, MVT::i32, Legal);
17391739

1740+
if (Subtarget->isVIS3()) {
1741+
setOperationAction(ISD::ADDC, MVT::i64, Legal);
1742+
setOperationAction(ISD::ADDE, MVT::i64, Legal);
1743+
}
1744+
17401745
if (Subtarget->is64Bit()) {
17411746
setOperationAction(ISD::BITCAST, MVT::f64, Expand);
17421747
setOperationAction(ISD::BITCAST, MVT::i64, Expand);

llvm/lib/Target/Sparc/SparcInstr64Bit.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,11 @@ def : Pat<(and i64:$lhs, (not i64:$rhs)), (ANDNrr $lhs, $rhs)>;
157157
def : Pat<(or i64:$lhs, (not i64:$rhs)), (ORNrr $lhs, $rhs)>;
158158
def : Pat<(not (xor i64:$lhs, i64:$rhs)), (XNORrr $lhs, $rhs)>;
159159

160+
def : Pat<(addc i64:$lhs, i64:$rhs), (ADDCCrr $lhs, $rhs)>, Requires<[HasVIS3]>;
160161
def : Pat<(add i64:$lhs, i64:$rhs), (ADDrr $lhs, $rhs)>;
161162
def : Pat<(sub i64:$lhs, i64:$rhs), (SUBrr $lhs, $rhs)>;
162163

164+
def : Pat<(addc i64:$lhs, (i64 simm13:$rhs)), (ADDCCri $lhs, imm:$rhs)>, Requires<[HasVIS3]>;
163165
def : Pat<(add i64:$lhs, (i64 simm13:$rhs)), (ADDri $lhs, imm:$rhs)>;
164166
def : Pat<(sub i64:$lhs, (i64 simm13:$rhs)), (SUBri $lhs, imm:$rhs)>;
165167

llvm/lib/Target/Sparc/SparcInstrVIS.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,3 +290,8 @@ def : Pat<(f32 fpimm0), (FZEROS)>;
290290
def : Pat<(f64 fpnegimm0), (FNEGD (FZERO))>;
291291
def : Pat<(f32 fpnegimm0), (FNEGS (FZEROS))>;
292292
} // Predicates = [HasVIS]
293+
294+
// VIS3 instruction patterns.
295+
let Predicates = [HasVIS3] in {
296+
def : Pat<(i64 (adde i64:$lhs, i64:$rhs)), (ADDXCCC $lhs, $rhs)>;
297+
} // Predicates = [HasVIS3]

llvm/test/CodeGen/SPARC/2011-01-11-CC.ll

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
; RUN: llc -mtriple=sparc %s -o - | FileCheck %s -check-prefix=V8
33
; RUN: llc -mtriple=sparc -mattr=v9 %s -o - | FileCheck %s -check-prefix=V9
44
; RUN: llc -mtriple=sparc64-unknown-linux %s -o - | FileCheck %s -check-prefix=SPARC64
5+
; RUN: llc -mtriple=sparc64-unknown-linux -mattr=vis3 %s -o - | FileCheck %s -check-prefix=SPARC64-VIS3
56

67
define i32 @test_addx(i64 %a, i64 %b, i64 %c) nounwind {
78
; V8-LABEL: test_addx:
@@ -60,6 +61,15 @@ define i32 @test_addx(i64 %a, i64 %b, i64 %c) nounwind {
6061
; SPARC64-NEXT: movgu %xcc, 1, %o3
6162
; SPARC64-NEXT: retl
6263
; SPARC64-NEXT: srl %o3, 0, %o0
64+
;
65+
; SPARC64-VIS3-LABEL: test_addx:
66+
; SPARC64-VIS3: ! %bb.0: ! %entry
67+
; SPARC64-VIS3-NEXT: mov %g0, %o3
68+
; SPARC64-VIS3-NEXT: add %o0, %o1, %o0
69+
; SPARC64-VIS3-NEXT: cmp %o0, %o2
70+
; SPARC64-VIS3-NEXT: movgu %xcc, 1, %o3
71+
; SPARC64-VIS3-NEXT: retl
72+
; SPARC64-VIS3-NEXT: srl %o3, 0, %o0
6373
entry:
6474
%0 = add i64 %a, %b
6575
%1 = icmp ugt i64 %0, %c
@@ -92,6 +102,13 @@ define i32 @test_select_int_icc(i32 %a, i32 %b, i32 %c) nounwind {
92102
; SPARC64-NEXT: move %icc, %o1, %o2
93103
; SPARC64-NEXT: retl
94104
; SPARC64-NEXT: mov %o2, %o0
105+
;
106+
; SPARC64-VIS3-LABEL: test_select_int_icc:
107+
; SPARC64-VIS3: ! %bb.0: ! %entry
108+
; SPARC64-VIS3-NEXT: cmp %o0, 0
109+
; SPARC64-VIS3-NEXT: move %icc, %o1, %o2
110+
; SPARC64-VIS3-NEXT: retl
111+
; SPARC64-VIS3-NEXT: mov %o2, %o0
95112
entry:
96113
%0 = icmp eq i32 %a, 0
97114
%1 = select i1 %0, i32 %b, i32 %c
@@ -133,6 +150,13 @@ define float @test_select_fp_icc(i32 %a, float %f1, float %f2) nounwind {
133150
; SPARC64-NEXT: cmp %o0, 0
134151
; SPARC64-NEXT: retl
135152
; SPARC64-NEXT: fmovse %icc, %f3, %f0
153+
;
154+
; SPARC64-VIS3-LABEL: test_select_fp_icc:
155+
; SPARC64-VIS3: ! %bb.0: ! %entry
156+
; SPARC64-VIS3-NEXT: fmovs %f5, %f0
157+
; SPARC64-VIS3-NEXT: cmp %o0, 0
158+
; SPARC64-VIS3-NEXT: retl
159+
; SPARC64-VIS3-NEXT: fmovse %icc, %f3, %f0
136160
entry:
137161
%0 = icmp eq i32 %a, 0
138162
%1 = select i1 %0, float %f1, float %f2
@@ -182,6 +206,13 @@ define double @test_select_dfp_icc(i32 %a, double %f1, double %f2) nounwind {
182206
; SPARC64-NEXT: cmp %o0, 0
183207
; SPARC64-NEXT: retl
184208
; SPARC64-NEXT: fmovde %icc, %f2, %f0
209+
;
210+
; SPARC64-VIS3-LABEL: test_select_dfp_icc:
211+
; SPARC64-VIS3: ! %bb.0: ! %entry
212+
; SPARC64-VIS3-NEXT: fmovd %f4, %f0
213+
; SPARC64-VIS3-NEXT: cmp %o0, 0
214+
; SPARC64-VIS3-NEXT: retl
215+
; SPARC64-VIS3-NEXT: fmovde %icc, %f2, %f0
185216
entry:
186217
%0 = icmp eq i32 %a, 0
187218
%1 = select i1 %0, double %f1, double %f2
@@ -229,6 +260,17 @@ define i32 @test_select_int_fcc(float %f, i32 %a, i32 %b) nounwind {
229260
; SPARC64-NEXT: fcmps %fcc0, %f1, %f0
230261
; SPARC64-NEXT: retl
231262
; SPARC64-NEXT: movne %fcc0, %o1, %o0
263+
;
264+
; SPARC64-VIS3-LABEL: test_select_int_fcc:
265+
; SPARC64-VIS3: ! %bb.0: ! %entry
266+
; SPARC64-VIS3-NEXT: sethi %h44(.LCPI4_0), %o0
267+
; SPARC64-VIS3-NEXT: add %o0, %m44(.LCPI4_0), %o0
268+
; SPARC64-VIS3-NEXT: sllx %o0, 12, %o0
269+
; SPARC64-VIS3-NEXT: ld [%o0+%l44(.LCPI4_0)], %f0
270+
; SPARC64-VIS3-NEXT: mov %o2, %o0
271+
; SPARC64-VIS3-NEXT: fcmps %fcc0, %f1, %f0
272+
; SPARC64-VIS3-NEXT: retl
273+
; SPARC64-VIS3-NEXT: movne %fcc0, %o1, %o0
232274
entry:
233275
%0 = fcmp une float %f, 0.000000e+00
234276
%a.b = select i1 %0, i32 %a, i32 %b
@@ -284,6 +326,17 @@ define float @test_select_fp_fcc(float %f, float %f1, float %f2) nounwind {
284326
; SPARC64-NEXT: fcmps %fcc0, %f1, %f2
285327
; SPARC64-NEXT: retl
286328
; SPARC64-NEXT: fmovsne %fcc0, %f3, %f0
329+
;
330+
; SPARC64-VIS3-LABEL: test_select_fp_fcc:
331+
; SPARC64-VIS3: ! %bb.0: ! %entry
332+
; SPARC64-VIS3-NEXT: sethi %h44(.LCPI5_0), %o0
333+
; SPARC64-VIS3-NEXT: add %o0, %m44(.LCPI5_0), %o0
334+
; SPARC64-VIS3-NEXT: sllx %o0, 12, %o0
335+
; SPARC64-VIS3-NEXT: ld [%o0+%l44(.LCPI5_0)], %f2
336+
; SPARC64-VIS3-NEXT: fmovs %f5, %f0
337+
; SPARC64-VIS3-NEXT: fcmps %fcc0, %f1, %f2
338+
; SPARC64-VIS3-NEXT: retl
339+
; SPARC64-VIS3-NEXT: fmovsne %fcc0, %f3, %f0
287340
entry:
288341
%0 = fcmp une float %f, 0.000000e+00
289342
%1 = select i1 %0, float %f1, float %f2
@@ -352,6 +405,18 @@ define double @test_select_dfp_fcc(double %f, double %f1, double %f2) nounwind {
352405
; SPARC64-NEXT: fmovd %f4, %f0
353406
; SPARC64-NEXT: retl
354407
; SPARC64-NEXT: nop
408+
;
409+
; SPARC64-VIS3-LABEL: test_select_dfp_fcc:
410+
; SPARC64-VIS3: ! %bb.0: ! %entry
411+
; SPARC64-VIS3-NEXT: sethi %h44(.LCPI6_0), %o0
412+
; SPARC64-VIS3-NEXT: add %o0, %m44(.LCPI6_0), %o0
413+
; SPARC64-VIS3-NEXT: sllx %o0, 12, %o0
414+
; SPARC64-VIS3-NEXT: ldd [%o0+%l44(.LCPI6_0)], %f6
415+
; SPARC64-VIS3-NEXT: fcmpd %fcc0, %f0, %f6
416+
; SPARC64-VIS3-NEXT: fmovdne %fcc0, %f2, %f4
417+
; SPARC64-VIS3-NEXT: fmovd %f4, %f0
418+
; SPARC64-VIS3-NEXT: retl
419+
; SPARC64-VIS3-NEXT: nop
355420
entry:
356421
%0 = fcmp une double %f, 0.000000e+00
357422
%1 = select i1 %0, double %f1, double %f2
@@ -453,6 +518,31 @@ define i32 @test_float_cc(double %a, double %b, i32 %c, i32 %d) nounwind {
453518
; SPARC64-NEXT: ! %bb.4: ! %exit.0
454519
; SPARC64-NEXT: retl
455520
; SPARC64-NEXT: mov %g0, %o0
521+
;
522+
; SPARC64-VIS3-LABEL: test_float_cc:
523+
; SPARC64-VIS3: ! %bb.0: ! %entry
524+
; SPARC64-VIS3-NEXT: sethi %h44(.LCPI7_0), %o0
525+
; SPARC64-VIS3-NEXT: add %o0, %m44(.LCPI7_0), %o0
526+
; SPARC64-VIS3-NEXT: sllx %o0, 12, %o0
527+
; SPARC64-VIS3-NEXT: ldd [%o0+%l44(.LCPI7_0)], %f4
528+
; SPARC64-VIS3-NEXT: fcmpd %fcc0, %f0, %f4
529+
; SPARC64-VIS3-NEXT: fbuge %fcc0, .LBB7_3
530+
; SPARC64-VIS3-NEXT: nop
531+
; SPARC64-VIS3-NEXT: ! %bb.1: ! %loop.2
532+
; SPARC64-VIS3-NEXT: fcmpd %fcc0, %f2, %f4
533+
; SPARC64-VIS3-NEXT: fbule %fcc0, .LBB7_3
534+
; SPARC64-VIS3-NEXT: nop
535+
; SPARC64-VIS3-NEXT: ! %bb.2: ! %exit.1
536+
; SPARC64-VIS3-NEXT: retl
537+
; SPARC64-VIS3-NEXT: mov 1, %o0
538+
; SPARC64-VIS3-NEXT: .LBB7_3: ! %loop
539+
; SPARC64-VIS3-NEXT: ! =>This Inner Loop Header: Depth=1
540+
; SPARC64-VIS3-NEXT: cmp %o2, 10
541+
; SPARC64-VIS3-NEXT: be %icc, .LBB7_3
542+
; SPARC64-VIS3-NEXT: nop
543+
; SPARC64-VIS3-NEXT: ! %bb.4: ! %exit.0
544+
; SPARC64-VIS3-NEXT: retl
545+
; SPARC64-VIS3-NEXT: mov %g0, %o0
456546
entry:
457547
%0 = fcmp uge double %a, 0.000000e+00
458548
br i1 %0, label %loop, label %loop.2
@@ -558,6 +648,34 @@ define void @test_adde_sube(ptr %a, ptr %b, ptr %sum, ptr %diff) nounwind {
558648
; SPARC64-NEXT: stx %i0, [%i3]
559649
; SPARC64-NEXT: ret
560650
; SPARC64-NEXT: restore
651+
;
652+
; SPARC64-VIS3-LABEL: test_adde_sube:
653+
; SPARC64-VIS3: .register %g2, #scratch
654+
; SPARC64-VIS3-NEXT: ! %bb.0: ! %entry
655+
; SPARC64-VIS3-NEXT: save %sp, -128, %sp
656+
; SPARC64-VIS3-NEXT: ldx [%i0+8], %i4
657+
; SPARC64-VIS3-NEXT: ldx [%i0], %i5
658+
; SPARC64-VIS3-NEXT: ldx [%i1+8], %g2
659+
; SPARC64-VIS3-NEXT: ldx [%i1], %i1
660+
; SPARC64-VIS3-NEXT: addcc %i4, %g2, %g2
661+
; SPARC64-VIS3-NEXT: addxccc %i5, %i1, %i1
662+
; SPARC64-VIS3-NEXT: stx %i1, [%i2]
663+
; SPARC64-VIS3-NEXT: stx %g2, [%i2+8]
664+
; SPARC64-VIS3-NEXT: !APP
665+
; SPARC64-VIS3-NEXT: !NO_APP
666+
; SPARC64-VIS3-NEXT: ldx [%i0+8], %i1
667+
; SPARC64-VIS3-NEXT: mov %g0, %i2
668+
; SPARC64-VIS3-NEXT: ldx [%i0], %i0
669+
; SPARC64-VIS3-NEXT: cmp %i4, %i1
670+
; SPARC64-VIS3-NEXT: movcs %xcc, 1, %i2
671+
; SPARC64-VIS3-NEXT: srl %i2, 0, %i2
672+
; SPARC64-VIS3-NEXT: sub %i5, %i0, %i0
673+
; SPARC64-VIS3-NEXT: sub %i0, %i2, %i0
674+
; SPARC64-VIS3-NEXT: sub %i4, %i1, %i1
675+
; SPARC64-VIS3-NEXT: stx %i1, [%i3+8]
676+
; SPARC64-VIS3-NEXT: stx %i0, [%i3]
677+
; SPARC64-VIS3-NEXT: ret
678+
; SPARC64-VIS3-NEXT: restore
561679
entry:
562680
%0 = bitcast ptr %a to ptr
563681
%1 = bitcast ptr %b to ptr

0 commit comments

Comments
 (0)