From: Richard Kenner Date: Sun, 12 Apr 1992 21:11:03 +0000 (-0400) Subject: *** empty log message *** X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=dcfedcd0da4e503b81c99e13e773f71f7035102c;p=gcc.git *** empty log message *** From-SVN: r730 --- diff --git a/gcc/Makefile.in b/gcc/Makefile.in index b7e76bbfa8f..ae08a33d51c 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -813,7 +813,7 @@ recog.o : recog.c $(CONFIG_H) $(RTL_H) \ insn-flags.h insn-codes.h real.h reg-stack.o : reg-stack.c $(CONFIG_H) $(RTL_H) $(TREE_H) \ regs.h hard-reg-set.h flags.h insn-config.h - + aux-output.o : aux-output.c $(CONFIG_H) \ $(RTL_H) regs.h hard-reg-set.h real.h insn-config.h conditions.h \ insn-flags.h output.h insn-attr.h insn-codes.h @@ -1153,6 +1153,7 @@ mostlyclean: for name in $(LIB1FUNCS); do rm -f $${name}.c; done # Delete other temporary files. -rm -f tmp-float.h tmp-*proto.1 tmp-gcc.xtar.Z tmp-limits.h gccnew + -rm -f tmp-foo1 tmp-foo2 # Delete the stamp files. -rm -f stamp-* tmp-* # Delete debugging dump files. @@ -1550,6 +1551,26 @@ bootstrap2: force bootstrap3: force $(MAKE) CC="stage2/gcc -Bstage2/" CFLAGS="$(BOOT_CFLAGS)" libdir=$(libdir) LANGUAGES="$(LANGUAGES)" +# Compare the object files in the current directory with those in the +# stage2 directory. + +compare: force + for file in *.o; do \ + tail +10c $file > tmp-foo1; \ + tail +10c stage2/$file > tmp-foo2; \ + cmp tmp-foo1 tmp-foo2 || echo $file differs; \ + done + -rm -f tmp-foo* + +# Similar, but compare with stage3 directory +compare3: force + for file in *.o; do \ + tail +10c $file > tmp-foo1; \ + tail +10c stage3/$file > tmp-foo2; \ + cmp tmp-foo1 tmp-foo2 || echo $file differs; \ + done + -rm -f tmp-foo* + # Copy the object files from a particular stage into a subdirectory. stage1: force -if [ -d stage1 ] ; then true ; else mkdir stage1 ; fi diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 3d8712e2a92..e190d807e3a 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -98,6 +98,17 @@ u_short_cint_operand (op, mode) return (GET_CODE (op) == CONST_INT && (INTVAL (op) & 0xffff0000) == 0); } +/* Return 1 if OP is a CONST_INT that cannot fit in a signed D field. */ + +int +non_short_cint_operand (op, mode) + register rtx op; + enum machine_mode mode; +{ + return (GET_CODE (op) == CONST_INT + && (unsigned) (INTVAL (op) + 0x8000) >= 0x10000); +} + /* Returns 1 if OP is a register that is not special (i.e., not MQ, ctr, or lr). */ @@ -248,6 +259,18 @@ add_operand (op, mode) || (GET_CODE (op) == CONST_INT && (INTVAL (op) & 0xffff) == 0)); } +/* Return 1 if OP is a constant but not a valid add_operand. */ + +int +non_add_cint_operand (op, mode) + register rtx op; + enum machine_mode mode; +{ + return (GET_CODE (op) == CONST_INT + && (unsigned) (INTVAL (op) + 0x8000) >= 0x10000 + && (INTVAL (op) & 0xffff) != 0); +} + /* Return 1 if the operand is a non-special register or a constant that can be used as the operand of an OR or XOR insn on the RS/6000. */ @@ -262,6 +285,19 @@ logical_operand (op, mode) || (INTVAL (op) & 0xffff) == 0))); } +/* Return 1 if C is a constant that is not a logical operand (as + above). */ + +int +non_logical_cint_operand (op, mode) + register rtx op; + enum machine_mode mode; +{ + return (GET_CODE (op) == CONST_INT + && (INTVAL (op) & 0xffff0000) != 0 + && (INTVAL (op) & 0xffff) != 0); +} + /* Return 1 if C is a constant that can be encoded in a mask on the RS/6000. It is if there are no more than two 1->0 or 0->1 transitions. Reject all ones and all zeros, since these should have been optimized @@ -310,6 +346,17 @@ and_operand (op, mode) || mask_operand (op, mode)); } +/* Return 1 if the operand is a constant but not a valid operand for an AND + insn. */ + +int +non_and_cint_operand (op, mode) + register rtx op; + enum machine_mode mode; +{ + return GET_CODE (op) == CONST_INT && ! and_operand (op, mode); +} + /* Return 1 if the operand is a general register or memory operand. */ int diff --git a/gcc/stmt.c b/gcc/stmt.c index a999cb4f402..1c531648584 100644 --- a/gcc/stmt.c +++ b/gcc/stmt.c @@ -1155,6 +1155,9 @@ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line) if (j < 0) { + if (j == -3) + continue; + error ("unknown register name `%s' in `asm'", regname); return; } diff --git a/gcc/varasm.c b/gcc/varasm.c index ab3591d25c9..a2f7e8f8f56 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -208,11 +208,13 @@ strip_reg_name (name) name++; return name; } - + /* Decode an `asm' spec for a declaration as a register name. Return the register number, or -1 if nothing specified, - or -2 if the name is not a register. Accept an exact spelling or - a decimal number. Prefixes such as % are optional. */ + or -2 if the ASMSPEC is not `cc' and is recognized, + or -3 if ASMSPEC is `cc' and is not recognized. + Accept an exact spelling or a decimal number. + Prefixes such as % are optional. */ int decode_reg_name (asmspec) @@ -254,6 +256,9 @@ decode_reg_name (asmspec) } #endif /* ADDITIONAL_REGISTER_NAMES */ + if (!strcmp (asmspec, "cc")) + return -3; + return -2; } @@ -302,10 +307,10 @@ make_decl_rtl (decl, asmspec, top_level) if (TREE_REGDECL (decl) && reg_number == -1) error_with_decl (decl, "register name not specified for `%s'"); - else if (TREE_REGDECL (decl) && reg_number == -2) + else if (TREE_REGDECL (decl) && reg_number < 0) error_with_decl (decl, "invalid register name for `%s'"); - else if (reg_number >= 0 && ! TREE_REGDECL (decl)) + else if ((reg_number >= 0 || reg_number == -3) && ! TREE_REGDECL (decl)) error_with_decl (decl, "register name given for non-register variable `%s'"); else if (TREE_REGDECL (decl) && TREE_CODE (decl) == FUNCTION_DECL)