summaryrefslogtreecommitdiff
path: root/source/slang/lower-to-ir.cpp
diff options
context:
space:
mode:
authorTim Foley <tfoley@nvidia.com>2017-09-11 15:25:31 -0700
committerTim Foley <tfoley@nvidia.com>2017-09-11 15:27:08 -0700
commit4644b64d648893718336d83fae0139ee19405e61 (patch)
treef7c623dc814b823a535d38b68029f529af36780f /source/slang/lower-to-ir.cpp
parente2de1eaec725e979f98ad6f518b93b4d9ce55a36 (diff)
Get another test working with IR codedgen
- Add support for matrix types in IR/codegen - Add support for basic indexing operations in IR/codegen
Diffstat (limited to 'source/slang/lower-to-ir.cpp')
-rw-r--r--source/slang/lower-to-ir.cpp44
1 files changed, 43 insertions, 1 deletions
diff --git a/source/slang/lower-to-ir.cpp b/source/slang/lower-to-ir.cpp
index 4bdfa4438..10b4aefca 100644
--- a/source/slang/lower-to-ir.cpp
+++ b/source/slang/lower-to-ir.cpp
@@ -519,6 +519,15 @@ struct ValLoweringVisitor : ValVisitor<ValLoweringVisitor, LoweredValInfo, Lower
return getBuilder()->getVectorType(irElementType, irElementCount);
}
+
+ LoweredTypeInfo visitMatrixExpressionType(MatrixExpressionType* type)
+ {
+ auto irElementType = lowerSimpleType(context, type->getElementType());
+ auto irRowCount = lowerSimpleVal(context, type->getRowCount());
+ auto irColumnCount = lowerSimpleVal(context, type->getColumnCount());
+
+ return getBuilder()->getMatrixType(irElementType, irRowCount, irColumnCount);
+ }
};
LoweredValInfo lowerVal(
@@ -738,9 +747,42 @@ struct ExprLoweringVisitor : ExprVisitor<ExprLoweringVisitor, LoweredValInfo>
return emitCallToVal(context, type, funcVal, irArgs.Count(), irArgs.Buffer());
}
+ LoweredValInfo subscriptValue(
+ LoweredTypeInfo type,
+ LoweredValInfo baseVal,
+ IRValue* indexVal)
+ {
+ auto builder = getBuilder();
+ switch (baseVal.flavor)
+ {
+ case LoweredValInfo::Flavor::Simple:
+ return LoweredValInfo::simple(
+ builder->emitElementExtract(
+ getSimpleType(type),
+ getSimpleVal(context, baseVal),
+ indexVal));
+
+ case LoweredValInfo::Flavor::Ptr:
+ return LoweredValInfo::ptr(
+ builder->emitElementAddress(
+ builder->getPtrType(getSimpleType(type)),
+ baseVal.val,
+ indexVal));
+
+ default:
+ SLANG_UNIMPLEMENTED_X("subscript expr");
+ return LoweredValInfo();
+ }
+
+ }
+
LoweredValInfo visitIndexExpr(IndexExpr* expr)
{
- SLANG_UNIMPLEMENTED_X("codegen for subscript expression");
+ auto type = lowerType(context, expr->type);
+ auto baseVal = lowerExpr(context, expr->BaseExpression);
+ auto indexVal = getSimpleVal(context, lowerExpr(context, expr->IndexExpression));
+
+ return subscriptValue(type, baseVal, indexVal);
}
LoweredValInfo extractField(