[LLVMdev] bitwise AND (original) (raw)

Tobias Grosser tobias at grosser.es
Tue Sep 6 03:14:26 PDT 2011


On 09/06/2011 10:40 AM, Jimborean Alexandra wrote:

Hi,

I want to compute the bitwise 'and' between two values of type int1: %x = and %a, %b . Which is the LLVM instruction that creates this?

The LLVM-IR instruction for this is:

http://llvm.org/docs/LangRef.html#i_and

'and' Instruction

Syntax: = and , ; yields {ty}:result

Overview: The 'and' instruction returns the bitwise logical and of its two operands.

For your example this would be: %x = and i1 %a, %b

I only found the APInt class, whose constructor is: APInt(unsigned numBits, uint64t val, bool isSigned = false)

and which provides the bitwise AND operation: APInt llvm::APIntOps::And <http://llvm.org/docs/doxygen/html/namespacellvm11APIntOps.html#a684cfe02c582e8d75cd6d457e63e6c25> (const APInt &LHS, const APInt &RHS) Bitwise AND function for APInt <http://llvm.org/docs/doxygen/html/classllvm11APInt.html>.

Is this the best way to build the 'and' instruction that I need?

I am not sure why you look into APInt. APInt is an abstract data type for arbitrary, fixed width integer calculations and is (except of being used by LLVM) independent of LLVM and LLVM-IR. You would use APInt 'and', if you want to perform calculations on data that is already of type APInt or int.

If you want to perform the 'and' operation in an LLVM-IR program, you can just add the 'and' instruction into the LLVM-IR source. You can either do this by changing the file with a text editor, or, if you write e.g. a LLVM pass, by construction a new 'and' instruction using the IRBuilder()->CreateAnd(Value *A, Value *B) function.

If so, how can I send the value uint64_t stored in the values %a , %b of type int1 ?

I did not get this one. Could you try to rephrase?

Cheers Tobi



More information about the llvm-dev mailing list