📄 tower-as.h
字号:
fprintf ((FILE), "&0x%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 { long l[2]; \ REAL_VALUE_TO_TARGET_DOUBLE (VALUE, l); \ fprintf ((FILE), "&0x%lx%08lx", l[0], l[1]); \ } while (0)#if 0#undef PRINT_OPERAND#define PRINT_OPERAND(FILE, X, CODE) \{ if (CODE == '.') fprintf (FILE, "."); \ else if (CODE == '#') fprintf (FILE, "&"); \ else if (CODE == '-') fprintf (FILE, "-(%%sp)"); \ else if (CODE == '+') fprintf (FILE, "(%%sp)+"); \ else if (CODE == '@') fprintf (FILE, "(%%sp)"); \ else if (CODE == '!') fprintf (FILE, "%%fpcr"); \ else if (CODE == '/') \ fprintf (FILE, "%%"); \ else if (CODE == '$') { if (TARGET_68040_ONLY) fprintf (FILE, "s"); } \ else if (CODE == '&') { if (TARGET_68040_ONLY) fprintf (FILE, "d"); } \ else if (GET_CODE (X) == REG) \ fprintf (FILE, "%s", reg_names[REGNO (X)]); \ else if (GET_CODE (X) == MEM) \ output_address (XEXP (X, 0)); \ else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == SFmode) \ { REAL_VALUE_TYPE r; long l; \ REAL_VALUE_FROM_CONST_DOUBLE (r, X); \ REAL_VALUE_TO_TARGET_SINGLE (r, l); \ fprintf (FILE, "&0x%lx", l); } \ else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == DFmode) \ { REAL_VALUE_TYPE r; int i[2]; \ REAL_VALUE_FROM_CONST_DOUBLE (r, X); \ REAL_VALUE_TO_TARGET_DOUBLE (r, i); \ fprintf (FILE, "&0x%x%08x", i[0], i[1]); } \ else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == XFmode) \ { REAL_VALUE_TYPE r; \ REAL_VALUE_FROM_CONST_DOUBLE (r, X); \ ASM_OUTPUT_LONG_DOUBLE_OPERAND (FILE, r); } \ else { putc ('&', FILE); output_addr_const (FILE, X); }}#endif/* Note that this contains a kludge that knows that the only reason we have an address (plus (label_ref...) (reg...)) is in the insn before a tablejump, and we know that the table is exactly 10 bytes away. */#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, "10(%%pc,%s.w", \ reg_names[REGNO (XEXP (ireg, 0))]); \ else \ fprintf (FILE, "10(%%pc,%s.l", \ reg_names[REGNO (ireg)]); \ if (scale != 1) fprintf (FILE, "*%d", scale); \ putc (')', FILE); \ break; } \ if (ireg != 0 || breg != 0) \ { int scale = 1; \ if (breg == 0) \ abort (); \ if (addr != 0) \ output_addr_const (FILE, addr); \ 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, "10(%%pc,%s.w)", \ reg_names[REGNO (reg1)]); \ break; } \ default: \ output_addr_const (FILE, addr); \ }}/* Override usual definitions of SDB output macros. These definitions differ only in the absence of the period at the beginning of the name of the directive and in the use of `~' as the symbol for the current location. */#define PUT_SDB_SCL(a) fprintf(asm_out_file, "\tscl\t%d;", (a))#define PUT_SDB_INT_VAL(a) fprintf (asm_out_file, "\tval\t%d;", (a))#define PUT_SDB_VAL(a) \( fputs ("\tval\t", asm_out_file), \ output_addr_const (asm_out_file, (a)), \ fputc (';', asm_out_file))#define PUT_SDB_DEF(a) \do { fprintf (asm_out_file, "\tdef\t"); \ ASM_OUTPUT_LABELREF (asm_out_file, a); \ fprintf (asm_out_file, ";"); } while (0)#define PUT_SDB_PLAIN_DEF(a) fprintf(asm_out_file,"\tdef\t~%s;",a)#define PUT_SDB_ENDEF fputs("\tendef\n", asm_out_file)#define PUT_SDB_TYPE(a) fprintf(asm_out_file, "\ttype\t0%o;", a)#define PUT_SDB_SIZE(a) fprintf(asm_out_file, "\tsize\t%d;", a)#define PUT_SDB_START_DIM fprintf(asm_out_file, "\tdim\t")#define PUT_SDB_NEXT_DIM(a) fprintf(asm_out_file, "%d,", a)#define PUT_SDB_LAST_DIM(a) fprintf(asm_out_file, "%d;", a)#define PUT_SDB_TAG(a) \do { fprintf (asm_out_file, "\ttag\t"); \ ASM_OUTPUT_LABELREF (asm_out_file, a); \ fprintf (asm_out_file, ";"); } while (0)#define PUT_SDB_BLOCK_START(LINE) \ fprintf (asm_out_file, \ "\tdef\t~bb;\tval\t~;\tscl\t100;\tline\t%d;\tendef\n", \ (LINE))#define PUT_SDB_BLOCK_END(LINE) \ fprintf (asm_out_file, \ "\tdef\t~eb;\tval\t~;\tscl\t100;\tline\t%d;\tendef\n", \ (LINE))#define PUT_SDB_FUNCTION_START(LINE) \ fprintf (asm_out_file, \ "\tdef\t~bf;\tval\t~;\tscl\t101;\tline\t%d;\tendef\n", \ (LINE))#define PUT_SDB_FUNCTION_END(LINE) \ fprintf (asm_out_file, \ "\tdef\t~ef;\tval\t~;\tscl\t101;\tline\t%d;\tendef\n", \ (LINE))#define PUT_SDB_EPILOGUE_END(NAME) \ fprintf (asm_out_file, \ "\tdef\t%s;\tval\t~;\tscl\t-1;\tendef\n", \ (NAME))#define SDB_GENERATE_FAKE(BUFFER, NUMBER) \ sprintf ((BUFFER), "~%dfake", (NUMBER));#define NO_DOLLAR_IN_LABEL#define NO_DOT_IN_LABEL/* The usual definitions don't work because neither $ nor . is allowed. */#define CONSTRUCTOR_NAME_FORMAT "_GLOBAL_%%I\%%%s"/* Define a few machine-specific details of the implementation of constructors. The __CTORS_LIST__ goes in the .init section. Define CTOR_LIST_BEGIN and CTOR_LIST_END to contribute to the .init section an instruction to push a word containing 0 (or some equivalent of that). */#undef INIT_SECTION_ASM_OP#define INIT_SECTION_ASM_OP "\tsection\t~init"#undef FINI_SECTION_ASM_OP#define FINI_SECTION_ASM_OP "\tsection\t~fini"#undef READONLY_DATA_SECTION_ASM_OP#define READONLY_DATA_SECTION_ASM_OP "\tsection\t~rodata"#define CTOR_LIST_BEGIN \ asm (INIT_SECTION_ASM_OP); \ asm ("clr.l -(%sp)")#define CTOR_LIST_END CTOR_LIST_BEGIN#define BSS_SECTION_ASM_OP "\tsection\t~bss"#define TARGET_ASM_CONSTRUCTOR m68k_svr3_asm_out_constructor
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -