aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1992-04-12 17:11:03 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1992-04-12 17:11:03 -0400
commitdcfedcd0da4e503b81c99e13e773f71f7035102c (patch)
tree4f6f4ba406a519023d5c578c157b17085ecc8fff
parentcdc54cc9f9c16d7df406c8018a8d5a279be492dc (diff)
downloadgcc-dcfedcd0da4e503b81c99e13e773f71f7035102c.zip
gcc-dcfedcd0da4e503b81c99e13e773f71f7035102c.tar.gz
gcc-dcfedcd0da4e503b81c99e13e773f71f7035102c.tar.bz2
*** empty log message ***
From-SVN: r730
-rw-r--r--gcc/Makefile.in23
-rw-r--r--gcc/config/rs6000/rs6000.c47
-rw-r--r--gcc/stmt.c3
-rw-r--r--gcc/varasm.c15
4 files changed, 82 insertions, 6 deletions
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index b7e76bb..ae08a33 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 3d8712e..e190d80 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 a999cb4..1c53164 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 ab3591d..a2f7e8f 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)