Author: djg Date: Mon Nov 5 17:35:22 2007 New Revision: 43744 URL: http://llvm.org/viewvc/llvm-project?rev=43744&view=rev Log: Add support for vector remainder operations.
Added: llvm/trunk/test/CodeGen/X86/vector-rem.ll Modified: llvm/trunk/docs/LangRef.html llvm/trunk/lib/AsmParser/llvmAsmParser.y llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Modified: llvm/trunk/docs/LangRef.html URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/LangRef.html?rev=43744&r1=43743&r2=43744&view=diff ============================================================================== --- llvm/trunk/docs/LangRef.html (original) +++ llvm/trunk/docs/LangRef.html Mon Nov 5 17:35:22 2007 @@ -2093,7 +2093,8 @@ <h5>Arguments:</h5> <p>The two arguments to the '<tt>urem</tt>' instruction must be <a href="#t_integer">integer</a> values. Both arguments must have identical -types.</p> +types. This instruction can also take <a href="#t_vector">vector</a> versions +of the values in which case the elements must be integers.</p> <h5>Semantics:</h5> <p>This instruction returns the unsigned integer <i>remainder</i> of a division. This instruction always performs an unsigned division to get the remainder, @@ -2112,7 +2113,10 @@ </pre> <h5>Overview:</h5> <p>The '<tt>srem</tt>' instruction returns the remainder from the -signed division of its two operands.</p> +signed division of its two operands. This instruction can also take +<a href="#t_vector">vector</a> versions of the values in which case +the elements must be integers.</p> +</p> <h5>Arguments:</h5> <p>The two arguments to the '<tt>srem</tt>' instruction must be <a href="#t_integer">integer</a> values. Both arguments must have identical @@ -2144,7 +2148,8 @@ <h5>Arguments:</h5> <p>The two arguments to the '<tt>frem</tt>' instruction must be <a href="#t_floating">floating point</a> values. Both arguments must have -identical types.</p> +identical types. This instruction can also take <a href="#t_vector">vector</a> +versions of floating point values.</p> <h5>Semantics:</h5> <p>This instruction returns the <i>remainder</i> of a division.</p> <h5>Example:</h5> Modified: llvm/trunk/lib/AsmParser/llvmAsmParser.y URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/llvmAsmParser.y?rev=43744&r1=43743&r2=43744&view=diff ============================================================================== --- llvm/trunk/lib/AsmParser/llvmAsmParser.y (original) +++ llvm/trunk/lib/AsmParser/llvmAsmParser.y Mon Nov 5 17:35:22 2007 @@ -2812,11 +2812,6 @@ !isa<VectorType>((*$2).get())) GEN_ERROR( "Arithmetic operator requires integer, FP, or packed operands"); - if (isa<VectorType>((*$2).get()) && - ($1 == Instruction::URem || - $1 == Instruction::SRem || - $1 == Instruction::FRem)) - GEN_ERROR("Remainder not supported on vector types"); Value* val1 = getVal(*$2, $3); CHECK_FOR_ERROR Value* val2 = getVal(*$2, $5); Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp?rev=43744&r1=43743&r2=43744&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Mon Nov 5 17:35:22 2007 @@ -2925,6 +2925,8 @@ Result = DAG.getNode(DivOpc, VT, Tmp1, Tmp2); Result = DAG.getNode(ISD::MUL, VT, Result, Tmp2); Result = DAG.getNode(ISD::SUB, VT, Tmp1, Result); + } else if (MVT::isVector(VT)) { + Result = LegalizeOp(UnrollVectorOp(Op)); } else { assert(VT == MVT::i32 && "Cannot expand this binary operator!"); @@ -2933,13 +2935,17 @@ SDOperand Dummy; Result = ExpandLibCall(TLI.getLibcallName(LC), Node, isSigned, Dummy); } - } else { - // Floating point mod -> fmod libcall. - RTLIB::Libcall LC = VT == MVT::f32 - ? RTLIB::REM_F32 : RTLIB::REM_F64; - SDOperand Dummy; - Result = ExpandLibCall(TLI.getLibcallName(LC), Node, - false/*sign irrelevant*/, Dummy); + } else if (MVT::isFloatingPoint(VT)) { + if (MVT::isVector(VT)) { + Result = LegalizeOp(UnrollVectorOp(Op)); + } else { + // Floating point mod -> fmod libcall. + RTLIB::Libcall LC = VT == MVT::f32 + ? RTLIB::REM_F32 : RTLIB::REM_F64; + SDOperand Dummy; + Result = ExpandLibCall(TLI.getLibcallName(LC), Node, + false/*sign irrelevant*/, Dummy); + } } break; } Added: llvm/trunk/test/CodeGen/X86/vector-rem.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/vector-rem.ll?rev=43744&view=auto ============================================================================== --- llvm/trunk/test/CodeGen/X86/vector-rem.ll (added) +++ llvm/trunk/test/CodeGen/X86/vector-rem.ll Mon Nov 5 17:35:22 2007 @@ -0,0 +1,15 @@ +; RUN: llvm-as < %s | llc -march=x86-64 | grep div | count 8 +; RUN: llvm-as < %s | llc -march=x86-64 | grep fmodf | count 4 + +define <4 x i32> @foo(<4 x i32> %t, <4 x i32> %u) { + %m = srem <4 x i32> %t, %u + ret <4 x i32> %m +} +define <4 x i32> @bar(<4 x i32> %t, <4 x i32> %u) { + %m = urem <4 x i32> %t, %u + ret <4 x i32> %m +} +define <4 x float> @qux(<4 x float> %t, <4 x float> %u) { + %m = frem <4 x float> %t, %u + ret <4 x float> %m +} _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits