?? dpx2.h
字號:
do { char dstr[30]; \ REAL_VALUE_TO_DECIMAL (VALUE, "%.20g", dstr); \ fprintf (FILE, "\tdc.d %s\n", dstr); \ } while (0)#endif#define ASM_OUTPUT_DOUBLE(FILE,VALUE) \do { long l[2]; \ REAL_VALUE_TO_TARGET_DOUBLE (VALUE, l); \ fprintf (FILE, "\tdc.l $%x,$%x\n", l[0], l[1]); \ } while (0)/* This is how to output an assembler line defining a `float' constant. */#undef ASM_OUTPUT_FLOAT#define ASM_OUTPUT_FLOAT(FILE,VALUE) \do { long l; \ REAL_VALUE_TO_TARGET_SINGLE (VALUE, l); \ if (sizeof (int) == sizeof (long)) \ fprintf (FILE, "\tdc.l $%x\n", l); \ else \ fprintf (FILE, "\tdc.l $%lx\n", l); \ } while (0)/* This is how to output an assembler line defining an `int' constant. */#undef ASM_OUTPUT_INT #define ASM_OUTPUT_INT(FILE,VALUE) \( fprintf (FILE, "\tdc.l "), \ output_addr_const (FILE, (VALUE)), \ fprintf (FILE, "\n"))/* Likewise for `char' and `short' constants. */#undef ASM_OUTPUT_SHORT#define ASM_OUTPUT_SHORT(FILE,VALUE) \( fprintf (FILE, "\tdc.w "), \ output_addr_const (FILE, (VALUE)), \ fprintf (FILE, "\n"))#undef ASM_OUTPUT_CHAR#define ASM_OUTPUT_CHAR(FILE,VALUE) \( fprintf (FILE, "\tdc.b "), \ output_addr_const (FILE, (VALUE)), \ fprintf (FILE, "\n"))/* This is how to output an assembler line for a numeric constant byte. */#undef ASM_OUTPUT_BYTE#define ASM_OUTPUT_BYTE(FILE,VALUE) \ fprintf (FILE, "\tdc.b $%x\n", (VALUE))/* This is how to output an element of a case-vector that is absolute. (The 68000 does not use such vectors, but we must define this macro anyway.) */#undef ASM_OUTPUT_ADDR_VEC_ELT#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \ asm_fprintf (FILE, "\tdc.l %LL%d\n", VALUE)/* This is how to output an element of a case-vector that is relative. */#undef ASM_OUTPUT_ADDR_DIFF_ELT#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \ asm_fprintf (FILE, "\tdc.w %LL%d-%LL%d\n", VALUE, REL)/* Currently, JUMP_TABLES_IN_TEXT_SECTION must be defined in order to keep switch tables in the text section. */#define JUMP_TABLES_IN_TEXT_SECTION 1/* Output a float value (represented as a C double) as an immediate operand. This macro is a 68k-specific macro. */#undef ASM_OUTPUT_FLOAT_OPERAND#define ASM_OUTPUT_FLOAT_OPERAND(CODE,FILE,VALUE) \ do { \ if (CODE == 'f') \ { \ char dstr[30]; \ REAL_VALUE_TO_DECIMAL (VALUE, "%.9g", dstr); \ asm_fprintf ((FILE), "%I%s", dstr); \ } \ else \ { \ long l; \ REAL_VALUE_TO_TARGET_SINGLE (VALUE, l); \ if (sizeof (int) == sizeof (long)) \ asm_fprintf ((FILE), "%I$%x", l); \ else \ asm_fprintf ((FILE), "%I$%lx", l); \ } \ } while (0)/* Output a double value (represented as a C double) as an immediate operand. This macro is a 68k-specific macro. */#undef ASM_OUTPUT_DOUBLE_OPERAND #define ASM_OUTPUT_DOUBLE_OPERAND(FILE,VALUE) \ do { char dstr[30]; \ REAL_VALUE_TO_DECIMAL (VALUE, "%.20g", dstr); \ asm_fprintf (FILE, "%I%s", dstr); \ } while (0)/* Note, long double immediate operands are not actually generated by m68k.md. */#undef ASM_OUTPUT_LONG_DOUBLE_OPERAND#define ASM_OUTPUT_LONG_DOUBLE_OPERAND(FILE,VALUE) \ do { char dstr[30]; \ REAL_VALUE_TO_DECIMAL (VALUE, "%.20g", dstr); \ asm_fprintf (FILE, "%I%s", dstr); \ } while (0)#undef ASM_OUTPUT_COMMON#define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) \( fputs ("\t.comm ", (FILE)), \ assemble_name ((FILE), (NAME)), \ fprintf ((FILE), ",%u\n", (ROUNDED)))#undef ASM_OUTPUT_LOCAL#define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED) \ do { \ int align = exact_log2 (ROUNDED); \ /*fprintf ((FILE), "\tsection 14\n"); */ \ data_section (); \ ASM_OUTPUT_ALIGN ((FILE), align) \ ASM_OUTPUT_LABEL ((FILE), (NAME)); \ fprintf ((FILE), "\tdcb.b %u,0\n", (ROUNDED)); \ /* fprintf ((FILE), "\tsection 10\n"); */ \ } while (0)#undef PRINT_OPERAND_ADDRESS#define PRINT_OPERAND_ADDRESS(FILE, ADDR) \{ register rtx reg1, reg2, breg, ireg; \ register rtx addr = ADDR; \ rtx offset; \ switch (GET_CODE (addr)) \ { \ case REG: \ fprintf (FILE, "(%s)", reg_names[REGNO (addr)]); \ break; \ case PRE_DEC: \ fprintf (FILE, "-(%s)", reg_names[REGNO (XEXP (addr, 0))]); \ break; \ case POST_INC: \ fprintf (FILE, "(%s)+", reg_names[REGNO (XEXP (addr, 0))]); \ break; \ case PLUS: \ reg1 = 0; reg2 = 0; \ ireg = 0; breg = 0; \ offset = 0; \ if (CONSTANT_ADDRESS_P (XEXP (addr, 0))) \ { \ offset = XEXP (addr, 0); \ addr = XEXP (addr, 1); \ } \ else if (CONSTANT_ADDRESS_P (XEXP (addr, 1))) \ { \ offset = XEXP (addr, 1); \ addr = XEXP (addr, 0); \ } \ if (GET_CODE (addr) != PLUS) ; \ else if (GET_CODE (XEXP (addr, 0)) == SIGN_EXTEND) \ { \ reg1 = XEXP (addr, 0); \ addr = XEXP (addr, 1); \ } \ else if (GET_CODE (XEXP (addr, 1)) == SIGN_EXTEND) \ { \ reg1 = XEXP (addr, 1); \ addr = XEXP (addr, 0); \ } \ else if (GET_CODE (XEXP (addr, 0)) == MULT) \ { \ reg1 = XEXP (addr, 0); \ addr = XEXP (addr, 1); \ } \ else if (GET_CODE (XEXP (addr, 1)) == MULT) \ { \ reg1 = XEXP (addr, 1); \ addr = XEXP (addr, 0); \ } \ else if (GET_CODE (XEXP (addr, 0)) == REG) \ { \ reg1 = XEXP (addr, 0); \ addr = XEXP (addr, 1); \ } \ else if (GET_CODE (XEXP (addr, 1)) == REG) \ { \ reg1 = XEXP (addr, 1); \ addr = XEXP (addr, 0); \ } \ if (GET_CODE (addr) == REG || GET_CODE (addr) == MULT \ || GET_CODE (addr) == SIGN_EXTEND) \ { if (reg1 == 0) reg1 = addr; else reg2 = addr; addr = 0; } \/* for OLD_INDEXING \ else if (GET_CODE (addr) == PLUS) \ { \ if (GET_CODE (XEXP (addr, 0)) == REG) \ { \ reg2 = XEXP (addr, 0); \ addr = XEXP (addr, 1); \ } \ else if (GET_CODE (XEXP (addr, 1)) == REG) \ { \ reg2 = XEXP (addr, 1); \ addr = XEXP (addr, 0); \ } \ } \ */ \ if (offset != 0) { if (addr != 0) abort (); addr = offset; } \ if ((reg1 && (GET_CODE (reg1) == SIGN_EXTEND \ || GET_CODE (reg1) == MULT)) \ || (reg2 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg2)))) \ { breg = reg2; ireg = reg1; } \ else if (reg1 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg1))) \ { breg = reg1; ireg = reg2; } \ if (ireg != 0 && breg == 0 && GET_CODE (addr) == LABEL_REF) \ { int scale = 1; \ if (GET_CODE (ireg) == MULT) \ { scale = INTVAL (XEXP (ireg, 1)); \ ireg = XEXP (ireg, 0); } \ if (GET_CODE (ireg) == SIGN_EXTEND) \ fprintf (FILE, "(.L%d,pc,%s.w", \ CODE_LABEL_NUMBER (XEXP (addr, 0)), \ reg_names[REGNO (XEXP (ireg, 0))]); \ else \ fprintf (FILE, "(.L%d,pc,%s.l", \ CODE_LABEL_NUMBER (XEXP (addr, 0)), \ reg_names[REGNO (ireg)]); \ if (scale != 1) fprintf (FILE, "*%d", scale); \ putc (')', FILE); \ break; } \ if (breg != 0 && ireg == 0 && GET_CODE (addr) == LABEL_REF \ && ! (flag_pic && breg == pic_offset_table_rtx)) \ { \ fprintf (FILE, "(.L%d,pc,%s.l", \ CODE_LABEL_NUMBER (XEXP (addr, 0)), \ reg_names[REGNO (breg)]); \ putc (')', FILE); \ break; } \ if (ireg != 0 || breg != 0) \ { int scale = 1; \ if (breg == 0) \ abort (); \ putc ('(', FILE); \ if (addr != 0) \ { \ output_addr_const (FILE, addr); \ putc (',', FILE); \ } \ fprintf (FILE, "%s", reg_names[REGNO (breg)]); \ if (ireg != 0) \ putc (',', FILE); \ if (ireg != 0 && GET_CODE (ireg) == MULT) \ { scale = INTVAL (XEXP (ireg, 1)); \ ireg = XEXP (ireg, 0); } \ if (ireg != 0 && GET_CODE (ireg) == SIGN_EXTEND) \ fprintf (FILE, "%s.w", reg_names[REGNO (XEXP (ireg, 0))]); \ else if (ireg != 0) \ fprintf (FILE, "%s.l", reg_names[REGNO (ireg)]); \ if (scale != 1) fprintf (FILE, "*%d", scale); \ putc (')', FILE); \ break; \ } \ else if (reg1 != 0 && GET_CODE (addr) == LABEL_REF) \ { fprintf (FILE, "(.L%d,pc,%s.w)", \ CODE_LABEL_NUMBER (XEXP (addr, 0)), \ reg_names[REGNO (reg1)]); \ break; } \ default: \ if (GET_CODE (addr) == CONST_INT \ && INTVAL (addr) < 0x8000 \ && INTVAL (addr) >= -0x8000) \ fprintf (FILE, "%d.w", INTVAL (addr)); \ else \ output_addr_const (FILE, addr); \ }}#endif /* ! use gas */
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -