/*! Implement public class */
INLINE uint32_t getRegNum(void) const { return file.regNum(); }
/*! Implements public interface */
- bool isScalarOrBool(ir::Register reg) const;
- /*! Implements public interface */
INLINE ir::RegisterData getRegisterData(ir::Register reg) const {
return file.get(reg);
}
SelectionInstruction *mov = this->create(SEL_OP_MOV, 1, 1);
mov->src(0) = GenRegister::retype(insn->src(regID), GEN_TYPE_F);
mov->state = GenInstructionState(simdWidth);
- if (this->isScalarOrBool(insn->src(regID).reg()))
+ if (this->isScalarReg(insn->src(regID).reg()))
mov->state.noMask = 1;
insn->src(regID) = mov->dst(0) = GenRegister::fxgrf(simdWidth, tmp);
insn->prepend(*mov);
ir::Register Selection::Opaque::replaceDst(SelectionInstruction *insn, uint32_t regID) {
SelectionBlock *block = insn->parent;
- uint32_t simdWidth = this->isScalarOrBool(insn->dst(regID).reg()) ? 1 : insn->state.execWidth;
+ uint32_t simdWidth = this->isScalarReg(insn->dst(regID).reg()) ? 1 : insn->state.execWidth;
ir::Register tmp;
ir::RegisterFamily f = file.get(insn->dst(regID).reg()).family;
int genType = f == ir::FAMILY_QWORD ? GEN_TYPE_DF : GEN_TYPE_F;
return tmp;
}
- bool Selection::Opaque::isScalarOrBool(ir::Register reg) const {
- if (isScalarReg(reg))
- return true;
- return false;
- }
-
#define SEL_REG(SIMD16, SIMD8, SIMD1) \
- if (ctx.sel->isScalarOrBool(reg) == true) \
+ if (ctx.sel->isScalarReg(reg) == true) \
return GenRegister::retype(GenRegister::SIMD1(reg), genType); \
else if (simdWidth == 8) \
return GenRegister::retype(GenRegister::SIMD8(reg), genType); \
SelectionInstruction *insn = this->appendInsn(SEL_OP_UNTYPED_READ, elemNum, 1);
SelectionVector *srcVector = this->appendVector();
SelectionVector *dstVector = this->appendVector();
- if (this->isScalarOrBool(dst[0].reg()))
+ if (this->isScalarReg(dst[0].reg()))
insn->state.noMask = 1;
// Regular instruction to encode
for (uint32_t elemID = 0; elemID < elemNum; ++elemID)
SelectionVector *srcVector = this->appendVector();
SelectionVector *dstVector = this->appendVector();
- if (this->isScalarOrBool(dst.reg()))
+ if (this->isScalarReg(dst.reg()))
insn->state.noMask = 1;
// Instruction to encode
insn->src(0) = addr;
SelectionVector *vector = this->appendVector();
SelectionVector *srcVector = this->appendVector();
- if (this->isScalarOrBool(dst.reg()))
+ if (this->isScalarReg(dst.reg()))
insn->state.noMask = 1;
insn->src(0) = addr;
insn->dst(0) = dst;
this->blockList = &this->opaque->blockList;
}
- bool Selection::isScalarOrBool(ir::Register reg) const {
- return this->opaque->isScalarOrBool(reg);
- }
-
uint32_t Selection::getLargestBlockSize(void) const {
return this->opaque->getLargestBlockSize();
}
const GenRegister dst = sel.selReg(insn.getDst(0), getType(opcode, insnType));
const GenRegister src = sel.selReg(insn.getSrc(0), getType(opcode, insnType));
sel.push();
- if (sel.isScalarOrBool(insn.getDst(0)) == true) {
+ if (sel.isScalarReg(insn.getDst(0)) == true) {
sel.curr.execWidth = 1;
sel.curr.predicate = GEN_PREDICATE_NONE;
sel.curr.noMask = 1;
sel.push();
// Boolean values use scalars
- if (sel.isScalarOrBool(insn.getDst(0)) == true) {
+ if (sel.isScalarReg(insn.getDst(0)) == true) {
sel.curr.execWidth = 1;
sel.curr.predicate = GEN_PREDICATE_NONE;
sel.curr.noMask = 1;
if(opcode == OP_ORD) return false;
const uint32_t genCmp = getGenCompare(opcode);
sel.push();
- if (sel.isScalarOrBool(insn.getDst(0)) == true) {
+ if (sel.isScalarReg(insn.getDst(0)) == true) {
sel.curr.execWidth = 1;
sel.curr.predicate = GEN_PREDICATE_NONE;
sel.curr.noMask = 1;
const Type type = insn.getType();
if (type == TYPE_U32 || type == TYPE_S32) {
sel.push();
- if (sel.isScalarOrBool(insn.getDst(0)) == true) {
+ if (sel.isScalarReg(insn.getDst(0)) == true) {
sel.curr.execWidth = 1;
sel.curr.predicate = GEN_PREDICATE_NONE;
sel.curr.noMask = 1;
GBE_ASSERT(type == TYPE_U32 || type == TYPE_S32);
if (type == TYPE_U32 && imm.data.u32 <= 0xffff) {
sel.push();
- if (sel.isScalarOrBool(insn.getDst(0)) == true) {
+ if (sel.isScalarReg(insn.getDst(0)) == true) {
sel.curr.execWidth = 1;
sel.curr.predicate = GEN_PREDICATE_NONE;
sel.curr.noMask = 1;
}
if (type == TYPE_S32 && (imm.data.s32 >= -32768 && imm.data.s32 <= 32767)) {
sel.push();
- if (sel.isScalarOrBool(insn.getDst(0)) == true) {
+ if (sel.isScalarReg(insn.getDst(0)) == true) {
sel.curr.execWidth = 1;
sel.curr.predicate = GEN_PREDICATE_NONE;
sel.curr.noMask = 1;
const Register src1 = insn.getSrc(childID ^ 1);
if (is16BitSpecialReg(src0)) {
sel.push();
- if (sel.isScalarOrBool(insn.getDst(0)) == true) {
+ if (sel.isScalarReg(insn.getDst(0)) == true) {
sel.curr.execWidth = 1;
sel.curr.predicate = GEN_PREDICATE_NONE;
sel.curr.noMask = 1;
const GenRegister dst = sel.selReg(insn.getDst(0), type);
sel.push();
- if (sel.isScalarOrBool(insn.getDst(0)) == true) {
+ if (sel.isScalarReg(insn.getDst(0)) == true) {
sel.curr.execWidth = 1;
sel.curr.predicate = GEN_PREDICATE_NONE;
sel.curr.noMask = 1;
switch (type) {
case TYPE_BOOL:
- if (!sel.isScalarOrBool(insn.getDst(0))) {
+ if (!sel.isScalarReg(insn.getDst(0))) {
sel.curr.modFlag = 1;
sel.curr.physicalFlag = 0;
sel.curr.flagIndex = (uint16_t) insn.getDst(0);
{
using namespace ir;
const uint32_t valueNum = insn.getValueNum();
- const uint32_t simdWidth = sel.isScalarOrBool(insn.getValue(0)) ? 1 : sel.ctx.getSimdWidth();
+ const uint32_t simdWidth = sel.isScalarReg(insn.getValue(0)) ? 1 : sel.ctx.getSimdWidth();
GBE_ASSERT(valueNum == 1);
GenRegister dst = GenRegister::retype(sel.selReg(insn.getValue(0)), GEN_TYPE_F);
// get dword based address
{
using namespace ir;
const uint32_t valueNum = insn.getValueNum();
- const uint32_t simdWidth = sel.isScalarOrBool(insn.getValue(0)) ?
+ const uint32_t simdWidth = sel.isScalarReg(insn.getValue(0)) ?
1 : sel.ctx.getSimdWidth();
if(valueNum > 1) {
vector<GenRegister> dst(valueNum);
}
sel.push();
- if (sel.isScalarOrBool(dst))
+ if (sel.isScalarReg(dst))
sel.curr.noMask = 1;
sel.curr.physicalFlag = 0;
sel.curr.modFlag = 1;
type == TYPE_DOUBLE || type == TYPE_FLOAT ||
type == TYPE_U32 || type == TYPE_S32))
sel.curr.flagGen = 1;
- else if (sel.isScalarOrBool(dst)) {
+ else if (sel.isScalarReg(dst)) {
// If the dest reg is a scalar bool, we can't set it as
// dst register, as the execution width is still 8 or 16.
// Instead, we set the needStoreBool to flagGen, and change
const GenRegister src = sel.selReg(insn.getSrc(0), srcType);
const Opcode opcode = insn.getOpcode();
sel.push();
- if (sel.isScalarOrBool(insn.getDst(0)) == true) {
+ if (sel.isScalarReg(insn.getDst(0)) == true) {
sel.curr.execWidth = 1;
sel.curr.predicate = GEN_PREDICATE_NONE;
sel.curr.noMask = 1;
const Register pred = insn.getPredicate();
sel.push();
- if (sel.isScalarOrBool(insn.getDst(0)) == true) {
+ if (sel.isScalarReg(insn.getDst(0)) == true) {
sel.curr.execWidth = 1;
sel.curr.predicate = GEN_PREDICATE_NONE;
sel.curr.noMask = 1;
static const size_t familyVectorSize[] = {2,2,2,4,8};
static const size_t familyScalarSize[] = {2,2,2,4,8};
using namespace ir;
- const bool isScalar = ctx.sel->isScalarOrBool(reg);
+ const bool isScalar = ctx.sel->isScalarReg(reg);
const RegisterData regData = ctx.sel->getRegisterData(reg);
const RegisterFamily family = regData.family;
const uint32_t typeSize = isScalar ? familyScalarSize[family] : familyVectorSize[family];
// If an element has very long interval, we don't want to put it into a
// vector as it will add more pressure to the register allocation.
if (it == vectorMap.end() &&
- ctx.sel->isScalarOrBool(reg) == false &&
+ ctx.sel->isScalarReg(reg) == false &&
ctx.isSpecialReg(reg) == false &&
(intervals[reg].maxID - intervals[reg].minID) < 2048)
{
insn.opcode == SEL_OP_OR || \
insn.opcode == SEL_OP_XOR))
- #define IS_SCALAR_FLAG(insn) selection.isScalarOrBool(ir::Register(insn.state.flagIndex))
+ #define IS_SCALAR_FLAG(insn) selection.isScalarReg(ir::Register(insn.state.flagIndex))
#define GET_FLAG_REG(insn) GenRegister::uwxgrf(IS_SCALAR_FLAG(insn) ? 1 : 8,\
ir::Register(insn.state.flagIndex));
#define IS_TEMP_FLAG(insn) (insn.state.flag == 0 && insn.state.subFlag == 1)