Making use of SSE intrinsics

Hi all,

I’d like to make use of some specific x86 Streaming SIMD Extension instructions, but I don’t know where to start. For instance the ‘rcpps’ instructions computes a low precision but fast reciprocal. I’ve noticed that LLVM supports intrinsics, but I couldn’t find any information on how to use them. I’ve tried digging through the LLVM-GCC code but it’s just too complex for me. I would be very grateful if someone could complete this code:

LoadInst *x = new LoadInst(ptr_x, “”, false, basicBlock);

// y = rcpps(x) // FIXME

StoreInst *storeResult = new StoreInst(y, ptr_y, false, basicBlock);

Somewhat related to this, I’d also like to know how to ‘reinterpret_cast’ values. It can be quite useful to sometimes interpret a vector of floating-point values as a vector of integers (for instance to extract the sign, exponent and/or mantissa bits). Any information on how to do that would be much appreciated.

Thanks,

Nicolas Capens

LoadInst *x = new LoadInst(ptr_x, "", false, basicBlock);

// y = rcpps(x) // FIXME
StoreInst *storeResult = new StoreInst(y, ptr_y, false, basicBlock);

Using an IRBuilder, something like the following (uncompiled, but it's
at least approximately right):
Value* x = Builder.CreateLoad(ptr_x);
Function* rcpps = Intrinsic::getDeclaration(Module, Intrinsic::x86_sse_rcp_ps);
Value* y = Builder.CreateCall(rcpps, x);
Builder.CreateStore(y, ptr_y);

Somewhat related to this, I'd also like to know how to 'reinterpret_cast'
values. It can be quite useful to sometimes interpret a vector of
floating-point values as a vector of integers (for instance to extract the
sign, exponent and/or mantissa bits). Any information on how to do that
would be much appreciated.

Use the bitcast instruction (see LLVM Language Reference Manual — LLVM 18.0.0git documentation).

-Eli

Thanks a lot Eli, works like a charm!