1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-16 07:14:09 +02:00

Added vector index intrinsic for Og+

This commit is contained in:
Brian Fiete 2021-07-15 12:24:55 -07:00
parent 40cc6b27b7
commit d06ab26856

View file

@ -17517,6 +17517,40 @@ void BeMCContext::Generate(BeFunction* function)
AllocInst(BeMCInstKind_DbgBreak); AllocInst(BeMCInstKind_DbgBreak);
} }
break; break;
case BfIRIntrinsic_Index:
{
auto valPtr = GetOperand(castedInst->mArgs[0].mValue);
auto idx = GetOperand(castedInst->mArgs[1].mValue);
auto valType = GetType(valPtr);
if (!valType->IsPointer())
{
SoftFail("Non-pointer index target", castedInst->mDbgLoc);
break;
}
valType = ((BePointerType*)valType)->mElementType;
if (!valType->IsVector())
{
SoftFail("Non-vector index target", castedInst->mDbgLoc);
break;
}
auto vectorType = (BeVectorType*)valType;
auto elementPtrType = mModule->mContext->GetPointerTo(vectorType->mElementType);
result = AllocVirtualReg(elementPtrType);
CreateDefineVReg(result);
auto vregInfo = GetVRegInfo(result);
vregInfo->mRelTo = valPtr;
vregInfo->mRelOffset = idx;
vregInfo->mRelOffsetScale = vectorType->mElementType->mSize;
vregInfo->mIsExpr = true;
result = CreateLoad(result);
}
break;
case BfIRIntrinsic_MemSet: case BfIRIntrinsic_MemSet:
{ {
if (auto constVal = BeValueDynCast<BeConstant>(castedInst->mArgs[1].mValue)) if (auto constVal = BeValueDynCast<BeConstant>(castedInst->mArgs[1].mValue))