[lang] added __global__ storage specifier
This commit is contained in:
@@ -142,7 +142,7 @@ public:
|
|||||||
STATIC,
|
STATIC,
|
||||||
THREAD, // _Thread_local
|
THREAD, // _Thread_local
|
||||||
AUTO,
|
AUTO,
|
||||||
REGISTER,
|
GLOBAL,
|
||||||
|
|
||||||
// STORAGE CLASS SPECIFIER END
|
// STORAGE CLASS SPECIFIER END
|
||||||
BREAK,
|
BREAK,
|
||||||
@@ -236,7 +236,7 @@ public:
|
|||||||
bool IsIdentifier() const { return IDENTIFIER == tag_; }
|
bool IsIdentifier() const { return IDENTIFIER == tag_; }
|
||||||
bool IsEOF() const { return tag_ == Token::END; }
|
bool IsEOF() const { return tag_ == Token::END; }
|
||||||
bool IsTypeSpecQual() const { return CONST <= tag_ && tag_ <= ENUM; }
|
bool IsTypeSpecQual() const { return CONST <= tag_ && tag_ <= ENUM; }
|
||||||
bool IsDecl() const { return CONST <= tag_ && tag_ <= REGISTER; }
|
bool IsDecl() const { return CONST <= tag_ && tag_ <= GLOBAL; }
|
||||||
static const char* Lexeme(int tag) {
|
static const char* Lexeme(int tag) {
|
||||||
auto iter = tagLexemeMap_.find(tag);
|
auto iter = tagLexemeMap_.find(tag);
|
||||||
if (iter == tagLexemeMap_.end())
|
if (iter == tagLexemeMap_.end())
|
||||||
|
@@ -40,7 +40,7 @@ enum {
|
|||||||
S_STATIC = 0x04,
|
S_STATIC = 0x04,
|
||||||
S_THREAD = 0x08,
|
S_THREAD = 0x08,
|
||||||
S_AUTO = 0x10,
|
S_AUTO = 0x10,
|
||||||
S_REGISTER = 0x20,
|
S_GLOBAL = 0x20,
|
||||||
|
|
||||||
// Type specifier
|
// Type specifier
|
||||||
T_SIGNED = 0x40,
|
T_SIGNED = 0x40,
|
||||||
|
@@ -1000,6 +1000,10 @@ QualType Parser::ParseDeclSpec(int* storageSpec, int* funcSpec, int* alignSpec)
|
|||||||
EnsureAndSetStorageSpec(tok, storageSpec, S_EXTERN);
|
EnsureAndSetStorageSpec(tok, storageSpec, S_EXTERN);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Token::GLOBAL:
|
||||||
|
EnsureAndSetStorageSpec(tok, storageSpec, S_GLOBAL);
|
||||||
|
break;
|
||||||
|
|
||||||
case Token::STATIC:
|
case Token::STATIC:
|
||||||
if (!storageSpec)
|
if (!storageSpec)
|
||||||
Error(tok, ERR_FUNC_SPEC);
|
Error(tok, ERR_FUNC_SPEC);
|
||||||
@@ -1020,10 +1024,6 @@ QualType Parser::ParseDeclSpec(int* storageSpec, int* funcSpec, int* alignSpec)
|
|||||||
EnsureAndSetStorageSpec(tok, storageSpec, S_AUTO);
|
EnsureAndSetStorageSpec(tok, storageSpec, S_AUTO);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Token::REGISTER:
|
|
||||||
EnsureAndSetStorageSpec(tok, storageSpec, S_REGISTER);
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Type qualifier
|
// Type qualifier
|
||||||
case Token::CONST: qualSpec |= Qualifier::CONST; break;
|
case Token::CONST: qualSpec |= Qualifier::CONST; break;
|
||||||
case Token::RESTRICT: qualSpec |= Qualifier::RESTRICT; break;
|
case Token::RESTRICT: qualSpec |= Qualifier::RESTRICT; break;
|
||||||
|
@@ -7,6 +7,7 @@
|
|||||||
static MemPoolImp<Token> tokenPool;
|
static MemPoolImp<Token> tokenPool;
|
||||||
|
|
||||||
const std::unordered_map<std::string, int> Token::kwTypeMap_ {
|
const std::unordered_map<std::string, int> Token::kwTypeMap_ {
|
||||||
|
{ "__global__", Token::GLOBAL },
|
||||||
{ "auto", Token::AUTO },
|
{ "auto", Token::AUTO },
|
||||||
{ "break", Token::BREAK },
|
{ "break", Token::BREAK },
|
||||||
{ "case", Token::CASE },
|
{ "case", Token::CASE },
|
||||||
@@ -30,7 +31,6 @@ const std::unordered_map<std::string, int> Token::kwTypeMap_ {
|
|||||||
{ "newaxis", Token::NEWAXIS },
|
{ "newaxis", Token::NEWAXIS },
|
||||||
{ "signed", Token::SIGNED },
|
{ "signed", Token::SIGNED },
|
||||||
{ "unsigned", Token::UNSIGNED },
|
{ "unsigned", Token::UNSIGNED },
|
||||||
{ "register", Token::REGISTER },
|
|
||||||
{ "restrict", Token::RESTRICT },
|
{ "restrict", Token::RESTRICT },
|
||||||
{ "return", Token::RETURN },
|
{ "return", Token::RETURN },
|
||||||
{ "short", Token::SHORT },
|
{ "short", Token::SHORT },
|
||||||
@@ -121,6 +121,7 @@ const std::unordered_map<int, const char*> Token::tagLexemeMap_ {
|
|||||||
{ Token::EXTERN, "extern" },
|
{ Token::EXTERN, "extern" },
|
||||||
{ Token::FLOAT, "float" },
|
{ Token::FLOAT, "float" },
|
||||||
{ Token::FOR, "for" },
|
{ Token::FOR, "for" },
|
||||||
|
{ Token::GLOBAL, "global" },
|
||||||
{ Token::GOTO, "goto" },
|
{ Token::GOTO, "goto" },
|
||||||
{ Token::IF, "if" },
|
{ Token::IF, "if" },
|
||||||
{ Token::INLINE, "inline" },
|
{ Token::INLINE, "inline" },
|
||||||
@@ -129,7 +130,6 @@ const std::unordered_map<int, const char*> Token::tagLexemeMap_ {
|
|||||||
{ Token::NEWAXIS, "newaxis" },
|
{ Token::NEWAXIS, "newaxis" },
|
||||||
{ Token::SIGNED, "signed" },
|
{ Token::SIGNED, "signed" },
|
||||||
{ Token::UNSIGNED, "unsigned" },
|
{ Token::UNSIGNED, "unsigned" },
|
||||||
{ Token::REGISTER, "register" },
|
|
||||||
{ Token::RESTRICT, "restrict" },
|
{ Token::RESTRICT, "restrict" },
|
||||||
{ Token::RETURN, "return" },
|
{ Token::RETURN, "return" },
|
||||||
{ Token::SHORT, "short" },
|
{ Token::SHORT, "short" },
|
||||||
|
@@ -34,7 +34,7 @@ R"(
|
|||||||
#define SHAPE_B TK, TN
|
#define SHAPE_B TK, TN
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void dot(TYPE * A, TYPE * B, TYPE * C,
|
__global__ void dot(TYPE * A, TYPE * B, TYPE * C,
|
||||||
int M, int N, int K,
|
int M, int N, int K,
|
||||||
int lda __multipleof(8),
|
int lda __multipleof(8),
|
||||||
int ldb __multipleof(8),
|
int ldb __multipleof(8),
|
||||||
|
Reference in New Issue
Block a user