/// isNeg, isNot - Check if the given Value is a NEG or NOT instruction.
///
- static bool isNeg(const Value *V);
- static bool isNot(const Value *V);
+ static bool isNeg(const Value *V);
+ static bool isNot(const Value *V);
/// getNegArgument, getNotArgument - Helper functions to extract the
/// unary argument of a NEG or NOT operation implemented via Sub or Xor.
///
- static const Value* getNegArgument(const Value *BinOp);
- static Value* getNegArgument( Value *BinOp);
- static const Value* getNotArgument(const Value *BinOp);
- static Value* getNotArgument( Value *BinOp);
+ static const Value *getNegArgument(const Value *BinOp);
+ static Value *getNegArgument( Value *BinOp);
+ static const Value *getNotArgument(const Value *BinOp);
+ static Value *getNotArgument( Value *BinOp);
BinaryOps getOpcode() const {
return static_cast<BinaryOps>(Instruction::getOpcode());
#ifndef LLVM_INSTRUCTIONS_H
#define LLVM_INSTRUCTIONS_H
-#include "llvm/Instruction.h"
#include "llvm/InstrTypes.h"
namespace llvm {
}
unsigned getNumOperands() const { return 2; }
+ /// isLogicalShift - Return true if this is a logical shift left or a logical
+ /// shift right.
+ bool isLogicalShift() const;
+
+ /// isArithmeticShift - Return true if this is a sign-extending shift right
+ /// operation.
+ bool isArithmeticShift() const {
+ return !isLogicalShift();
+ }
+
+
virtual ShiftInst *clone() const;
// Methods for support type inquiry through isa, cast, and dyn_cast:
}
+//===----------------------------------------------------------------------===//
+// ShiftInst Class
+//===----------------------------------------------------------------------===//
+
+/// isLogicalShift - Return true if this is a logical shift left or a logical
+/// shift right.
+bool ShiftInst::isLogicalShift() const {
+ return getOpcode() == Instruction::Shl || getType()->isUnsigned();
+}
+
+
//===----------------------------------------------------------------------===//
// SetCondInst Class
//===----------------------------------------------------------------------===//