Skip to content

Commit 5ad296c

Browse files
committed
[𝘀𝗽𝗿] initial version
Created using spr 1.3.5
2 parents ebacd46 + 70b5a4f commit 5ad296c

File tree

10 files changed

+598
-6
lines changed

10 files changed

+598
-6
lines changed

llvm/lib/Target/Sparc/SparcISelLowering.cpp

Lines changed: 18 additions & 4 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);
@@ -1748,7 +1753,8 @@ SparcTargetLowering::SparcTargetLowering(const TargetMachine &TM,
17481753
setOperationAction(ISD::CTPOP, MVT::i64,
17491754
Subtarget->usePopc() ? Legal : Expand);
17501755
setOperationAction(ISD::CTTZ , MVT::i64, Expand);
1751-
setOperationAction(ISD::CTLZ , MVT::i64, Expand);
1756+
setOperationAction(ISD::CTLZ, MVT::i64,
1757+
Subtarget->isVIS3() ? Legal : Expand);
17521758
setOperationAction(ISD::BSWAP, MVT::i64, Expand);
17531759
setOperationAction(ISD::ROTL , MVT::i64, Expand);
17541760
setOperationAction(ISD::ROTR , MVT::i64, Expand);
@@ -1810,7 +1816,7 @@ SparcTargetLowering::SparcTargetLowering(const TargetMachine &TM,
18101816
setOperationAction(ISD::FREM , MVT::f32, Expand);
18111817
setOperationAction(ISD::FMA , MVT::f32, Expand);
18121818
setOperationAction(ISD::CTTZ , MVT::i32, Expand);
1813-
setOperationAction(ISD::CTLZ , MVT::i32, Expand);
1819+
setOperationAction(ISD::CTLZ, MVT::i32, Subtarget->isVIS3() ? Legal : Expand);
18141820
setOperationAction(ISD::ROTL , MVT::i32, Expand);
18151821
setOperationAction(ISD::ROTR , MVT::i32, Expand);
18161822
setOperationAction(ISD::BSWAP, MVT::i32, Expand);
@@ -1849,8 +1855,10 @@ SparcTargetLowering::SparcTargetLowering(const TargetMachine &TM,
18491855
if (Subtarget->is64Bit()) {
18501856
setOperationAction(ISD::UMUL_LOHI, MVT::i64, Expand);
18511857
setOperationAction(ISD::SMUL_LOHI, MVT::i64, Expand);
1852-
setOperationAction(ISD::MULHU, MVT::i64, Expand);
1853-
setOperationAction(ISD::MULHS, MVT::i64, Expand);
1858+
setOperationAction(ISD::MULHU, MVT::i64,
1859+
Subtarget->isVIS3() ? Legal : Expand);
1860+
setOperationAction(ISD::MULHS, MVT::i64,
1861+
Subtarget->isVIS3() ? Legal : Expand);
18541862

18551863
setOperationAction(ISD::SHL_PARTS, MVT::i64, Expand);
18561864
setOperationAction(ISD::SRA_PARTS, MVT::i64, Expand);
@@ -3560,6 +3568,12 @@ bool SparcTargetLowering::useLoadStackGuardNode(const Module &M) const {
35603568
return true;
35613569
}
35623570

3571+
bool SparcTargetLowering::isFPImmLegal(const APFloat &Imm, EVT VT,
3572+
bool ForCodeSize) const {
3573+
return Subtarget->isVIS() && (VT == MVT::f32 || VT == MVT::f64) &&
3574+
Imm.isZero();
3575+
}
3576+
35633577
// Override to disable global variable loading on Linux.
35643578
void SparcTargetLowering::insertSSPDeclarations(Module &M) const {
35653579
if (!Subtarget->isTargetLinux())

llvm/lib/Target/Sparc/SparcISelLowering.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,9 @@ namespace llvm {
207207
return VT != MVT::f128;
208208
}
209209

210+
bool isFPImmLegal(const APFloat &Imm, EVT VT,
211+
bool ForCodeSize) const override;
212+
210213
bool shouldInsertFencesForAtomic(const Instruction *I) const override {
211214
// FIXME: We insert fences for each atomics and generate
212215
// sub-optimal code for PSO/TSO. (Approximately nobody uses any

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: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@ class VISInst2<bits<9> opfval, string OpcStr, RegisterClass RC = DFPRegs>
4545
!strconcat(OpcStr, " $rs2, $rd")>;
4646

4747
// For VIS Instructions with only rd operand.
48-
let Constraints = "$rd = $f", rs1 = 0, rs2 = 0 in
48+
let rs1 = 0, rs2 = 0 in
4949
class VISInstD<bits<9> opfval, string OpcStr, RegisterClass RC = DFPRegs>
5050
: VISInstFormat<opfval,
51-
(outs RC:$rd), (ins RC:$f),
51+
(outs RC:$rd), (ins),
5252
!strconcat(OpcStr, " $rd")>;
5353

5454
// VIS 1 Instructions
@@ -277,3 +277,36 @@ def UMULXHI : VISInst<0b000010110, "umulxhi", I64Regs>;
277277
def XMULX : VISInst<0b100010101, "xmulx", I64Regs>;
278278
def XMULXHI : VISInst<0b100010110, "xmulxhi", I64Regs>;
279279
} // Predicates = [IsVIS3]
280+
281+
// FP immediate patterns.
282+
def fpimm0 : PatLeaf<(fpimm), [{return N->isExactlyValue(+0.0);}]>;
283+
def fpnegimm0 : PatLeaf<(fpimm), [{return N->isExactlyValue(-0.0);}]>;
284+
285+
// VIS instruction patterns.
286+
let Predicates = [HasVIS] in {
287+
// Zero immediate.
288+
def : Pat<(f64 fpimm0), (FZERO)>;
289+
def : Pat<(f32 fpimm0), (FZEROS)>;
290+
def : Pat<(f64 fpnegimm0), (FNEGD (FZERO))>;
291+
def : Pat<(f32 fpnegimm0), (FNEGS (FZEROS))>;
292+
} // 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+
298+
def : Pat<(i64 (mulhu i64:$lhs, i64:$rhs)), (UMULXHI $lhs, $rhs)>;
299+
// Signed "MULXHI".
300+
// Based on the formula presented in OSA2011 §7.140, but with bitops to select
301+
// the values to be added.
302+
def : Pat<(i64 (mulhs i64:$lhs, i64:$rhs)),
303+
(SUBrr (UMULXHI $lhs, $rhs),
304+
(ADDrr (ANDrr (SRAXri $lhs, 63), $rhs),
305+
(ANDrr (SRAXri $rhs, 63), $lhs)))>;
306+
307+
def : Pat<(i64 (ctlz i64:$src)), (LZCNT $src)>;
308+
// 32-bit LZCNT.
309+
// The zero extension will leave us with 32 extra leading zeros,
310+
// so we need to compensate for it.
311+
def : Pat<(i32 (ctlz i32:$src)), (ADDri (LZCNT (SRLri $src, 0)), (i32 -32))>;
312+
} // 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)