summaryrefslogtreecommitdiff
path: root/gcc/genopinit.c
diff options
context:
space:
mode:
authorcchavva <cchavva@138bc75d-0d04-0410-961f-82ee72b054a4>2000-10-18 21:33:41 +0000
committercchavva <cchavva@138bc75d-0d04-0410-961f-82ee72b054a4>2000-10-18 21:33:41 +0000
commitbec2d4909566b67347a964a8e1eb1918f772f873 (patch)
tree23acf9f52d85ebec426a6674cb36c94dab1cabb1 /gcc/genopinit.c
parent03e2df8e7dc9d2f3f06bac67bc48e48783664aa7 (diff)
downloadgcc-bec2d4909566b67347a964a8e1eb1918f772f873.tar.gz
Adding new option -ftrapv.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@36942 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/genopinit.c')
-rw-r--r--gcc/genopinit.c49
1 files changed, 40 insertions, 9 deletions
diff --git a/gcc/genopinit.c b/gcc/genopinit.c
index 993c347a1b0..9aeaee7baac 100644
--- a/gcc/genopinit.c
+++ b/gcc/genopinit.c
@@ -46,8 +46,11 @@ Boston, MA 02111-1307, USA. */
If $N is present in the pattern, it means the two modes must be consecutive
widths in the same mode class (e.g, QImode and HImode). $I means that
- only integer modes should be considered for the next mode, and $F means
- that only float modes should be considered.
+ only full integer modes should be considered for the next mode, and $F
+ means that only float modes should be considered.
+ $P means that both full and partial integer modes should be considered.
+
+ $V means to emit 'v' if the first mode is a MODE_FLOAT mode.
For some optabs, we store the operation by RTL codes. These are only
used for comparisons. In that case, $c and $C are the lower-case and
@@ -62,14 +65,24 @@ const char * const optabs[] =
"fixtrunctab[$A][$B][1] = CODE_FOR_$(fixuns_trunc$F$a$I$b2$)",
"floattab[$B][$A][0] = CODE_FOR_$(float$I$a$F$b2$)",
"floattab[$B][$A][1] = CODE_FOR_$(floatuns$I$a$F$b2$)",
- "add_optab->handlers[$A].insn_code = CODE_FOR_$(add$a3$)",
- "sub_optab->handlers[$A].insn_code = CODE_FOR_$(sub$a3$)",
- "smul_optab->handlers[$A].insn_code = CODE_FOR_$(mul$a3$)",
+ "add_optab->handlers[$A].insn_code = CODE_FOR_$(add$P$a3$)",
+ "addv_optab->handlers[(int) $A].insn_code =\n\
+ add_optab->handlers[(int) $A].insn_code = CODE_FOR_$(add$F$a3$)",
+ "addv_optab->handlers[(int) $A].insn_code = CODE_FOR_$(addv$I$a3$)",
+ "sub_optab->handlers[$A].insn_code = CODE_FOR_$(sub$P$a3$)",
+ "subv_optab->handlers[(int) $A].insn_code =\n\
+ sub_optab->handlers[(int) $A].insn_code = CODE_FOR_$(sub$F$a3$)",
+ "subv_optab->handlers[(int) $A].insn_code = CODE_FOR_$(subv$I$a3$)",
+ "smul_optab->handlers[$A].insn_code = CODE_FOR_$(mul$P$a3$)",
+ "smulv_optab->handlers[(int) $A].insn_code =\n\
+ smul_optab->handlers[(int) $A].insn_code = CODE_FOR_$(mul$F$a3$)",
+ "smulv_optab->handlers[(int) $A].insn_code = CODE_FOR_$(mulv$I$a3$)",
"umul_highpart_optab->handlers[$A].insn_code = CODE_FOR_$(umul$a3_highpart$)",
"smul_highpart_optab->handlers[$A].insn_code = CODE_FOR_$(smul$a3_highpart$)",
"smul_widen_optab->handlers[$B].insn_code = CODE_FOR_$(mul$a$b3$)$N",
"umul_widen_optab->handlers[$B].insn_code = CODE_FOR_$(umul$a$b3$)$N",
"sdiv_optab->handlers[$A].insn_code = CODE_FOR_$(div$I$a3$)",
+ "sdivv_optab->handlers[(int) $A].insn_code = CODE_FOR_$(div$V$I$a3$)",
"udiv_optab->handlers[$A].insn_code = CODE_FOR_$(udiv$I$a3$)",
"sdivmod_optab->handlers[$A].insn_code = CODE_FOR_$(divmod$a4$)",
"udivmod_optab->handlers[$A].insn_code = CODE_FOR_$(udivmod$a4$)",
@@ -91,8 +104,14 @@ const char * const optabs[] =
"smax_optab->handlers[$A].insn_code = CODE_FOR_$(max$F$a3$)",
"umin_optab->handlers[$A].insn_code = CODE_FOR_$(umin$I$a3$)",
"umax_optab->handlers[$A].insn_code = CODE_FOR_$(umax$I$a3$)",
- "neg_optab->handlers[$A].insn_code = CODE_FOR_$(neg$a2$)",
- "abs_optab->handlers[$A].insn_code = CODE_FOR_$(abs$a2$)",
+ "neg_optab->handlers[$A].insn_code = CODE_FOR_$(neg$P$a2$)",
+ "negv_optab->handlers[(int) $A].insn_code =\n\
+ neg_optab->handlers[(int) $A].insn_code = CODE_FOR_$(neg$F$a2$)",
+ "negv_optab->handlers[(int) $A].insn_code = CODE_FOR_$(negv$I$a2$)",
+ "abs_optab->handlers[$A].insn_code = CODE_FOR_$(abs$P$a2$)",
+ "absv_optab->handlers[(int) $A].insn_code =\n\
+ abs_optab->handlers[(int) $A].insn_code = CODE_FOR_$(abs$F$a2$)",
+ "absv_optab->handlers[(int) $A].insn_code = CODE_FOR_$(absv$I$a2$)",
"sqrt_optab->handlers[$A].insn_code = CODE_FOR_$(sqrt$a2$)",
"sin_optab->handlers[$A].insn_code = CODE_FOR_$(sin$a2$)",
"cos_optab->handlers[$A].insn_code = CODE_FOR_$(cos$a2$)",
@@ -136,7 +155,7 @@ gen_insn (insn)
for (pindex = 0; pindex < ARRAY_SIZE (optabs); pindex++)
{
- int force_float = 0, force_int = 0;
+ int force_float = 0, force_int = 0, force_partial_int = 0;
int force_consec = 0;
int matches = 1;
@@ -160,9 +179,14 @@ gen_insn (insn)
case 'I':
force_int = 1;
break;
+ case 'P':
+ force_partial_int = 1;
+ break;
case 'F':
force_float = 1;
break;
+ case 'V':
+ break;
case 'c':
for (op = 0; op < NUM_RTX_CODE; op++)
{
@@ -196,6 +220,9 @@ gen_insn (insn)
if (*p == 0
&& (! force_int || mode_class[i] == MODE_INT)
+ && (! force_partial_int
+ || mode_class[i] == MODE_INT
+ || mode_class[i] == MODE_PARTIAL_INT)
&& (! force_float || mode_class[i] == MODE_FLOAT))
break;
}
@@ -207,7 +234,7 @@ gen_insn (insn)
else
m2 = i, np += strlen (GET_MODE_NAME(i));
- force_int = force_float = 0;
+ force_int = force_partial_int = force_float = 0;
break;
default:
@@ -243,6 +270,10 @@ gen_insn (insn)
case '(': case ')':
case 'I': case 'F': case 'N':
break;
+ case 'V':
+ if (GET_MODE_CLASS (m1) == MODE_FLOAT)
+ printf ("v");
+ break;
case 'a':
for (np = GET_MODE_NAME(m1); *np; np++)
putchar (TOLOWER (*np));