aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDoug Evans <dje@gnu.org>1996-08-15 19:05:21 +0000
committerDoug Evans <dje@gnu.org>1996-08-15 19:05:21 +0000
commit5ab7138b864346ad197796835427037f8af8c3b4 (patch)
treefcb67e3194a8878265edaa93dfe94fa3a3033c3c /gcc
parent1271a76a07ea23917a755aa07737fc838051bb80 (diff)
downloadgcc-5ab7138b864346ad197796835427037f8af8c3b4.zip
gcc-5ab7138b864346ad197796835427037f8af8c3b4.tar.gz
gcc-5ab7138b864346ad197796835427037f8af8c3b4.tar.bz2
sparc.c (label_ref_operand): New function.
* sparc/sparc.c (label_ref_operand): New function. (emit_move_sequence): Pass label_ref to gen_move_label_di to not lose flags. * sparc/sparc.md (move_label_di): Operand one is label_ref now. * genattrtab.c (write_test_expr): Allow label_ref in match_dup. From-SVN: r12643
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/sparc/sparc.c18
-rw-r--r--gcc/config/sparc/sparc.md4
-rw-r--r--gcc/genattrtab.c3
3 files changed, 22 insertions, 3 deletions
diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c
index 1708b37..5b80dcb 100644
--- a/gcc/config/sparc/sparc.c
+++ b/gcc/config/sparc/sparc.c
@@ -441,6 +441,20 @@ symbolic_memory_operand (op, mode)
|| GET_CODE (op) == HIGH || GET_CODE (op) == LABEL_REF);
}
+/* Return truth value of statement that OP is a LABEL_REF of mode MODE. */
+
+int
+label_ref_operand (op, mode)
+ rtx op;
+ enum machine_mode mode;
+{
+ if (GET_CODE (op) != LABEL_REF)
+ return 0;
+ if (GET_MODE (op) != mode)
+ return 0;
+ return 1;
+}
+
/* Return 1 if the operand is an argument used in generating pic references
in either the medium/low or medium/anywhere code models of sparc64. */
@@ -1502,6 +1516,8 @@ emit_move_sequence (operands, mode)
{
if (TARGET_ARCH64)
abort ();
+ /* ??? This might suffer from the same problem the DImode case did:
+ flags in operand1 not being propagated. */
emit_insn (gen_move_pic_label_si (operand0, XEXP (operand1, 0)));
return 1;
}
@@ -1512,7 +1528,7 @@ emit_move_sequence (operands, mode)
{
if (! TARGET_ARCH64)
abort ();
- emit_insn (gen_move_label_di (operands[0], XEXP (operands[1], 0)));
+ emit_insn (gen_move_label_di (operand0, operand1));
return 1;
}
/* DImode HIGH values in sparc64 need a clobber added. */
diff --git a/gcc/config/sparc/sparc.md b/gcc/config/sparc/sparc.md
index 1fc88de..f565dc6 100644
--- a/gcc/config/sparc/sparc.md
+++ b/gcc/config/sparc/sparc.md
@@ -1573,7 +1573,9 @@
(define_insn "move_label_di"
[(set (match_operand:DI 0 "register_operand" "=r")
- (label_ref:DI (match_operand 1 "" "")))
+ ; This was previously (label_ref:DI (match_operand 1 "" "")) but that
+ ; loses the volatil and other flags of the original label_ref.
+ (match_operand:DI 1 "label_ref_operand" ""))
(set (reg:DI 15) (pc))]
"TARGET_ARCH64"
"*
diff --git a/gcc/genattrtab.c b/gcc/genattrtab.c
index 38285f1..f1a94d0 100644
--- a/gcc/genattrtab.c
+++ b/gcc/genattrtab.c
@@ -4488,7 +4488,8 @@ write_test_expr (exp, in_comparison)
/* The address of the branch target. */
case MATCH_DUP:
- printf ("insn_addresses[INSN_UID (operands[%d])]", XINT (exp, 0));
+ printf ("insn_addresses[INSN_UID (GET_CODE (operands[%d]) == LABEL_REF ? XEXP (operands[%d], 0) : operands[%d])]",
+ XINT (exp, 0), XINT (exp, 0), XINT (exp, 0));
break;
/* The address of the current insn. It would be more consistent with