static void emit_load_convert(Ctype *to, Ctype *from) { SAVE; if (is_inttype(from) && to->type == CTYPE_FLOAT) emit("cvtsi2ss %%eax, %%xmm0"); else if (is_inttype(from) && to->type == CTYPE_DOUBLE) emit("cvtsi2sd %%eax, %%xmm0"); else if (from->type == CTYPE_FLOAT && to->type == CTYPE_DOUBLE) emit("cvtps2pd %%xmm0, %%xmm0"); else if (from->type == CTYPE_DOUBLE && to->type == CTYPE_FLOAT) emit("cvtpd2ps %%xmm0, %%xmm0"); else if (to->type == CTYPE_BOOL) emit_to_bool(from); else if (is_inttype(to)) emit_toint(from); }
static void emit_load_convert(Type *to, Type *from) { SAVE; if (is_inttype(from) && to->kind == KIND_FLOAT) emit("cvtsi2ss #eax, #xmm0"); else if (is_inttype(from) && to->kind == KIND_DOUBLE) emit("cvtsi2sd #eax, #xmm0"); else if (from->kind == KIND_FLOAT && to->kind == KIND_DOUBLE) emit("cvtps2pd #xmm0, #xmm0"); else if ((from->kind == KIND_DOUBLE || from->kind == KIND_LDOUBLE) && to->kind == KIND_FLOAT) emit("cvtpd2ps #xmm0, #xmm0"); else if (to->kind == KIND_BOOL) emit_to_bool(from); else if (is_inttype(from) && is_inttype(to)) emit_intcast(from); else if (is_inttype(to)) emit_toint(from); }
static void emit_binop(Node *node) { SAVE; if (node->ty->kind == KIND_PTR) { emit_pointer_arith(node->kind, node->left, node->right); return; } switch (node->kind) { case '<': emit_comp("setl", "setb", node); return; case OP_EQ: emit_comp("sete", "sete", node); return; case OP_LE: emit_comp("setle", "setna", node); return; case OP_NE: emit_comp("setne", "setne", node); return; } if (is_inttype(node->ty)) emit_binop_int_arith(node); else if (is_flotype(node->ty)) emit_binop_float_arith(node); else error("internal error: %s", node2s(node)); }
static void emit_binop(Node *node) { SAVE; if (node->ctype->type == CTYPE_PTR) { emit_pointer_arith(node->type, node->left, node->right); return; } switch (node->type) { case '<': emit_comp("setl", node); return; case '>': emit_comp("setg", node); return; case OP_EQ: emit_comp("sete", node); return; case OP_GE: emit_comp("setge", node); return; case OP_LE: emit_comp("setle", node); return; case OP_NE: emit_comp("setne", node); return; } if (is_inttype(node->ctype)) emit_binop_int_arith(node); else if (is_flotype(node->ctype)) emit_binop_float_arith(node); else error("internal error"); }