summaryrefslogtreecommitdiffstats
path: root/source/slang/parser.cpp
diff options
context:
space:
mode:
authorTim Foley <tfoleyNV@users.noreply.github.com>2017-09-07 10:31:37 -0700
committerGitHub <noreply@github.com>2017-09-07 10:31:37 -0700
commit0e566a63f0bafb7def65521315e9f19a2bc79e34 (patch)
tree470c20f7948693f39b7603645ad9d09fb693c459 /source/slang/parser.cpp
parentca16ede67d3fc34ec1cc81b8f835199c5ef1ab9a (diff)
parentced92a047e510480cff15be1a1cd102abffa3f82 (diff)
Merge pull request #177 from tfoleyNV/ir-work
Replace old notion of "intrinsic" operations
Diffstat (limited to 'source/slang/parser.cpp')
-rw-r--r--source/slang/parser.cpp52
1 files changed, 37 insertions, 15 deletions
diff --git a/source/slang/parser.cpp b/source/slang/parser.cpp
index 9c0d692e6..8ea41641d 100644
--- a/source/slang/parser.cpp
+++ b/source/slang/parser.cpp
@@ -3766,29 +3766,51 @@ namespace Slang
{
RefPtr<IntrinsicOpModifier> modifier = new IntrinsicOpModifier();
- parser->ReadToken(TokenType::LParent);
- if (parser->LookAheadToken(TokenType::IntegerLiteral))
- {
- modifier->op = (IntrinsicOp)StringToInt(parser->ReadToken().Content);
- }
- else
+ // We allow a few difference forms here:
+ //
+ // First, we can specify the intrinsic op `enum` value directly:
+ //
+ // __intrinsic_op(<integer literal>)
+ //
+ // Second, we can specify the operation by name:
+ //
+ // __intrinsic_op(<identifier>)
+ //
+ // Finally, we can leave off the specification, so that the
+ // op name will be derived fromthe function name:
+ //
+ // __intrinsic_op
+ //
+ if (AdvanceIf(parser, TokenType::LParent))
{
- modifier->opToken = parser->ReadToken(TokenType::Identifier);
+ if (AdvanceIf(parser, TokenType::OpSub))
+ {
+ modifier->op = IROp(-StringToInt(parser->ReadToken().Content));
+ }
+ else if (parser->LookAheadToken(TokenType::IntegerLiteral))
+ {
+ modifier->op = IROp(StringToInt(parser->ReadToken().Content));
+ }
+ else
+ {
+ modifier->opToken = parser->ReadToken(TokenType::Identifier);
- modifier->op = findIntrinsicOp(modifier->opToken.Content.Buffer());
+ modifier->op = findIROp(modifier->opToken.Content.Buffer());
- if (modifier->op == IntrinsicOp::Unknown)
- {
- parser->sink->diagnose(modifier->opToken, Diagnostics::unimplemented, "unknown intrinsic op");
+ if (modifier->op == kIROp_Invalid)
+ {
+ parser->sink->diagnose(modifier->opToken, Diagnostics::unimplemented, "unknown intrinsic op");
+ }
}
+
+ parser->ReadToken(TokenType::RParent);
}
- parser->ReadToken(TokenType::RParent);
return modifier;
}
- static RefPtr<RefObject> parseIntrinsicModifier(Parser* parser, void* /*userData*/)
+ static RefPtr<RefObject> parseTargetIntrinsicModifier(Parser* parser, void* /*userData*/)
{
auto modifier = new TargetIntrinsicModifier();
@@ -4027,8 +4049,8 @@ namespace Slang
MODIFIER(layout, parseLayoutModifier);
- MODIFIER(__intrinsic_op, parseIntrinsicOpModifier);
- MODIFIER(__intrinsic, parseIntrinsicModifier);
+ MODIFIER(__intrinsic_op, parseIntrinsicOpModifier);
+ MODIFIER(__target_intrinsic, parseTargetIntrinsicModifier);
MODIFIER(__glsl_extension, parseGLSLExtensionModifier);
MODIFIER(__glsl_version, parseGLSLVersionModifier);