more gcc diffs
James Van Artsdalen
james at bigtex.uucp
Sun Aug 14 10:43:02 AEST 1988
First: if anyone has a *small* program that compiles with floating
point but does not work, I'd like to see it. I've got perl, but it's
not real small :-( If anyone has any floating point programs running,
I'd like to know too.
Here are more changes to the i386.md file. Remember to re-link i386.md
to md! If you missed my first patch, let me know and I'll mail it to
you.
*** /tmp/,RCSt1a27406 Sat Aug 13 19:33:27 1988
--- i386.md Sat Aug 13 17:08:23 1988
***************
*** 98,104
"*
{
rtx xops[1];
! fp_push_sf (operands[0]);
/* fp_pop_level--; */
xops[0] = FP_TOP;
output_asm_insn (\"ftst\;fstp %0(0)\;fstsw %Rax\;sahf\", xops);
--- 98,105 -----
"*
{
rtx xops[1];
! if (!FP_REG_P (operands[0]))
! fp_push_sf (operands[0]);
/* fp_pop_level--; */
xops[0] = FP_TOP;
output_asm_insn (\"ftst\;fstp %0(0)\;fstsw %Rax\;sahf\", xops);
***************
*** 114,120
"*
{
rtx xops[1];
! fp_push_df (operands[0]);
/* fp_pop_level--; */
xops[0] = FP_TOP;
output_asm_insn (\"ftst\;fstp %0(0)\;fstsw %Rax\;sahf\", xops);
--- 115,122 -----
"*
{
rtx xops[1];
! if (!FP_REG_P (operands[0]))
! fp_push_df (operands[0]);
/* fp_pop_level--; */
xops[0] = FP_TOP;
output_asm_insn (\"ftst\;fstp %0(0)\;fstsw %Rax\;sahf\", xops);
***************
*** 303,309
&& GET_MODE (REG_NOTES (insn)) == (enum machine_mode) REG_WAS_0
/* Make sure the insn that stored the 0 is still present. */
&& ! XEXP (REG_NOTES (insn), 0)->volatil
! && GET_CODE (XEXP (REG_NOTES (insn), 0)) != NOTE)
/* Fastest way to change a 0 to a 1. */
return \"inc%W %0\";
return \"mov%W %1,%0\";
--- 305,313 -----
&& GET_MODE (REG_NOTES (insn)) == (enum machine_mode) REG_WAS_0
/* Make sure the insn that stored the 0 is still present. */
&& ! XEXP (REG_NOTES (insn), 0)->volatil
! && GET_CODE (XEXP (REG_NOTES (insn), 0)) != NOTE
! /* Make sure cross jumping didn't happen here. */
! && no_labels_between_p (XEXP (REG_NOTES (insn), 0), insn))
/* Fastest way to change a 0 to a 1. */
return \"inc%W %0\";
return \"mov%W %1,%0\";
***************
*** 322,328
&& GET_MODE (REG_NOTES (insn)) == (enum machine_mode) REG_WAS_0
/* Make sure the insn that stored the 0 is still present. */
&& ! XEXP (REG_NOTES (insn), 0)->volatil
! && GET_CODE (XEXP (REG_NOTES (insn), 0)) != NOTE)
/* Fastest way to change a 0 to a 1. */
return \"inc%B %0\";
/* If mov%B isn't allowed for one of these regs, use mov%W. */
--- 326,334 -----
&& GET_MODE (REG_NOTES (insn)) == (enum machine_mode) REG_WAS_0
/* Make sure the insn that stored the 0 is still present. */
&& ! XEXP (REG_NOTES (insn), 0)->volatil
! && GET_CODE (XEXP (REG_NOTES (insn), 0)) != NOTE
! /* Make sure cross jumping didn't happen here. */
! && no_labels_between_p (XEXP (REG_NOTES (insn), 0), insn))
/* Fastest way to change a 0 to a 1. */
return \"inc%B %0\";
/* If mov%B isn't allowed for one of these regs, use mov%W. */
Here is a change to flow.c that RMS suggested:
*** /tmp/,RCSt1a27435 Sat Aug 13 19:36:13 1988
--- flow.c Thu Aug 11 04:27:27 1988
***************
*** 1613,1619
if (GET_CODE (testreg) == REG
&& (regno = REGNO (testreg), regno != FRAME_POINTER_REGNUM)
! && regno != ARG_POINTER_REGNUM
&& (regno >= FIRST_PSEUDO_REGISTER
|| INSN_VOLATILE (insn)))
{
--- 1613,1621 -----
if (GET_CODE (testreg) == REG
&& (regno = REGNO (testreg), regno != FRAME_POINTER_REGNUM)
! && regno != ARG_POINTER_REGNUM)
! #if 0 /* This was added in 1.25, but screws up death notes for hard regs.
! It probably isn't really needed anyway. */
&& (regno >= FIRST_PSEUDO_REGISTER
|| INSN_VOLATILE (insn)))
#endif
***************
*** 1616,1621
&& regno != ARG_POINTER_REGNUM
&& (regno >= FIRST_PSEUDO_REGISTER
|| INSN_VOLATILE (insn)))
{
register int offset = regno / REGSET_ELT_BITS;
register int bit = 1 << (regno % REGSET_ELT_BITS);
--- 1618,1624 -----
It probably isn't really needed anyway. */
&& (regno >= FIRST_PSEUDO_REGISTER
|| INSN_VOLATILE (insn)))
+ #endif
{
register int offset = regno / REGSET_ELT_BITS;
register int bit = 1 << (regno % REGSET_ELT_BITS);
Here is my current config.h:
---
#include "config-i386v.h"
/* These next two are needed to fix a bug wherein the assembler pseudo-op
.file is not printed if -g is not selected. The SysV assembler always
wants to see .file */
#define ASM_OUTPUT_SOURCE_FILENAME(FILE, NAME)
#undef ASM_FILE_START
#define ASM_FILE_START(FILE) \
fprintf(FILE, "\t.file\t\"%s\"\n", dump_base_name);
/* This is *necessary* for performance reasons. Try parse.tab.c with
alloca.c and you'll see */
#ifdef __GNUC__
#define alloca(n) __builtin_alloca(n)
#else
asm char *alloca(n)
{
%mem n
subl n, %esp
andl $-4, %esp
mov %esp,%eax
%reg n
subl n, %esp
andl $-4, %esp
mov %esp,%eax
%con n
subl n, %esp
andl $-4, %esp
mov %esp,%eax
}
#endif
/* These two allow shared libraries to be used */
#define STARTFILE_SPEC \
"%{pg:gcrt0.o%s}%{!pg:%{p:mcrt0.o%s}%{!p:crt1.o%s}}"
#define LIB_SPEC "%{!p:%{!pg:-lc crtn.o%s}}%{p:-lc_p}%{pg:-lc_p}"
/* This allows full 8 bit data to be placed in strings. */
#undef ASM_OUTPUT_ASCII
#define ASM_OUTPUT_ASCII(asm_out_file, p, size) \
{int i=0; \
while (i < size) \
{ if (i%10 ==0) { if(i!=0)fprintf(asm_out_file,"\n"); \
fprintf(asm_out_file,ASM_BYTE); } \
else fprintf(asm_out_file,","); \
fprintf (asm_out_file, "0x%x",p[i++]);} \
fprintf(asm_out_file,"\n"); }
/* This says to use the 80387 by default. This should always be true -
no worthwhile 386 system is going to fail to emulate a missing 387! */
/* RMS says maybe this doesn't work yet...
#undef TARGET_DEFAULT
#define TARGET_DEFAULT 1
*/
--
James R. Van Artsdalen ...!uunet!utastro!bigtex!james "Live Free or Die"
Home: 512-346-2444 Work: 328-0282; 110 Wild Basin Rd. Ste #230, Austin TX 78746
More information about the Comp.unix.microport
mailing list