diff options
| author | Tim Foley <tfoleyNV@users.noreply.github.com> | 2017-09-07 10:31:37 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-09-07 10:31:37 -0700 |
| commit | 0e566a63f0bafb7def65521315e9f19a2bc79e34 (patch) | |
| tree | 470c20f7948693f39b7603645ad9d09fb693c459 /source/slang/parser.cpp | |
| parent | ca16ede67d3fc34ec1cc81b8f835199c5ef1ab9a (diff) | |
| parent | ced92a047e510480cff15be1a1cd102abffa3f82 (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.cpp | 52 |
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); |
