static void emit_literal_string(Node *node) { SAVE; if (!node->slabel) { node->slabel = make_label(); emit_noindent(".data"); emit_label(node->slabel); emit(".string \"%s\"", quote_cstring(node->sval)); emit_noindent(".text"); } emit("lea %s(%%rip), %%rax", node->slabel); }
static void emit_literal(Node *node) { SAVE; switch (node->ctype->type) { case CTYPE_BOOL: case CTYPE_CHAR: emit("mov $%d, %%rax", node->ival); break; case CTYPE_INT: emit("mov $%d, %%rax", node->ival); break; case CTYPE_LONG: case CTYPE_LLONG: { emit("mov $%lu, %%rax", node->ival); break; } case CTYPE_FLOAT: { if (!node->flabel) { node->flabel = make_label(); float fval = node->fval; int *p = (int *)&fval; emit_noindent(".data"); emit_label(node->flabel); emit(".long %d", *p); emit_noindent(".text"); } emit("movss %s(%%rip), %%xmm0", node->flabel); break; } case CTYPE_DOUBLE: case CTYPE_LDOUBLE: { if (!node->flabel) { node->flabel = make_label(); int *fval = (int *)&node->fval; emit_noindent(".data"); emit_label(node->flabel); emit(".long %d", fval[0]); emit(".long %d", fval[1]); emit_noindent(".text"); } emit("movsd %s(%%rip), %%xmm0", node->flabel); break; } default: error("internal error"); } }
static void emit_literal(Node *node) { SAVE; switch (node->ty->kind) { case KIND_BOOL: case KIND_CHAR: case KIND_SHORT: emit("mov $%u, #rax", node->ival); break; case KIND_INT: emit("mov $%u, #rax", node->ival); break; case KIND_LONG: case KIND_LLONG: { emit("mov $%lu, #rax", node->ival); break; } case KIND_FLOAT: { if (!node->flabel) { node->flabel = make_label(); float fval = node->fval; emit_noindent(".data"); emit_label(node->flabel); emit(".long %d", *(uint32_t *)&fval); emit_noindent(".text"); } emit("movss %s(#rip), #xmm0", node->flabel); break; } case KIND_DOUBLE: case KIND_LDOUBLE: { if (!node->flabel) { node->flabel = make_label(); emit_noindent(".data"); emit_label(node->flabel); emit(".quad %lu", *(uint64_t *)&node->fval); emit_noindent(".text"); } emit("movsd %s(#rip), #xmm0", node->flabel); break; } case KIND_ARRAY: { if (!node->slabel) { node->slabel = make_label(); emit_noindent(".data"); emit_label(node->slabel); emit(".string \"%s\"", quote_cstring_len(node->sval, node->ty->size)); emit_noindent(".text"); } emit("lea %s(#rip), #rax", node->slabel); break; } default: error("internal error"); } }