Skip to content

Commit

Permalink
[Power9]Legalize and emit code for HW/Byte vector extract and convert…
Browse files Browse the repository at this point in the history
… to QP

Implemente patterns to extract HWord and Byte vector elements and convert to
quad-precision.

Differential Revision: https://reviews.llvm.org/D46774

llvm-svn: 333377
  • Loading branch information
lei137 committed May 28, 2018
1 parent aefe07a commit 651be44
Show file tree
Hide file tree
Showing 2 changed files with 1,171 additions and 3 deletions.
63 changes: 63 additions & 0 deletions llvm/lib/Target/PowerPC/PPCInstrVSX.td
Original file line number Diff line number Diff line change
Expand Up @@ -3179,6 +3179,33 @@ let AddedComplexity = 400, Predicates = [HasP9Vector] in {
(f128 (XSCVUDQP (XXEXTRACTUW $src, !shl(Idx, 2))))>;
}

// (Un)Signed HWord vector extract -> QP
foreach Idx = 0-7 in {
def : Pat<(f128 (sint_to_fp
(i32 (sext_inreg
(vector_extract v8i16:$src, Idx), i16)))),
(f128 (XSCVSDQP (EXTRACT_SUBREG
(VEXTSH2D (VEXTRACTUH !add(Idx, Idx), $src)),
sub_64)))>;
// The SDAG adds the `and` since an `i16` is being extracted as an `i32`.
def : Pat<(f128 (uint_to_fp
(and (i32 (vector_extract v8i16:$src, Idx)), 65535))),
(f128 (XSCVUDQP (EXTRACT_SUBREG
(VEXTRACTUH !add(Idx, Idx), $src), sub_64)))>;
}

// (Un)Signed Byte vector extract -> QP
foreach Idx = 0-15 in {
def : Pat<(f128 (sint_to_fp
(i32 (sext_inreg (vector_extract v16i8:$src, Idx),
i8)))),
(f128 (XSCVSDQP (EXTRACT_SUBREG
(VEXTSB2D (VEXTRACTUB Idx, $src)), sub_64)))>;
def : Pat<(f128 (uint_to_fp
(and (i32 (vector_extract v16i8:$src, Idx)), 255))),
(f128 (XSCVUDQP
(EXTRACT_SUBREG (VEXTRACTUB Idx, $src), sub_64)))>;
}
} // IsBigEndian, HasP9Vector

let Predicates = [IsLittleEndian, HasP9Vector] in {
Expand Down Expand Up @@ -3209,6 +3236,42 @@ let AddedComplexity = 400, Predicates = [HasP9Vector] in {
def : Pat<(f128 (uint_to_fp (i32 (extractelt v4i32:$src, !head(Idx))))),
(f128 (XSCVUDQP (XXEXTRACTUW $src, !head(!tail(Idx)))))>;
}

// (Un)Signed HWord vector extract -> QP
// The Nested foreach lists identifies the vector element and corresponding
// register byte location.
foreach Idx = [[0,14],[1,12],[2,10],[3,8],[4,6],[5,4],[6,2],[7,0]] in {
def : Pat<(f128 (sint_to_fp
(i32 (sext_inreg
(vector_extract v8i16:$src, !head(Idx)), i16)))),
(f128 (XSCVSDQP
(EXTRACT_SUBREG (VEXTSH2D
(VEXTRACTUH !head(!tail(Idx)), $src)),
sub_64)))>;
def : Pat<(f128 (uint_to_fp
(and (i32 (vector_extract v8i16:$src, !head(Idx))),
65535))),
(f128 (XSCVUDQP (EXTRACT_SUBREG
(VEXTRACTUH !head(!tail(Idx)), $src), sub_64)))>;
}

// (Un)Signed Byte vector extract -> QP
foreach Idx = [[0,15],[1,14],[2,13],[3,12],[4,11],[5,10],[6,9],[7,8],[8,7],
[9,6],[10,5],[11,4],[12,3],[13,2],[14,1],[15,0]] in {
def : Pat<(f128 (sint_to_fp
(i32 (sext_inreg
(vector_extract v16i8:$src, !head(Idx)), i8)))),
(f128 (XSCVSDQP
(EXTRACT_SUBREG
(VEXTSB2D (VEXTRACTUB !head(!tail(Idx)), $src)),
sub_64)))>;
def : Pat<(f128 (uint_to_fp
(and (i32 (vector_extract v16i8:$src, !head(Idx))),
255))),
(f128 (XSCVUDQP
(EXTRACT_SUBREG
(VEXTRACTUB !head(!tail(Idx)), $src), sub_64)))>;
}
} // IsLittleEndian, HasP9Vector

// Convert (Un)Signed DWord in memory -> QP
Expand Down
Loading

0 comments on commit 651be44

Please sign in to comment.