From: hjl@lucon.org (H.J. Lu)
To: wilson@cygnus.com (Jim Wilson)
Cc: law@cygnus.com, scox@cygnus.com,
crux@pool.informatik.rwth-aachen.de, egcs@cygnus.com
Subject: A patch for PPro
Date: Wed, 06 May 1998 17:12:00 -0000 [thread overview]
Message-ID: <m0yX9fY-000268C@ocean.lucon.org> (raw)
In-Reply-To: <199805010234.TAA02560@ada.cygnus.com.cygnus.com>
Hi,
The current egcs in CVS disables fp conditional move for PPro. The
problem is mark_constants has to search inside a CONST_DOUBLE when it
is enabled. I understand it is not safe to do so. I am enclosing a
patch which will search inside a CONST_DOUBLE only for those PPro fp
conditional moves. It won't affect any other CPUs, even other x86
instructions.
H.J.
---
Wed May 6 07:35:26 1998 H.J. Lu (hjl@gnu.org)
* config/i386/i386.md (movsicc_1, movhicc_1): Use
output_int_conditional_move ().
(movxfcc_1, movdfcc_1, movxfcc_1): Fix typos, use
output_fp_conditional_move () and allow constants for reload.
* config/i386/i386.h (IS_SEARCH_CONST_DOUBLE_OK): New, defined
as is_search_const_double_ok (insn).
* config/i386/i386.c (output_fp_conditional_move): New function
to hanld fp conditional move.
(output_int_conditional_move): New function to handle integer
conditional move.
(is_search_const_double_ok): New function to check if it is ok
search inside a CONST_DOUBLE used by INSN.
* varasm.c (IS_SEARCH_CONST_DOUBLE_OK): New. True if it is ok
to search inside a CONST_DOUBLE used by INSN. Default to false.
(mark_constant_pool): Call mark_constants with a new arg,
IS_SEARCH_CONST_DOUBLE_OK (insn).
(mark_constants): Add a new arg to indicate if the instruction
is ok to search inside a CONST_DOUBLE. Look inside CONST_DOUBLE
if it is in memory and it is ok to do so.
* print-rtl.c (get_insn_name): New. Return the insn name string
if there is one, otherwise NULL.
* rtl.h (get_insn_name): New declaration.
Index: config/i386/i386.md
===================================================================
RCS file: /home/work/cvs/gnu/egcs/gcc/config/i386/i386.md,v
retrieving revision 1.1.1.14
diff -u -r1.1.1.14 i386.md
--- config/i386/i386.md 1998/04/21 15:42:54 1.1.1.14
+++ config/i386/i386.md 1998/04/21 15:48:12
@@ -7259,58 +7260,7 @@
(match_operand:SI 3 "general_operand" "0,rm,rm,g")))
(clobber (match_scratch:SI 4 "X,X,X,=&r"))]
"TARGET_CMOVE"
- "*
-{
- if (which_alternative == 0)
- {
- /* r <- cond ? arg : r */
- output_asm_insn (AS2 (cmov%C1,%2,%0), operands);
- }
- else if (which_alternative == 1)
- {
- /* r <- cond ? r : arg */
- output_asm_insn (AS2 (cmov%c1,%3,%0), operands);
- }
- else if (which_alternative == 2)
- {
- /* r <- cond ? arg1 : arg2 */
- output_asm_insn (AS2 (cmov%C1,%2,%0), operands);
- output_asm_insn (AS2 (cmov%c1,%3,%0), operands);
- }
- else if (which_alternative == 3)
- {
- /* r <- cond ? arg1 : arg2 */
- rtx xops[3];
-
- xops[0] = gen_label_rtx ();
- xops[1] = gen_label_rtx ();
- xops[2] = operands[1];
-
- output_asm_insn (\"j%c2 %l0\", xops);
- if (! rtx_equal_p (operands[0], operands[2]))
- if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[2]) == MEM)
- {
- output_asm_insn (AS2 (mov%z2,%2,%4), operands);
- output_asm_insn (AS2 (mov%z2,%4,%0), operands);
- }
- else
- output_asm_insn (AS2 (mov%z0,%2,%0), operands);
- output_asm_insn (\"jmp %l1\", xops);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (xops[0]));
- if (! rtx_equal_p (operands[0], operands[3]))
- {
- if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[3]) == MEM)
- {
- output_asm_insn (AS2 (mov%z3,%3,%4), operands);
- output_asm_insn (AS2 (mov%z3,%4,%0), operands);
- }
- else
- output_asm_insn (AS2 (mov%z0,%3,%0), operands);
- }
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (xops[1]));
- }
- RET;
-}")
+ "* return output_int_conditional_move (which_alternative, operands);")
(define_insn "movhicc_1"
[(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,&r,rm")
@@ -7320,69 +7270,26 @@
(match_operand:HI 3 "general_operand" "0,rm,rm,g")))
(clobber (match_scratch:SI 4 "X,X,X,=&r"))]
"TARGET_CMOVE"
- "*
-{
- if (which_alternative == 0)
- {
- /* r <- cond ? arg : r */
- output_asm_insn (AS2 (cmov%C1,%2,%0), operands);
- }
- else if (which_alternative == 1)
- {
- /* r <- cond ? r : arg */
- output_asm_insn (AS2 (cmov%c1,%3,%0), operands);
- }
- else if (which_alternative == 2)
- {
- /* r <- cond ? arg1 : arg2 */
- output_asm_insn (AS2 (cmov%C1,%2,%0), operands);
- output_asm_insn (AS2 (cmov%c1,%3,%0), operands);
- }
- else if (which_alternative == 3)
- {
- /* r <- cond ? arg1 : arg2 */
- rtx xops[3];
-
- xops[0] = gen_label_rtx ();
- xops[1] = gen_label_rtx ();
- xops[2] = operands[1];
-
- output_asm_insn (\"j%c2 %l0\", xops);
- if (! rtx_equal_p (operands[0], operands[2]))
- if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[2]) == MEM)
- {
- output_asm_insn (AS2 (mov%z2,%2,%4), operands);
- output_asm_insn (AS2 (mov%z2,%4,%0), operands);
- }
- else
- output_asm_insn (AS2 (mov%z0,%2,%0), operands);
- output_asm_insn (\"jmp %l1\", xops);
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (xops[0]));
- if (! rtx_equal_p (operands[0], operands[3]))
- {
- if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[3]) == MEM)
- {
- output_asm_insn (AS2 (mov%z3,%3,%4), operands);
- output_asm_insn (AS2 (mov%z3,%4,%0), operands);
- }
- else
- output_asm_insn (AS2 (mov%z0,%3,%0), operands);
- }
- ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (xops[1]));
- }
- RET;
-}")
+ "* return output_int_conditional_move (which_alternative, operands);")
+
;; We need to disable the FP forms of these since they do not support
;; memory as written, but no input reloads are permitted for insns
;; that use cc0. Also, movxfcc is not present.
+;; ??? We should add support for constant values to each of the mov*fcc
+;; patterns. Apparently only values accepted by standard_80387_constant_p
+;; are valid. We need to create a new predicate that accepts all
+;; nonimmediate_operand values plus those constants accepts by s_8_c_p.
+;; We need to add 'G' to the constraints where appropriate. We need to
+;; add code to the alternative 3 cases that knows how to load such constants.
+
(define_expand "movsfcc"
[(match_dup 4)
- (set (match_operand 0 "register_operand" "")
+ (set (match_operand 0 "register_operand" "t")
(if_then_else:SF (match_operand 1 "comparison_operator" "")
- (match_operand:SF 2 "register_operand" "")
- (match_operand:SF 3 "register_operand" "")))]
- "0 && TARGET_CMOVE"
+ (match_operand:SF 2 "nonimmediate_operand" "")
+ (match_operand:SF 3 "nonimmediate_operand" "")))]
+ "TARGET_CMOVE"
"
{
operands[4] = i386_compare_gen (i386_compare_op0, i386_compare_op1);
@@ -7392,9 +7299,9 @@
[(match_dup 4)
(set (match_operand 0 "register_operand" "t")
(if_then_else:DF (match_operand 1 "comparison_operator" "")
- (match_operand:DF 2 "register_operand" "")
- (match_operand:DF 3 "register_operand" "")))]
- "0 && TARGET_CMOVE"
+ (match_operand:DF 2 "nonimmediate_operand" "")
+ (match_operand:DF 3 "nonimmediate_operand" "")))]
+ "TARGET_CMOVE"
"
{
operands[4] = i386_compare_gen (i386_compare_op0, i386_compare_op1);
@@ -7404,75 +7311,40 @@
[(match_dup 4)
(set (match_operand 0 "register_operand" "")
(if_then_else:XF (match_operand 1 "comparison_operator" "")
- (match_operand:XF 2 "register_operand" "")
- (match_operand:XF 3 "register_operand" "")))]
- "0 && TARGET_CMOVE"
+ (match_operand:XF 2 "nonimmediate_operand" "")
+ (match_operand:XF 3 "nonimmediate_operand" "")))]
+ "TARGET_CMOVE"
"
{
operands[4] = i386_compare_gen (i386_compare_op0, i386_compare_op1);
}")
(define_insn "movsfcc_1"
- [(set (match_operand:SF 0 "general_operand" "=f,f,&f")
+ [(set (match_operand:SF 0 "register_operand" "=f,=f,=f,=f")
(if_then_else:SF (match_operator 1 "comparison_operator"
[(cc0) (const_int 0)])
- (match_operand:SF 2 "register_operand" "0,f,f")
- (match_operand:SF 3 "register_operand" "f,0,f")))]
+ (match_operand:SF 2 "nonimmediate_operand" "0,f,f,fFm")
+ (match_operand:SF 3 "nonimmediate_operand" "f,0,f,fFm")))]
"TARGET_CMOVE"
- "*
-{
- switch (which_alternative)
- {
- case 0:
- /* r <- cond ? arg : r */
- output_asm_insn (AS2 (fcmov%f1,%3,%0), operands);
- break;
-
- case 1:
- /* r <- cond ? r : arg */
- output_asm_insn (AS2 (fcmov%F1,%2,%0), operands);
- break;
-
- case 2:
- /* r <- cond ? r : arg */
- output_asm_insn (AS2 (fcmov%F1,%2,%0), operands);
- output_asm_insn (AS2 (fcmov%f1,%3,%0), operands);
- break;
- }
-
- RET;
-}")
+ "* return output_fp_conditional_move (which_alternative, operands);")
(define_insn "movdfcc_1"
- [(set (match_operand:DF 0 "general_operand" "=f,f,&f")
+ [(set (match_operand:DF 0 "register_operand" "=f,=f,=f,=f")
(if_then_else:DF (match_operator 1 "comparison_operator"
[(cc0) (const_int 0)])
- (match_operand:DF 2 "register_operand" "0,f,f")
- (match_operand:DF 3 "register_operand" "f,0,f")))]
+ (match_operand:DF 2 "nonimmediate_operand" "0,f,f,fFm")
+ (match_operand:DF 3 "nonimmediate_operand" "f,0,f,fFm")))]
"TARGET_CMOVE"
- "*
-{
- switch (which_alternative)
- {
- case 0:
- /* r <- cond ? arg : r */
- output_asm_insn (AS2 (fcmov%f1,%3,%0), operands);
- break;
-
- case 1:
- /* r <- cond ? r : arg */
- output_asm_insn (AS2 (fcmov%F1,%2,%0), operands);
- break;
+ "* return output_fp_conditional_move (which_alternative, operands);")
- case 2:
- /* r <- cond ? r : arg */
- output_asm_insn (AS2 (fcmov%F1,%2,%0), operands);
- output_asm_insn (AS2 (fcmov%f1,%3,%0), operands);
- break;
- }
-
- RET;
-}")
+(define_insn "movxfcc_1"
+ [(set (match_operand:XF 0 "register_operand" "=f,=f,=f,=f")
+ (if_then_else:XF (match_operator 1 "comparison_operator"
+ [(cc0) (const_int 0)])
+ (match_operand:XF 2 "nonimmediate_operand" "0,f,f,fFm")
+ (match_operand:XF 3 "nonimmediate_operand" "f,0,f,fFm")))]
+ "TARGET_CMOVE"
+ "* return output_fp_conditional_move (which_alternative, operands);")
(define_insn "strlensi_unroll"
[(set (match_operand:SI 0 "register_operand" "=&r,&r")
Index: config/i386/i386.h
===================================================================
RCS file: /home/work/cvs/gnu/egcs/gcc/config/i386/i386.h,v
retrieving revision 1.1.1.15
diff -u -r1.1.1.15 i386.h
--- config/i386/i386.h 1998/04/21 15:42:51 1.1.1.15
+++ config/i386/i386.h 1998/05/06 18:08:55
@@ -817,6 +817,10 @@
#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) \
((C) == 'G' ? standard_80387_constant_p (VALUE) : 0)
+/* Is ok to search inside a CONST_DOUBLE? */
+#define IS_SEARCH_CONST_DOUBLE_OK(insn) \
+ is_search_const_double_ok (insn)
+
/* Place additional restrictions on the register class to use when it
is necessary to be able to hold a value of mode MODE in a reload
register for which class CLASS would ordinarily be used. */
Index: config/i386/i386.c
===================================================================
RCS file: /home/work/cvs/gnu/egcs/gcc/config/i386/i386.c,v
retrieving revision 1.1.1.13
diff -u -r1.1.1.13 i386.c
--- config/i386/i386.c 1998/05/05 22:04:03 1.1.1.13
+++ config/i386/i386.c 1998/05/06 18:07:22
@@ -5107,4 +5116,158 @@
ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (xops[12]));
return "";
+}
+
+char *
+output_fp_conditional_move (which_alternative, operands)
+ int which_alternative;
+ rtx operands[];
+{
+ if (which_alternative == 0)
+ {
+ /* r <- cond ? arg : r */
+ output_asm_insn (AS2 (fcmov%f1,%3,%0), operands);
+ }
+ else if (which_alternative == 1)
+ {
+ /* r <- cond ? r : arg */
+ output_asm_insn (AS2 (fcmov%F1,%2,%0), operands);
+ }
+ else if (which_alternative == 2)
+ {
+ /* r <- cond ? r : arg */
+ output_asm_insn (AS2 (fcmov%F1,%2,%0), operands);
+ output_asm_insn (AS2 (fcmov%f1,%3,%0), operands);
+ }
+ else if (which_alternative == 3)
+ {
+ /* r <- cond ? arg1 : arg2 */
+ rtx xops[3];
+
+ xops[0] = gen_label_rtx ();
+ xops[1] = gen_label_rtx ();
+ xops[2] = operands[1];
+
+ output_asm_insn ("j%f2 %l0", xops);
+ if (STACK_REG_P (operands[2]) || GET_CODE (operands[2]) == MEM)
+ output_asm_insn (AS1 (fld%z2,%y2), operands);
+ else
+ {
+ int conval = standard_80387_constant_p (operands[2]);
+
+ switch (conval)
+ {
+ case 1:
+ fprintf (asm_out_file, "\tfldz\n");
+ break;
+ case 2:
+ fprintf (asm_out_file, "\tfld1\n");
+ break;
+ default:
+ operands[2] = CONST_DOUBLE_MEM (operands[2]);
+ if (GET_CODE (operands[2]) != MEM)
+ abort ();
+ output_asm_insn (AS1 (fld%z2,%y2), operands);
+ break;
+ }
+ }
+ output_asm_insn ("jmp %l1", xops);
+ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (xops[0]));
+ if (STACK_REG_P (operands[3]) || GET_CODE (operands[3]) == MEM)
+ output_asm_insn (AS1 (fld%z3,%y3), operands);
+ else
+ {
+ int conval = standard_80387_constant_p (operands[2]);
+
+ switch (conval)
+ {
+ case 1:
+ fprintf (asm_out_file, "\tfldz\n");
+ break;
+ case 2:
+ fprintf (asm_out_file, "\tfld1\n");
+ break;
+ default:
+ operands[3] = CONST_DOUBLE_MEM (operands[3]);
+ if (GET_CODE (operands[3]) != MEM)
+ abort ();
+ output_asm_insn (AS1 (fld%z3,%y3), operands);
+ break;
+ }
+ }
+ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (xops[1]));
+ }
+
+ return "";
+}
+
+char *
+output_int_conditional_move (which_alternative, operands)
+ int which_alternative;
+ rtx operands[];
+{
+ if (which_alternative == 0)
+ {
+ /* r <- cond ? arg : r */
+ output_asm_insn (AS2 (cmov%C1,%2,%0), operands);
+ }
+ else if (which_alternative == 1)
+ {
+ /* r <- cond ? r : arg */
+ output_asm_insn (AS2 (cmov%c1,%3,%0), operands);
+ }
+ else if (which_alternative == 2)
+ {
+ /* r <- cond ? arg1 : arg2 */
+ output_asm_insn (AS2 (cmov%C1,%2,%0), operands);
+ output_asm_insn (AS2 (cmov%c1,%3,%0), operands);
+ }
+ else if (which_alternative == 3)
+ {
+ /* r <- cond ? arg1 : arg2 */
+ rtx xops[3];
+
+ xops[0] = gen_label_rtx ();
+ xops[1] = gen_label_rtx ();
+ xops[2] = operands[1];
+
+ output_asm_insn ("j%c2 %l0", xops);
+ if (! rtx_equal_p (operands[0], operands[2]))
+ {
+ if (GET_CODE (operands[0]) == MEM
+ && GET_CODE (operands[2]) == MEM)
+ {
+ output_asm_insn (AS2 (mov%z2,%2,%4), operands);
+ output_asm_insn (AS2 (mov%z2,%4,%0), operands);
+ }
+ else
+ output_asm_insn (AS2 (mov%z0,%2,%0), operands);
+ }
+ output_asm_insn ("jmp %l1", xops);
+ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (xops[0]));
+ if (! rtx_equal_p (operands[0], operands[3]))
+ {
+ if (GET_CODE (operands[0]) == MEM
+ && GET_CODE (operands[3]) == MEM)
+ {
+ output_asm_insn (AS2 (mov%z3,%3,%4), operands);
+ output_asm_insn (AS2 (mov%z3,%4,%0), operands);
+ }
+ else
+ output_asm_insn (AS2 (mov%z0,%3,%0), operands);
+ }
+ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (xops[1]));
+ }
+
+ return "";
+}
+
+int
+is_search_const_double_ok (insn)
+ rtx insn;
+{
+ const char * name = get_insn_name (insn);
+ return name && (strcmp (name, "movsfcc_1") == 0
+ || strcmp (name, "movdfcc_1") == 0
+ || strcmp (name, "movxfcc_1") == 0);
}
Index: varasm.c
===================================================================
RCS file: /home/work/cvs/gnu/egcs/gcc/varasm.c,v
retrieving revision 1.1.1.15
diff -u -r1.1.1.15 varasm.c
--- varasm.c 1998/04/17 15:01:32 1.1.1.15
+++ varasm.c 1998/05/06 18:09:07
@@ -155,7 +155,7 @@
rtx));
static struct pool_constant *find_pool_constant PROTO((rtx));
static void mark_constant_pool PROTO((void));
-static void mark_constants PROTO((rtx));
+static void mark_constants PROTO((rtx, int));
static int output_addressed_constants PROTO((tree));
static void output_after_function_constants PROTO((void));
static void output_constructor PROTO((tree, int));
@@ -3651,6 +3652,11 @@
first_pool = last_pool = 0;
}
+/* Is ok to search inside a CONST_DOUBLE? Default to NO. */
+#ifndef IS_SEARCH_CONST_DOUBLE_OK
+#define IS_SEARCH_CONST_DOUBLE_OK(insn) (0)
+#endif
+
/* Look through the instructions for this function, and mark all the
entries in the constant pool which are actually being used. */
@@ -3668,18 +3674,19 @@
for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
- mark_constants (PATTERN (insn));
+ mark_constants (PATTERN (insn), IS_SEARCH_CONST_DOUBLE_OK (insn));
for (insn = current_function_epilogue_delay_list;
insn;
insn = XEXP (insn, 1))
if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
- mark_constants (PATTERN (insn));
+ mark_constants (PATTERN (insn), IS_SEARCH_CONST_DOUBLE_OK (insn));
}
static void
-mark_constants (x)
+mark_constants (x, fp_mem_ok)
register rtx x;
+ int fp_mem_ok;
{
register int i;
register char *format_ptr;
@@ -3697,8 +3704,16 @@
a MEM, but does not constitute a use of that MEM. This is particularly
important inside a nested function, because CONST_DOUBLE_MEM may be
a reference to a MEM in the parent's constant pool. See the comment
- in force_const_mem. */
- else if (GET_CODE (x) == CONST_DOUBLE)
+ in force_const_mem.
+
+ For a special case on x86 with FP conditional move, reload may
+ generate patterns containing CONST_DOUBLE such that the x86
+ backend will generate load memory instuctions behind the back. To
+ cover this, we check if the instruction in which the CONST_DOUBLE
+ is used is a SET. If the instruction is a SET and CONST_DOUBLE is
+ in memory, we will look inside the CONST_DOUBLE. */
+ else if (GET_CODE (x) == CONST_DOUBLE
+ && (!fp_mem_ok || GET_CODE (CONST_DOUBLE_MEM (x)) != MEM))
return;
/* Insns may appear inside a SEQUENCE. Only check the patterns of
@@ -3706,7 +3721,7 @@
a constant just because it happens to appear in a REG_EQUIV note. */
if (GET_RTX_CLASS (GET_CODE (x)) == 'i')
{
- mark_constants (PATTERN (x));
+ mark_constants (PATTERN (x), fp_mem_ok);
return;
}
@@ -3717,7 +3732,7 @@
switch (*format_ptr++)
{
case 'e':
- mark_constants (XEXP (x, i));
+ mark_constants (XEXP (x, i), fp_mem_ok);
break;
case 'E':
@@ -3726,7 +3741,7 @@
register int j;
for (j = 0; j < XVECLEN (x, i); j++)
- mark_constants (XVECEXP (x, i, j));
+ mark_constants (XVECEXP (x, i, j), fp_mem_ok);
}
break;
Index: rtl.h
===================================================================
RCS file: /home/work/cvs/gnu/egcs/gcc/rtl.h,v
retrieving revision 1.1.1.17
diff -u -r1.1.1.17 rtl.h
--- rtl.h 1998/04/28 22:45:33 1.1.1.17
+++ rtl.h 1998/05/06 17:57:54
@@ -1207,6 +1196,7 @@
extern void print_rtl PROTO ((FILE *, rtx));
extern void print_inline_rtx PROTO ((FILE *, rtx, int));
#endif
+extern const char *get_insn_name PROTO ((rtx));
/* In loop.c */
extern void init_loop PROTO ((void));
Index: print-rtl.c
===================================================================
RCS file: /home/work/cvs/gnu/egcs/gcc/print-rtl.c,v
retrieving revision 1.1.1.5
diff -u -r1.1.1.5 print-rtl.c
--- print-rtl.c 1998/03/21 01:48:28 1.1.1.5
+++ print-rtl.c 1998/05/06 19:08:37
@@ -52,6 +52,8 @@
extern char **insn_name_ptr;
+static void print_rtx PROTO ((rtx));
+
/* Print IN_RTX onto OUTFILE. This is the recursive part of printing. */
static void
@@ -362,4 +364,24 @@
sawclose = 0;
print_rtx (x);
putc ('\n', outf);
+}
+
+const char *
+get_insn_name (in_rtx)
+ register rtx in_rtx;
+{
+ if (GET_RTX_CLASS (GET_CODE (in_rtx)) == 'i' && insn_name_ptr)
+ {
+ register int i;
+ register char *format_ptr;
+
+ format_ptr = GET_RTX_FORMAT (GET_CODE (in_rtx));
+ for (i = 0; i < GET_RTX_LENGTH (GET_CODE (in_rtx)); i++)
+ if (*format_ptr++ == 'i'
+ && &INSN_CODE (in_rtx) == &XINT (in_rtx, i)
+ && XINT (in_rtx, i) >= 0)
+ return insn_name_ptr[XINT (in_rtx, i)];
+ }
+
+ return NULL;
}
next prev parent reply other threads:[~1998-05-06 17:12 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
1998-04-25 18:25 More fp bug in egcs H.J. Lu
1998-04-27 21:29 ` Jim Wilson
1998-04-30 20:03 ` Jim Wilson
1998-05-02 18:56 ` H.J. Lu
1998-05-03 20:10 ` Jim Wilson
1998-05-05 0:35 ` Jeffrey A Law
1998-05-05 19:14 ` H.J. Lu
1998-05-06 11:49 ` Jim Wilson
1998-05-05 5:03 ` Jeffrey A Law
1998-05-06 17:12 ` H.J. Lu [this message]
1998-05-06 18:14 ` A patch for PPro Jeffrey A Law
1998-05-07 15:31 ` Jim Wilson
[not found] <199805131005.KAA00076@iron.rcp.co.uk>
1998-05-15 1:48 ` H.J. Lu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=m0yX9fY-000268C@ocean.lucon.org \
--to=hjl@lucon.org \
--cc=crux@pool.informatik.rwth-aachen.de \
--cc=egcs@cygnus.com \
--cc=law@cygnus.com \
--cc=scox@cygnus.com \
--cc=wilson@cygnus.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).