Changes for GCC 2.4.2, from 2.4.1. Changes in files you can reconstruct automatically have been omitted. diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/ChangeLog gcc-2.4.2/ChangeLog *** gcc-2.4.1/ChangeLog Wed May 26 02:08:06 1993 --- gcc-2.4.2/ChangeLog Mon May 31 02:12:58 1993 *************** *** 1,3 **** --- 1,151 ---- + Mon May 31 00:15:20 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * Version 2.4.2 released. + + Sun May 30 21:14:42 1993 Jim Wilson (wilson@sphagnum.cygnus.com) + + * integrate.c (expand_inline_function): Increment map->const_age + before copying REG_NOTES. + + * sparc.c (sparc_builtin_saveregs): Don't set first_reg to zero + for varargs. + + Sun May 30 23:58:52 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * objc/Makefile (copy-headers): chmod the headers, not the dir. + + * Makefile.in (objc-headers): Don't dep on force. + Touch objc-headers so copy is not repeated at install time. + + * final.c (shorten_branches): Conditionalize last change + on SHORTEN_WITH_ADJUST_INSN_LENGTH. + + * pa.h (SHORTEN_WITH_ADJUST_INSN_LENGTH): Defined. + + Sun May 30 13:53:30 1993 Jeff Law (law@snake.cs.utah.edu) + + * final.c (shorten_branches): Call ADJUST_INSN_LENGTH during the + shortening phase. + + * pa.c (output_cbranch): In forward/long branch case, only + nullify if the delay slot was empty or if the delay slot + was explicitly nullified. + (output_bb): Likewise. + + * pa.h (ADJUST_INSN_LENGTH): Call pa_insn_adjust_length. + + * pa.h (INSN_SETS_ARE_DELAYED): Do not call get_attr_type with a + CLOBBER insn. + (INSN_REFERENCES_ARE_DELAYED): Likewise. + + * pa.md (call insns and expanders): Do not explicitly clobber %r31. + + * pa.c (pa_insn_adjust_length): Rework. Add code to handle + millicode calls with unfilled delay slots and inline block moves. + (compute_movstrsi_length): New function to compute the length of + a movstrsi pattern. + (output_cbranch): Long branches with unfilled delay slots can + always nullify the following instruction if their delay slot + was not filled. + + Sun May 30 18:58:22 1993 Jim Wilson (wilson@sphagnum.cygnus.com) + + * mips.c (function_arg_partial_nregs): For BLKmode values, fits in + remaining register if total size <= MAX_ARGS_IN_REGISTERS, not <. + + Sun May 30 17:45:06 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * emit-rtl.c (operand_subword): Shift by (HOST_BITS_PER_WIDE_INT / 2), + not by 32. + + * reload1.c (reload): If only non-group need is unfilled, see if + regs spilled for earlier classes can satisfy it. + + * config/mips/iris4loser.h (ASM_SPEC): Add unconditional -O0. + + Sat May 29 15:19:57 1993 Jeff Law (law@snake.cs.utah.edu) + + * pa.md (movdf for const_double): Handle loading + a CONST_DOUBLE into general registers. + (movsf for const_double): Likewise. + + * pa.c (singlemove_string): Handle SFmode CONST_DOUBLE + as a source operand. + + Sat May 29 14:14:30 1993 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * emit-rtl.c (operand_subword): Correctly handle case when + REAL_VALUE_TO_TARGET_DOUBLE is used on a 64-bit machine. + + Sat May 29 12:15:43 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * fixincludes (signal.h): Don't mung #endif if nonwhite stuff precedes. + + * rtl.h: Undef PC. + + Fri May 28 19:01:39 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * configure (i[34]86-*-isc*): If gas and not stabs, use isccoff.h. + + * final.c (shorten_branches): Do not call insn_current_length + with an insn which has a non-varying length. Use insn_lengths + instead. + + * c-typeck.c (process_init_constructor): Never set current_index + itself--always store into current_index_node. + + * dbxout.c (dbxout_type): Add missing `;' for array with no domain. + + Fri May 28 16:47:54 1993 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * cse.c (fold_rtx): Correct check for associating shifts and + ending up with a shift count too large; convert to the + largest valid for ASHIFTRT and don't fold all others. + + * combine.c (make_compound_operation, case ASHIFTRT): Fix typo. + Was using C1 where C2 is needed. + + Fri May 28 17:50:38 1993 Jim Wilson (wilson@sphagnum.cygnus.com) + + * integrate.c (expand_inline_function): When copy REG_NOTES, must + also call subst_constants. + + * gcc.c (process_command): When GCC_EXEC_PREFIX is defined and + tooldir is relative, add it to search path in addition to standard + directory rather than instead of. + + Fri May 28 00:50:53 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * config/arm/arm.h (GO_IF_LEGITIMATE_INDEX): Check explicitly for + upper and lower bounds of valid INDEX. + + * genopinit.c (insn_name_ptr): Declare as variable. + (optabs): Fix typo in floatuns case. + + Thu May 27 12:13:55 1993 Richard Kenner (kenner@vlsi1.ultra.nyu.edu) + + * combine.c (simplify_and_const_int, case IOR, XOR, NOT): Don't + create constant wider than mode of VAROP. + + Thu May 27 20:41:18 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * configure (i[34]86-ibm-aix*): Set fixincludes. + (i[34]86-*-sco*): Don't test --with-gas, just --with-stabs. + + Wed May 26 16:05:05 1993 Michael Collison (collison@osf.org) + + * jump.c (jump_optimize): Insert missing GET_MODE call. + + Wed May 26 18:40:09 1993 Jim Wilson (wilson@wookumz.gnu.ai.mit.edu) + + * i960.md (ashlsi3): Use shlo instead of shli. + Wed May 26 00:34:33 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * config/nextstep.h (INCLUDE_DEFAULTS): Undo previous change. + + * Makefile.in (gcc.xtar.z): Renamed from gcc.xtar.Z. Use gzip. + (dist): Depend on gcc.xtar.z. + (mostlyclean): Delete temp-gcc.xtar.z. * Version 2.4.1 released. diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/Makefile.in gcc-2.4.2/Makefile.in *** gcc-2.4.1/Makefile.in Tue May 25 10:49:58 1993 --- gcc-2.4.2/Makefile.in Mon May 31 02:11:08 1993 *************** *** 1377,1382 **** touch stmp-fixinc ! # copy objc header files ! objc-headers: force if [ -d objc ]; then true; else mkdir objc; fi thisdir1=`pwd`; \ --- 1377,1382 ---- touch stmp-fixinc ! # copy objc header files into build directory ! objc-headers: if [ -d objc ]; then true; else mkdir objc; fi thisdir1=`pwd`; \ *************** *** 1387,1391 **** GCC_FOR_TARGET="$${thisdir1}/xgcc -B$${thisdir1}/" \ GCC_CFLAGS="$(GCC_CFLAGS)" incinstalldir=$${thisdir1}/include ! # Remake the info files. --- 1387,1391 ---- GCC_FOR_TARGET="$${thisdir1}/xgcc -B$${thisdir1}/" \ GCC_CFLAGS="$(GCC_CFLAGS)" incinstalldir=$${thisdir1}/include ! touch objc-headers # Remake the info files. *************** *** 1445,1449 **** for name in $(LIB1FUNCS); do rm -f $${name}.c; done # Delete other temporary files. ! -rm -f tmp-float.h tmp-gcc.xtar.Z -rm -f tmp-foo1 tmp-foo2 tmp-proto.* tmp-unproto.1 tmp-SYSCALLS.s # Delete the stamp files. --- 1445,1449 ---- for name in $(LIB1FUNCS); do rm -f $${name}.c; done # Delete other temporary files. ! -rm -f tmp-float.h tmp-gcc.xtar.z -rm -f tmp-foo1 tmp-foo2 tmp-proto.* tmp-unproto.1 tmp-SYSCALLS.s # Delete the stamp files. *************** *** 1739,1751 **** # Create the distribution tar file. ! #dist: gcc-$(version).tar.Z ! dist: gcc.xtar.Z ! gcc.xtar.Z: gcc.xtar ! compress < gcc.xtar > tmp-gcc.xtar.Z ! mv tmp-gcc.xtar.Z gcc.xtar.Z ! #gcc-$(version).tar.Z: gcc-$(version).tar ! # compress < gcc-$(version).tar > gcc-$(version).tar.Z #gcc-$(version).tar: --- 1739,1751 ---- # Create the distribution tar file. ! #dist: gcc-$(version).tar.z ! dist: gcc.xtar.z ! gcc.xtar.z: gcc.xtar ! gzip < gcc.xtar > tmp-gcc.xtar.z ! mv tmp-gcc.xtar.z gcc.xtar.z ! #gcc-$(version).tar.z: gcc-$(version).tar ! # gzip < gcc-$(version).tar > gcc-$(version).tar.z #gcc-$(version).tar: diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/README gcc-2.4.2/README *** gcc-2.4.1/README Wed May 26 05:05:54 1993 --- gcc-2.4.2/README Mon May 31 02:23:54 1993 *************** *** 1,3 **** ! This directory contains the version 2.4.1 release of the GNU C compiler. It includes all of the support for compiling C++ and Objective C, including a run-time library for Objective C. --- 1,3 ---- ! This directory contains the version 2.4.2 release of the GNU C compiler. It includes all of the support for compiling C++ and Objective C, including a run-time library for Objective C. diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/c-typeck.c gcc-2.4.2/c-typeck.c *** gcc-2.4.1/c-typeck.c Wed May 26 00:30:03 1993 --- gcc-2.4.2/c-typeck.c Fri May 28 20:03:39 1993 *************** *** 5255,5259 **** warning ("empty array initializer range"); tail = TREE_CHAIN (tail); ! current_index = end_index; continue; } --- 5255,5262 ---- warning ("empty array initializer range"); tail = TREE_CHAIN (tail); ! TREE_INT_CST_LOW (current_index) ! = TREE_INT_CST_LOW (end_index); ! TREE_INT_CST_HIGH (current_index) ! = TREE_INT_CST_HIGH (end_index); continue; } *************** *** 5260,5264 **** else { ! current_index = start_index; win = 1; /* See if the first element is also the last. */ --- 5263,5270 ---- else { ! TREE_INT_CST_LOW (current_index) ! = TREE_INT_CST_LOW (start_index); ! TREE_INT_CST_HIGH (current_index) ! = TREE_INT_CST_HIGH (start_index); win = 1; /* See if the first element is also the last. */ *************** *** 5277,5281 **** { constant_expression_warning (index); ! current_index = index, win = 1; } --- 5283,5290 ---- { constant_expression_warning (index); ! TREE_INT_CST_LOW (current_index) = TREE_INT_CST_LOW (index); ! TREE_INT_CST_HIGH (current_index) ! = TREE_INT_CST_HIGH (index); ! win = 1; } diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/combine.c gcc-2.4.2/combine.c *** gcc-2.4.1/combine.c Mon May 24 04:02:21 1993 --- gcc-2.4.2/combine.c Fri May 28 18:47:14 1993 *************** *** 5218,5222 **** GEN_INT (newop1)), INTVAL (c2) - INTVAL (c1), ! NULL_RTX, mode_width - INTVAL (c1), code == LSHIFTRT, 0, in_code == COMPARE); } --- 5218,5222 ---- GEN_INT (newop1)), INTVAL (c2) - INTVAL (c1), ! NULL_RTX, mode_width - INTVAL (c2), code == LSHIFTRT, 0, in_code == COMPARE); } *************** *** 5969,5973 **** /* If VAROP is (ior (lshiftrt FOO C1) C2), try to commute the IOR and LSHIFT so we end up with an (and (lshiftrt (ior ...) ...) ...) ! operation which may be a bitfield extraction. */ if (GET_CODE (XEXP (varop, 0)) == LSHIFTRT --- 5969,5975 ---- /* If VAROP is (ior (lshiftrt FOO C1) C2), try to commute the IOR and LSHIFT so we end up with an (and (lshiftrt (ior ...) ...) ...) ! operation which may be a bitfield extraction. Ensure ! that the constant we form is not wider than the mode of ! VAROP. */ if (GET_CODE (XEXP (varop, 0)) == LSHIFTRT *************** *** 5976,5979 **** --- 5978,5984 ---- && INTVAL (XEXP (XEXP (varop, 0), 1)) < HOST_BITS_PER_WIDE_INT && GET_CODE (XEXP (varop, 1)) == CONST_INT + && ((INTVAL (XEXP (XEXP (varop, 0), 1)) + + floor_log2 (INTVAL (XEXP (varop, 1)))) + < GET_MODE_BITSIZE (GET_MODE (varop))) && (INTVAL (XEXP (varop, 1)) & ~ nonzero_bits (XEXP (varop, 0), GET_MODE (varop)) == 0)) *************** *** 6004,6009 **** case NOT: ! /* (and (not FOO)) is (and (xor FOO CONST_OP)) so if FOO is an ! LSHIFTRT we can do the same as above. */ if (GET_CODE (XEXP (varop, 0)) == LSHIFTRT --- 6009,6015 ---- case NOT: ! /* (and (not FOO)) is (and (xor FOO CONST)), so if FOO is an ! LSHIFTRT, we can do the same as above. Ensure that the constant ! we form is not wider than the mode of VAROP. */ if (GET_CODE (XEXP (varop, 0)) == LSHIFTRT *************** *** 6010,6013 **** --- 6016,6021 ---- && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT && INTVAL (XEXP (XEXP (varop, 0), 1)) >= 0 + && (INTVAL (XEXP (XEXP (varop, 0), 1)) + floor_log2 (constop) + < GET_MODE_BITSIZE (GET_MODE (varop))) && INTVAL (XEXP (XEXP (varop, 0), 1)) < HOST_BITS_PER_WIDE_INT) { diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/config/arm/arm.h gcc-2.4.2/config/arm/arm.h *** gcc-2.4.1/config/arm/arm.h Fri May 14 17:10:28 1993 --- gcc-2.4.2/config/arm/arm.h Fri May 28 15:01:14 1993 *************** *** 679,707 **** used by the macro GO_IF_LEGITIMATE_ADDRESS. Floating point indices can only be small constants. */ ! #define GO_IF_LEGITIMATE_INDEX(MODE, BASE_REGNO, INDEX, LABEL) \ ! do \ ! { \ ! int range; \ ! \ ! if (GET_MODE_CLASS (MODE) == MODE_FLOAT) \ ! range = 1024; \ ! else \ ! { \ ! if (INDEX_REGISTER_RTX_P (INDEX)) \ ! goto LABEL; \ ! if (GET_MODE_SIZE (MODE) <= 4 && GET_CODE (INDEX) == MULT) \ ! { \ ! rtx xiop0 = XEXP (INDEX, 0); \ ! rtx xiop1 = XEXP (INDEX, 1); \ ! if (INDEX_REGISTER_RTX_P (xiop0) && power_of_two_operand (xiop1, SImode)) \ ! goto LABEL; \ ! if (INDEX_REGISTER_RTX_P (xiop1) && power_of_two_operand (xiop0, SImode)) \ ! goto LABEL; \ ! } \ ! range = 4096; \ ! } \ ! \ ! if (GET_CODE (INDEX) == CONST_INT && abs (INTVAL (INDEX)) < range) \ ! goto LABEL; \ } while (0) --- 679,710 ---- used by the macro GO_IF_LEGITIMATE_ADDRESS. Floating point indices can only be small constants. */ ! #define GO_IF_LEGITIMATE_INDEX(MODE, BASE_REGNO, INDEX, LABEL) \ ! do \ ! { \ ! int range; \ ! \ ! if (GET_MODE_CLASS (MODE) == MODE_FLOAT) \ ! range = 1024; \ ! else \ ! { \ ! if (INDEX_REGISTER_RTX_P (INDEX)) \ ! goto LABEL; \ ! if (GET_MODE_SIZE (MODE) <= 4 && GET_CODE (INDEX) == MULT) \ ! { \ ! rtx xiop0 = XEXP (INDEX, 0); \ ! rtx xiop1 = XEXP (INDEX, 1); \ ! if (INDEX_REGISTER_RTX_P (xiop0) \ ! && power_of_two_operand (xiop1, SImode)) \ ! goto LABEL; \ ! if (INDEX_REGISTER_RTX_P (xiop1) \ ! && power_of_two_operand (xiop0, SImode)) \ ! goto LABEL; \ ! } \ ! range = 4096; \ ! } \ ! \ ! if (GET_CODE (INDEX) == CONST_INT && INTVAL (INDEX) < range \ ! && INTVAL (INDEX) > -range) \ ! goto LABEL; \ } while (0) diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/config/convex/convex.md gcc-2.4.2/config/convex/convex.md *** gcc-2.4.1/config/convex/convex.md Fri May 7 07:53:07 1993 --- gcc-2.4.2/config/convex/convex.md Sat May 29 21:17:14 1993 *************** *** 1938,1949 **** "" "jmp %a0") - - ;;- Local variables: - ;;- mode:emacs-lisp - ;;- comment-start: ";;- " - ;;- eval: (set-syntax-table (copy-sequence (syntax-table))) - ;;- eval: (modify-syntax-entry ?[ "(]") - ;;- eval: (modify-syntax-entry ?] ")[") - ;;- eval: (modify-syntax-entry ?{ "(}") - ;;- eval: (modify-syntax-entry ?} "){") - ;;- End: --- 1938,1939 ---- diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/config/i960/i960.md gcc-2.4.2/config/i960/i960.md *** gcc-2.4.1/config/i960/i960.md Mon May 3 19:35:26 1993 --- gcc-2.4.2/config/i960/i960.md Wed May 26 18:38:30 1993 *************** *** 2093,2096 **** --- 2093,2104 ---- ;; Arithmetic shift instructions. + ;; The shli instruction generates an overflow fault if the sign changes. + ;; In the case of overflow, it does not give the natural result, it instead + ;; gives the last shift value before the overflow. We can not use this + ;; instruction because gcc thinks that arithmetic left shift and logical + ;; left shift are identical, and sometimes canonicalizes the logical left + ;; shift to an arithmetic left shift. Therefore we must always use the + ;; logical left shift instruction. + (define_insn "ashlsi3" [(set (match_operand:SI 0 "register_operand" "=d") *************** *** 2098,2102 **** (match_operand:SI 2 "arith_operand" "dI")))] "" ! "shli %2,%1,%0" [(set_attr "type" "alu2")]) --- 2106,2110 ---- (match_operand:SI 2 "arith_operand" "dI")))] "" ! "shlo %2,%1,%0" [(set_attr "type" "alu2")]) diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/config/mips/iris4loser.h gcc-2.4.2/config/mips/iris4loser.h *** gcc-2.4.1/config/mips/iris4loser.h Wed May 26 00:39:19 1993 --- gcc-2.4.2/config/mips/iris4loser.h Sun May 30 17:44:57 1993 *************** *** 10,13 **** --- 10,14 ---- %{pipe: %e-pipe is not supported.} \ %{mips1} %{mips2} %{mips3} \ + -O0 \ %{g} %{g0} %{g1} %{g2} %{g3} %{v} %{K} \ %{ggdb:-g} %{ggdb0:-g0} %{ggdb1:-g1} %{ggdb2:-g2} %{ggdb3:-g3} \ diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/config/mips/mips.c gcc-2.4.2/config/mips/mips.c *** gcc-2.4.1/config/mips/mips.c Sun May 9 12:00:55 1993 --- gcc-2.4.2/config/mips/mips.c Sun May 30 23:03:16 1993 *************** *** 2640,2644 **** int words = (int_size_in_bytes (type) + 3) / 4; ! if (words + cum->arg_words < MAX_ARGS_IN_REGISTERS) return 0; /* structure fits in registers */ --- 2640,2644 ---- int words = (int_size_in_bytes (type) + 3) / 4; ! if (words + cum->arg_words <= MAX_ARGS_IN_REGISTERS) return 0; /* structure fits in registers */ diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/config/nextstep.h gcc-2.4.2/config/nextstep.h *** gcc-2.4.1/config/nextstep.h Tue May 25 18:10:53 1993 --- gcc-2.4.2/config/nextstep.h Wed May 26 19:52:08 1993 *************** *** 31,34 **** --- 31,36 ---- { LOCAL_INCLUDE_DIR, 0}, \ { "/NextDeveloper/Headers", 0}, \ + { "/NextDeveloper/Headers/ansi", 0}, \ + { "/NextDeveloper/Headers/bsd", 0}, \ { "/LocalDeveloper/Headers", 0}, \ { "/LocalDeveloper/Headers/ansi", 0}, \ diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/config/pa/pa.c gcc-2.4.2/config/pa/pa.c *** gcc-2.4.1/config/pa/pa.c Tue May 11 11:39:31 1993 --- gcc-2.4.2/config/pa/pa.c Mon May 31 02:20:11 1993 *************** *** 892,897 **** /* Return the best assembler insn template ! for moving operands[1] into operands[0] as a fullword. */ char * singlemove_string (operands) --- 892,901 ---- /* Return the best assembler insn template ! for moving operands[1] into operands[0] as a fullword. + For CONST_DOUBLE and CONST_INT we should also check for + other values we can load directly via zdepi, ldil, etc. + ??? Do this for 2.5. */ + char * singlemove_string (operands) *************** *** 900,910 **** if (GET_CODE (operands[0]) == MEM) return "stw %r1,%0"; ! if (GET_CODE (operands[1]) == MEM) return "ldw %1,%0"; ! if (GET_CODE (operands[1]) == CONST_INT) ! if (INT_14_BITS (operands[1])) ! return (INTVAL (operands[1]) == 0 ? "copy 0,%0" : "ldi %1,%0"); ! else ! return "ldil L'%1,%0\n\tldo R'%1(%0),%0"; return "copy %1,%0"; } --- 904,935 ---- if (GET_CODE (operands[0]) == MEM) return "stw %r1,%0"; ! else if (GET_CODE (operands[1]) == MEM) return "ldw %1,%0"; ! else if (GET_CODE (operands[1]) == CONST_DOUBLE ! && GET_MODE (operands[1]) == SFmode) ! { ! int i; ! union real_extract u; ! union float_extract { float f; int i; } v; ! ! bcopy (&CONST_DOUBLE_LOW (operands[1]), &u, sizeof u); ! v.f = REAL_VALUE_TRUNCATE (SFmode, u.d); ! i = v.i; ! ! operands[1] = gen_rtx (CONST_INT, VOIDmode, i); ! ! if (INT_14_BITS (operands[1])) ! return (INTVAL (operands[1]) == 0 ? "copy 0,%0" : "ldi %1,%0"); ! else ! return "ldil L'%1,%0\n\tldo R'%1(%0),%0"; ! } ! ! else if (GET_CODE (operands[1]) == CONST_INT) ! { ! if (INT_14_BITS (operands[1])) ! return (INTVAL (operands[1]) == 0 ? "copy 0,%0" : "ldi %1,%0"); ! else ! return "ldil L'%1,%0\n\tldo R'%1(%0),%0"; ! } return "copy %1,%0"; } *************** *** 1422,1425 **** --- 1447,1564 ---- return ""; } + + /* Count the number of insns necessary to handle this block move. + + Basic structure is the same as emit_block_move, except that we + count insns rather than emit them. */ + + int + compute_movstrsi_length (insn) + rtx insn; + { + rtx pat = PATTERN (insn); + int size_is_constant; + int align = INTVAL (XEXP (XVECEXP (pat, 0, 6), 0)); + unsigned long n_bytes; + int insn_count = 0; + + if (GET_CODE (XEXP (XVECEXP (pat, 0, 5), 0)) == CONST_INT) + { + size_is_constant = 1; + n_bytes = INTVAL (XEXP (XVECEXP (pat, 0, 5), 0)); + } + else + { + size_is_constant = 0; + n_bytes = 0; + } + + /* We can't move more than four bytes at a time because the PA + has no longer integer move insns. (Could use fp mem ops?) */ + if (align > 4) + align = 4; + + if (size_is_constant) + { + unsigned long n_items; + unsigned long offset; + rtx temp; + + if (n_bytes == 0) + return 0; + + if (align >= 4) + { + /* Don't unroll too large blocks. */ + if (n_bytes > 64) + goto copy_with_loop; + + /* first load */ + insn_count = 1; + + /* Count the unrolled insns. */ + for (offset = 4; offset < n_bytes; offset += 4) + insn_count += 2; + + /* Count last store or partial store. */ + insn_count += 1; + return insn_count; + } + + if (align >= 2 && n_bytes >= 2) + { + /* initial load. */ + insn_count = 1; + + /* Unrolled loop. */ + for (offset = 2; offset + 2 <= n_bytes; offset += 2) + insn_count += 2; + + /* ??? odd load/store */ + if (n_bytes % 2 != 0) + insn_count += 2; + + /* ??? final store from loop. */ + insn_count += 1; + + return insn_count; + } + + /* First load. */ + insn_count = 1; + + /* The unrolled loop. */ + for (offset = 1; offset + 1 <= n_bytes; offset += 1) + insn_count += 2; + + /* Final store. */ + insn_count += 1; + + return insn_count; + } + + if (align != 4) + abort(); + + copy_with_loop: + + /* setup for constant and non-constant case. */ + insn_count = 1; + + /* The copying loop. */ + insn_count += 3; + + /* The counter is negative, >= -4. The remaining number of bytes are + determined by the two least significant bits. */ + + if (size_is_constant) + { + if (n_bytes % 4 != 0) + insn_count += 2; + } + else + insn_count += 4; + return insn_count; + } *************** *** 2108,2113 **** /* No frame pointer, but we have a stack greater than 8k. We restore ! %r2 very late in this case. (all other cases are restored as early ! as possible. */ if (! frame_pointer_needed && ! VAL_14_BITS_P (actual_fsize + 20) --- 2247,2252 ---- /* No frame pointer, but we have a stack greater than 8k. We restore ! %r2 very late in this case. (All other cases are restored as early ! as possible.) */ if (! frame_pointer_needed && ! VAL_14_BITS_P (actual_fsize + 20) *************** *** 2303,2306 **** --- 2442,2492 ---- } + /* Return any length adjustment needed by INSN which already has its length + computed as LENGTH. Return zero if no adjustment is necessary. + + For the PA: function calls, millicode calls, and short conditional branches + with unfilled delay slots need an adjustment by +1 (to account for + the NOP which will be inserted into the instruction stream). + + Also compute the length of an inline block move here as it is too + complicated to express as a length attribute in pa.md. + + (For 2.5) Indirect calls do not need length adjustment as their + delay slot is filled internally in the output template. + + (For 2.5) No adjustment is necessary for jump tables or casesi insns. */ + int + pa_adjust_insn_length (insn, length) + rtx insn; + int length; + { + rtx pat = PATTERN (insn); + + /* Call insn with an unfilled delay slot. */ + if (GET_CODE (insn) == CALL_INSN) + return 1; + /* Millicode insn with an unfilled delay slot. */ + else if (GET_CODE (insn) == INSN + && GET_CODE (pat) != SEQUENCE + && GET_CODE (pat) != USE + && GET_CODE (pat) != CLOBBER + && get_attr_type (insn) == TYPE_MILLI) + return 1; + /* Block move pattern. */ + else if (GET_CODE (insn) == INSN + && GET_CODE (pat) == PARALLEL + && GET_CODE (XEXP (XVECEXP (pat, 0, 0), 0)) == MEM + && GET_CODE (XEXP (XVECEXP (pat, 0, 0), 1)) == MEM + && GET_MODE (XEXP (XVECEXP (pat, 0, 0), 0)) == BLKmode + && GET_MODE (XEXP (XVECEXP (pat, 0, 0), 1)) == BLKmode) + return compute_movstrsi_length (insn) - 1; + /* Conditional branch with an unfilled delay slot. */ + else if (GET_CODE (insn) == JUMP_INSN && ! simplejump_p (insn) + && length != 2 && length != 4) + return 1; + else + return 0; + } + /* Print operand X (an rtx) in assembler syntax to file FILE. CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified. *************** *** 3040,3047 **** else strcat (buf, "%B3"); if (nullify) strcat (buf, " %2,%1,0\n\tbl,n %0,0"); else ! strcat (buf, " %2,%1,0\n\tbl %0,0%#"); break; --- 3226,3236 ---- else strcat (buf, "%B3"); + /* Nullify the delay slot if the delay slot was explicitly + nullified by the delay branch scheduler or if no insn + could be placed in the delay slot. */ if (nullify) strcat (buf, " %2,%1,0\n\tbl,n %0,0"); else ! strcat (buf, " %2,%1,0\n\tbl%* %0,0"); break; *************** *** 3123,3126 **** --- 3312,3318 ---- else strcat (buf, ">="); + /* Nullify the delay slot if the delay slot was explicitly + nullified by the delay branch scheduler or if no insn + could be placed in the delay slot. */ if (nullify && negated) strcat (buf, " %0,%1,1,0\n\tbl,n %3,0"); *************** *** 3127,3134 **** else if (nullify && ! negated) strcat (buf, " %0,%1,1,0\n\tbl,n %2,0"); ! else if (! nullify && negated) ! strcat (buf, " %0,%1,1,0\n\tbl %3,0%#"); ! else if (! nullify && ! negated) ! strcat (buf, " %0,%1,1,0\n\tbl %2,0%#"); break; --- 3319,3326 ---- else if (nullify && ! negated) strcat (buf, " %0,%1,1,0\n\tbl,n %2,0"); ! else if (negated) ! strcat (buf, " %0,%1,1,0\n\tbl%* %3,0"); ! else ! strcat (buf, " %0,%1,1,0\n\tbl%* %2,0"); break; diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/config/pa/pa.h gcc-2.4.2/config/pa/pa.h *** gcc-2.4.1/config/pa/pa.h Thu May 20 01:09:40 1993 --- gcc-2.4.2/config/pa/pa.h Mon May 31 00:39:48 1993 *************** *** 1,4 **** /* Definitions of target machine for GNU compiler, for the HP Spectrum. ! Copyright (C) 1992 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@mcc.com) and Tim Moore (moore@defmacro.cs.utah.edu) of the Center for --- 1,4 ---- /* Definitions of target machine for GNU compiler, for the HP Spectrum. ! Copyright (C) 1992, 1993 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@mcc.com) and Tim Moore (moore@defmacro.cs.utah.edu) of the Center for *************** *** 1474,1483 **** (COST) = pa_adjust_cost (INSN, LINK, DEP, COST) ! /* Conditional branches with empty delay slots have a length of two. */ #define ADJUST_INSN_LENGTH(INSN, LENGTH) \ ! if (GET_CODE (INSN) == CALL_INSN \ ! || (GET_CODE (INSN) == JUMP_INSN && ! simplejump_p (insn))) \ ! LENGTH += 1; /* Millicode insns are actually function calls with some special constraints on arguments and register usage. --- 1474,1485 ---- (COST) = pa_adjust_cost (INSN, LINK, DEP, COST) ! /* Handling the special cases is going to get too complicated for a macro, ! just call `pa_adjust_insn_length' to do the real work. */ #define ADJUST_INSN_LENGTH(INSN, LENGTH) \ ! LENGTH += pa_adjust_insn_length (INSN, LENGTH); + /* Enable a bug fix. (This is for extra caution.) */ + #define SHORTEN_WITH_ADJUST_INSN_LENGTH + /* Millicode insns are actually function calls with some special constraints on arguments and register usage. *************** *** 1495,1500 **** get_attr_type will try to recognize the given insn, so make sure to ! filter out things it will not accept. SEQUENCE and USE insns in ! particular. */ #define INSN_SETS_ARE_DELAYED(X) \ ((GET_CODE (X) == INSN \ --- 1497,1502 ---- get_attr_type will try to recognize the given insn, so make sure to ! filter out things it will not accept -- SEQUENCE, USE and CLOBBER insns ! in particular. */ #define INSN_SETS_ARE_DELAYED(X) \ ((GET_CODE (X) == INSN \ *************** *** 1501,1504 **** --- 1503,1507 ---- && GET_CODE (PATTERN (X)) != SEQUENCE \ && GET_CODE (PATTERN (X)) != USE \ + && GET_CODE (PATTERN (X)) != CLOBBER \ && get_attr_type (X) == TYPE_MILLI)) *************** *** 1507,1510 **** --- 1510,1514 ---- && GET_CODE (PATTERN (X)) != SEQUENCE \ && GET_CODE (PATTERN (X)) != USE \ + && GET_CODE (PATTERN (X)) != CLOBBER \ && get_attr_type (X) == TYPE_MILLI)) diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/config/pa/pa.md gcc-2.4.2/config/pa/pa.md *** gcc-2.4.1/config/pa/pa.md Mon May 17 13:45:56 1993 --- gcc-2.4.2/config/pa/pa.md Mon May 31 00:36:38 1993 *************** *** 1349,1362 **** ;; This pattern forces (set (reg:DF ...) (const_double ...)) ! ;; to be reloaded by putting the constant into memory. ! ;; It must come before the more general movdf pattern. (define_insn "" ! [(set (match_operand:DF 0 "general_operand" "=fx") ! (match_operand:DF 1 "" "m"))] "GET_CODE (operands[1]) == CONST_DOUBLE && operands[1] != CONST0_RTX (DFmode)" ! "fldds%F1 %1,%0" ! [(set_attr "type" "fpload") ! (set_attr "length" "1")]) (define_expand "movdf" --- 1349,1369 ---- ;; This pattern forces (set (reg:DF ...) (const_double ...)) ! ;; to be reloaded by putting the constant into memory when ! ;; reg is a floating point register. ! ;; ! ;; For integer registers we use ldil;ldo to set the appropriate ! ;; value. ! ;; ! ;; This must come before the movdf pattern, and it must be present ! ;; to handle obscure reloading cases. (define_insn "" ! [(set (match_operand:DF 0 "general_operand" "=?r,fx") ! (match_operand:DF 1 "" "?E,m"))] "GET_CODE (operands[1]) == CONST_DOUBLE && operands[1] != CONST0_RTX (DFmode)" ! "* return (which_alternative == 0 ? output_move_double (operands) ! : \" fldds%F1 %1,%0\");" ! [(set_attr "type" "move,fpload") ! (set_attr "length" "4,1")]) (define_expand "movdf" *************** *** 1523,1526 **** --- 1530,1552 ---- [(set_attr "length" "1,2")]) + ;; This pattern forces (set (reg:SF ...) (const_double ...)) + ;; to be reloaded by putting the constant into memory when + ;; reg is a floating point register. + ;; + ;; For integer registers we use ldil;ldo to set the appropriate + ;; value. + ;; + ;; This must come before the movsf pattern, and it must be present + ;; to handle obscure reloading cases. + (define_insn "" + [(set (match_operand:SF 0 "general_operand" "=?r,fx") + (match_operand:SF 1 "" "?E,m"))] + "GET_CODE (operands[1]) == CONST_DOUBLE + && operands[1] != CONST0_RTX (SFmode)" + "* return (which_alternative == 0 ? singlemove_string (operands) + : \" fldws%F1 %1,%0\");" + [(set_attr "type" "move,fpload") + (set_attr "length" "2,1")]) + (define_expand "movsf" [(set (match_operand:SF 0 "general_operand" "") *************** *** 2703,2707 **** [(parallel [(call (match_operand:SI 0 "" "") (match_operand 1 "" "")) - (clobber (reg:SI 31)) (clobber (reg:SI 2))])] "" --- 2729,2732 ---- *************** *** 2728,2732 **** [(call (mem:SI (match_operand:SI 0 "call_operand_address" "r,S")) (match_operand 1 "" "i,i")) - (clobber (reg:SI 31)) (clobber (reg:SI 2))] "" --- 2753,2756 ---- *************** *** 2748,2752 **** (call (match_operand:SI 1 "" "") (match_operand 2 "" ""))) - (clobber (reg:SI 31)) (clobber (reg:SI 2))])] ;;- Don't use operand 1 for most machines. --- 2772,2775 ---- *************** *** 2775,2779 **** (call (mem:SI (match_operand:SI 1 "call_operand_address" "r,S")) (match_operand 2 "" "i,i"))) - (clobber (reg:SI 31)) (clobber (reg:SI 2))] ;;- Don't use operand 1 for most machines. --- 2798,2801 ---- diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/config/sparc/sparc.c gcc-2.4.2/config/sparc/sparc.c *** gcc-2.4.1/config/sparc/sparc.c Sun Apr 25 17:26:15 1993 --- gcc-2.4.2/config/sparc/sparc.c Mon May 31 00:09:58 1993 *************** *** 2261,2266 **** --- 2261,2269 ---- int regno; + #if 0 /* This code seemed to have no effect except to make + varargs not work right when va_list wasn't the first arg. */ if (! stdarg) first_reg = 0; + #endif for (regno = first_reg; regno < NPARM_REGS; regno++) diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/configure gcc-2.4.2/configure *** gcc-2.4.1/configure Wed May 26 00:41:30 1993 --- gcc-2.4.2/configure Fri May 28 23:55:31 1993 *************** *** 388,392 **** broken_install=yes install_headers_dir=install-headers-cpio ! if [ x$gas = xyes ] || [ x$stabs = xyes ] then tm_file=i386/scodbx.h --- 388,392 ---- broken_install=yes install_headers_dir=install-headers-cpio ! if [ x$stabs = xyes ] then tm_file=i386/scodbx.h *************** *** 416,420 **** tmake_file=i386/t-svr3dbx else ! tm_file=i386/iscgas.h tmake_file=i386/t-isc fi --- 416,421 ---- tmake_file=i386/t-svr3dbx else ! # iscgas.h, a nonexistent file, was used here. ! tm_file=i386/isccoff.h tmake_file=i386/t-isc fi *************** *** 439,442 **** --- 440,444 ---- xmake_file=i386/x-aix broken_install=yes + fixincludes=fixinc.ps2 ;; i386-sun-sunos*) # Sun i386 roadrunner diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/cse.c gcc-2.4.2/cse.c *** gcc-2.4.1/cse.c Thu May 6 05:43:41 1993 --- gcc-2.4.2/cse.c Fri May 28 18:40:22 1993 *************** *** 5284,5294 **** /* If we are associating shift operations, don't let this ! produce a shift of larger than the object. This could ! occur when we following a sign-extend by a right shift on ! a machine that does a sign-extend as a pair of shifts. */ if (is_shift && GET_CODE (new_const) == CONST_INT ! && INTVAL (new_const) > GET_MODE_BITSIZE (mode)) ! break; y = copy_rtx (XEXP (y, 0)); --- 5284,5302 ---- /* If we are associating shift operations, don't let this ! produce a shift of the size of the object or larger. ! This could occur when we follow a sign-extend by a right ! shift on a machine that does a sign-extend as a pair ! of shifts. */ if (is_shift && GET_CODE (new_const) == CONST_INT ! && INTVAL (new_const) >= GET_MODE_BITSIZE (mode)) ! { ! /* As an exception, we can turn an ASHIFTRT of this ! form into a shift of the number of bits - 1. */ ! if (code == ASHIFTRT) ! new_const = GEN_INT (GET_MODE_BITSIZE (mode) - 1); ! else ! break; ! } y = copy_rtx (XEXP (y, 0)); diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/dbxout.c gcc-2.4.2/dbxout.c *** gcc-2.4.1/dbxout.c Tue May 25 23:43:21 1993 --- gcc-2.4.2/dbxout.c Fri May 28 19:01:10 1993 *************** *** 1083,1091 **** tem = TYPE_DOMAIN (type); if (tem == NULL) ! fprintf(asmfile, "ar%d;0;-1", ! TYPE_SYMTAB_ADDRESS (integer_type_node)); else { ! fprintf(asmfile, "a"); dbxout_range_type (tem); } --- 1083,1091 ---- tem = TYPE_DOMAIN (type); if (tem == NULL) ! fprintf (asmfile, "ar%d;0;-1;", ! TYPE_SYMTAB_ADDRESS (integer_type_node)); else { ! fprintf (asmfile, "a"); dbxout_range_type (tem); } diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/emit-rtl.c gcc-2.4.2/emit-rtl.c *** gcc-2.4.1/emit-rtl.c Wed May 19 13:13:13 1993 --- gcc-2.4.2/emit-rtl.c Sun May 30 20:17:27 1993 *************** *** 922,930 **** /* The only remaining cases are when OP is a constant. If the host and target floating formats are the same, handling two-word floating ! constants are easy. */ #ifdef REAL_ARITHMETIC if ((HOST_BITS_PER_WIDE_INT == BITS_PER_WORD) && GET_MODE_CLASS (mode) == MODE_FLOAT ! && GET_MODE_SIZE (mode) == 2 * UNITS_PER_WORD && GET_CODE (op) == CONST_DOUBLE) { --- 922,932 ---- /* The only remaining cases are when OP is a constant. If the host and target floating formats are the same, handling two-word floating ! constants are easy. Note that REAL_VALUE_TO_TARGET_{SINGLE,DOUBLE} ! are defined as returning 32 bit and 64-bit values, respectively, ! and not values of BITS_PER_WORD and 2 * BITS_PER_WORD bits. */ #ifdef REAL_ARITHMETIC if ((HOST_BITS_PER_WIDE_INT == BITS_PER_WORD) && GET_MODE_CLASS (mode) == MODE_FLOAT ! && GET_MODE_BITSIZE (mode) == 64 && GET_CODE (op) == CONST_DOUBLE) { *************** *** 934,938 **** REAL_VALUE_FROM_CONST_DOUBLE (rv, op); REAL_VALUE_TO_TARGET_DOUBLE (rv, k); ! return GEN_INT (k[i]); } #else /* no REAL_ARITHMETIC */ --- 936,952 ---- REAL_VALUE_FROM_CONST_DOUBLE (rv, op); REAL_VALUE_TO_TARGET_DOUBLE (rv, k); ! ! /* We handle 32-bit and 64-bit host words here. Note that the order in ! which the words are written depends on the word endianness. ! ! ??? This is a potential portability problem and should ! be fixed at some point. */ ! if (HOST_BITS_PER_WIDE_INT == 32) ! return GEN_INT (k[i]); ! else if (HOST_BITS_PER_WIDE_INT == 64 && i == 0) ! return GEN_INT ((k[! WORDS_BIG_ENDIAN] << (HOST_BITS_PER_WIDE_INT / 2)) ! | k[WORDS_BIG_ENDIAN]); ! else ! abort (); } #else /* no REAL_ARITHMETIC */ *************** *** 964,968 **** if ((HOST_BITS_PER_WIDE_INT == BITS_PER_WORD) && GET_MODE_CLASS (mode) == MODE_FLOAT ! && GET_MODE_SIZE (mode) == UNITS_PER_WORD && GET_CODE (op) == CONST_DOUBLE) { --- 978,982 ---- if ((HOST_BITS_PER_WIDE_INT == BITS_PER_WORD) && GET_MODE_CLASS (mode) == MODE_FLOAT ! && GET_MODE_BITSIZE (mode) == 32 && GET_CODE (op) == CONST_DOUBLE) { diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/final.c gcc-2.4.2/final.c *** gcc-2.4.1/final.c Sat May 15 09:05:58 1993 --- gcc-2.4.2/final.c Sun May 30 23:49:55 1993 *************** *** 588,591 **** --- 588,592 ---- { int new_length; + int tmp_length; uid = INSN_UID (insn); *************** *** 609,613 **** insn_addresses[inner_uid] = insn_current_address; ! inner_length = insn_current_length (inner_insn); if (inner_length != insn_lengths[inner_uid]) { --- 610,621 ---- insn_addresses[inner_uid] = insn_current_address; ! ! /* insn_current_length returns 0 for insns with a ! non-varying length. */ ! if (! varying_length[inner_uid]) ! inner_length = insn_lengths[inner_uid]; ! else ! inner_length = insn_current_length (inner_insn); ! if (inner_length != insn_lengths[inner_uid]) { *************** *** 624,627 **** --- 632,645 ---- insn_current_address += new_length; } + + #ifdef SHORTEN_WITH_ADJUST_INSN_LENGTH + #ifdef ADJUST_INSN_LENGTH + /* If needed, do any adjustment. */ + tmp_length = new_length; + ADJUST_INSN_LENGTH (insn, new_length); + insn_current_address += (new_length - tmp_length); + #endif + #endif + if (new_length != insn_lengths[uid]) { diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/fixincludes gcc-2.4.2/fixincludes *** gcc-2.4.1/fixincludes Sun May 23 17:51:49 1993 --- gcc-2.4.2/fixincludes Sat May 29 15:34:39 1993 *************** *** 532,536 **** if [ -r ${LIB}/$file ]; then echo Fixing $file, nested comments ! sed -e 's/#endif.*/#endif/' ${LIB}/$file > ${LIB}/${file}.sed rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file if cmp $file ${LIB}/$file >/dev/null 2>&1; then --- 532,536 ---- if [ -r ${LIB}/$file ]; then echo Fixing $file, nested comments ! sed -e 's/^[ ]#endif.*/#endif/' ${LIB}/$file > ${LIB}/${file}.sed rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file if cmp $file ${LIB}/$file >/dev/null 2>&1; then diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/gcc.c gcc-2.4.2/gcc.c *** gcc-2.4.1/gcc.c Fri May 14 16:52:18 1993 --- gcc-2.4.2/gcc.c Fri May 28 18:54:31 1993 *************** *** 2353,2374 **** } - tooldir_prefix = concat (tooldir_base_prefix, spec_machine, "/"); - - /* If tooldir is relative, base it on exec_prefix. A relative - tooldir lets us move the installed tree as a unit. */ - - if (*tooldir_prefix != '/') - { - if (gcc_exec_prefix) - tooldir_prefix = concat (concat (gcc_exec_prefix, spec_machine, "/"), - concat (spec_version, "/", tooldir_prefix), - ""); - else - tooldir_prefix = concat (concat (standard_exec_prefix, spec_machine, "/"), - concat (spec_version, "/", tooldir_prefix), - ""); - } - - /* Set up the search paths before we go looking for config files. */ --- 2353,2356 ---- *************** *** 2382,2385 **** --- 2364,2396 ---- add_prefix (&startfile_prefix, standard_exec_prefix, 0, 1, NULL_PTR); add_prefix (&startfile_prefix, standard_exec_prefix_1, 0, 1, NULL_PTR); + + tooldir_prefix = concat (tooldir_base_prefix, spec_machine, "/"); + + /* If tooldir is relative, base it on exec_prefix. A relative + tooldir lets us move the installed tree as a unit. + + If GCC_EXEC_PREFIX is defined, then we want to add two relative + directories, so that we can search both the user specified directory + and the standard place. */ + + if (*tooldir_prefix != '/') + { + if (gcc_exec_prefix) + { + char *gcc_exec_tooldir_prefix + = concat (concat (gcc_exec_prefix, spec_machine, "/"), + concat (spec_version, "/", tooldir_prefix), + ""); + + add_prefix (&exec_prefix, concat (gcc_exec_tooldir_prefix, "bin", "/"), + 0, 0, NULL_PTR); + add_prefix (&startfile_prefix, concat (gcc_exec_tooldir_prefix, "lib", "/"), + 0, 0, NULL_PTR); + } + + tooldir_prefix = concat (concat (standard_exec_prefix, spec_machine, "/"), + concat (spec_version, "/", tooldir_prefix), + ""); + } add_prefix (&exec_prefix, concat (tooldir_prefix, "bin", "/"), diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/gcc.texi gcc-2.4.2/gcc.texi *** gcc-2.4.1/gcc.texi Mon May 24 19:20:29 1993 --- gcc-2.4.2/gcc.texi Sun May 30 17:22:40 1993 *************** *** 1054,1057 **** --- 1054,1063 ---- @code{make}. Either ignore the problem or switch to GNU Make. + @item + If you have installed a program known as purify, you may find that it + causes errors while linking @code{enquire}, which is part of building + GNU CC. The fix is to get rid of the file @code{real-ld} which purify + installs---so that GNU CC won't try to use it. + @item On Linux SLS 1.01, there is a problem with @file{libc.a}: it does not *************** *** 1334,1337 **** --- 1340,1349 ---- @samp{make CC=gcc} to avoid mismatches in the definition of @code{size_t}. + + @item + Objective C does not work on the RS/6000, the Alpha, or the HP PA. + + @item + C++ does not work on the Alpha. @item diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/genopinit.c gcc-2.4.2/genopinit.c *** gcc-2.4.1/genopinit.c Mon May 24 12:55:12 1993 --- gcc-2.4.2/genopinit.c Fri May 28 00:50:52 1993 *************** *** 75,79 **** "fixtrunctab[(int) %A][(int) %B][1] = CODE_FOR_%(fixuns_trunc%F\%a%I\%b2%)", "floattab[(int) %B][(int) %A][0] = CODE_FOR_%(float%I\%a%F\%b2%)", ! "floattab[(int) %B][(int) %A][1] = CODE_FOR_%(floatuns%I\%a%F\%b%)", "add_optab->handlers[(int) %A].insn_code = CODE_FOR_%(add%a3%)", "sub_optab->handlers[(int) %A].insn_code = CODE_FOR_%(sub%a3%)", --- 75,79 ---- "fixtrunctab[(int) %A][(int) %B][1] = CODE_FOR_%(fixuns_trunc%F\%a%I\%b2%)", "floattab[(int) %B][(int) %A][0] = CODE_FOR_%(float%I\%a%F\%b2%)", ! "floattab[(int) %B][(int) %A][1] = CODE_FOR_%(floatuns%I\%a%F\%b2%)", "add_optab->handlers[(int) %A].insn_code = CODE_FOR_%(add%a3%)", "sub_optab->handlers[(int) %A].insn_code = CODE_FOR_%(sub%a3%)", *************** *** 121,124 **** --- 121,127 ---- "reload_out_optab[(int) %A] = CODE_FOR_%(reload_out%a%)", "movstr_optab[(int) %A] = CODE_FOR_%(movstr%a%)" }; + + /* Allow linking with print-rtl.c. */ + char **insn_name_ptr; static void diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/integrate.c gcc-2.4.2/integrate.c *** gcc-2.4.1/integrate.c Mon May 24 18:53:18 1993 --- gcc-2.4.2/integrate.c Mon May 31 00:32:45 1993 *************** *** 1709,1718 **** } ! /* Now copy the REG_NOTES. */ for (insn = insns; insn; insn = NEXT_INSN (insn)) if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' ! && map->insn_map[INSN_UID (insn)]) ! REG_NOTES (map->insn_map[INSN_UID (insn)]) ! = copy_rtx_and_substitute (REG_NOTES (insn), map); if (local_return_label) --- 1709,1728 ---- } ! /* Now copy the REG_NOTES. Increment const_age, so that only constants ! from parameters can be substituted in. These are the only ones that ! are valid across the entire function. */ ! map->const_age++; for (insn = insns; insn; insn = NEXT_INSN (insn)) if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' ! && map->insn_map[INSN_UID (insn)] ! && REG_NOTES (insn)) ! { ! rtx tem = copy_rtx_and_substitute (REG_NOTES (insn), map); ! /* We must also do subst_constants, in case one of our parameters ! has const type and constant value. */ ! subst_constants (&tem, NULL_RTX, map); ! apply_change_group (); ! REG_NOTES (map->insn_map[INSN_UID (insn)]) = tem; ! } if (local_return_label) diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/invoke.texi gcc-2.4.2/invoke.texi *** gcc-2.4.1/invoke.texi Sat May 22 13:23:00 1993 --- gcc-2.4.2/invoke.texi Sat May 29 01:33:03 1993 *************** *** 2280,2284 **** @samp{-msoft-float} changes the calling convention in the output file; therefore, it is only useful if you compile @emph{all} of a program with ! this option. @ignore --- 2280,2286 ---- @samp{-msoft-float} changes the calling convention in the output file; therefore, it is only useful if you compile @emph{all} of a program with ! this option. In particular, you need to compile @file{libgcc.a}, the ! library that comes with GNU CC, with @samp{-msoft-float} in order for ! this to work. @ignore diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/jump.c gcc-2.4.2/jump.c *** gcc-2.4.1/jump.c Sat Apr 17 17:41:23 1993 --- gcc-2.4.2/jump.c Wed May 26 19:47:57 1993 *************** *** 347,354 **** break; pushes++; ! if (total_pushed + GET_MODE_SIZE (SET_DEST (pbody)) > stack_adjust_amount) break; ! total_pushed += GET_MODE_SIZE (SET_DEST (pbody)); } --- 347,354 ---- break; pushes++; ! if (total_pushed + GET_MODE_SIZE (GET_MODE (SET_DEST (pbody))) > stack_adjust_amount) break; ! total_pushed += GET_MODE_SIZE (GET_MODE (SET_DEST (pbody))); } *************** *** 380,384 **** && XEXP (XEXP (dest, 0), 0) == stack_pointer_rtx)) break; ! total_pushed -= GET_MODE_SIZE (SET_DEST (pbody)); /* If this push doesn't fully fit in the space of the stack adjust that we deleted, --- 380,384 ---- && XEXP (XEXP (dest, 0), 0) == stack_pointer_rtx)) break; ! total_pushed -= GET_MODE_SIZE (GET_MODE (SET_DEST (pbody))); /* If this push doesn't fully fit in the space of the stack adjust that we deleted, diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/md.texi gcc-2.4.2/md.texi *** gcc-2.4.1/md.texi Mon May 24 18:42:26 1993 --- gcc-2.4.2/md.texi Thu May 27 20:13:30 1993 *************** *** 3638,3643 **** For normal insns, the length will be determined by value of the @samp{length} attribute. In the case of @code{addr_vec} and ! @code{addr_diff_vec} insn patterns, the length will be computed as ! the number of vectors multiplied by the size of each vector.@refill The following macros can be used to refine the length computation: --- 3638,3645 ---- For normal insns, the length will be determined by value of the @samp{length} attribute. In the case of @code{addr_vec} and ! @code{addr_diff_vec} insn patterns, the length is computed as ! the number of vectors multiplied by the size of each vector. ! ! Lengths are measured in addressable storage units (bytes). The following macros can be used to refine the length computation: diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/objc/Makefile gcc-2.4.2/objc/Makefile *** gcc-2.4.1/objc/Makefile Wed May 5 11:52:30 1993 --- gcc-2.4.2/objc/Makefile Mon May 31 02:12:13 1993 *************** *** 73,77 **** realfile=$(srcdir)/objc/$$file; \ cp $$realfile $(incinstalldir)/objc; \ ! chmod a+r $(incinstalldir)/objc; \ done --- 73,77 ---- realfile=$(srcdir)/objc/$$file; \ cp $$realfile $(incinstalldir)/objc; \ ! chmod a+r $(incinstalldir)/objc/$$file; \ done diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/reload1.c gcc-2.4.2/reload1.c *** gcc-2.4.1/reload1.c Mon May 24 20:29:38 1993 --- gcc-2.4.2/reload1.c Sun May 30 19:28:46 1993 *************** *** 1786,1789 **** --- 1786,1818 ---- while (max_needs[class] > 0 || max_nongroups[class] > 0) { + #ifdef SMALL_REGISTER_CLASSES + /* This should be right for all machines, but only the 386 + is known to need it, so this conditional plays safe. + ??? For 2.5, try making this unconditional. */ + /* If we spilled enough regs, but they weren't counted + against the non-group need, see if we can count them now. + If so, we can avoid some actual spilling. */ + if (max_needs[class] <= 0 && max_nongroups[class] > 0) + for (i = 0; i < n_spills; i++) + if (TEST_HARD_REG_BIT (reg_class_contents[class], + spill_regs[i]) + && !TEST_HARD_REG_BIT (counted_for_groups, + spill_regs[i]) + && !TEST_HARD_REG_BIT (counted_for_nongroups, + spill_regs[i]) + && max_nongroups[class] > 0) + { + register enum reg_class *p; + + SET_HARD_REG_BIT (counted_for_nongroups, spill_regs[i]); + max_nongroups[class]--; + p = reg_class_superclasses[class]; + while (*p != LIM_REG_CLASSES) + max_nongroups[(int) *p++]--; + } + if (max_needs[class] <= 0 && max_nongroups[class] <= 0) + break; + #endif + /* Consider the potential reload regs that aren't yet in use as reload regs, in order of preference. diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/rtl.h gcc-2.4.2/rtl.h *** gcc-2.4.1/rtl.h Thu Apr 29 15:36:44 1993 --- gcc-2.4.2/rtl.h Sat May 29 12:15:40 1993 *************** *** 24,27 **** --- 24,28 ---- #undef FLOAT /* Likewise. */ #undef ABS /* Likewise. */ + #undef PC /* Likewise. */ /* Register Transfer Language EXPRESSIONS CODES */ diff -rc2P -x gcc.info* -x cpp.info* -x *-parse.c -x TAGS -x cexp.c -x gcc.??s -x cpp.??s -x *.aux -x c-parse.y -x objc-parse.y gcc-2.4.1/version.c gcc-2.4.2/version.c *** gcc-2.4.1/version.c Wed May 26 00:55:47 1993 --- gcc-2.4.2/version.c Mon May 31 00:30:48 1993 *************** *** 1 **** ! char *version_string = "2.4.1"; --- 1 ---- ! char *version_string = "2.4.2";