📄 outx86_g.c
字号:
*/PRIVATE void put_code P1 (const CODE *, ip){ ILEN len1 = ip->length, len2 = ip->length; /* * this is expensive, but some assemblers require it * this is to be moved to the peephole optimizer */ switch (ip->opcode) { case op_shl: case op_shr: case op_asl: case op_asr: len1 = IL1; break; case op_movsbw: case op_movzbw: len2 = IL2; /*lint -fallthrough */ case op_movsbl: case op_movzbl: len1 = IL1; break; case op_movswl: case op_movzwl: len1 = IL2; break; default: break; } putop (ip->opcode); putlen (ip->length); /* * Sun reverses the INTEL syntax: * The source comes first * The destination comes second * The imul instruction is special (3 operands), this * is handled here */ if (ip->oper1 != NIL_ADDRESS) { oprintf ("\t"); putamode (ip->oper1, len1); if (ip->oper2 != NIL_ADDRESS) { if (ip->opcode == op_line) { oprintf ("%s%s>>>>\t", newline, comment); } else { oprintf (", "); } putamode (ip->oper2, len2); /* * Assembler has strange syntax */ if (ip->opcode == op_imul && ip->oper1->mode == am_immed && ip->oper2->mode == am_dreg) { oprintf (", "); putamode (ip->oper2, len2); } } } oprintf ("%s", newline);}static void put_type P1 (const SYM *, sp){ TYP *tp = typeof (sp); if (is_object_type (tp)) { oprintf ("\t.type\t%s,@object%s", outlate (nameof (sp)), newline); oprintf ("\t.size\t%s,%ld%s", outlate (nameof (sp)), tp->size, newline); } else { oprintf ("\t.type\t%s,@function%s", outlate (nameof (sp)), newline); }}/* * generate a named label. */PRIVATE void put_name P1 (SYM *, sp){ put_reference (sp); put_type (sp); oprintf ("%s:%s", outlate (nameof (sp)), newline);}/* * output a compiler generated label. */PRIVATE void put_label P1 (LABEL, lab){ oprintf ("%s%u:%s", prefix, (unsigned int) lab, newline);}static void put_header P2 (enum e_gt, gtype, SIZE, al){ static const char *directive[] = { ".byte\t", /* bytegen */ ".word\t", /* wordgen */ ".long\t", /* longgen */ ".long\t", /* longlonggen */ }; if (gentype != gtype || outcol >= MAX_WIDTH) { put_align (al); gentype = gtype; outcol = 15; oprintf ("\t%s", directive[gtype]); } else { oprintf (","); }}PRIVATE void put_byte P1 (UVAL, val){ put_header (bytegen, alignment_of_type (tp_char)); oprintf ("0x%lx", val & OxffUL); outcol += 4;}PRIVATE void put_word P1 (UVAL, val){ /* stupid assembler has no .word */ /* emit low byte, high byte */ put_byte (val & (UVAL) 255); put_byte ((val >> 8) & (UVAL) 255);}PRIVATE void put_dword P1 (UVAL, val){ put_header (longgen, alignment_of_type (tp_long)); oprintf ("0x%lx", val); outcol += 10;}#ifndef FLOAT_BOOTSTRAP#ifdef FLOAT_IEEE/* * Generate IEEE single and double numbers */PRIVATE void put_float P1 (const RVAL *, vp){ unsigned long ul; ieee_single (vp, &ul); put_dword ((UVAL) ul);}PRIVATE void put_double P1 (const RVAL *, vp){ unsigned long ul[2]; ieee_double (vp, ul, FALSE); put_dword ((UVAL) ul[0]); put_dword ((UVAL) ul[1]);}PRIVATE void put_longdouble P1 (const RVAL *, vp){ unsigned long ul[3]; ieee_longdouble (vp, ul, FALSE); put_dword ((UVAL) ul[0]); put_dword ((UVAL) ul[1]); put_dword ((UVAL) ul[2]);}#endif /* FLOAT_IEEE */#endif /* FLOAT_BOOTSTRAP */#ifndef RELOC_BUGPRIVATE void put_char P1 (const EXPR *, ep){ put_header (bytegen, alignment_of_type (tp_char)); putconst (ep); outcol += 10;}PRIVATE void put_short P1 (const EXPR *, ep){ put_header (wordgen, alignment_of_type (tp_short)); putconst (ep); outcol += 10;}#endif /* RELOC_BUG */PRIVATE void put_long P1 (const EXPR *, ep){ put_header (longgen, alignment_of_type (tp_long)); putconst (ep); outcol += 10;}PRIVATE void put_longlong P1 (const EXPR *, ep){ put_header (longlonggen, alignment_of_type (tp_longlong)); putconst (ep); outcol += 10;}PRIVATE void put_pointer P1 (const EXPR *, ep){ put_header ((tp_pointer->size == 2L ? wordgen : longgen), alignment_of_type (tp_pointer)); putconst (ep); outcol += 10;}/*ARGSUSED */PRIVATE void put_storage P1 (const SYM *, sp){ SIZE size = typeof (sp)->size; put_bseg (alignment_of_type (typeof (sp))); if (is_static (sp)) { oprintf ("\t.lcomm\t%s%u,%ld%s", prefix, (unsigned) sp->value.l, size, newline); } else { oprintf ("\t.comm\t%s,%ld%s", outlate (nameof (sp)), size, newline); }}/* * dump the string literal pool. * if we are producing single copies of strings (which should therefore * be read only we put them in the text segment - else in the data segment. */PRIVATE void put_literals P0 (void){ const CHAR *cp; size_t len; if (lang_option == LANG_KANDR) { put_dseg (alignment_of_type (tp_char)); } else { put_kseg (alignment_of_type (tp_char)); } for (; strtab != NIL_STRING; strtab = strtab->next) { nl (); put_label (strtab->label); cp = strtab->str; for (len = strtab->len; len--;) put_byte ((UVAL) *cp++); put_byte ((UVAL) Ox0UL); } nl ();}PRIVATE void put_reference P1 (SYM *, sp){ if (!is_symbol_output (sp)) { switch (storageof (sp)) { case sc_global: case sc_external: nl (); oprintf ("\t.globl\t%s%s", outlate (nameof (sp)), newline); break; default: break; } symbol_output (sp); }}/* align the following data */static void put_align P1 (SIZE, al){ nl (); if (al > align_type) { oprintf ("\t.align\t%ld%s", al, newline); } align_type = al;}/* * output any function epilogue code */PRIVATE void put_epilogue P2 (SYM *, sp, LABEL, label){ put_label (label); oprintf ("\t.size\t%s,%s%u-%s%s", outlate (nameof (sp)), prefix, label, outlate (nameof (sp)), newline);} /*lint !e818*/ /* pointer parameter could be declared as pointing to const */PRIVATE void nl P0 (void){ if (outcol > 0) { oprintf ("%s", newline); gentype = nogen; outcol = 0; }}static void seg P3 (enum e_sg, segtype, const char *, segname, SIZE, al){ nl (); if (curseg != segtype) { oprintf ("\t%s%s", segname, newline); curseg = segtype; align_type = 0L; } put_align (al);}PRIVATE void put_cseg P1 (SIZE, al){ seg (codeseg, ".text", al);}PRIVATE void put_dseg P1 (SIZE, al){ seg (dataseg, ".data", al);}static void put_bseg P1 (SIZE, al){ put_dseg (al);}PRIVATE void put_kseg P1 (SIZE, al){ if (IandD_option) { put_dseg (al); } else { put_cseg (al); }}PRIVATE void put_rseg P1 (SIZE, al){ put_cseg (al);}PRIVATE void put_finish P0 (void){}PRIVATE void put_start P0 (void){ oprintf ("\t.file\t\"%s\"%s", in_file, newline); oprintf ("\t.version\t\"%s %s\"%s", PROGNAME, VERSION, newline); oprintf ("\t.optim%s", newline); oprintf ("c386_compiled.:%s", newline);}#ifdef MULTIPLE_ASSEMBLERSstruct funcs gasx86_func = { put_code, put_name, put_label, put_byte, put_word, put_dword,#ifndef RELOC_BUG put_char, put_short,#endif /* RELOC_BUG */ put_long, put_longlong, put_pointer, put_storage, put_literals, put_finish, put_start, put_reference, put_epilogue, put_cseg, put_dseg, put_kseg, put_rseg, #ifndef FLOAT_BOOTSTRAP#ifdef FLOAT_SUPPORT put_float, put_double, put_longdouble,#endif /* FLOAT_SUPPORT */#endif /* FLOAT_BOOTSTRAP */ NULL};#endif /* MULTIPLE_ASSEMBLERS */#endif /* TARGET_GAS */#endif /* INTEL */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -