ir_tarval *fold_builtin_nan(call_expression_t const *const call, type_t const *const function_type) { ir_tarval *payload = NULL; call_argument_t *const argument = call->arguments; if (argument != NULL && argument->expression->kind == EXPR_STRING_LITERAL) { const char *str = argument->expression->string_literal.value->begin; /* sanity checking */ if (is_valid_strold_input(str)) { ir_mode *payload_mode = atomic_modes[ATOMIC_TYPE_ULONGLONG]; payload = new_tarval_from_str(str, strlen(str), payload_mode); } } type_t *type = function_type->function.return_type; ir_mode *mode = get_ir_mode_storage(type); return new_tarval_nan(mode, false, payload); }
int main(void) { init_ident(); init_tarval_1(); init_irprog_1(); init_mode(); init_tarval_2(); double d_nan = 0.0/0.0; assert (d_nan != d_nan); d_nan = new_nan(1234); assert (d_nan != d_nan); assert (nan_payload(d_nan) == 1234); d_nan *= 2; assert (d_nan != d_nan); ir_tarval* tv_nan = new_tarval_from_double(d_nan, mode_D); assert (tarval_is_nan(tv_nan)); d_nan = get_tarval_double(tv_nan); assert (d_nan != d_nan); assert (nan_payload(d_nan) == 1234); tv_nan = new_tarval_nan(mode_D, false, NULL); assert (tarval_is_nan(tv_nan)); d_nan = get_tarval_double(tv_nan); assert (d_nan != d_nan); d_nan = new_nan(0); assert (nan_payload(d_nan) == 0); assert (d_nan != d_nan); tv_nan = new_tarval_from_double(d_nan, mode_D); assert (tarval_is_nan(tv_nan)); d_nan = get_tarval_double(tv_nan); assert (d_nan != d_nan); assert (nan_payload(d_nan) == 0); finish_tarval(); finish_mode(); finish_ident(); return 0; }