📄 3b1.h
字号:
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, "LD%%%d(%%pc,%s.w", \ CODE_LABEL_NUMBER (XEXP (addr, 0)), \ reg_names[REGNO (XEXP (ireg, 0))]); \ else \ fprintf (FILE, "LD%%%d(%%pc,%s.l", \ CODE_LABEL_NUMBER (XEXP (addr, 0)), \ reg_names[REGNO (ireg)]); \ if (scale != 1) fprintf (FILE, "*%d", scale); \ fprintf (FILE, ")"); \ break; } \ if (breg != 0 && ireg == 0 && GET_CODE (addr) == LABEL_REF) \ { fprintf (FILE, "LD%%%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 (); \ 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, "LD%%%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", INTVAL (addr)); \ else \ output_addr_const (FILE, addr); \ }}#define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \ sprintf ((LABEL), "%s%%%ld", (PREFIX), (long)(NUM))#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ fprintf (FILE, "%s%%%d:\n", PREFIX, NUM)/* Must put address in %a0 , not %d0 . -- LGM, 7/15/88 */#define FUNCTION_PROFILER(FILE, LABEL_NO) \ fprintf (FILE, "\tmov.l &LP%%%d,%%a0\n\tjsr mcount\n", (LABEL_NO))#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \ fprintf (FILE, "\tlong L%%%d\n", (VALUE))#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \ fprintf (FILE, "\tshort L%%%d-L%%%d\n", (VALUE), (REL))/* ihnp4!lmayk!lgm says that `short 0' triggers assembler bug; `short L%nn-L%nn' supposedly works. */#define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,TABLE) \ if (! RTX_INTEGRATED_P (TABLE)) \ fprintf (FILE, "\tswbeg &%d\n%s%%%d:\n", \ XVECLEN (PATTERN (TABLE), 1), (PREFIX), (NUM)); \ else \ fprintf (FILE, "\tswbeg &%d\n%s%%%d:\n\tshort %s%%%d-%s%%%d\n", \ XVECLEN (PATTERN (TABLE), 1) + 1, (PREFIX), (NUM), \ (PREFIX), (NUM), (PREFIX), (NUM))/* At end of a switch table, define LDnnn iff the symbol LInnn was defined. Some SGS assemblers have a bug such that "Lnnn-LInnn-2.b(pc,d0.l*2)" fails to assemble. Luckily "LDnnn(pc,d0.l*2)" produces the results we want. This difference can be accommodated by making the assembler define such "LDnnn" to be either "Lnnn-LInnn-2.b", "Lnnn", or any other string, as necessary. This is accomplished via the ASM_OUTPUT_CASE_END macro. */#define ASM_OUTPUT_CASE_END(FILE,NUM,TABLE) \{ if (switch_table_difference_label_flag) \ fprintf (FILE, "\tset LD%%%d,L%%%d-LI%%%d\n", (NUM), (NUM), (NUM)); \ switch_table_difference_label_flag = 0; }int switch_table_difference_label_flag;#define ASM_OUTPUT_OPCODE(FILE, PTR) \{ if ((PTR)[0] == 'j' && (PTR)[1] == 'b') \ { ++(PTR); \ while (*(PTR) != ' ') \ { putc (*(PTR), (FILE)); ++(PTR); } \ fprintf ((FILE), ".w"); } \ else if ((PTR)[0] == 's') \ { \ if (!strncmp ((PTR), "swap", 4)) \ { fprintf ((FILE), "swap.w"); (PTR) += 4; } \ } \ else if ((PTR)[0] == 'f') \ { \ if (!strncmp ((PTR), "fmove", 5)) \ { fprintf ((FILE), "fmov"); (PTR) += 5; } \ else if (!strncmp ((PTR), "fbne", 4)) \ { fprintf ((FILE), "fbneq"); (PTR) += 4; } \ } \/* MOVE, MOVEA, MOVEQ, MOVEC ==> MOV */ \ else if ((PTR)[0] == 'm' && (PTR)[1] == 'o' \ && (PTR)[2] == 'v' && (PTR)[3] == 'e') \ { fprintf ((FILE), "mov"); (PTR) += 4; \ if ((PTR)[0] == 'q' || (PTR)[0] == 'a' \ || (PTR)[0] == 'c') (PTR)++; } \/* SUB, SUBQ, SUBA, SUBI ==> SUB */ \ else if ((PTR)[0] == 's' && (PTR)[1] == 'u' \ && (PTR)[2] == 'b') \ { fprintf ((FILE), "sub"); (PTR) += 3; \ if ((PTR)[0] == 'q' || (PTR)[0] == 'i' \ || (PTR)[0] == 'a') (PTR)++; } \/* CMP, CMPA, CMPI, CMPM ==> CMP */ \ else if ((PTR)[0] == 'c' && (PTR)[1] == 'm' \ && (PTR)[2] == 'p') \ { fprintf ((FILE), "cmp"); (PTR) += 3; \ if ((PTR)[0] == 'a' || (PTR)[0] == 'i' \ || (PTR)[0] == 'm') (PTR)++; } \}#define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED) \( fputs ("\tlcomm ", (FILE)), \ assemble_name ((FILE), (NAME)), \ fprintf ((FILE), ",%u\n", (ROUNDED)))#define USER_LABEL_PREFIX ""/* 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_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 subroutines to call to handle multiply, divide, and remainder. Use the subroutines that the 3b1's library provides. The `*' prevents an underscore from being prepended by the compiler. */#define DIVSI3_LIBCALL "*ldiv"#define UDIVSI3_LIBCALL "*uldiv"#define MODSI3_LIBCALL "*lrem"#define UMODSI3_LIBCALL "*ulrem"#define MULSI3_LIBCALL "*lmul"#define UMULSI3_LIBCALL "*ulmul"/* Definitions for collect2. */#define OBJECT_FORMAT_COFF#define MY_ISCOFF(magic) \ ((magic) == MC68KWRMAGIC || (magic) == MC68KROMAGIC || (magic) == MC68KPGMAGIC)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -