On Thu, Dec 25, 2008 at 1:54 AM, Eli Friedman <eli.friedman at gmail.com> wrote:> On Thu, Dec 25, 2008 at 1:28 AM, Claudio Basile <cbasile at tempo-da.com> wrote: >> Hi all, >> >> is there any way to compare two 128bit values? >> I have tried 3 different approaches and they all fail with an internal >> assertion. >> I'm running llvm 2.4 on x86 with the following command line: >> >> > llvm-as test.ll -o test.bc >> > llc test.bc -filetype=asm >> >> I would expect the code generator to emit a sequence of SSE >> instructions. > > Approaches 1 and 2 depend on some stuff that hasn't really stabilized > yet... you should get much better results with vicmp.Oh wait, I just realized vicmp is a post-2.4 thing... if you really want to generate an SSE comparison using LLVM 2.4, you can use the x86 intrinsics, like @llvm.x86.sse2.pcmpeq.b. -Eli
On Dec 25, 2008, at 11:02 AM, Eli Friedman wrote:> On Thu, Dec 25, 2008 at 1:54 AM, Eli Friedman > <eli.friedman at gmail.com> wrote: >> On Thu, Dec 25, 2008 at 1:28 AM, Claudio Basile <cbasile at tempo- >> da.com> wrote: >>> Hi all, >>> >>> is there any way to compare two 128bit values? >>> I have tried 3 different approaches and they all fail with an >>> internal >>> assertion. >>> I'm running llvm 2.4 on x86 with the following command line: >>> >>>> llvm-as test.ll -o test.bc >>>> llc test.bc -filetype=asm >>> >>> I would expect the code generator to emit a sequence of SSE >>> instructions. >> >> Approaches 1 and 2 depend on some stuff that hasn't really stabilized >> yet... you should get much better results with vicmp. > > Oh wait, I just realized vicmp is a post-2.4 thing... if you really > want to generate an SSE comparison using LLVM 2.4, you can use the x86 > intrinsics, like @llvm.x86.sse2.pcmpeq.b.Thanks for your answer. It looks like vicmp is part of LLVM 2.4. It is documented there, at least. How do you suggest I use it to compare two vector operands? I'd guess I could generate a mask by extracting the most significant bits in each words, but that approach doesn't work per my initial posting. Claudio
On Thu, Dec 25, 2008 at 5:44 PM, Claudio Basile <cbasile at tempo-da.com> wrote:> Thanks for your answer. > It looks like vicmp is part of LLVM 2.4. It is documented there, at least.Hmm, really? I don't see it at http://llvm.org/releases/2.4/docs/LangRef.html. If it's there, then it should work, I think.> How do you suggest I use it to compare two vector operands? > I'd guess I could generate a mask by extracting the most significant bits in > each words, but that approach doesn't work per my initial posting.For the best code generation, I'd suggest using @llvm.x86.sse.movmsk.ps. Something like icmp eq(movmskps(vicmp(a,b)),0) should do the trick assuming a and b are <4 x i32>. As far as I know, there isn't any way to make LLVM generate that without using the x86-specific intrinsic. -Eli