From: Peter Barada <pbarada@mail.wm.sps.mot.com>
To: rth@redhat.com
Cc: Peter.Barada@motorola.com, gcc@gcc.gnu.org
Subject: Re: Saga of m68k PIC continues
Date: Wed, 11 Dec 2002 16:19:00 -0000 [thread overview]
Message-ID: <200212120011.gBC0B5W08189@hyper.wm.sps.mot.com> (raw)
In-Reply-To: <20021211235940.GF6975@redhat.com> (message from Richard Henderson on Wed, 11 Dec 2002 15:59:40 -0800)
>> 1) Should general_src_operand accept the unspec symbol?
>
>Nope.
Ah well, I went and did it anyway, and now it generates code, stuff
that actually looks like its legal(not too efficent mind you). I
successfully build all of glibc-2.2.5 for m68k using it.
Unfortunately without hardware I can't test it :-(
>
>> 2) If not, does anyone have an idea how I should get this instruction
>> recognized?
>
>You *may* want to wrap the unspec in a CONST. That would
>make the thing be recognized by general_operand. But I
>can't tell if that's exactly right, since you've posted
>no code.
I pulled the code from i386.c, so it should do that. Form a dump of
-fPIC code I see:
(insn 9 39 11 (set (reg/f:SI 0 %d0 [32])
(const:SI (unspec:SI[
(symbol_ref:SI ("a"))
] 6))) 29 {*m68k.md:1007} (nil)
(expr_list:REG_EQUIV (const:SI (unspec:SI[
(symbol_ref:SI ("a"))
] 6))
(nil)))
so the unspec is wrapped in a const.
Here's everthing I've done to get to this point. Its not pretty, and
nowehere near complete. Any suggestions on which way to go from
here will be much apprecieated.
[pbarada: ~/work/cvs-wavemark/cross-linux-tools/gcc-3.2.1/gcc/config/m68k] > cvs diff -Nu m68k-protos.h m68k.h m68k.c m68k.md
Index: m68k-protos.h
===================================================================
RCS file: /usr/local/wavemark/cvs/archives/cross-linux-tools/gcc-3.2.1/gcc/config/m68k/m68k-protos.h,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 m68k-protos.h
--- m68k-protos.h 2002/11/25 23:46:44 1.1.1.1
+++ m68k-protos.h 2002/12/12 00:05:15
@@ -1,5 +1,5 @@
/* Definitions of target machine for GNU compiler. Sun 68000/68020 version.
- Copyright (C) 2000 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -47,6 +47,8 @@
extern int strict_low_part_peephole_ok PARAMS ((enum machine_mode, rtx, rtx));
/* Functions from m68k.c used in macros. */
+extern int symbolic_reference_mentioned_p PARAMS ((rtx));
+extern int legitimate_pic_address_disp_p PARAMS ((rtx));
extern int symbolic_operand PARAMS ((rtx, enum machine_mode));
extern int const_int_cost PARAMS ((rtx));
extern int standard_68881_constant_p PARAMS ((rtx));
Index: m68k.h
===================================================================
RCS file: /usr/local/wavemark/cvs/archives/cross-linux-tools/gcc-3.2.1/gcc/config/m68k/m68k.h,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 m68k.h
--- m68k.h 2002/11/25 23:46:44 1.1.1.1
+++ m68k.h 2002/12/12 00:05:16
@@ -1,6 +1,6 @@
/* Definitions of target machine for GNU compiler.
Sun 68000/68020 version.
- Copyright (C) 1987, 1988, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ Copyright (C) 1987, 1988, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2002,
2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -280,7 +280,7 @@
#define OVERRIDE_OPTIONS \
{ \
override_options(); \
- if (! TARGET_68020 && flag_pic == 2) \
+ if (! (TARGET_68020 || TARGET_5200) && flag_pic == 2) \
error("-fPIC is not currently supported on the 68000 or 68010\n"); \
if (TARGET_PCREL && flag_pic == 0) \
flag_pic = 1; \
@@ -1305,6 +1305,16 @@
#define PCREL_GENERAL_OPERAND_OK (TARGET_PCREL)
#endif
+#if 1
+#define LEGITIMATE_PIC_OPERAND_P(X) \
+ (! SYMBOLIC_CONST (X) \
+ || legitimate_pic_address_disp_p (X))
+
+#define SYMBOLIC_CONST(X) \
+ (GET_CODE (X) == SYMBOL_REF \
+ || GET_CODE (X) == LABEL_REF \
+ || (GET_CODE (X) == CONST && symbolic_reference_mentioned_p (X)))
+#else
#define LEGITIMATE_PIC_OPERAND_P(X) \
((! symbolic_operand (X, VOIDmode) \
&& ! (GET_CODE (X) == CONST_DOUBLE && mem_for_const_double (X) != 0 \
@@ -1313,6 +1323,7 @@
VOIDmode))) \
|| (GET_CODE (X) == SYMBOL_REF && SYMBOL_REF_FLAG (X)) \
|| PCREL_GENERAL_OPERAND_OK)
+#endif
/* The macros REG_OK_FOR..._P assume that the arg is a REG rtx
and check its validity for a certain class.
Index: m68k.c
===================================================================
RCS file: /usr/local/wavemark/cvs/archives/cross-linux-tools/gcc-3.2.1/gcc/config/m68k/m68k.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 m68k.c
--- m68k.c 2002/11/25 23:46:44 1.1.1.1
+++ m68k.c 2002/12/12 00:05:16
@@ -1,5 +1,5 @@
/* Subroutines for insn-output.c for Motorola 68000 family.
- Copyright (C) 1987, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+ Copyright (C) 1987, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -124,6 +124,12 @@
struct gcc_target targetm = TARGET_INITIALIZER;
\f
+#if 1
+/* Prefix built by ASM_GENERATE_INTERNAL_LABEL. */
+static char internal_label_prefix[16];
+static int internal_label_prefix_len;
+#endif
+
/* Sometimes certain combinations of command options do not make
sense on a particular target machine. You can define a macro
`OVERRIDE_OPTIONS' to take account of this. This macro, if
@@ -174,6 +180,15 @@
else
m68k_align_funcs = i;
}
+
+ /* Figure out what ASM_GENERATE_INTERNAL_LABEL builds as a prefix. */
+ {
+ char *p;
+ ASM_GENERATE_INTERNAL_LABEL (internal_label_prefix, "LX", 0);
+ p = strchr (internal_label_prefix, 'X');
+ internal_label_prefix_len = p - internal_label_prefix;
+ *p = '\0';
+ }
}
\f
/* This function generates the assembly code for function entry.
@@ -341,11 +356,22 @@
if (flag_pic && current_function_uses_pic_offset_table)
{
- fprintf (stream, "\tmove.l #__GLOBAL_OFFSET_TABLE_, %s\n",
- reg_names[PIC_OFFSET_TABLE_REGNUM]);
- fprintf (stream, "\tlea.l (pc,%s.l),%s\n",
- reg_names[PIC_OFFSET_TABLE_REGNUM],
- reg_names[PIC_OFFSET_TABLE_REGNUM]);
+ if (TARGET_5200)
+ {
+ asm_fprintf (stream, "\tmovel %0I_GLOBAL_OFFSET_TABLE_@GOTPC, %s\n",
+ reg_names[PIC_OFFSET_TABLE_REGNUM]);
+ asm_fprintf (stream, "\tlea %Rpc@(-6,%s:l),%s\n",
+ reg_names[PIC_OFFSET_TABLE_REGNUM],
+ reg_names[PIC_OFFSET_TABLE_REGNUM]);
+ }
+ else
+ {
+ fprintf (stream, "\tmove.l #__GLOBAL_OFFSET_TABLE_, %s\n",
+ reg_names[PIC_OFFSET_TABLE_REGNUM]);
+ fprintf (stream, "\tlea.l (pc,%s.l),%s\n",
+ reg_names[PIC_OFFSET_TABLE_REGNUM],
+ reg_names[PIC_OFFSET_TABLE_REGNUM]);
+ }
}
}
@@ -1901,6 +1927,7 @@
/* Returns 1 if OP is either a symbol reference or a sum of a symbol
reference and a constant. */
+#if 1
int
symbolic_operand (op, mode)
register rtx op;
@@ -1914,6 +1941,50 @@
case CONST:
op = XEXP (op, 0);
+ if (GET_CODE (op) == SYMBOL_REF
+ || GET_CODE (op) == LABEL_REF
+ || (GET_CODE (op) == UNSPEC
+ && (XINT (op, 1) == 6
+ || XINT (op, 1) == 7
+ || XINT (op, 1) == 15)))
+ return 1;
+ if (GET_CODE (op) != PLUS
+ || GET_CODE (XEXP (op, 1)) != CONST_INT)
+ return 0;
+
+ op = XEXP (op, 0);
+ if (GET_CODE (op) == SYMBOL_REF
+ || GET_CODE (op) == LABEL_REF)
+ return 1;
+ /* Only @GOTOFF gets offsets. */
+ if (GET_CODE (op) != UNSPEC
+ || XINT (op, 1) != 7)
+ return 0;
+
+ op = XVECEXP (op, 0, 0);
+ if (GET_CODE (op) == SYMBOL_REF
+ || GET_CODE (op) == LABEL_REF)
+ return 1;
+ return 0;
+
+ default:
+ return 0;
+ }
+}
+#else
+int
+symbolic_operand (op, mode)
+ register rtx op;
+ enum machine_mode mode ATTRIBUTE_UNUSED;
+{
+ switch (GET_CODE (op))
+ {
+ case SYMBOL_REF:
+ case LABEL_REF:
+ return 1;
+
+ case CONST:
+ op = XEXP (op, 0);
return ((GET_CODE (XEXP (op, 0)) == SYMBOL_REF
|| GET_CODE (XEXP (op, 0)) == LABEL_REF)
&& GET_CODE (XEXP (op, 1)) == CONST_INT);
@@ -1928,6 +1999,7 @@
return 0;
}
}
+#endif
\f
/* Check for sign_extend or zero_extend. Used for bit-count operands. */
@@ -1949,6 +2021,110 @@
}
\f
+
+#if 1
+/* Return true if OP is a symbolic operand that resolves locally. */
+
+static int
+local_symbolic_operand (op, mode)
+ rtx op;
+ enum machine_mode mode ATTRIBUTE_UNUSED;
+{
+ if (GET_CODE (op) == LABEL_REF)
+ return 1;
+
+ if (GET_CODE (op) == CONST
+ && GET_CODE (XEXP (op, 0)) == PLUS
+ && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT)
+ op = XEXP (XEXP (op, 0), 0);
+
+ if (GET_CODE (op) != SYMBOL_REF)
+ return 0;
+
+ /* These we've been told are local by varasm and encode_section_info
+ respectively. */
+ if (CONSTANT_POOL_ADDRESS_P (op) || SYMBOL_REF_FLAG (op))
+ return 1;
+
+ /* There is, however, a not insubstantial body of code in the rest of
+ the compiler that assumes it can just stick the results of
+ ASM_GENERATE_INTERNAL_LABEL in a symbol_ref and have done. */
+ /* ??? This is a hack. Should update the body of the compiler to
+ always create a DECL an invoke ENCODE_SECTION_INFO. */
+ if (strncmp (XSTR (op, 0), internal_label_prefix,
+ internal_label_prefix_len) == 0)
+ return 1;
+
+ return 0;
+}
+
+/* Determine if a given CONST RTX is a valid memory displacement
+ in PIC mode. */
+
+int
+legitimate_pic_address_disp_p (disp)
+ register rtx disp;
+{
+ if (GET_CODE (disp) != CONST)
+ return 0;
+ disp = XEXP (disp, 0);
+
+ if (GET_CODE (disp) == PLUS)
+ {
+ if (GET_CODE (XEXP (disp, 1)) != CONST_INT)
+ return 0;
+ disp = XEXP (disp, 0);
+ }
+
+ if (GET_CODE (disp) != UNSPEC
+ || XVECLEN (disp, 0) != 1)
+ return 0;
+
+ /* Must be @GOT or @GOTOFF. */
+ switch (XINT (disp, 1))
+ {
+ case 6: /* @GOT */
+ return GET_CODE (XVECEXP (disp, 0, 0)) == SYMBOL_REF;
+
+ case 7: /* @GOTOFF */
+ return local_symbolic_operand (XVECEXP (disp, 0, 0), Pmode);
+ }
+
+ return 0;
+}
+
+/* Returns 1 if OP contains a symbol reference */
+
+int
+symbolic_reference_mentioned_p (op)
+ rtx op;
+{
+ register const char *fmt;
+ register int i;
+
+ if (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF)
+ return 1;
+
+ fmt = GET_RTX_FORMAT (GET_CODE (op));
+ for (i = GET_RTX_LENGTH (GET_CODE (op)) - 1; i >= 0; i--)
+ {
+ if (fmt[i] == 'E')
+ {
+ register int j;
+
+ for (j = XVECLEN (op, i) - 1; j >= 0; j--)
+ if (symbolic_reference_mentioned_p (XVECEXP (op, i, j)))
+ return 1;
+ }
+
+ else if (fmt[i] == 'e' && symbolic_reference_mentioned_p (XEXP (op, i)))
+ return 1;
+ }
+
+ return 0;
+}
+
+#endif
/* Legitimize PIC addresses. If the address is already
position-independent, we return ORIG. Newly generated
position-independent addresses go to REG. If we need more
@@ -1989,6 +2165,122 @@
That (in a nutshell) is how *all* symbol and label references are
handled. */
+#if 1
+rtx
+legitimize_pic_address (orig, mode, reg)
+ rtx orig, reg;
+ enum machine_mode mode ATTRIBUTE_UNUSED;
+{
+ rtx addr = orig;
+ rtx pic_ref = addr;
+ rtx base;
+
+ /* First handle a simple SYMBOL_REF or LABEL_REF */
+ if (local_symbolic_operand(addr, Pmode))
+ {
+ if (reg == 0)
+ abort ();
+
+ if (TARGET_5200)
+ {
+ pic_ref = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), 7);
+ pic_ref = gen_rtx_CONST (Pmode, pic_ref);
+ /* Now move the symbol into a register(w/o using emit_move_insn) */
+ RTX_UNCHANGING_P (pic_ref) = 1;
+ emit_insn (gen_rtx_SET (Pmode, reg, pic_ref));
+ pic_ref = gen_rtx_MEM (Pmode,
+ gen_rtx_PLUS (Pmode,
+ pic_offset_table_rtx, reg));
+ }
+ else
+ {
+ pic_ref = gen_rtx_MEM (Pmode,
+ gen_rtx_PLUS (Pmode,
+ pic_offset_table_rtx, addr));
+ }
+ current_function_uses_pic_offset_table = 1;
+ RTX_UNCHANGING_P (pic_ref) = 1;
+ emit_move_insn (reg, pic_ref);
+ return reg;
+ }
+ else if (GET_CODE (addr) == SYMBOL_REF)
+ {
+ /* This symbol must be referenced via a load from the
+ Global Offset Table (@GOT). */
+
+ current_function_uses_pic_offset_table = 1;
+ pic_ref = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), 6);
+ pic_ref = gen_rtx_CONST (Pmode, pic_ref);
+ pic_ref = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, pic_ref);
+ pic_ref = gen_rtx_MEM (Pmode, pic_ref);
+ RTX_UNCHANGING_P (pic_ref) = 1;
+ /* set_mem_alias_set (new, ix86_GOT_alias_set ()); */
+
+ if (reg == 0)
+ reg = gen_reg_rtx (Pmode);
+ emit_move_insn (reg, pic_ref);
+ pic_ref = reg;
+ }
+ else
+ {
+ if (GET_CODE (addr) == CONST)
+ {
+ addr = XEXP (addr, 0);
+
+ /* We must match stuff we generate before. Assume the only
+ unspecs that can get here are ours. Not that we could do
+ anything with them anyway... */
+ if (GET_CODE (addr) == UNSPEC
+ || (GET_CODE (addr) == PLUS
+ && GET_CODE (XEXP (addr, 0)) == UNSPEC))
+ return addr;
+ if (GET_CODE (addr) != PLUS)
+ abort ();
+ }
+ if (GET_CODE (addr) == PLUS)
+ {
+ rtx op0 = XEXP (addr, 0), op1 = XEXP (addr, 1);
+
+ /* Check first to see if this is a constant offset from a @GOTOFF
+ symbol reference. */
+ if (local_symbolic_operand (op0, Pmode)
+ && GET_CODE (op1) == CONST_INT)
+ {
+ current_function_uses_pic_offset_table = 1;
+ pic_ref = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op0), 7);
+ pic_ref = gen_rtx_PLUS (Pmode, pic_ref, op1);
+ pic_ref = gen_rtx_CONST (Pmode, pic_ref);
+ pic_ref = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, pic_ref);
+
+ if (reg != 0)
+ {
+ emit_move_insn (reg, pic_ref);
+ pic_ref = reg;
+ }
+ }
+ else
+ {
+ base = legitimize_pic_address (XEXP (addr, 0), mode, reg);
+ pic_ref = legitimize_pic_address (XEXP (addr, 1),
+ mode, base == reg ? NULL_RTX : reg);
+
+ if (GET_CODE (pic_ref) == CONST_INT)
+ pic_ref = plus_constant (base, INTVAL (pic_ref));
+ else
+ {
+ if (GET_CODE (pic_ref) == PLUS && CONSTANT_P (XEXP (pic_ref, 1)))
+ {
+ base = gen_rtx_PLUS (Pmode, base, XEXP (pic_ref, 0));
+ pic_ref = XEXP (pic_ref, 1);
+ }
+ pic_ref = gen_rtx_PLUS (Pmode, base, pic_ref);
+ }
+ }
+ }
+ }
+ return pic_ref;
+}
+#else
rtx
legitimize_pic_address (orig, mode, reg)
rtx orig, reg;
@@ -2038,6 +2330,7 @@
}
return pic_ref;
}
+#endif
\f
typedef enum { MOVL, SWAP, NEGW, NOTW, NOTB, MOVQ } CONST_METHOD;
@@ -3394,6 +3687,40 @@
*/
+static void output_pic_addr_const(file, op)
+ FILE *file;
+ rtx op;
+{
+ if (GET_CODE (op) == CONST)
+ op = XEXP(op, 0);
+ if (GET_CODE (op) == UNSPEC)
+ {
+ if (XVECLEN (op, 0) != 1)
+ abort ();
+ output_pic_addr_const (file, XVECEXP (op, 0, 0));
+ switch (XINT (op, 1))
+ {
+ case 6:
+ fputs ("@GOT", file);
+ break;
+ case 7:
+ fputs ("@GOTOFF", file);
+ break;
+ case 8:
+ fputs ("@PLT", file);
+ break;
+ case 15:
+ fputs ("@GOTPCREL(%RIP)", file);
+ break;
+ default:
+ output_operand_lossage ("invalid UNSPEC as operand");
+ break;
+ }
+ }
+ else
+ output_addr_const(file, op);
+}
+
void
print_operand (file, op, letter)
FILE *file; /* file to write to */
@@ -3466,7 +3793,10 @@
if (GET_CODE (op) != MEM || GET_CODE (XEXP (op, 0)) != SYMBOL_REF
|| !TARGET_PCREL)
abort ();
- output_addr_const (file, XEXP (op, 0));
+ if (flag_pic)
+ output_pic_addr_const (file, XEXP (op, 0));
+ else
+ output_addr_const (file, XEXP (op, 0));
}
else if (GET_CODE (op) == REG)
{
@@ -3540,7 +3870,10 @@
&& (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == CONST))
print_operand_address (file, op);
else
- output_addr_const (file, op);
+ if (flag_pic)
+ output_pic_addr_const (file, op);
+ else
+ output_addr_const (file, op);
}
}
@@ -4065,6 +4398,11 @@
|| GET_CODE (XEXP (op, 0)) == LABEL_REF
|| GET_CODE (XEXP (op, 0)) == CONST))
return 1;
+#if 1
+ /* Accept symols */
+ if (symbolic_operand(op, mode) || local_symbolic_operand(op, mode))
+ return 1;
+#endif
return general_operand (op, mode);
}
Index: m68k.md
===================================================================
RCS file: /usr/local/wavemark/cvs/archives/cross-linux-tools/gcc-3.2.1/gcc/config/m68k/m68k.md,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 m68k.md
--- m68k.md 2002/11/25 23:46:44 1.1.1.1
+++ m68k.md 2002/12/12 00:05:16
@@ -273,6 +273,13 @@
;;- END FPA Explanation Section.
+/* Defien the constants being used by the unspec */
+(define_constants [
+ (UNSPEC_SIN 1)
+ (UNSPEC_COS 2)
+ (UNSPEC_GOT 3)
+ (UNSPEC_GOTOFF 4)
+])
;;- Some of these insn's are composites of several m68000 op codes.
;;- The assembler (or final @@??) insures that the appropriate one is
@@ -948,6 +955,29 @@
""
"
{
+#if 1
+ /* if PIC, push symbol into a register and then do the add */
+ if (flag_pic)
+ {
+ if (!reload_in_progress)
+ {
+ /* If the destination is a symbol,
+ push its address into a register */
+ if (symbolic_operand (operands[0], SImode))
+ operands[0] = force_reg (SImode, XEXP (operands[0], 0));
+ else if (GET_CODE (operands[0]) == MEM
+ && symbolic_operand (XEXP (operands[0], 0), SImode))
+ operands[0] = gen_rtx (MEM, SImode,
+ force_reg (SImode, XEXP (operands[0], 0)));
+ }
+
+ if (symbolic_operand (operands[1], SImode))
+ {
+ rtx temp = reload_in_progress ? operands[0] : gen_reg_rtx (Pmode);
+ operands[1] = legitimize_pic_address (operands[1], SImode, temp);
+ }
+ }
+#else
if (flag_pic && !TARGET_PCREL && symbolic_operand (operands[1], SImode))
{
/* The source is an address which requires PIC relocation.
@@ -968,6 +998,7 @@
operands[0] = gen_rtx (MEM, SImode,
force_reg (SImode, XEXP (operands[0], 0)));
}
+#endif
}")
;; General case of fullword move. The register constraints
@@ -8315,7 +8346,7 @@
(define_insn "sinsf2"
[(set (match_operand:SF 0 "nonimmediate_operand" "=f")
- (unspec:SF [(match_operand:SF 1 "general_operand" "fm")] 1))]
+ (unspec:SF [(match_operand:SF 1 "general_operand" "fm")] UNSPEC_SIN))]
"TARGET_68881 && flag_unsafe_math_optimizations"
"*
{
@@ -8327,7 +8358,7 @@
(define_insn "sindf2"
[(set (match_operand:DF 0 "nonimmediate_operand" "=f")
- (unspec:DF [(match_operand:DF 1 "general_operand" "fm")] 1))]
+ (unspec:DF [(match_operand:DF 1 "general_operand" "fm")] UNSPEC_SIN))]
"TARGET_68881 && flag_unsafe_math_optimizations"
"*
{
@@ -8339,13 +8370,13 @@
(define_insn "sinxf2"
[(set (match_operand:XF 0 "nonimmediate_operand" "=f")
- (unspec:XF [(match_operand:XF 1 "nonimmediate_operand" "fm")] 1))]
+ (unspec:XF [(match_operand:XF 1 "nonimmediate_operand" "fm")] UNSPEC_SIN))]
"TARGET_68881 && flag_unsafe_math_optimizations"
"fsin%.x %1,%0")
(define_insn "cossf2"
[(set (match_operand:SF 0 "nonimmediate_operand" "=f")
- (unspec:SF [(match_operand:SF 1 "general_operand" "fm")] 2))]
+ (unspec:SF [(match_operand:SF 1 "general_operand" "fm")] UNSPEC_COS))]
"TARGET_68881 && flag_unsafe_math_optimizations"
"*
{
@@ -8357,7 +8388,7 @@
(define_insn "cosdf2"
[(set (match_operand:DF 0 "nonimmediate_operand" "=f")
- (unspec:DF [(match_operand:DF 1 "general_operand" "fm")] 2))]
+ (unspec:DF [(match_operand:DF 1 "general_operand" "fm")] UNSPEC_COS))]
"TARGET_68881 && flag_unsafe_math_optimizations"
"*
{
@@ -8369,7 +8400,7 @@
(define_insn "cosxf2"
[(set (match_operand:XF 0 "nonimmediate_operand" "=f")
- (unspec:XF [(match_operand:XF 1 "nonimmediate_operand" "fm")] 2))]
+ (unspec:XF [(match_operand:XF 1 "nonimmediate_operand" "fm")] UNSPEC_COS))]
"TARGET_68881 && flag_unsafe_math_optimizations"
"fcos%.x %1,%0")
[pbarada: ~/work/cvs-wavemark/cross-linux-tools/gcc-3.2.1/gcc/config/m68k] >
--
Peter Barada Peter.Barada@motorola.com
Wizard 781-852-2768 (direct)
WaveMark Solutions(wholly owned by Motorola) 781-270-0193 (fax)
next prev parent reply other threads:[~2002-12-12 0:11 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-12-11 12:57 Peter Barada
2002-12-11 14:25 ` Jim Wilson
2002-12-11 16:11 ` Richard Henderson
2002-12-11 16:19 ` Peter Barada [this message]
2002-12-12 2:41 ` Richard Henderson
2002-12-12 5:11 ` Andreas Schwab
2002-12-12 11:24 ` Richard Henderson
2002-12-12 11:28 ` Andreas Schwab
2002-12-12 12:27 ` Peter Barada
2002-12-12 12:44 ` Jan Hubicka
2002-12-12 12:44 ` Peter Barada
2002-12-12 13:00 ` Jan Hubicka
2002-12-12 13:46 ` Peter Barada
2002-12-12 14:32 ` Jim Wilson
2002-12-12 13:50 ` Peter Barada
2002-12-12 13:59 ` Jan Hubicka
2002-12-12 14:57 ` Richard Henderson
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=200212120011.gBC0B5W08189@hyper.wm.sps.mot.com \
--to=pbarada@mail.wm.sps.mot.com \
--cc=Peter.Barada@motorola.com \
--cc=gcc@gcc.gnu.org \
--cc=rth@redhat.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).