[llvm-commits] CVS: llvm/include/llvm/IntrinsicsX86.td
Changes in directory llvm/include/llvm: IntrinsicsX86.td updated: 1.2 -> 1.3 --- Log message: Add more SSE intrinsics --- Diffs of the changes: (+118 -94) IntrinsicsX86.td | 212 ++- 1 files changed, 118 insertions(+), 94 deletions(-) Index: llvm/include/llvm/IntrinsicsX86.td diff -u llvm/include/llvm/IntrinsicsX86.td:1.2 llvm/include/llvm/IntrinsicsX86.td:1.3 --- llvm/include/llvm/IntrinsicsX86.td:1.2 Mon Mar 27 02:23:12 2006 +++ llvm/include/llvm/IntrinsicsX86.td Wed Mar 29 00:07:16 2006 @@ -18,73 +18,45 @@ // Arithmetic ops let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.". def int_x86_sse_add_ss : GCCBuiltin<"__builtin_ia32_addss">, - Intrinsic<[llvm_float_ty, llvm_float_ty, - llvm_float_ty], [InstrNoMem]>; - def int_x86_sse_add_ps : GCCBuiltin<"__builtin_ia32_addps">, Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty], [InstrNoMem]>; def int_x86_sse_sub_ss : GCCBuiltin<"__builtin_ia32_subss">, - Intrinsic<[llvm_float_ty, llvm_float_ty, - llvm_float_ty], [InstrNoMem]>; - def int_x86_sse_sub_ps : GCCBuiltin<"__builtin_ia32_subps">, Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty], [InstrNoMem]>; def int_x86_sse_mul_ss : GCCBuiltin<"__builtin_ia32_mulss">, - Intrinsic<[llvm_float_ty, llvm_float_ty, - llvm_float_ty], [InstrNoMem]>; - def int_x86_sse_mul_ps : GCCBuiltin<"__builtin_ia32_mulps">, Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty], [InstrNoMem]>; def int_x86_sse_div_ss : GCCBuiltin<"__builtin_ia32_divss">, - Intrinsic<[llvm_float_ty, llvm_float_ty, - llvm_float_ty], [InstrNoMem]>; - def int_x86_sse_div_ps : GCCBuiltin<"__builtin_ia32_divps">, Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty], [InstrNoMem]>; def int_x86_sse_sqrt_ss : GCCBuiltin<"__builtin_ia32_sqrtss">, - Intrinsic<[llvm_float_ty, llvm_float_ty, - llvm_float_ty], [InstrNoMem]>; + Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty], +[InstrNoMem]>; def int_x86_sse_sqrt_ps : GCCBuiltin<"__builtin_ia32_sqrtps">, - Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty, - llvm_v4f32_ty], [InstrNoMem]>; + Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty], +[InstrNoMem]>; def int_x86_sse_rcp_ss : GCCBuiltin<"__builtin_ia32_rcpss">, - Intrinsic<[llvm_float_ty, llvm_float_ty, - llvm_float_ty], [InstrNoMem]>; + Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty], +[InstrNoMem]>; def int_x86_sse_rcp_ps : GCCBuiltin<"__builtin_ia32_rcpps">, - Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty, - llvm_v4f32_ty], [InstrNoMem]>; + Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty], +[InstrNoMem]>; def int_x86_sse_rsqrt_ss : GCCBuiltin<"__builtin_ia32_rsqrtss">, - Intrinsic<[llvm_float_ty, llvm_float_ty, - llvm_float_ty], [InstrNoMem]>; + Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty], +[InstrNoMem]>; def int_x86_sse_rsqrt_ps : GCCBuiltin<"__builtin_ia32_rsqrtps">, + Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty], +[InstrNoMem]>; + def int_x86_sse_min_ss : GCCBuiltin<"__builtin_ia32_minss">, Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty], [InstrNoMem]>; - def int_x86_sse_min_ss : GCCBuiltin<"__builtin_ia32_minss">, - Intrinsic<[llvm_float_ty, llvm_float_ty, - llvm_float_ty], [InstrNoMem]>; def int_x86_sse_min_ps : GCCBuiltin<"__builtin_ia32_minps">, Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty], [InstrNoMem]>; def int_x86_sse_max_ss : GCCBuiltin<"__builtin_ia32_maxss">, - Intrinsic<[llvm_float_ty, llvm_float_ty, - llvm_float_ty], [InstrNoMem]>; - def int_x86_sse_max_ps : GCCBuiltin<"__builtin_ia32_maxps">, Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty], [InstrNoMem]>; -} - -// Logical ops -let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.". - def int_x86_sse_and_ps : GCCBuiltin<"__builtin_ia32_andps">, - Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty, - llvm_v4f32_ty], [InstrNoMem]>; - def int_x86_sse_andnot_ps : GCCBuiltin<"__builtin_ia32_andnotps">, - Intrinsic<[llvm_v4f32_ty, llvm_v4f32_ty, - llvm_v4f32_ty], [InstrNoMem]>; - def int_x86_sse_or_
[llvm-commits] CVS: llvm/lib/Target/X86/README.txt
Changes in directory llvm/lib/Target/X86: README.txt updated: 1.77 -> 1.78 --- Log message: Another entry about shuffles. --- Diffs of the changes: (+6 -0) README.txt |6 ++ 1 files changed, 6 insertions(+) Index: llvm/lib/Target/X86/README.txt diff -u llvm/lib/Target/X86/README.txt:1.77 llvm/lib/Target/X86/README.txt:1.78 --- llvm/lib/Target/X86/README.txt:1.77 Tue Mar 28 00:55:45 2006 +++ llvm/lib/Target/X86/README.txt Tue Mar 28 21:03:46 2006 @@ -667,3 +667,9 @@ Use movhps to update upper 64-bits of a v4sf value. Also movlps on lower half of a v4sf value. + +//===-===// + +Better codegen for vector_shuffles like this { x, 0, 0, 0 } or { x, 0, x, 0}. +Perhaps use pxor / xorp* to clear a XMM register first? + ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp X86InstrSSE.td
Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.142 -> 1.143 X86InstrSSE.td updated: 1.41 -> 1.42 --- Log message: - More shuffle related bug fixes. - Whenever possible use ops of the right packed types for vector shuffles / splats. --- Diffs of the changes: (+30 -47) X86ISelLowering.cpp | 35 +-- X86InstrSSE.td | 42 +- 2 files changed, 30 insertions(+), 47 deletions(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.142 llvm/lib/Target/X86/X86ISelLowering.cpp:1.143 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.142 Tue Mar 28 19:30:51 2006 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Tue Mar 28 21:04:49 2006 @@ -2403,43 +2403,18 @@ return SDOperand(); // PSHUFD's 2nd vector must be undef. -if (MVT::isInteger(VT) && X86::isPSHUFDMask(PermMask.Val)) - if (V2.getOpcode() == ISD::UNDEF) -return SDOperand(); - else +if (MVT::isInteger(VT) && X86::isPSHUFDMask(PermMask.Val)) { + if (V2.getOpcode() != ISD::UNDEF) return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V1, - DAG.getNode(ISD::UNDEF, V1.getValueType()), - PermMask); + DAG.getNode(ISD::UNDEF, V1.getValueType()),PermMask); + return SDOperand(); +} if (NumElems == 2 || X86::isSplatMask(PermMask.Val) || X86::isSHUFPMask(PermMask.Val)) { return NormalizeVectorShuffle(V1, V2, PermMask, VT, DAG); } -#if 0 -else if (X86::isSplatMask(PermMask.Val)) { - // Handle splat cases. - if (V2.getOpcode() == ISD::UNDEF) -// Leave the VECTOR_SHUFFLE alone. It matches SHUFP*. -return SDOperand(); - else -// Make it match SHUFP* or UNPCKLPD. Second vector is undef since it's -// not needed. -return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V1, - DAG.getNode(ISD::UNDEF, V1.getValueType()), - PermMask); -} else if (X86::isPSHUFDMask(PermMask.Val)) { - if (V2.getOpcode() == ISD::UNDEF) -// Leave the VECTOR_SHUFFLE alone. It matches PSHUFD. -return SDOperand(); - else -// Make it match PSHUFD. Second vector is undef since it's not needed. -return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V1, - DAG.getNode(ISD::UNDEF, V1.getValueType()), - PermMask); -} else if (X86::isSHUFPMask(PermMask.Val)) - return NormalizeVectorShuffle(V1, V2, PermMask, VT, DAG); -#endif assert(0 && "Unexpected VECTOR_SHUFFLE to lower"); abort(); Index: llvm/lib/Target/X86/X86InstrSSE.td diff -u llvm/lib/Target/X86/X86InstrSSE.td:1.41 llvm/lib/Target/X86/X86InstrSSE.td:1.42 --- llvm/lib/Target/X86/X86InstrSSE.td:1.41 Tue Mar 28 19:30:51 2006 +++ llvm/lib/Target/X86/X86InstrSSE.td Tue Mar 28 21:04:49 2006 @@ -55,11 +55,7 @@ return getI8Imm(X86::getShuffleSHUFImmediate(N)); }]>; -def SHUFP_splat_mask : PatLeaf<(build_vector), [{ - return X86::isSplatMask(N); -}], SHUFFLE_get_shuf_imm>; - -def MOVLHPS_splat_mask : PatLeaf<(build_vector), [{ +def v2f64_v2i64_splat_mask : PatLeaf<(build_vector), [{ return X86::isSplatMask(N); }]>; @@ -87,6 +83,12 @@ return X86::isSHUFPMask(N); }], SHUFFLE_get_shuf_imm>; +// Only use SHUFP for v4i32 if no other options are available. +// FIXME: add tblgen hook to reduce the complexity of pattern. +def SHUFP_v4i32_shuffle_mask : PatLeaf<(build_vector), [{ + return !X86::isUNPCKHMask(N) && !X86::isPSHUFDMask(N) && X86::isSHUFPMask(N); +}], SHUFFLE_get_shuf_imm>; + //===--===// // SSE scalar FP Instructions //===--===// @@ -1327,6 +1329,8 @@ Requires<[HasSSE2]>; // bit_convert +def : Pat<(v2i64 (bitconvert (v4i32 VR128:$src))), (v2i64 VR128:$src)>, + Requires<[HasSSE2]>; def : Pat<(v4i32 (bitconvert (v4f32 VR128:$src))), (v4i32 VR128:$src)>, Requires<[HasSSE2]>; def : Pat<(v4f32 (bitconvert (v4i32 VR128:$src))), (v4f32 VR128:$src)>, @@ -1346,16 +1350,20 @@ def : Pat<(v16i8 (X86zexts2vec R8:$src)), (MOVZD128rr (V_SET0_PI), (MOVZX32rr8 R8:$src))>, Requires<[HasSSE2]>; -// Splat v4f32 / v4i32 -def : Pat<(vector_shuffle (v4f32 VR128:$src), (undef), SHUFP_splat_mask:$sm), - (v4f32 (SHUFPSrr VR128:$src, VR128:$src, SHUFP_splat_mask:$sm))>, - Requires<[HasSSE1]>; -def : Pat<(vector_shuffle (v4i32 VR128:$src), (undef), SHUFP_splat_mask:$sm), - (v4i32 (SHUFPSrr VR128:$src, VR128:$src, SHUFP_splat_mask:$sm))>, - Requires<[HasSSE2]>; - // Splat v2f64 / v2i64 -def : Pat<(vector_shuffle (v2f64 VR128:$src), (undef), MOVLHPS_splat_mask:$sm), - (v2f64 (MOVLHPSrr VR128:$src, VR128:$src))>, Requires<[
[llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp X86InstrSSE.td
Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.141 -> 1.142 X86InstrSSE.td updated: 1.40 -> 1.41 --- Log message: - Only use pshufd for v4i32 vector shuffles. - Other shuffle related fixes. --- Diffs of the changes: (+83 -61) X86ISelLowering.cpp | 51 +--- X86InstrSSE.td | 93 +--- 2 files changed, 83 insertions(+), 61 deletions(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.141 llvm/lib/Target/X86/X86ISelLowering.cpp:1.142 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.141 Tue Mar 28 17:41:33 2006 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Tue Mar 28 19:30:51 2006 @@ -1583,15 +1583,21 @@ return Mask; } -/// CommuteVectorShuffleIfNeeded - Swap vector_shuffle operands (as well as -/// values in ther permute mask if needed. Return an empty SDOperand is it is -/// already well formed. -static SDOperand CommuteVectorShuffleIfNeeded(SDOperand V1, SDOperand V2, - SDOperand Mask, MVT::ValueType VT, - SelectionDAG &DAG) { +/// NormalizeVectorShuffle - Swap vector_shuffle operands (as well as +/// values in ther permute mask if needed. Use V1 as second vector if it is +/// undef. Return an empty SDOperand is it is already well formed. +static SDOperand NormalizeVectorShuffle(SDOperand V1, SDOperand V2, +SDOperand Mask, MVT::ValueType VT, +SelectionDAG &DAG) { unsigned NumElems = Mask.getNumOperands(); SDOperand Half1 = Mask.getOperand(0); SDOperand Half2 = Mask.getOperand(NumElems/2); + bool V2Undef = false; + if (V2.getOpcode() == ISD::UNDEF) { +V2Undef = true; +V2 = V1; + } + if (cast(Half1)->getValue() >= NumElems && cast(Half2)->getValue() < NumElems) { // Swap the operands and change mask. @@ -1604,6 +1610,10 @@ DAG.getNode(ISD::BUILD_VECTOR, Mask.getValueType(), MaskVec); return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V2, V1, Mask); } + + if (V2Undef) +return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V1, V1, Mask); + return SDOperand(); } @@ -2387,8 +2397,26 @@ MVT::ValueType VT = Op.getValueType(); unsigned NumElems = PermMask.getNumOperands(); -if (NumElems == 2) - return CommuteVectorShuffleIfNeeded(V1, V2, PermMask, VT, DAG); +if (X86::isUNPCKLMask(PermMask.Val) || +X86::isUNPCKHMask(PermMask.Val)) + // Leave the VECTOR_SHUFFLE alone. It matches {P}UNPCKL*. + return SDOperand(); + +// PSHUFD's 2nd vector must be undef. +if (MVT::isInteger(VT) && X86::isPSHUFDMask(PermMask.Val)) + if (V2.getOpcode() == ISD::UNDEF) +return SDOperand(); + else +return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V1, + DAG.getNode(ISD::UNDEF, V1.getValueType()), + PermMask); + +if (NumElems == 2 || +X86::isSplatMask(PermMask.Val) || +X86::isSHUFPMask(PermMask.Val)) { + return NormalizeVectorShuffle(V1, V2, PermMask, VT, DAG); +} +#if 0 else if (X86::isSplatMask(PermMask.Val)) { // Handle splat cases. if (V2.getOpcode() == ISD::UNDEF) @@ -2400,10 +2428,6 @@ return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V1, DAG.getNode(ISD::UNDEF, V1.getValueType()), PermMask); -} else if (X86::isUNPCKLMask(PermMask.Val) || - X86::isUNPCKHMask(PermMask.Val)) { - // Leave the VECTOR_SHUFFLE alone. It matches {P}UNPCKL*. - return SDOperand(); } else if (X86::isPSHUFDMask(PermMask.Val)) { if (V2.getOpcode() == ISD::UNDEF) // Leave the VECTOR_SHUFFLE alone. It matches PSHUFD. @@ -2414,7 +2438,8 @@ DAG.getNode(ISD::UNDEF, V1.getValueType()), PermMask); } else if (X86::isSHUFPMask(PermMask.Val)) - return CommuteVectorShuffleIfNeeded(V1, V2, PermMask, VT, DAG); + return NormalizeVectorShuffle(V1, V2, PermMask, VT, DAG); +#endif assert(0 && "Unexpected VECTOR_SHUFFLE to lower"); abort(); Index: llvm/lib/Target/X86/X86InstrSSE.td diff -u llvm/lib/Target/X86/X86InstrSSE.td:1.40 llvm/lib/Target/X86/X86InstrSSE.td:1.41 --- llvm/lib/Target/X86/X86InstrSSE.td:1.40 Tue Mar 28 17:51:43 2006 +++ llvm/lib/Target/X86/X86InstrSSE.td Tue Mar 28 19:30:51 2006 @@ -79,9 +79,8 @@ return X86::isUNPCKHMask(N); }]>; -// Only use PSHUF if it is not a splat. def PSHUFD_shuffle_mask : PatLeaf<(build_vector), [{ - return !X86::isSplatMask(N) && X86::isPSHUFDMask(N); + return X86::isPSHUFDMask(N); }], SHUFFLE_get_shuf_imm>; def SHUFP_shuffle_mask : PatLeaf<(build_vector), [{ @@ -918,86 +917,92 @@ "pshufw {$src2, $src1, $dst|$dst, $src1, $src2}", []>; def PSHUFDrr : PDIi8<
[llvm-commits] CVS: llvm/lib/Target/PowerPC/README_ALTIVEC.txt
Changes in directory llvm/lib/Target/PowerPC: README_ALTIVEC.txt updated: 1.5 -> 1.6 --- Log message: add a note --- Diffs of the changes: (+4 -0) README_ALTIVEC.txt |4 1 files changed, 4 insertions(+) Index: llvm/lib/Target/PowerPC/README_ALTIVEC.txt diff -u llvm/lib/Target/PowerPC/README_ALTIVEC.txt:1.5 llvm/lib/Target/PowerPC/README_ALTIVEC.txt:1.6 --- llvm/lib/Target/PowerPC/README_ALTIVEC.txt:1.5 Tue Mar 28 12:56:23 2006 +++ llvm/lib/Target/PowerPC/README_ALTIVEC.txt Tue Mar 28 18:24:13 2006 @@ -145,3 +145,7 @@ //===--===// +Instcombine llvm.ppc.altivec.vperm with an immediate into a shuffle operation. + +//===--===// + ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/test/Regression/CodeGen/Generic/vector-constantexpr.ll
Changes in directory llvm/test/Regression/CodeGen/Generic: vector-constantexpr.ll added (r1.1) --- Log message: new testcase --- Diffs of the changes: (+10 -0) vector-constantexpr.ll | 10 ++ 1 files changed, 10 insertions(+) Index: llvm/test/Regression/CodeGen/Generic/vector-constantexpr.ll diff -c /dev/null llvm/test/Regression/CodeGen/Generic/vector-constantexpr.ll:1.1 *** /dev/null Tue Mar 28 18:12:18 2006 --- llvm/test/Regression/CodeGen/Generic/vector-constantexpr.ll Tue Mar 28 18:12:08 2006 *** *** 0 --- 1,10 + ; RUN: llvm-as < %s | llc + + void ""(float* %inregs, float* %outregs) { + %a_addr.i = alloca <4 x float> ; <<4 x float>*> [#uses=1] + store <4 x float> < float extractelement (<4 x float> undef, uint 3), float extractelement (<4 x float> undef, uint 0), float extractelement (<4 x float> undef, uint 1), float extractelement (<4 x float> undef, uint 2) >, <4 x float>* %a_addr.i + ret void + } + + + ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.211 -> 1.212 --- Log message: Bug fixes: handle constantexpr insert/extract element operations Handle constantpacked vectors with constantexpr elements. This fixes CodeGen/Generic/vector-constantexpr.ll --- Diffs of the changes: (+6 -16) SelectionDAGISel.cpp | 22 ++ 1 files changed, 6 insertions(+), 16 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.211 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.212 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.211Tue Mar 28 07:45:20 2006 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Tue Mar 28 18:11:43 2006 @@ -507,8 +507,8 @@ void visitSetLT(User &I) { visitSetCC(I, ISD::SETLT, ISD::SETULT); } void visitSetGT(User &I) { visitSetCC(I, ISD::SETGT, ISD::SETUGT); } - void visitExtractElement(ExtractElementInst &I); - void visitInsertElement(InsertElementInst &I); + void visitExtractElement(User &I); + void visitInsertElement(User &I); void visitGetElementPtr(User &I); void visitCast(User &I); @@ -586,18 +586,8 @@ // the packed constant. std::vector Ops; if (ConstantPacked *CP = dyn_cast(C)) { -if (MVT::isFloatingPoint(PVT)) { - for (unsigned i = 0; i != NumElements; ++i) { -const ConstantFP *El = cast(CP->getOperand(i)); -Ops.push_back(DAG.getConstantFP(El->getValue(), PVT)); - } -} else { - for (unsigned i = 0; i != NumElements; ++i) { -const ConstantIntegral *El = -cast(CP->getOperand(i)); -Ops.push_back(DAG.getConstant(El->getRawValue(), PVT)); - } -} +for (unsigned i = 0; i != NumElements; ++i) + Ops.push_back(getValue(CP->getOperand(i))); } else { assert(isa(C) && "Unknown packed constant!"); SDOperand Op; @@ -1020,7 +1010,7 @@ } } -void SelectionDAGLowering::visitInsertElement(InsertElementInst &I) { +void SelectionDAGLowering::visitInsertElement(User &I) { SDOperand InVec = getValue(I.getOperand(0)); SDOperand InVal = getValue(I.getOperand(1)); SDOperand InIdx = DAG.getNode(ISD::ZERO_EXTEND, TLI.getPointerTy(), @@ -1032,7 +1022,7 @@ InVec, InVal, InIdx, Num, Typ)); } -void SelectionDAGLowering::visitExtractElement(ExtractElementInst &I) { +void SelectionDAGLowering::visitExtractElement(User &I) { SDOperand InVec = getValue(I.getOperand(0)); SDOperand InIdx = DAG.getNode(ISD::ZERO_EXTEND, TLI.getPointerTy(), getValue(I.getOperand(1))); ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/Target/X86/X86InstrSSE.td
Changes in directory llvm/lib/Target/X86: X86InstrSSE.td updated: 1.39 -> 1.40 --- Log message: Added aliases to scalar SSE instructions, e.g. addss, to match x86 intrinsics. The source operands type are v4sf with upper bits passes through. Added matching code for these. --- Diffs of the changes: (+201 -47) X86InstrSSE.td | 248 ++--- 1 files changed, 201 insertions(+), 47 deletions(-) Index: llvm/lib/Target/X86/X86InstrSSE.td diff -u llvm/lib/Target/X86/X86InstrSSE.td:1.39 llvm/lib/Target/X86/X86InstrSSE.td:1.40 --- llvm/lib/Target/X86/X86InstrSSE.td:1.39 Tue Mar 28 01:01:28 2006 +++ llvm/lib/Target/X86/X86InstrSSE.td Tue Mar 28 17:51:43 2006 @@ -174,53 +174,6 @@ [(set VR128:$dst, (v2f64 (scalar_to_vector (loadf64 addr:$src]>; - -// Conversion instructions -def CVTSS2SIrr: SSI<0x2D, MRMSrcReg, (ops R32:$dst, FR32:$src), - "cvtss2si {$src, $dst|$dst, $src}", []>; -def CVTSS2SIrm: SSI<0x2D, MRMSrcMem, (ops R32:$dst, f32mem:$src), - "cvtss2si {$src, $dst|$dst, $src}", []>; - -def CVTTSS2SIrr: SSI<0x2C, MRMSrcReg, (ops R32:$dst, FR32:$src), - "cvttss2si {$src, $dst|$dst, $src}", - [(set R32:$dst, (fp_to_sint FR32:$src))]>; -def CVTTSS2SIrm: SSI<0x2C, MRMSrcMem, (ops R32:$dst, f32mem:$src), - "cvttss2si {$src, $dst|$dst, $src}", - [(set R32:$dst, (fp_to_sint (loadf32 addr:$src)))]>; -def CVTTSD2SIrr: SDI<0x2C, MRMSrcReg, (ops R32:$dst, FR64:$src), - "cvttsd2si {$src, $dst|$dst, $src}", - [(set R32:$dst, (fp_to_sint FR64:$src))]>; -def CVTTSD2SIrm: SDI<0x2C, MRMSrcMem, (ops R32:$dst, f64mem:$src), - "cvttsd2si {$src, $dst|$dst, $src}", - [(set R32:$dst, (fp_to_sint (loadf64 addr:$src)))]>; -def CVTSD2SSrr: SDI<0x5A, MRMSrcReg, (ops FR32:$dst, FR64:$src), - "cvtsd2ss {$src, $dst|$dst, $src}", - [(set FR32:$dst, (fround FR64:$src))]>; -def CVTSD2SSrm: SDI<0x5A, MRMSrcMem, (ops FR32:$dst, f64mem:$src), - "cvtsd2ss {$src, $dst|$dst, $src}", - [(set FR32:$dst, (fround (loadf64 addr:$src)))]>; -def CVTSI2SSrr: SSI<0x2A, MRMSrcReg, (ops FR32:$dst, R32:$src), - "cvtsi2ss {$src, $dst|$dst, $src}", - [(set FR32:$dst, (sint_to_fp R32:$src))]>; -def CVTSI2SSrm: SSI<0x2A, MRMSrcMem, (ops FR32:$dst, i32mem:$src), - "cvtsi2ss {$src, $dst|$dst, $src}", - [(set FR32:$dst, (sint_to_fp (loadi32 addr:$src)))]>; -def CVTSI2SDrr: SDI<0x2A, MRMSrcReg, (ops FR64:$dst, R32:$src), - "cvtsi2sd {$src, $dst|$dst, $src}", - [(set FR64:$dst, (sint_to_fp R32:$src))]>; -def CVTSI2SDrm: SDI<0x2A, MRMSrcMem, (ops FR64:$dst, i32mem:$src), - "cvtsi2sd {$src, $dst|$dst, $src}", - [(set FR64:$dst, (sint_to_fp (loadi32 addr:$src)))]>; -// SSE2 instructions with XS prefix -def CVTSS2SDrr: I<0x5A, MRMSrcReg, (ops FR64:$dst, FR32:$src), - "cvtss2sd {$src, $dst|$dst, $src}", - [(set FR64:$dst, (fextend FR32:$src))]>, XS, -Requires<[HasSSE2]>; -def CVTSS2SDrm: I<0x5A, MRMSrcMem, (ops FR64:$dst, f32mem:$src), - "cvtss2sd {$src, $dst|$dst, $src}", - [(set FR64:$dst, (fextend (loadf32 addr:$src)))]>, XS, -Requires<[HasSSE2]>; - // Arithmetic instructions let isTwoAddress = 1 in { let isCommutable = 1 in { @@ -317,6 +270,207 @@ def MINSDrm : SDI<0x5D, MRMSrcMem, (ops FR64:$dst, f64mem:$src), "minsd {$src, $dst|$dst, $src}", []>; + +// Aliases to match intrinsics which expect XMM operand(s). +let isTwoAddress = 1 in { +let isCommutable = 1 in { +def Int_ADDSSrr : SSI<0x58, MRMSrcReg, (ops VR128:$dst, VR128:$src1, +VR128:$src2), +"addss {$src2, $dst|$dst, $src2}", +[(set VR128:$dst, (int_x86_sse_add_ss VR128:$src1, + VR128:$src2))]>; +def Int_ADDSDrr : SDI<0x58, MRMSrcReg, (ops VR128:$dst, VR128:$src1, +VR128:$src2), +"addsd {$src2, $dst|$dst, $src2}", +[(set VR128:$dst, (int_x86_sse2_add_sd VR128:$src1, + VR128:$src2))]>; +def Int_MULSSrr : SSI<0x59, MRMSrcReg, (ops VR128:$dst, VR128:$src1, +VR128:$src2), +"mulss {$src2, $dst|$dst, $src2}", +[(set VR128:$dst, (int_x86_sse_mul_ss VR128:$src1, + VR128:$src2))]>; +def Int_MULSDrr : SDI<0x59, MRMSrcReg, (ops VR128:$dst, VR128:$src1, +VR128:$src2), +"mulsd {$src2, $dst|$dst, $src2}", +[(set VR128:$dst, (int_x86_
[llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp
Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.140 -> 1.141 --- Log message: Fixing buggy code. --- Diffs of the changes: (+6 -6) X86ISelLowering.cpp | 12 ++-- 1 files changed, 6 insertions(+), 6 deletions(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.140 llvm/lib/Target/X86/X86ISelLowering.cpp:1.141 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.140 Tue Mar 28 04:17:11 2006 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Tue Mar 28 17:41:33 2006 @@ -1571,14 +1571,14 @@ unsigned NumOperands = N->getNumOperands(); unsigned Shift = (NumOperands == 4) ? 2 : 1; unsigned Mask = 0; - unsigned i = NumOperands - 1; - do { -unsigned Val = cast(N->getOperand(i))->getValue(); + for (unsigned i = 0; i < NumOperands; ++i) { +unsigned Val + = cast(N->getOperand(NumOperands-i-1))->getValue(); if (Val >= NumOperands) Val -= NumOperands; Mask |= Val; -Mask <<= Shift; ---i; - } while (i != 0); +if (i != NumOperands - 1) + Mask <<= Shift; + } return Mask; } ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/utils/TableGen/IntrinsicEmitter.cpp
Changes in directory llvm/utils/TableGen: IntrinsicEmitter.cpp updated: 1.16 -> 1.17 --- Log message: Don't sort the names before outputing the intrinsic name table. It causes a mismatch against the enum table. This is a part of Sabre's master plan to drive me nuts with subtle bugs that happens to only affect x86 be. :-) --- Diffs of the changes: (+2 -7) IntrinsicEmitter.cpp |9 ++--- 1 files changed, 2 insertions(+), 7 deletions(-) Index: llvm/utils/TableGen/IntrinsicEmitter.cpp diff -u llvm/utils/TableGen/IntrinsicEmitter.cpp:1.16 llvm/utils/TableGen/IntrinsicEmitter.cpp:1.17 --- llvm/utils/TableGen/IntrinsicEmitter.cpp:1.16 Fri Mar 24 13:49:31 2006 +++ llvm/utils/TableGen/IntrinsicEmitter.cppTue Mar 28 16:25:56 2006 @@ -100,16 +100,11 @@ void IntrinsicEmitter:: EmitIntrinsicToNameTable(const std::vector &Ints, std::ostream &OS) { - std::vector Names; - for (unsigned i = 0, e = Ints.size(); i != e; ++i) -Names.push_back(Ints[i].Name); - std::sort(Names.begin(), Names.end()); - OS << "// Intrinsic ID to name table\n"; OS << "#ifdef GET_INTRINSIC_NAME_TABLE\n"; OS << " // Note that entry #0 is the invalid intrinsic!\n"; - for (unsigned i = 0, e = Names.size(); i != e; ++i) -OS << " \"" << Names[i] << "\",\n"; + for (unsigned i = 0, e = Ints.size(); i != e; ++i) +OS << " \"" << Ints[i].Name << "\",\n"; OS << "#endif\n\n"; } ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: DAGCombiner.cpp updated: 1.132 -> 1.133 --- Log message: When building a VVECTOR_SHUFFLE node from extract_element operations, make sure to build it as SHUFFLE(X, undef, mask), not SHUFFLE(X, X, mask). The later is not canonical form, and prevents the PPC splat pattern from matching. For a particular splat, we go from generating this: li r10, lo16(LCPI1_0) lis r11, ha16(LCPI1_0) lvx v3, r11, r10 vperm v3, v2, v2, v3 to generating: vspltw v3, v2, 3 --- Diffs of the changes: (+11 -1) DAGCombiner.cpp | 12 +++- 1 files changed, 11 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.132 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.133 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.132 Tue Mar 28 16:11:53 2006 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Tue Mar 28 16:19:47 2006 @@ -2419,7 +2419,17 @@ // Return the new VVECTOR_SHUFFLE node. std::vector Ops; Ops.push_back(VecIn1); -Ops.push_back(VecIn2.Val ? VecIn2 : VecIn1); // Use V1 twice if no V2. +if (VecIn2.Val) { + Ops.push_back(VecIn2); +} else { + // Use an undef vbuild_vector as input for the second operand. + std::vector UnOps(NumInScalars, + DAG.getNode(ISD::UNDEF, + cast(EltType)->getVT())); + UnOps.push_back(NumElts); + UnOps.push_back(EltType); + Ops.push_back(DAG.getNode(ISD::VBUILD_VECTOR, MVT::Vector, UnOps)); +} Ops.push_back(DAG.getNode(ISD::VBUILD_VECTOR,MVT::Vector, BuildVecIndices)); Ops.push_back(NumElts); Ops.push_back(EltType); ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm-test/SingleSource/UnitTests/Vector/Altivec/casts.c
Changes in directory llvm-test/SingleSource/UnitTests/Vector/Altivec: casts.c added (r1.1) --- Log message: Random testcase from my collection --- Diffs of the changes: (+30 -0) casts.c | 30 ++ 1 files changed, 30 insertions(+) Index: llvm-test/SingleSource/UnitTests/Vector/Altivec/casts.c diff -c /dev/null llvm-test/SingleSource/UnitTests/Vector/Altivec/casts.c:1.1 *** /dev/null Tue Mar 28 16:28:47 2006 --- llvm-test/SingleSource/UnitTests/Vector/Altivec/casts.c Tue Mar 28 16:28:37 2006 *** *** 0 --- 1,30 + #include + #include + + typedef union { + float f[4]; + vector float v; + } floatToVector; + + + void test(float F, vector float *R) { +floatToVector FTV; +FTV.f[0] = F; +*R = (vector float) vec_splat((vector unsigned int)FTV.v, 0); + } + + void test2(float F, vector float *R) { +*R = (vector float)(F); + } + void test2a(float F, vector float *X, vector float *R) { +*R = (vector float)(F) + *X; + } + + + int main() { + floatToVector X; + int i; + test(12.34, &X.v); + + printf("%f %f %f %f\n", X.f[0], X.f[1], X.f[2], X.f[3]); + } ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: DAGCombiner.cpp updated: 1.131 -> 1.132 --- Log message: Canonicalize VECTOR_SHUFFLE(X, X, Y) -> VECTOR_SHUFFLE(X,undef,Y') --- Diffs of the changes: (+30 -0) DAGCombiner.cpp | 30 ++ 1 files changed, 30 insertions(+) Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.131 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.132 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.131 Tue Mar 28 14:28:38 2006 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Tue Mar 28 16:11:53 2006 @@ -212,6 +212,7 @@ SDOperand visitINSERT_VECTOR_ELT(SDNode *N); SDOperand visitVINSERT_VECTOR_ELT(SDNode *N); SDOperand visitVBUILD_VECTOR(SDNode *N); +SDOperand visitVECTOR_SHUFFLE(SDNode *N); SDOperand ReassociateOps(unsigned Opc, SDOperand LHS, SDOperand RHS); @@ -646,6 +647,7 @@ case ISD::INSERT_VECTOR_ELT: return visitINSERT_VECTOR_ELT(N); case ISD::VINSERT_VECTOR_ELT: return visitVINSERT_VECTOR_ELT(N); case ISD::VBUILD_VECTOR: return visitVBUILD_VECTOR(N); + case ISD::VECTOR_SHUFFLE: return visitVECTOR_SHUFFLE(N); } return SDOperand(); } @@ -2427,6 +2429,34 @@ return SDOperand(); } +SDOperand DAGCombiner::visitVECTOR_SHUFFLE(SDNode *N) { + // If the LHS and the RHS are the same node, turn the RHS into an undef. + if (N->getOperand(0) == N->getOperand(1)) { +// Check the SHUFFLE mask, mapping any inputs from the 2nd operand into the +// first operand. +std::vector MappedOps; +SDOperand ShufMask = N->getOperand(2); +unsigned NumElts = ShufMask.getNumOperands(); +for (unsigned i = 0, e = ShufMask.getNumOperands(); i != e; ++i) { + if (cast(ShufMask.getOperand(i))->getValue() >= NumElts) { +unsigned NewIdx = + cast(ShufMask.getOperand(i))->getValue() - NumElts; +MappedOps.push_back(DAG.getConstant(NewIdx, MVT::i32)); + } else { +MappedOps.push_back(ShufMask.getOperand(i)); + } +} +ShufMask = DAG.getNode(ISD::BUILD_VECTOR, ShufMask.getValueType(), + MappedOps); +return DAG.getNode(ISD::VECTOR_SHUFFLE, N->getValueType(0), + N->getOperand(0), + DAG.getNode(ISD::UNDEF, N->getValueType(0)), + ShufMask); + } + + return SDOperand(); +} + SDOperand DAGCombiner::SimplifySelect(SDOperand N0, SDOperand N1, SDOperand N2){ assert(N0.getOpcode() ==ISD::SETCC && "First argument must be a SetCC node!"); ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/test/Regression/CodeGen/X86/unpcklps.ll
Changes in directory llvm/test/Regression/CodeGen/X86: unpcklps.ll added (r1.1) --- Log message: new testcase --- Diffs of the changes: (+18 -0) unpcklps.ll | 18 ++ 1 files changed, 18 insertions(+) Index: llvm/test/Regression/CodeGen/X86/unpcklps.ll diff -c /dev/null llvm/test/Regression/CodeGen/X86/unpcklps.ll:1.1 *** /dev/null Tue Mar 28 14:32:22 2006 --- llvm/test/Regression/CodeGen/X86/unpcklps.llTue Mar 28 14:32:12 2006 *** *** 0 --- 1,18 + ; RUN: llvm-as < %s | llc -march=x86 -mcpu=yonah | grep unpcklps && + ; RUN: llvm-as < %s | llc -march=x86 -mcpu=yonah | not grep 'sub.*esp' + + void %test(<4 x float>* %res, <4 x float>* %A, <4 x float>* %B) { + %tmp = load <4 x float>* %B ; <<4 x float>> [#uses=2] + %tmp3 = load <4 x float>* %A; <<4 x float>> [#uses=2] + %tmp = extractelement <4 x float> %tmp3, uint 0 ; [#uses=1] + %tmp7 = extractelement <4 x float> %tmp, uint 0 ; [#uses=1] + %tmp8 = extractelement <4 x float> %tmp3, uint 1; [#uses=1] + %tmp9 = extractelement <4 x float> %tmp, uint 1 ; [#uses=1] + %tmp10 = insertelement <4 x float> undef, float %tmp, uint 0 ; <<4 x float>> [#uses=1] + %tmp11 = insertelement <4 x float> %tmp10, float %tmp7, uint 1 ; <<4 x float>> [#uses=1] + %tmp12 = insertelement <4 x float> %tmp11, float %tmp8, uint 2 ; <<4 x float>> [#uses=1] + %tmp13 = insertelement <4 x float> %tmp12, float %tmp9, uint 3 ; <<4 x float>> [#uses=1] + store <4 x float> %tmp13, <4 x float>* %res + ret void + } + ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: DAGCombiner.cpp updated: 1.130 -> 1.131 --- Log message: Turn a series of extract_element's feeding a build_vector into a vector_shuffle node. For this: void test(__m128 *res, __m128 *A, __m128 *B) { *res = _mm_unpacklo_ps(*A, *B); } we now produce this code: _test: movl 8(%esp), %eax movaps (%eax), %xmm0 movl 12(%esp), %eax unpcklps (%eax), %xmm0 movl 4(%esp), %eax movaps %xmm0, (%eax) ret instead of this: _test: subl $76, %esp movl 88(%esp), %eax movaps (%eax), %xmm0 movaps %xmm0, (%esp) movaps %xmm0, 32(%esp) movss 4(%esp), %xmm0 movss 32(%esp), %xmm1 unpcklps %xmm0, %xmm1 movl 84(%esp), %eax movaps (%eax), %xmm0 movaps %xmm0, 16(%esp) movaps %xmm0, 48(%esp) movss 20(%esp), %xmm0 movss 48(%esp), %xmm2 unpcklps %xmm0, %xmm2 unpcklps %xmm1, %xmm2 movl 80(%esp), %eax movaps %xmm2, (%eax) addl $76, %esp ret GCC produces this (with -fomit-frame-pointer): _test: subl$12, %esp movl20(%esp), %eax movaps (%eax), %xmm0 movl24(%esp), %eax unpcklps(%eax), %xmm0 movl16(%esp), %eax movaps %xmm0, (%eax) addl$12, %esp ret --- Diffs of the changes: (+86 -0) DAGCombiner.cpp | 86 1 files changed, 86 insertions(+) Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.130 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.131 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.130 Tue Mar 28 13:11:05 2006 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Tue Mar 28 14:28:38 2006 @@ -211,6 +211,7 @@ SDOperand visitSTORE(SDNode *N); SDOperand visitINSERT_VECTOR_ELT(SDNode *N); SDOperand visitVINSERT_VECTOR_ELT(SDNode *N); +SDOperand visitVBUILD_VECTOR(SDNode *N); SDOperand ReassociateOps(unsigned Opc, SDOperand LHS, SDOperand RHS); @@ -644,6 +645,7 @@ case ISD::STORE: return visitSTORE(N); case ISD::INSERT_VECTOR_ELT: return visitINSERT_VECTOR_ELT(N); case ISD::VINSERT_VECTOR_ELT: return visitVINSERT_VECTOR_ELT(N); + case ISD::VBUILD_VECTOR: return visitVBUILD_VECTOR(N); } return SDOperand(); } @@ -2341,6 +2343,90 @@ return SDOperand(); } +SDOperand DAGCombiner::visitVBUILD_VECTOR(SDNode *N) { + unsigned NumInScalars = N->getNumOperands()-2; + SDOperand NumElts = N->getOperand(NumInScalars); + SDOperand EltType = N->getOperand(NumInScalars+1); + + // Check to see if this is a VBUILD_VECTOR of a bunch of VEXTRACT_VECTOR_ELT + // operations. If so, and if the EXTRACT_ELT vector inputs come from at most + // two distinct vectors, turn this into a shuffle node. + SDOperand VecIn1, VecIn2; + for (unsigned i = 0; i != NumInScalars; ++i) { +// Ignore undef inputs. +if (N->getOperand(i).getOpcode() == ISD::UNDEF) continue; + +// If this input is something other than a VEXTRACT_VECTOR_ELT with a +// constant index, bail out. +if (N->getOperand(i).getOpcode() != ISD::VEXTRACT_VECTOR_ELT || +!isa(N->getOperand(i).getOperand(1))) { + VecIn1 = VecIn2 = SDOperand(0, 0); + break; +} + +// If the input vector type disagrees with the result of the vbuild_vector, +// we can't make a shuffle. +SDOperand ExtractedFromVec = N->getOperand(i).getOperand(0); +if (*(ExtractedFromVec.Val->op_end()-2) != NumElts || +*(ExtractedFromVec.Val->op_end()-1) != EltType) { + VecIn1 = VecIn2 = SDOperand(0, 0); + break; +} + +// Otherwise, remember this. We allow up to two distinct input vectors. +if (ExtractedFromVec == VecIn1 || ExtractedFromVec == VecIn2) + continue; + +if (VecIn1.Val == 0) { + VecIn1 = ExtractedFromVec; +} else if (VecIn2.Val == 0) { + VecIn2 = ExtractedFromVec; +} else { + // Too many inputs. + VecIn1 = VecIn2 = SDOperand(0, 0); + break; +} + } + + // If everything is good, we can make a shuffle operation. + if (VecIn1.Val) { +std::vector BuildVecIndices; +for (unsigned i = 0; i != NumInScalars; ++i) { + if (N->getOperand(i).getOpcode() == ISD::UNDEF) { +BuildVecIndices.push_back(DAG.getNode(ISD::UNDEF, MVT::i32)); +continue; + } + + SDOperand Extract = N->getOperand(i); + + // If extracting from the first vector, just use the index directly. + if (Extract.getOperand(0) == VecIn1) { +BuildVecIndices.push_back(Extract.getOperand(1)); +continue; + } + + // Otherwise, use InIdx + VecSize + unsigned Idx = cast(Extract.getOperand(1))->getValue(); + BuildVecIndices.push_back(DAG.getConstant(Idx+NumInScalars, MVT::i3
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.341 -> 1.342 --- Log message: Teach Legalize how to pack VVECTOR_SHUFFLE nodes into VECTOR_SHUFFLE nodes. --- Diffs of the changes: (+21 -0) LegalizeDAG.cpp | 21 + 1 files changed, 21 insertions(+) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.341 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.342 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.341 Mon Mar 27 18:40:09 2006 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Tue Mar 28 14:24:43 2006 @@ -4532,6 +4532,27 @@ Node->getOperand(1), Node->getOperand(2)); } break; + case ISD::VVECTOR_SHUFFLE: +if (!MVT::isVector(NewVT)) { + // Returning a scalar? Figure out if it is the LHS or RHS and return it. + SDOperand EltNum = Node->getOperand(2).getOperand(0); + if (cast(EltNum)->getValue()) +Result = PackVectorOp(Node->getOperand(1), NewVT); + else +Result = PackVectorOp(Node->getOperand(0), NewVT); +} else { + // Otherwise, return a VECTOR_SHUFFLE node. First convert the index + // vector from a VBUILD_VECTOR to a BUILD_VECTOR. + std::vector BuildVecIdx(Node->getOperand(2).Val->op_begin(), + Node->getOperand(2).Val->op_end()-2); + MVT::ValueType BVT = MVT::getIntVectorWithNumElements(BuildVecIdx.size()); + SDOperand BV = DAG.getNode(ISD::BUILD_VECTOR, BVT, BuildVecIdx); + + Result = DAG.getNode(ISD::VECTOR_SHUFFLE, NewVT, + PackVectorOp(Node->getOperand(0), NewVT), + PackVectorOp(Node->getOperand(1), NewVT), BV); +} +break; case ISD::VBIT_CONVERT: if (Op.getOperand(0).getValueType() != MVT::Vector) Result = DAG.getNode(ISD::BIT_CONVERT, NewVT, Op.getOperand(0)); ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.291 -> 1.292 --- Log message: new node --- Diffs of the changes: (+1 -0) SelectionDAG.cpp |1 + 1 files changed, 1 insertion(+) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.291 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.292 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.291Tue Mar 28 13:04:49 2006 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Tue Mar 28 13:54:42 2006 @@ -2761,6 +2761,7 @@ case ISD::SCALAR_TO_VECTOR: return "scalar_to_vector"; case ISD::VBUILD_VECTOR: return "vbuild_vector"; case ISD::VECTOR_SHUFFLE: return "vector_shuffle"; + case ISD::VVECTOR_SHUFFLE: return "vvector_shuffle"; case ISD::VBIT_CONVERT: return "vbit_convert"; case ISD::ADDC:return "addc"; case ISD::ADDE:return "adde"; ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/include/llvm/CodeGen/SelectionDAGNodes.h
Changes in directory llvm/include/llvm/CodeGen: SelectionDAGNodes.h updated: 1.124 -> 1.125 --- Log message: Add a new node --- Diffs of the changes: (+9 -0) SelectionDAGNodes.h |9 + 1 files changed, 9 insertions(+) Index: llvm/include/llvm/CodeGen/SelectionDAGNodes.h diff -u llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.124 llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.125 --- llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.124 Mon Mar 27 18:39:06 2006 +++ llvm/include/llvm/CodeGen/SelectionDAGNodes.h Tue Mar 28 13:54:11 2006 @@ -189,6 +189,15 @@ /// element number IDX. EXTRACT_VECTOR_ELT, +/// VVECTOR_SHUFFLE(VEC1, VEC2, SHUFFLEVEC, COUNT,TYPE) - Returns a vector, +/// of the same type as VEC1/VEC2. SHUFFLEVEC is a VBUILD_VECTOR of +/// constant int values that indicate which value each result element will +/// get. The elements of VEC1/VEC2 are enumerated in order. This is quite +/// similar to the Altivec 'vperm' instruction, except that the indices must +/// be constants and are in terms of the element size of VEC1/VEC2, not in +/// terms of bytes. +VVECTOR_SHUFFLE, + /// VECTOR_SHUFFLE(VEC1, VEC2, SHUFFLEVEC) - Returns a vector, of the same /// type as VEC1/VEC2. SHUFFLEVEC is a BUILD_VECTOR of constant int values /// (regardless of whether its datatype is legal or not) that indicate ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: DAGCombiner.cpp updated: 1.129 -> 1.130 --- Log message: Don't crash on X^X if X is a vector. Instead, produce a vector of zeros. --- Diffs of the changes: (+10 -2) DAGCombiner.cpp | 12 ++-- 1 files changed, 10 insertions(+), 2 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.129 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.130 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.129 Sat Mar 25 16:19:00 2006 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Tue Mar 28 13:11:05 2006 @@ -1396,8 +1396,16 @@ DAG.getConstant(N1C->getValue()^N01C->getValue(), VT)); } // fold (xor x, x) -> 0 - if (N0 == N1) -return DAG.getConstant(0, VT); + if (N0 == N1) { +if (!MVT::isVector(VT)) { + return DAG.getConstant(0, VT); +} else if (!AfterLegalize || TLI.isOperationLegal(ISD::BUILD_VECTOR, VT)) { + // Produce a vector of zeros. + SDOperand El = DAG.getConstant(0, MVT::getVectorBaseType(VT)); + std::vector Ops(MVT::getVectorNumElements(VT), El); + return DAG.getNode(ISD::BUILD_VECTOR, VT, Ops); +} + } // fold (xor (zext x), (zext y)) -> (zext (xor x, y)) if (N0.getOpcode() == ISD::ZERO_EXTEND && N1.getOpcode() == ISD::ZERO_EXTEND && ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.290 -> 1.291 --- Log message: Add an assertion --- Diffs of the changes: (+2 -0) SelectionDAG.cpp |2 ++ 1 files changed, 2 insertions(+) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.290 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.291 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.290Mon Mar 27 18:40:09 2006 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Tue Mar 28 13:04:49 2006 @@ -634,6 +634,8 @@ SDOperand SelectionDAG::getConstant(uint64_t Val, MVT::ValueType VT) { assert(MVT::isInteger(VT) && "Cannot create FP integer constant!"); + assert(!MVT::isVector(VT) && "Cannot create Vector ConstantSDNodes!"); + // Mask out any bits that are not valid for this constant. if (VT != MVT::i64) Val &= ((uint64_t)1 << MVT::getSizeInBits(VT)) - 1; ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/Target/PowerPC/README_ALTIVEC.txt
Changes in directory llvm/lib/Target/PowerPC: README_ALTIVEC.txt updated: 1.4 -> 1.5 --- Log message: add a note --- Diffs of the changes: (+10 -0) README_ALTIVEC.txt | 10 ++ 1 files changed, 10 insertions(+) Index: llvm/lib/Target/PowerPC/README_ALTIVEC.txt diff -u llvm/lib/Target/PowerPC/README_ALTIVEC.txt:1.4 llvm/lib/Target/PowerPC/README_ALTIVEC.txt:1.5 --- llvm/lib/Target/PowerPC/README_ALTIVEC.txt:1.4 Mon Mar 27 22:15:58 2006 +++ llvm/lib/Target/PowerPC/README_ALTIVEC.txt Tue Mar 28 12:56:23 2006 @@ -134,4 +134,14 @@ 2. Identical operations in different types are not getting CSE'd (e.g. { 0U, 0U, 0U, 0U } and {0.0, 0.0, 0.0, 0.0}. +//===--===// + +Two identical comparisons in predicate and nonpredicate form like this: + +a = vec_cmpb(x, y); +b = vec_any_out(x, y); + +Should turn into one "." compare instruction, not a dot and "nondot" form. + +//===--===// ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/DwarfWriter.cpp
Changes in directory llvm/lib/CodeGen: DwarfWriter.cpp updated: 1.52 -> 1.53 --- Log message: Refactor address attributes. Add base register to frame info. --- Diffs of the changes: (+19 -13) DwarfWriter.cpp | 32 +++- 1 files changed, 19 insertions(+), 13 deletions(-) Index: llvm/lib/CodeGen/DwarfWriter.cpp diff -u llvm/lib/CodeGen/DwarfWriter.cpp:1.52 llvm/lib/CodeGen/DwarfWriter.cpp:1.53 --- llvm/lib/CodeGen/DwarfWriter.cpp:1.52 Fri Mar 24 15:10:36 2006 +++ llvm/lib/CodeGen/DwarfWriter.cppTue Mar 28 08:58:32 2006 @@ -1213,6 +1213,21 @@ } } +/// AddAddress - Add an address attribute to a die based on the location +/// provided. +void DwarfWriter::AddAddress(DIE *Die, unsigned Attribute, + MachineLocation &Location) { + DIEBlock *Block = new DIEBlock(); + if (Location.isRegister()) { +Block->AddUInt(DW_FORM_data1, DW_OP_reg0 + Location.getRegister()); + } else { +Block->AddUInt(DW_FORM_data1, DW_OP_breg0 + Location.getRegister()); +Block->AddUInt(DW_FORM_sdata, Location.getOffset()); + } + Block->ComputeSize(*this); + Die->AddBlock(Attribute, 0, Block); +} + /// getDieMapSlotFor - Returns the debug information entry map slot for the /// specified debug descriptor. DIE *&DwarfWriter::getDieMapSlotFor(DebugInfoDesc *DD) { @@ -1518,7 +1533,6 @@ return SubprogramDie; } - /// NewScopeVariable - Create a new scope variable. /// DIE *DwarfWriter::NewScopeVariable(DebugVariable *DV, CompileUnit *Unit) { @@ -1545,20 +1559,10 @@ DIE *Type = NewType(Unit->getDie(), VD->getType(), Unit); VariableDie->AddDIEntry(DW_AT_type, DW_FORM_ref4, Type); - // Get variable address. + // Add variable address. MachineLocation Location; Asm->TM.getRegisterInfo()->getLocation(*MF, DV->getFrameIndex(), Location); - - // Add computation for variable. - DIEBlock *Block = new DIEBlock(); - if (Location.isRegister()) { -Block->AddUInt(DW_FORM_data1, DW_OP_reg0 + Location.getRegister()); - } else { -Block->AddUInt(DW_FORM_data1, DW_OP_breg0 + Location.getRegister()); -Block->AddUInt(DW_FORM_sdata, Location.getOffset()); - } - Block->ComputeSize(*this); - VariableDie->AddBlock(DW_AT_location, 0, Block); + AddAddress(VariableDie, DW_AT_location, Location); return VariableDie; } @@ -1628,6 +1632,8 @@ DWLabel("func_begin", SubprogramCount)); SPDie->AddLabel(DW_AT_high_pc, DW_FORM_addr, DWLabel("func_end", SubprogramCount)); + MachineLocation Location(Asm->TM.getRegisterInfo()->getFrameRegister(*MF)); + AddAddress(SPDie, DW_AT_frame_base, Location); ConstructScope(RootScope, SPDie, Unit); } ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/include/llvm/CodeGen/DwarfWriter.h
Changes in directory llvm/include/llvm/CodeGen: DwarfWriter.h updated: 1.31 -> 1.32 --- Log message: Refactor address attributes. Add base register to frame info. --- Diffs of the changes: (+5 -0) DwarfWriter.h |5 + 1 files changed, 5 insertions(+) Index: llvm/include/llvm/CodeGen/DwarfWriter.h diff -u llvm/include/llvm/CodeGen/DwarfWriter.h:1.31 llvm/include/llvm/CodeGen/DwarfWriter.h:1.32 --- llvm/include/llvm/CodeGen/DwarfWriter.h:1.31Thu Mar 23 17:02:34 2006 +++ llvm/include/llvm/CodeGen/DwarfWriter.h Tue Mar 28 08:58:32 2006 @@ -41,6 +41,7 @@ class DIEAbbrev; class GlobalVariableDesc; class MachineDebugInfo; +class MachineLocation; class MachineFunction; class Module; class SubprogramDesc; @@ -321,6 +322,10 @@ /// entry. void AddSourceLine(DIE *Die, CompileUnitDesc *File, unsigned Line); + /// AddAddress - Add an address attribute to a die based on the location + /// provided. + void AddAddress(DIE *Die, unsigned Attribute, MachineLocation &Location); + /// NewType - Create a new type DIE. /// DIE *NewType(DIE *Context, TypeDesc *TyDesc, CompileUnit *Unit); ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/Target/SparcV9/SparcV9RegisterInfo.cpp SparcV9RegisterInfo.h
Changes in directory llvm/lib/Target/SparcV9: SparcV9RegisterInfo.cpp updated: 1.11 -> 1.12 SparcV9RegisterInfo.h updated: 1.10 -> 1.11 --- Log message: Expose base register for DwarfWriter. Refactor code accordingly. --- Diffs of the changes: (+5 -4) SparcV9RegisterInfo.cpp |4 ++-- SparcV9RegisterInfo.h |5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) Index: llvm/lib/Target/SparcV9/SparcV9RegisterInfo.cpp diff -u llvm/lib/Target/SparcV9/SparcV9RegisterInfo.cpp:1.11 llvm/lib/Target/SparcV9/SparcV9RegisterInfo.cpp:1.12 --- llvm/lib/Target/SparcV9/SparcV9RegisterInfo.cpp:1.11Thu Mar 23 12:12:57 2006 +++ llvm/lib/Target/SparcV9/SparcV9RegisterInfo.cpp Tue Mar 28 07:48:33 2006 @@ -318,7 +318,7 @@ } -void SparcV9RegisterInfo::getLocation(MachineFunction &MF, unsigned Index, - MachineLocation &ML) const { +unsigned SparcV9RegisterInfo::getFrameRegister(MachineFunction &MF) const { abort (); + return 0; } Index: llvm/lib/Target/SparcV9/SparcV9RegisterInfo.h diff -u llvm/lib/Target/SparcV9/SparcV9RegisterInfo.h:1.10 llvm/lib/Target/SparcV9/SparcV9RegisterInfo.h:1.11 --- llvm/lib/Target/SparcV9/SparcV9RegisterInfo.h:1.10 Thu Mar 23 12:12:57 2006 +++ llvm/lib/Target/SparcV9/SparcV9RegisterInfo.h Tue Mar 28 07:48:33 2006 @@ -44,8 +44,9 @@ void eliminateFrameIndex (MachineBasicBlock::iterator MI) const; void emitPrologue (MachineFunction &MF) const; void emitEpilogue (MachineFunction &MF, MachineBasicBlock &MBB) const; - void getLocation(MachineFunction &MF, unsigned Index, - MachineLocation &ML) const; + + // Debug information queries. + unsigned getFrameRegister(MachineFunction &MF) const; }; } // End llvm namespace ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp AlphaRegisterInfo.h
Changes in directory llvm/lib/Target/Alpha: AlphaRegisterInfo.cpp updated: 1.38 -> 1.39 AlphaRegisterInfo.h updated: 1.10 -> 1.11 --- Log message: Expose base register for DwarfWriter. Refactor code accordingly. --- Diffs of the changes: (+4 -12) AlphaRegisterInfo.cpp | 12 ++-- AlphaRegisterInfo.h |4 ++-- 2 files changed, 4 insertions(+), 12 deletions(-) Index: llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp diff -u llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp:1.38 llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp:1.39 --- llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp:1.38Mon Mar 27 14:18:45 2006 +++ llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp Tue Mar 28 07:48:33 2006 @@ -354,16 +354,8 @@ } } -void AlphaRegisterInfo::getLocation(MachineFunction &MF, unsigned Index, -MachineLocation &ML) const { - assert(0 && "Needs to be defined for target"); - MachineFrameInfo *MFI = MF.getFrameInfo(); - bool FP = hasFP(MF); - - // FIXME - Needs to handle register variables. - // FIXME - Faking that llvm number is same as gcc numbering. - ML.set(getDwarfRegNum(FP ? Alpha::R15 : Alpha::R30), - MFI->getObjectOffset(Index) + MFI->getStackSize()); +unsigned AlphaRegisterInfo::getFrameRegister(MachineFunction &MF) const { + return getDwarfRegNum(hasFP(MF) ? Alpha::R15 : Alpha::R30); } #include "AlphaGenRegisterInfo.inc" Index: llvm/lib/Target/Alpha/AlphaRegisterInfo.h diff -u llvm/lib/Target/Alpha/AlphaRegisterInfo.h:1.10 llvm/lib/Target/Alpha/AlphaRegisterInfo.h:1.11 --- llvm/lib/Target/Alpha/AlphaRegisterInfo.h:1.10 Thu Mar 23 12:12:57 2006 +++ llvm/lib/Target/Alpha/AlphaRegisterInfo.h Tue Mar 28 07:48:33 2006 @@ -53,8 +53,8 @@ void emitPrologue(MachineFunction &MF) const; void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const; - void getLocation(MachineFunction &MF, unsigned Index, MachineLocation &ML) const; - + // Debug information queries. + unsigned getFrameRegister(MachineFunction &MF) const; static std::string getPrettyName(unsigned reg); }; ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp PPCRegisterInfo.h
Changes in directory llvm/lib/Target/PowerPC: PPCRegisterInfo.cpp updated: 1.51 -> 1.52 PPCRegisterInfo.h updated: 1.11 -> 1.12 --- Log message: Expose base register for DwarfWriter. Refactor code accordingly. --- Diffs of the changes: (+4 -11) PPCRegisterInfo.cpp | 11 ++- PPCRegisterInfo.h |4 ++-- 2 files changed, 4 insertions(+), 11 deletions(-) Index: llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp diff -u llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.51 llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.52 --- llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.51Mon Mar 27 14:18:45 2006 +++ llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp Tue Mar 28 07:48:33 2006 @@ -447,15 +447,8 @@ } } -void PPCRegisterInfo::getLocation(MachineFunction &MF, unsigned Index, - MachineLocation &ML) const { - MachineFrameInfo *MFI = MF.getFrameInfo(); - bool FP = hasFP(MF); - - // FIXME - Needs to handle register variables. - // FIXME - Faking that llvm number is same as gcc numbering. - ML.set(getDwarfRegNum(FP ? PPC::R31 : PPC::R1), - MFI->getObjectOffset(Index) + MFI->getStackSize()); +unsigned PPCRegisterInfo::getFrameRegister(MachineFunction &MF) const { + return getDwarfRegNum(hasFP(MF) ? PPC::R31 : PPC::R1); } #include "PPCGenRegisterInfo.inc" Index: llvm/lib/Target/PowerPC/PPCRegisterInfo.h diff -u llvm/lib/Target/PowerPC/PPCRegisterInfo.h:1.11 llvm/lib/Target/PowerPC/PPCRegisterInfo.h:1.12 --- llvm/lib/Target/PowerPC/PPCRegisterInfo.h:1.11 Thu Mar 23 12:12:57 2006 +++ llvm/lib/Target/PowerPC/PPCRegisterInfo.h Tue Mar 28 07:48:33 2006 @@ -56,8 +56,8 @@ void emitPrologue(MachineFunction &MF) const; void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const; - void getLocation(MachineFunction &MF, unsigned Index, - MachineLocation &ML) const; + // Debug information queries. + unsigned getFrameRegister(MachineFunction &MF) const; }; } // end namespace llvm ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/Target/Sparc/SparcRegisterInfo.cpp SparcRegisterInfo.h
Changes in directory llvm/lib/Target/Sparc: SparcRegisterInfo.cpp updated: 1.39 -> 1.40 SparcRegisterInfo.h updated: 1.10 -> 1.11 --- Log message: Expose base register for DwarfWriter. Refactor code accordingly. --- Diffs of the changes: (+4 -11) SparcRegisterInfo.cpp | 11 ++- SparcRegisterInfo.h |4 ++-- 2 files changed, 4 insertions(+), 11 deletions(-) Index: llvm/lib/Target/Sparc/SparcRegisterInfo.cpp diff -u llvm/lib/Target/Sparc/SparcRegisterInfo.cpp:1.39 llvm/lib/Target/Sparc/SparcRegisterInfo.cpp:1.40 --- llvm/lib/Target/Sparc/SparcRegisterInfo.cpp:1.39Mon Mar 27 14:18:45 2006 +++ llvm/lib/Target/Sparc/SparcRegisterInfo.cpp Tue Mar 28 07:48:33 2006 @@ -200,15 +200,8 @@ BuildMI(MBB, MBBI, SP::RESTORErr, 2, SP::G0).addReg(SP::G0).addReg(SP::G0); } -void SparcRegisterInfo::getLocation(MachineFunction &MF, unsigned Index, - MachineLocation &ML) const { - assert(0 && "Needs to be defined for target"); - MachineFrameInfo *MFI = MF.getFrameInfo(); - - // FIXME - Needs to handle register variables. - // FIXME - Faking that llvm number is same as gcc numbering. - ML.set(getDwarfRegNum(SP::G1), - MFI->getObjectOffset(Index) + MFI->getStackSize()); +unsigned SparcRegisterInfo::getFrameRegister(MachineFunction &MF) const { + return getDwarfRegNum(SP::G1); } #include "SparcGenRegisterInfo.inc" Index: llvm/lib/Target/Sparc/SparcRegisterInfo.h diff -u llvm/lib/Target/Sparc/SparcRegisterInfo.h:1.10 llvm/lib/Target/Sparc/SparcRegisterInfo.h:1.11 --- llvm/lib/Target/Sparc/SparcRegisterInfo.h:1.10 Thu Mar 23 12:12:57 2006 +++ llvm/lib/Target/Sparc/SparcRegisterInfo.h Tue Mar 28 07:48:33 2006 @@ -57,8 +57,8 @@ void emitPrologue(MachineFunction &MF) const; void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const; - void getLocation(MachineFunction &MF, unsigned Index, - MachineLocation &ML) const; + // Debug information queries. + unsigned getFrameRegister(MachineFunction &MF) const; }; } // end namespace llvm ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/Target/MRegisterInfo.cpp
Changes in directory llvm/lib/Target: MRegisterInfo.cpp updated: 1.12 -> 1.13 --- Log message: Expose base register for DwarfWriter. Refactor code accordingly. --- Diffs of the changes: (+16 -0) MRegisterInfo.cpp | 16 1 files changed, 16 insertions(+) Index: llvm/lib/Target/MRegisterInfo.cpp diff -u llvm/lib/Target/MRegisterInfo.cpp:1.12 llvm/lib/Target/MRegisterInfo.cpp:1.13 --- llvm/lib/Target/MRegisterInfo.cpp:1.12 Wed Feb 1 12:10:56 2006 +++ llvm/lib/Target/MRegisterInfo.cpp Tue Mar 28 07:48:33 2006 @@ -12,6 +12,11 @@ //===--===// #include "llvm/Target/MRegisterInfo.h" + +#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineFrameInfo.h" +#include "llvm/CodeGen/MachineLocation.h" + using namespace llvm; MRegisterInfo::MRegisterInfo(const TargetRegisterDesc *D, unsigned NR, @@ -38,3 +43,14 @@ } return Allocatable; } + +/// getLocation - This method should return the actual location of a frame +/// variable given the frame index. The location is returned in ML. +/// Subclasses should override this method for special handling of frame +/// variables and then call MRegisterInfo::getLocation for the default action. +void MRegisterInfo::getLocation(MachineFunction &MF, unsigned Index, +MachineLocation &ML) const { + MachineFrameInfo *MFI = MF.getFrameInfo(); + ML.set(getFrameRegister(MF), + MFI->getObjectOffset(Index) + MFI->getStackSize()); +} ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/Target/X86/X86RegisterInfo.cpp X86RegisterInfo.h
Changes in directory llvm/lib/Target/X86: X86RegisterInfo.cpp updated: 1.132 -> 1.133 X86RegisterInfo.h updated: 1.35 -> 1.36 --- Log message: Expose base register for DwarfWriter. Refactor code accordingly. --- Diffs of the changes: (+4 -11) X86RegisterInfo.cpp | 11 ++- X86RegisterInfo.h |4 ++-- 2 files changed, 4 insertions(+), 11 deletions(-) Index: llvm/lib/Target/X86/X86RegisterInfo.cpp diff -u llvm/lib/Target/X86/X86RegisterInfo.cpp:1.132 llvm/lib/Target/X86/X86RegisterInfo.cpp:1.133 --- llvm/lib/Target/X86/X86RegisterInfo.cpp:1.132 Mon Mar 27 14:18:45 2006 +++ llvm/lib/Target/X86/X86RegisterInfo.cpp Tue Mar 28 07:48:33 2006 @@ -686,15 +686,8 @@ } } -void X86RegisterInfo::getLocation(MachineFunction &MF, unsigned Index, - MachineLocation &ML) const { - MachineFrameInfo *MFI = MF.getFrameInfo(); - bool FP = hasFP(MF); - - // FIXME - Needs to handle register variables. - // FIXME - Hardcoding gcc numbering. - ML.set(getDwarfRegNum(FP ? X86::EBP : X86::ESP), - MFI->getObjectOffset(Index) + MFI->getStackSize()); +unsigned X86RegisterInfo::getFrameRegister(MachineFunction &MF) const { + return getDwarfRegNum(hasFP(MF) ? X86::EBP : X86::ESP); } #include "X86GenRegisterInfo.inc" Index: llvm/lib/Target/X86/X86RegisterInfo.h diff -u llvm/lib/Target/X86/X86RegisterInfo.h:1.35 llvm/lib/Target/X86/X86RegisterInfo.h:1.36 --- llvm/lib/Target/X86/X86RegisterInfo.h:1.35 Thu Mar 23 12:12:57 2006 +++ llvm/lib/Target/X86/X86RegisterInfo.h Tue Mar 28 07:48:33 2006 @@ -63,8 +63,8 @@ void emitPrologue(MachineFunction &MF) const; void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const; - void getLocation(MachineFunction &MF, unsigned Index, - MachineLocation &ML) const; + // Debug information queries. + unsigned getFrameRegister(MachineFunction &MF) const; }; } // End llvm namespace ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/include/llvm/Target/MRegisterInfo.h
Changes in directory llvm/include/llvm/Target: MRegisterInfo.h updated: 1.72 -> 1.73 --- Log message: Expose base register for DwarfWriter. Refactor code accordingly. --- Diffs of the changes: (+11 -1) MRegisterInfo.h | 12 +++- 1 files changed, 11 insertions(+), 1 deletion(-) Index: llvm/include/llvm/Target/MRegisterInfo.h diff -u llvm/include/llvm/Target/MRegisterInfo.h:1.72 llvm/include/llvm/Target/MRegisterInfo.h:1.73 --- llvm/include/llvm/Target/MRegisterInfo.h:1.72 Fri Mar 24 10:18:42 2006 +++ llvm/include/llvm/Target/MRegisterInfo.hTue Mar 28 07:48:33 2006 @@ -343,10 +343,20 @@ virtual void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const = 0; + //======// + /// Debug information queries. + + /// getFrameRegister - This method should return the register used as a base + /// for values allocated in the current stack frame. This value should be + /// returned as a dwarf register number (getDwarfRegNum.) + virtual unsigned getFrameRegister(MachineFunction &MF) const = 0; + /// getLocation - This method should return the actual location of a frame /// variable given the frame index. The location is returned in ML. + /// Subclasses should override this method for special handling of frame + /// variables and call MRegisterInfo::getLocation for the default action. virtual void getLocation(MachineFunction &MF, unsigned Index, - MachineLocation &ML) const = 0; + MachineLocation &ML) const; }; // This is useful when building DenseMaps keyed on virtual registers ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/Target/IA64/IA64RegisterInfo.cpp IA64RegisterInfo.h
Changes in directory llvm/lib/Target/IA64: IA64RegisterInfo.cpp updated: 1.15 -> 1.16 IA64RegisterInfo.h updated: 1.5 -> 1.6 --- Log message: Expose base register for DwarfWriter. Refactor code accordingly. --- Diffs of the changes: (+4 -12) IA64RegisterInfo.cpp | 13 ++--- IA64RegisterInfo.h |3 ++- 2 files changed, 4 insertions(+), 12 deletions(-) Index: llvm/lib/Target/IA64/IA64RegisterInfo.cpp diff -u llvm/lib/Target/IA64/IA64RegisterInfo.cpp:1.15 llvm/lib/Target/IA64/IA64RegisterInfo.cpp:1.16 --- llvm/lib/Target/IA64/IA64RegisterInfo.cpp:1.15 Mon Mar 27 14:18:45 2006 +++ llvm/lib/Target/IA64/IA64RegisterInfo.cpp Tue Mar 28 07:48:33 2006 @@ -329,18 +329,9 @@ } -void IA64RegisterInfo::getLocation(MachineFunction &MF, unsigned Index, - MachineLocation &ML) const { - assert(0 && "Needs to be defined for target"); - MachineFrameInfo *MFI = MF.getFrameInfo(); - bool FP = hasFP(MF); - - // FIXME - Needs to handle register variables. - // FIXME - Faking that llvm number is same as gcc numbering. - ML.set(getDwarfRegNum(FP ? IA64::r5 : IA64::r12), - MFI->getObjectOffset(Index) + MFI->getStackSize()); +unsigned IA64RegisterInfo::getFrameRegister(MachineFunction &MF) const { + return getDwarfRegNum(hasFP(MF) ? IA64::r5 : IA64::r12); } - #include "IA64GenRegisterInfo.inc" Index: llvm/lib/Target/IA64/IA64RegisterInfo.h diff -u llvm/lib/Target/IA64/IA64RegisterInfo.h:1.5 llvm/lib/Target/IA64/IA64RegisterInfo.h:1.6 --- llvm/lib/Target/IA64/IA64RegisterInfo.h:1.5 Thu Mar 23 12:12:57 2006 +++ llvm/lib/Target/IA64/IA64RegisterInfo.h Tue Mar 28 07:48:33 2006 @@ -49,7 +49,8 @@ void emitPrologue(MachineFunction &MF) const; void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const; - void getLocation(MachineFunction &MF, unsigned Index, MachineLocation &ML) const; + // Debug information queries. + unsigned getFrameRegister(MachineFunction &MF) const; }; } // End llvm namespace ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.210 -> 1.211 --- Log message: More bulletproofing of llvm.dbg.declare. --- Diffs of the changes: (+1 -1) SelectionDAGISel.cpp |2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.210 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.211 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.210Mon Mar 27 18:40:09 2006 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Tue Mar 28 07:45:20 2006 @@ -1390,7 +1390,7 @@ case Intrinsic::dbg_declare: { MachineDebugInfo *DebugInfo = DAG.getMachineDebugInfo(); DbgDeclareInst &DI = cast(I); -if (DebugInfo && DebugInfo->Verify(DI.getVariable())) { +if (DebugInfo && DI.getVariable() && DebugInfo->Verify(DI.getVariable())) { std::vector Ops; SDOperand AddressOp = getValue(DI.getAddress()); ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp
Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.139 -> 1.140 --- Log message: Added missing paren on behalf of Ramana Radhakrishnan. --- Diffs of the changes: (+1 -1) X86ISelLowering.cpp |2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.139 llvm/lib/Target/X86/X86ISelLowering.cpp:1.140 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.139 Tue Mar 28 02:27:15 2006 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Tue Mar 28 04:17:11 2006 @@ -2609,5 +2609,5 @@ X86::isPSHUFDMask(Mask.Val) || X86::isSHUFPMask(Mask.Val) || X86::isUNPCKLMask(Mask.Val) || - X86::isUNPCKHMask(Mask.Val); + X86::isUNPCKHMask(Mask.Val)); } ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp
Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.138 -> 1.139 --- Log message: Missed X86::isUNPCKHMask --- Diffs of the changes: (+2 -1) X86ISelLowering.cpp |3 ++- 1 files changed, 2 insertions(+), 1 deletion(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.138 llvm/lib/Target/X86/X86ISelLowering.cpp:1.139 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.138 Tue Mar 28 00:50:32 2006 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Tue Mar 28 02:27:15 2006 @@ -2608,5 +2608,6 @@ X86::isSplatMask(Mask.Val) || X86::isPSHUFDMask(Mask.Val) || X86::isSHUFPMask(Mask.Val) || - X86::isUNPCKLMask(Mask.Val)); + X86::isUNPCKLMask(Mask.Val) || + X86::isUNPCKHMask(Mask.Val); } ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits