Commit | Line | Data |
---|---|---|
9bf86ebb PR |
1 | /* Definitions for Unix assembler syntax for the Intel 80386. |
2 | Copyright (C) 1988 Free Software Foundation, Inc. | |
3 | ||
4 | This file is part of GNU CC. | |
5 | ||
6 | GNU CC is free software; you can redistribute it and/or modify | |
7 | it under the terms of the GNU General Public License as published by | |
8 | the Free Software Foundation; either version 2, or (at your option) | |
9 | any later version. | |
10 | ||
11 | GNU CC is distributed in the hope that it will be useful, | |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | GNU General Public License for more details. | |
15 | ||
16 | You should have received a copy of the GNU General Public License | |
17 | along with GNU CC; see the file COPYING. If not, write to | |
18 | the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ | |
19 | ||
20 | /* This file defines the aspects of assembler syntax | |
21 | that are the same for all the i386 Unix systems | |
22 | (though they may differ in non-Unix systems). */ | |
23 | ||
24 | /* Define some concatenation macros to concatenate an opcode | |
25 | and one, two or three operands. In other assembler syntaxes | |
26 | they may alter the order of ther operands. */ | |
27 | ||
28 | /* Note that the other files fail to use these | |
29 | in some of the places where they should. */ | |
30 | ||
31 | #ifdef __STDC__ | |
32 | #define AS2(a,b,c) #a " " #b "," #c | |
33 | #define AS3(a,b,c,d) #a " " #b "," #c "," #d | |
34 | #define AS1(a,b) #a " " #b | |
35 | #else | |
36 | #define AS1(a,b) "a b" | |
37 | #define AS2(a,b,c) "a b,c" | |
38 | #define AS3(a,b,c,d) "a b,c,d" | |
39 | #endif | |
40 | ||
41 | /* Define macro used to output shift-double opcodes when the shift | |
42 | count is in %cl. Some assemblers require %cl as an argument; | |
43 | some don't. This macro controls what to do: by default, don't | |
44 | print %cl. */ | |
45 | #define AS3_SHIFT_DOUBLE(a,b,c,d) AS2 (a,c,d) | |
46 | ||
47 | /* Output the size-letter for an opcode. | |
48 | CODE is the letter used in an operand spec (L, B, W, S or Q). | |
49 | CH is the corresponding lower case letter | |
50 | (except if CODE is `Q' then CH is `l', unless GAS_MNEMONICS). */ | |
51 | #define PUT_OP_SIZE(CODE,CH,FILE) putc (CH,(FILE)) | |
52 | ||
53 | /* Opcode suffix for fullword insn. */ | |
54 | #define L_SIZE "l" | |
55 | ||
56 | /* Prefix for register names in this syntax. */ | |
57 | #define RP "%" | |
58 | ||
59 | /* Prefix for immediate operands in this syntax. */ | |
60 | #define IP "$" | |
61 | ||
62 | /* Indirect call instructions should use `*'. */ | |
63 | #define USE_STAR 1 | |
64 | ||
65 | /* Prefix for a memory-operand X. */ | |
66 | #define PRINT_PTR(X, FILE) | |
67 | ||
68 | /* Delimiters that surround base reg and index reg. */ | |
69 | #define ADDR_BEG(FILE) putc('(', (FILE)) | |
70 | #define ADDR_END(FILE) putc(')', (FILE)) | |
71 | ||
72 | /* Print an index register (whose rtx is IREG). */ | |
73 | #define PRINT_IREG(FILE,IREG) \ | |
74 | do \ | |
75 | { fputs (",", (FILE)); PRINT_REG ((IREG), 0, (FILE)); } \ | |
76 | while (0) | |
77 | ||
78 | /* Print an index scale factor SCALE. */ | |
79 | #define PRINT_SCALE(FILE,SCALE) \ | |
80 | if ((SCALE) != 1) fprintf ((FILE), ",%d", (SCALE)) | |
81 | ||
82 | /* Print a base/index combination. | |
83 | BREG is the base reg rtx, IREG is the index reg rtx, | |
84 | and SCALE is the index scale factor (an integer). */ | |
85 | ||
86 | #define PRINT_B_I_S(BREG,IREG,SCALE,FILE) \ | |
87 | { ADDR_BEG (FILE); \ | |
88 | if (BREG) PRINT_REG ((BREG), 0, (FILE)); \ | |
89 | if ((IREG) != 0) \ | |
90 | { PRINT_IREG ((FILE), (IREG)); \ | |
91 | PRINT_SCALE ((FILE), (SCALE)); } \ | |
92 | ADDR_END (FILE); } | |
93 | \f | |
94 | /* Define the syntax of pseudo-ops, labels and comments. */ | |
95 | ||
96 | /* String containing the assembler's comment-starter. */ | |
97 | ||
98 | #define ASM_COMMENT_START "/" | |
99 | #define COMMENT_BEGIN "/" | |
100 | ||
101 | /* Output to assembler file text saying following lines | |
102 | may contain character constants, extra white space, comments, etc. */ | |
103 | ||
104 | #define ASM_APP_ON "/APP\n" | |
105 | ||
106 | /* Output to assembler file text saying following lines | |
107 | no longer contain unusual constructs. */ | |
108 | ||
109 | #define ASM_APP_OFF "/NO_APP\n" | |
110 | ||
111 | /* Output before read-only data. */ | |
112 | ||
113 | #define TEXT_SECTION_ASM_OP ".text" | |
114 | ||
115 | /* Output before writable (initialized) data. */ | |
116 | ||
117 | #define DATA_SECTION_ASM_OP ".data" | |
118 | ||
119 | /* Output before writable (uninitialized) data. */ | |
120 | ||
121 | #define BSS_SECTION_ASM_OP ".bss" | |
122 | ||
123 | /* This is how to output a command to make the user-level label named NAME | |
124 | defined for reference from other files. */ | |
125 | ||
126 | #define ASM_GLOBALIZE_LABEL(FILE,NAME) \ | |
127 | (fputs (".globl ", FILE), assemble_name (FILE, NAME), fputs ("\n", FILE)) | |
128 | ||
129 | /* By default, target has a 80387, uses IEEE compatible arithmetic, | |
130 | and returns float values in the 387, ie, | |
131 | (TARGET_80387 | TARGET_IEEE_FP | TARGET_FLOAT_RETURNS_IN_80387) */ | |
132 | ||
133 | #define TARGET_DEFAULT 0301 | |
134 | ||
135 | /* Floating-point return values come in the FP register. */ | |
136 | ||
137 | #define VALUE_REGNO(MODE) \ | |
138 | (GET_MODE_CLASS (MODE) == MODE_FLOAT \ | |
139 | && TARGET_FLOAT_RETURNS_IN_80387 ? FIRST_FLOAT_REG : 0) | |
140 | ||
141 | /* 1 if N is a possible register number for a function value. */ | |
142 | ||
143 | #define FUNCTION_VALUE_REGNO_P(N) \ | |
144 | ((N) == 0 || ((N)== FIRST_FLOAT_REG && TARGET_FLOAT_RETURNS_IN_80387)) | |
145 |