diff options
Diffstat (limited to 'gcc/config/i386/i386.h')
-rw-r--r-- | gcc/config/i386/i386.h | 126 |
1 files changed, 100 insertions, 26 deletions
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index 7fdf2564985..2342ce27067 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -2616,21 +2616,22 @@ struct machine_function GTY(()) #define X86_FILE_START_FLTUSED false /* APPLE LOCAL begin CW asm blocks */ -#undef TARGET_CW_EXTRA_INFO -#define TARGET_CW_EXTRA_INFO \ +#undef TARGET_IASM_EXTRA_INFO +#define TARGET_IASM_EXTRA_INFO \ char mod[3]; \ bool as_immediate; \ - bool as_offset; + bool as_offset; \ + bool pseudo; -#define TARGET_CW_REORDER_ARG(OPCODE, NEWARGNUM, NUM_ARGS, ARGNUM) \ +#define TARGET_IASM_REORDER_ARG(OPCODE, NEWARGNUM, NUM_ARGS, ARGNUM) \ do { \ /* If we are outputting AT&T style assembly language, the argument \ numbering is reversed. */ \ - if (cw_x86_needs_swapping (opcode)) \ + if (iasm_x86_needs_swapping (opcode)) \ NEWARGNUM = NUM_ARGS - ARGNUM + 1; \ } while (0) -#define CW_SYNTH_CONSTRAINTS(R, ARGNUM, NUM_ARGS, DB) \ +#define IASM_SYNTH_CONSTRAINTS(R, ARGNUM, NUM_ARGS, DB) \ do { \ /* On x86, operand 2 or 3 can be left out and the assembler will deal with it. \ \ @@ -2660,18 +2661,18 @@ struct machine_function GTY(()) } \ } while (0) -#define TARGET_CW_PRINT_OP(BUF, ARG, ARGNUM, USES, MUST_BE_REG, MUST_NOT_BE_REG, E) \ - cw_print_op (BUF, ARG, ARGNUM, USES, MUST_BE_REG, MUST_NOT_BE_REG, E) +#define TARGET_IASM_PRINT_OP(BUF, ARG, ARGNUM, USES, MUST_BE_REG, MUST_NOT_BE_REG, E) \ + iasm_print_op (BUF, ARG, ARGNUM, USES, MUST_BE_REG, MUST_NOT_BE_REG, E) -extern tree x86_canonicalize_operands (const char **, tree, void *); +extern tree iasm_x86_canonicalize_operands (const char **, tree, void *); /* On x86, we can rewrite opcodes, change argument ordering and so no... */ -#define CW_CANONICALIZE_OPERANDS(OPCODE, NEW_OPCODE, IARGS, E) \ - do { \ - NEW_OPCODE = OPCODE; \ - IARGS = x86_canonicalize_operands (&NEW_OPCODE, IARGS, E); \ +#define IASM_CANONICALIZE_OPERANDS(OPCODE, NEW_OPCODE, IARGS, E) \ + do { \ + NEW_OPCODE = OPCODE; \ + IARGS = iasm_x86_canonicalize_operands (&NEW_OPCODE, IARGS, E); \ } while (0) -#define CW_SEE_OPCODE(YYCHAR, T) \ +#define IASM_SEE_OPCODE(YYCHAR, T) \ /* If we see an int, arrange to see it as an identifier (opcode), \ not as a type. */ \ ((YYCHAR == TYPESPEC \ @@ -2680,7 +2681,7 @@ extern tree x86_canonicalize_operands (const char **, tree, void *); /* Return true iff the ID is a prefix for an instruction. */ -#define CW_IS_PREFIX(ID) \ +#define IASM_IS_PREFIX(ID) \ do { \ const char *myname = IDENTIFIER_POINTER (ID); \ if (strcasecmp (myname, "lock") == 0 \ @@ -2692,32 +2693,32 @@ extern tree x86_canonicalize_operands (const char **, tree, void *); return true; \ } while (0) -#define CW_PRINT_PREFIX(BUF, PREFIX_LIST) x86_cw_print_prefix(BUF, PREFIX_LIST) +#define IASM_PRINT_PREFIX(BUF, PREFIX_LIST) iasm_x86_print_prefix(BUF, PREFIX_LIST) -#define CW_IMMED_PREFIX(E, BUF) \ +#define IASM_IMMED_PREFIX(E, BUF) \ do { \ - if (! E->as_immediate) \ + if (!E->pseudo && ! E->as_immediate) \ sprintf (BUF + strlen (BUF), "$"); \ } while (0) -#define CW_OFFSET_PREFIX(E, BUF) \ +#define IASM_OFFSET_PREFIX(E, BUF) \ do { \ if (E->as_offset) \ sprintf (BUF + strlen (BUF), "$"); \ } while (0) /* We can't yet expose ST(x) to reg-stack.c, don't try. */ -#define CW_HIDE_REG(R) FP_REGNO_P (R) +#define IASM_HIDE_REG(R) FP_REGNO_P (R) -#define CW_SEE_IMMEDIATE(E) \ +#define IASM_SEE_IMMEDIATE(E) \ E->as_immediate = true -#define CW_SEE_NO_IMMEDIATE(E) \ +#define IASM_SEE_NO_IMMEDIATE(E) \ E->as_immediate = false /* Table of instructions that need extra constraints. Keep this table sorted. */ -#undef TARGET_CW_OP_CONSTRAINT -#define TARGET_CW_OP_CONSTRAINT \ +#undef TARGET_IASM_OP_CONSTRAINT +#define TARGET_IASM_OP_CONSTRAINT \ { "adc", 1, "+rm,r" }, \ { "adc", 2, "ir,m" }, \ { "add", 1, "+rm,r" }, \ @@ -2792,6 +2793,62 @@ extern tree x86_canonicalize_operands (const char **, tree, void *); { "cmovz", 2, U("rm")}, \ { "cmp", 1, "rm,r"}, \ { "cmp", 2, "ir,m"}, \ + { "cmpeqpd", 1, "=x"}, \ + { "cmpeqpd", 2, "xm"}, \ + { "cmpeqps", 1, "=x"}, \ + { "cmpeqps", 2, "xm"}, \ + { "cmpeqsd", 1, "=x"}, \ + { "cmpeqsd", 2, "xm"}, \ + { "cmpeqss", 1, "=x"}, \ + { "cmpeqss", 2, "xm"}, \ + { "cmplepd", 1, "=x"}, \ + { "cmplepd", 2, "xm"}, \ + { "cmpleps", 1, "=x"}, \ + { "cmpleps", 2, "xm"}, \ + { "cmplesd", 1, "=x"}, \ + { "cmplesd", 2, "xm"}, \ + { "cmpless", 1, "=x"}, \ + { "cmpless", 2, "xm"}, \ + { "cmpltpd", 1, "=x"}, \ + { "cmpltpd", 2, "xm"}, \ + { "cmpltps", 1, "=x"}, \ + { "cmpltps", 2, "xm"}, \ + { "cmpltsd", 1, "=x"}, \ + { "cmpltsd", 2, "xm"}, \ + { "cmpltss", 1, "=x"}, \ + { "cmpltss", 2, "xm"}, \ + { "cmpneqpd", 1, "=x"}, \ + { "cmpneqpd", 2, "xm"}, \ + { "cmpneqps", 1, "=x"}, \ + { "cmpneqps", 2, "xm"}, \ + { "cmpneqsd", 1, "=x"}, \ + { "cmpneqsd", 2, "xm"}, \ + { "cmpneqss", 1, "=x"}, \ + { "cmpneqss", 2, "xm"}, \ + { "cmpnlepd", 1, "=x"}, \ + { "cmpnlepd", 2, "xm"}, \ + { "cmpnleps", 1, "=x"}, \ + { "cmpnleps", 2, "xm"}, \ + { "cmpnlesd", 1, "=x"}, \ + { "cmpnlesd", 2, "xm"}, \ + { "cmpnless", 1, "=x"}, \ + { "cmpnless", 2, "xm"}, \ + { "cmpnltpd", 1, "=x"}, \ + { "cmpnltpd", 2, "xm"}, \ + { "cmpnltps", 1, "=x"}, \ + { "cmpnltps", 2, "xm"}, \ + { "cmpnltsd", 1, "=x"}, \ + { "cmpnltsd", 2, "xm"}, \ + { "cmpnltss", 1, "=x"}, \ + { "cmpnltss", 2, "xm"}, \ + { "cmpordpd", 1, "=x"}, \ + { "cmpordpd", 2, "xm"}, \ + { "cmpordps", 1, "=x"}, \ + { "cmpordps", 2, "xm"}, \ + { "cmpordsd", 1, "=x"}, \ + { "cmpordsd", 2, "xm"}, \ + { "cmpordss", 1, "=x"}, \ + { "cmpordss", 2, "xm"}, \ { "cmppd", 1, "=x"}, \ { "cmppd", 2, "xm"}, \ { "cmppd", 3, "i"}, \ @@ -2804,6 +2861,14 @@ extern tree x86_canonicalize_operands (const char **, tree, void *); { "cmpss", 1, "=x"}, \ { "cmpss", 2, "xm"}, \ { "cmpss", 3, "i"}, \ + { "cmpunordpd", 1, "=x"}, \ + { "cmpunordpd", 2, "xm"}, \ + { "cmpunordps", 1, "=x"}, \ + { "cmpunordps", 2, "xm"}, \ + { "cmpunordsd", 1, "=x"}, \ + { "cmpunordsd", 2, "xm"}, \ + { "cmpunordss", 1, "=x"}, \ + { "cmpunordss", 2, "xm"}, \ { "cmpxchg", 1, "+mr"}, \ { "cmpxchg", 2, "r"}, \ { "comisd", 1, "x"}, \ @@ -3400,10 +3465,19 @@ extern tree x86_canonicalize_operands (const char **, tree, void *); { "xorps", 1, "+x"}, \ { "xorps", 2, "xm"}, -#define TARGET_CW_EXTRA_CLOBBERS \ +#define TARGET_IASM_EXTRA_CLOBBERS \ { "rdtsc", { "edx", "eax"} } -#define CW_FUNCTION_MODIFIER "P" +#define IASM_FUNCTION_MODIFIER "P" + +#define IASM_VALID_PIC(DECL, E) \ + do { \ + if (E->as_immediate && ! TARGET_DYNAMIC_NO_PIC && flag_pic) \ + warning ("non-pic addressing form not suitible for pic code"); \ + } while (0) + +#define IASM_REGISTER_NAME(STR, BUF) i386_iasm_register_name (STR, BUF) + /* APPLE LOCAL end CW asm blocks */ /* |