{
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)
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;
return true;
case EXPR_BUILTIN_SYMBOL:
+ case EXPR_BUILTIN_PREFETCH:
case EXPR_CALL:
case EXPR_SELECT:
case EXPR_VA_START:
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;
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) {
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:
EXPR_PRETTY_FUNCTION,
EXPR_BUILTIN_SYMBOL,
EXPR_BUILTIN_CONSTANT_P,
+ EXPR_BUILTIN_PREFETCH,
EXPR_OFFSETOF,
EXPR_VA_START,
EXPR_VA_ARG,
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;
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;
[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),
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;
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:
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__)