aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/i386/i386.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/i386/i386.h')
-rw-r--r--gcc/config/i386/i386.h126
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 */
/*