mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-08 21:37:35 +00:00
Unbreak getOnesVector() / getZeroVector() to use valid ARM extended imm's.
llvm-svn: 81262
This commit is contained in:
parent
a3ab9b3b9e
commit
2b6ef7724e
@ -2086,14 +2086,19 @@ static SDValue getZeroVector(EVT VT, SelectionDAG &DAG, DebugLoc dl) {
|
|||||||
// will be implemented with the NEON VNEG instruction. However, VNEG does
|
// will be implemented with the NEON VNEG instruction. However, VNEG does
|
||||||
// not support i64 elements, so sometimes the zero vectors will need to be
|
// not support i64 elements, so sometimes the zero vectors will need to be
|
||||||
// explicitly constructed. For those cases, and potentially other uses in
|
// explicitly constructed. For those cases, and potentially other uses in
|
||||||
// the future, always build zero vectors as <4 x i32> or <2 x i32> bitcasted
|
// the future, always build zero vectors as <16 x i8> or <8 x i8> bitcasted
|
||||||
// to their dest type. This ensures they get CSE'd.
|
// to their dest type. This ensures they get CSE'd.
|
||||||
SDValue Vec;
|
SDValue Vec;
|
||||||
SDValue Cst = DAG.getTargetConstant(0, MVT::i32);
|
SDValue Cst = DAG.getTargetConstant(0, MVT::i8);
|
||||||
if (VT.getSizeInBits() == 64)
|
SmallVector<SDValue, 8> Ops;
|
||||||
Vec = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v2i32, Cst, Cst);
|
MVT TVT;
|
||||||
else
|
|
||||||
Vec = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v4i32, Cst, Cst, Cst, Cst);
|
if (VT.getSizeInBits() == 64) {
|
||||||
|
Ops.assign(8, Cst); TVT = MVT::v8i8;
|
||||||
|
} else {
|
||||||
|
Ops.assign(16, Cst); TVT = MVT::v16i8;
|
||||||
|
}
|
||||||
|
Vec = DAG.getNode(ISD::BUILD_VECTOR, dl, TVT, &Ops[0], Ops.size());
|
||||||
|
|
||||||
return DAG.getNode(ISD::BIT_CONVERT, dl, VT, Vec);
|
return DAG.getNode(ISD::BIT_CONVERT, dl, VT, Vec);
|
||||||
}
|
}
|
||||||
@ -2103,14 +2108,19 @@ static SDValue getZeroVector(EVT VT, SelectionDAG &DAG, DebugLoc dl) {
|
|||||||
static SDValue getOnesVector(EVT VT, SelectionDAG &DAG, DebugLoc dl) {
|
static SDValue getOnesVector(EVT VT, SelectionDAG &DAG, DebugLoc dl) {
|
||||||
assert(VT.isVector() && "Expected a vector type");
|
assert(VT.isVector() && "Expected a vector type");
|
||||||
|
|
||||||
// Always build ones vectors as <4 x i32> or <2 x i32> bitcasted to their dest
|
// Always build ones vectors as <16 x i32> or <8 x i32> bitcasted to their
|
||||||
// type. This ensures they get CSE'd.
|
// dest type. This ensures they get CSE'd.
|
||||||
SDValue Vec;
|
SDValue Vec;
|
||||||
SDValue Cst = DAG.getTargetConstant(~0U, MVT::i32);
|
SDValue Cst = DAG.getTargetConstant(0xFF, MVT::i8);
|
||||||
if (VT.getSizeInBits() == 64)
|
SmallVector<SDValue, 8> Ops;
|
||||||
Vec = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v2i32, Cst, Cst);
|
MVT TVT;
|
||||||
else
|
|
||||||
Vec = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v4i32, Cst, Cst, Cst, Cst);
|
if (VT.getSizeInBits() == 64) {
|
||||||
|
Ops.assign(8, Cst); TVT = MVT::v8i8;
|
||||||
|
} else {
|
||||||
|
Ops.assign(16, Cst); TVT = MVT::v16i8;
|
||||||
|
}
|
||||||
|
Vec = DAG.getNode(ISD::BUILD_VECTOR, dl, TVT, &Ops[0], Ops.size());
|
||||||
|
|
||||||
return DAG.getNode(ISD::BIT_CONVERT, dl, VT, Vec);
|
return DAG.getNode(ISD::BIT_CONVERT, dl, VT, Vec);
|
||||||
}
|
}
|
||||||
|
@ -1600,21 +1600,25 @@ def VORRq : N3VQ<0, 0, 0b10, 0b0001, 1, "vorr", v4i32, v4i32, or, 1>;
|
|||||||
def VBICd : N3V<0, 0, 0b01, 0b0001, 0, 1, (outs DPR:$dst),
|
def VBICd : N3V<0, 0, 0b01, 0b0001, 0, 1, (outs DPR:$dst),
|
||||||
(ins DPR:$src1, DPR:$src2), NoItinerary,
|
(ins DPR:$src1, DPR:$src2), NoItinerary,
|
||||||
"vbic\t$dst, $src1, $src2", "",
|
"vbic\t$dst, $src1, $src2", "",
|
||||||
[(set DPR:$dst, (v2i32 (and DPR:$src1,(vnot DPR:$src2))))]>;
|
[(set DPR:$dst, (v2i32 (and DPR:$src1,
|
||||||
|
(vnot_conv DPR:$src2))))]>;
|
||||||
def VBICq : N3V<0, 0, 0b01, 0b0001, 1, 1, (outs QPR:$dst),
|
def VBICq : N3V<0, 0, 0b01, 0b0001, 1, 1, (outs QPR:$dst),
|
||||||
(ins QPR:$src1, QPR:$src2), NoItinerary,
|
(ins QPR:$src1, QPR:$src2), NoItinerary,
|
||||||
"vbic\t$dst, $src1, $src2", "",
|
"vbic\t$dst, $src1, $src2", "",
|
||||||
[(set QPR:$dst, (v4i32 (and QPR:$src1,(vnot QPR:$src2))))]>;
|
[(set QPR:$dst, (v4i32 (and QPR:$src1,
|
||||||
|
(vnot_conv QPR:$src2))))]>;
|
||||||
|
|
||||||
// VORN : Vector Bitwise OR NOT
|
// VORN : Vector Bitwise OR NOT
|
||||||
def VORNd : N3V<0, 0, 0b11, 0b0001, 0, 1, (outs DPR:$dst),
|
def VORNd : N3V<0, 0, 0b11, 0b0001, 0, 1, (outs DPR:$dst),
|
||||||
(ins DPR:$src1, DPR:$src2), NoItinerary,
|
(ins DPR:$src1, DPR:$src2), NoItinerary,
|
||||||
"vorn\t$dst, $src1, $src2", "",
|
"vorn\t$dst, $src1, $src2", "",
|
||||||
[(set DPR:$dst, (v2i32 (or DPR:$src1, (vnot DPR:$src2))))]>;
|
[(set DPR:$dst, (v2i32 (or DPR:$src1,
|
||||||
|
(vnot_conv DPR:$src2))))]>;
|
||||||
def VORNq : N3V<0, 0, 0b11, 0b0001, 1, 1, (outs QPR:$dst),
|
def VORNq : N3V<0, 0, 0b11, 0b0001, 1, 1, (outs QPR:$dst),
|
||||||
(ins QPR:$src1, QPR:$src2), NoItinerary,
|
(ins QPR:$src1, QPR:$src2), NoItinerary,
|
||||||
"vorn\t$dst, $src1, $src2", "",
|
"vorn\t$dst, $src1, $src2", "",
|
||||||
[(set QPR:$dst, (v4i32 (or QPR:$src1, (vnot QPR:$src2))))]>;
|
[(set QPR:$dst, (v4i32 (or QPR:$src1,
|
||||||
|
(vnot_conv QPR:$src2))))]>;
|
||||||
|
|
||||||
// VMVN : Vector Bitwise NOT
|
// VMVN : Vector Bitwise NOT
|
||||||
def VMVNd : N2V<0b11, 0b11, 0b00, 0b00, 0b01011, 0, 0,
|
def VMVNd : N2V<0b11, 0b11, 0b00, 0b00, 0b01011, 0, 0,
|
||||||
@ -1634,13 +1638,13 @@ def VBSLd : N3V<1, 0, 0b01, 0b0001, 0, 1, (outs DPR:$dst),
|
|||||||
"vbsl\t$dst, $src2, $src3", "$src1 = $dst",
|
"vbsl\t$dst, $src2, $src3", "$src1 = $dst",
|
||||||
[(set DPR:$dst,
|
[(set DPR:$dst,
|
||||||
(v2i32 (or (and DPR:$src2, DPR:$src1),
|
(v2i32 (or (and DPR:$src2, DPR:$src1),
|
||||||
(and DPR:$src3, (vnot DPR:$src1)))))]>;
|
(and DPR:$src3, (vnot_conv DPR:$src1)))))]>;
|
||||||
def VBSLq : N3V<1, 0, 0b01, 0b0001, 1, 1, (outs QPR:$dst),
|
def VBSLq : N3V<1, 0, 0b01, 0b0001, 1, 1, (outs QPR:$dst),
|
||||||
(ins QPR:$src1, QPR:$src2, QPR:$src3), NoItinerary,
|
(ins QPR:$src1, QPR:$src2, QPR:$src3), NoItinerary,
|
||||||
"vbsl\t$dst, $src2, $src3", "$src1 = $dst",
|
"vbsl\t$dst, $src2, $src3", "$src1 = $dst",
|
||||||
[(set QPR:$dst,
|
[(set QPR:$dst,
|
||||||
(v4i32 (or (and QPR:$src2, QPR:$src1),
|
(v4i32 (or (and QPR:$src2, QPR:$src1),
|
||||||
(and QPR:$src3, (vnot QPR:$src1)))))]>;
|
(and QPR:$src3, (vnot_conv QPR:$src1)))))]>;
|
||||||
|
|
||||||
// VBIF : Vector Bitwise Insert if False
|
// VBIF : Vector Bitwise Insert if False
|
||||||
// like VBSL but with: "vbif\t$dst, $src3, $src1", "$src2 = $dst",
|
// like VBSL but with: "vbif\t$dst, $src3, $src1", "$src2 = $dst",
|
||||||
|
10
test/CodeGen/ARM/2009-09-09-AllOnes.ll
Normal file
10
test/CodeGen/ARM/2009-09-09-AllOnes.ll
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
; RUN: llc -mattr=+neon < %s
|
||||||
|
target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:32"
|
||||||
|
target triple = "thumbv7-elf"
|
||||||
|
|
||||||
|
define arm_apcscc void @foo() {
|
||||||
|
entry:
|
||||||
|
%0 = insertelement <4 x i32> undef, i32 -1, i32 3
|
||||||
|
store <4 x i32> %0, <4 x i32>* undef, align 16
|
||||||
|
unreachable
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user