__builtin_prefetch implemented
authorMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Fri, 7 Dec 2007 17:32:16 +0000 (17:32 +0000)
committerMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Fri, 7 Dec 2007 17:32:16 +0000 (17:32 +0000)
[r18643]

ast.c
ast.h
ast2firm.c
ast_t.h
parser.c
tokens.inc

diff --git a/ast.c b/ast.c
index 11c25ce..a8b66e0 100644 (file)
--- a/ast.c
+++ b/ast.c
@@ -286,7 +286,22 @@ static void print_builtin_constant(const builtin_constant_expression_t *expressi
 {
        fputs("__builtin_constant_p(", out);
        print_expression(expression->value);
-       fputs(")", out);
+       fputc(')', out);
+}
+
+static void print_builtin_prefetch(const builtin_prefetch_expression_t *expression)
+{
+       fputs("__builtin_prefetch(", out);
+       print_expression(expression->adr);
+       if (expression->rw) {
+               fputc(',', out);
+               print_expression(expression->rw);
+       }
+       if (expression->locality) {
+               fputc(',', out);
+               print_expression(expression->locality);
+       }
+       fputc(')', out);
 }
 
 static void print_conditional(const conditional_expression_t *expression)
@@ -415,6 +430,9 @@ void print_expression(const expression_t *expression)
        case EXPR_BUILTIN_CONSTANT_P:
                print_builtin_constant(&expression->builtin_constant);
                break;
+       case EXPR_BUILTIN_PREFETCH:
+               print_builtin_prefetch(&expression->builtin_prefetch);
+               break;
        case EXPR_CONDITIONAL:
                print_conditional(&expression->conditional);
                break;
@@ -833,6 +851,7 @@ bool is_constant_expression(const expression_t *expression)
                return true;
 
        case EXPR_BUILTIN_SYMBOL:
+       case EXPR_BUILTIN_PREFETCH:
        case EXPR_CALL:
        case EXPR_SELECT:
        case EXPR_VA_START:
diff --git a/ast.h b/ast.h
index 2674146..0322c76 100644 (file)
--- a/ast.h
+++ b/ast.h
@@ -31,6 +31,7 @@ typedef struct va_start_expression_t            va_start_expression_t;
 typedef struct va_arg_expression_t              va_arg_expression_t;
 typedef struct builtin_symbol_expression_t      builtin_symbol_expression_t;
 typedef struct builtin_constant_expression_t    builtin_constant_expression_t;
+typedef struct builtin_prefetch_expression_t    builtin_prefetch_expression_t;
 typedef struct classify_type_expression_t       classify_type_expression_t;
 typedef union  expression_t                     expression_t;
 
index 25545b8..b5cca3d 100644 (file)
@@ -2186,6 +2186,14 @@ static ir_node *builtin_constant_to_firm(const builtin_constant_expression_t *ex
        return new_Const_long(mode, v);
 }
 
+static ir_node *builtin_prefetch_to_firm(const builtin_prefetch_expression_t *expression)
+{
+       ir_node *adr = expression_to_firm(expression->adr);
+       /* no Firm support for prefetch yet */
+       (void) adr;
+       return NULL;
+}
+
 static ir_node *_expression_to_firm(const expression_t *expression)
 {
        switch(expression->kind) {
@@ -2229,6 +2237,8 @@ static ir_node *_expression_to_firm(const expression_t *expression)
                panic("unimplemented expression found");
        case EXPR_BUILTIN_CONSTANT_P:
                return builtin_constant_to_firm(&expression->builtin_constant);
+       case EXPR_BUILTIN_PREFETCH:
+               return builtin_prefetch_to_firm(&expression->builtin_prefetch);
 
        case EXPR_UNKNOWN:
        case EXPR_INVALID:
diff --git a/ast_t.h b/ast_t.h
index 56bca34..dac6215 100644 (file)
--- a/ast_t.h
+++ b/ast_t.h
@@ -31,6 +31,7 @@ typedef enum {
        EXPR_PRETTY_FUNCTION,
        EXPR_BUILTIN_SYMBOL,
        EXPR_BUILTIN_CONSTANT_P,
+       EXPR_BUILTIN_PREFETCH,
        EXPR_OFFSETOF,
        EXPR_VA_START,
        EXPR_VA_ARG,
@@ -187,6 +188,13 @@ struct builtin_constant_expression_t {
        expression_t      *value;
 };
 
+struct builtin_prefetch_expression_t {
+       expression_base_t  expression;
+       expression_t      *adr;
+       expression_t      *rw;
+       expression_t      *locality;
+};
+
 struct reference_expression_t {
        expression_base_t  expression;
        symbol_t          *symbol;
@@ -289,6 +297,7 @@ union expression_t {
        wide_string_literal_expression_t wide_string;
        builtin_symbol_expression_t      builtin_symbol;
        builtin_constant_expression_t    builtin_constant;
+       builtin_prefetch_expression_t    builtin_prefetch;
        reference_expression_t           reference;
        call_expression_t                call;
        unary_expression_t               unary;
index 5d2a6ab..793b1f5 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -181,6 +181,7 @@ static size_t get_expression_struct_size(expression_kind_t type)
                [EXPR_PRETTY_FUNCTION]     = sizeof(string_literal_expression_t),
                [EXPR_BUILTIN_SYMBOL]      = sizeof(builtin_symbol_expression_t),
                [EXPR_BUILTIN_CONSTANT_P]  = sizeof(builtin_constant_expression_t),
+               [EXPR_BUILTIN_PREFETCH]    = sizeof(builtin_prefetch_expression_t),
                [EXPR_OFFSETOF]            = sizeof(offsetof_expression_t),
                [EXPR_VA_START]            = sizeof(va_start_expression_t),
                [EXPR_VA_ARG]              = sizeof(va_arg_expression_t),
@@ -3192,6 +3193,28 @@ static expression_t *parse_builtin_constant(void)
        return expression;
 }
 
+static expression_t *parse_builtin_prefetch(void)
+{
+       eat(T___builtin_prefetch);
+
+       expression_t *expression = allocate_expression_zero(EXPR_BUILTIN_PREFETCH);
+
+       expect('(');
+       expression->builtin_prefetch.adr = parse_expression();
+       if (token.type == ',') {
+               next_token();
+               expression->builtin_prefetch.rw = parse_expression();
+       }
+       if (token.type == ',') {
+               next_token();
+               expression->builtin_prefetch.locality = parse_expression();
+       }
+       expect(')');
+       expression->base.datatype = type_void;
+
+       return expression;
+}
+
 static expression_t *parse_compare_builtin(void)
 {
        expression_t *expression;
@@ -3329,6 +3352,8 @@ static expression_t *parse_primary_expression(void)
                return parse_compare_builtin();
        case T___builtin_constant_p:
                return parse_builtin_constant();
+       case T___builtin_prefetch:
+               return parse_builtin_prefetch();
        case T___alignof__:
                return parse_alignof();
        case T_assume:
index 17ca6a3..4c92797 100644 (file)
@@ -62,6 +62,7 @@ S(_GNUC, __builtin_islessequal)
 S(_GNUC, __builtin_islessgreater)
 S(_GNUC, __builtin_isunordered)
 S(_GNUC, __builtin_constant_p)
+S(_GNUC, __builtin_prefetch)
 S(_C99, __PRETTY_FUNCTION__)
 S(_ALL, __FUNCTION__)
 S(_C99, __func__)