From cbb927448701d9be3470beccedda24379db7faf4 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 18 Mar 2002 16:08:31 +0100 Subject: re PR target/5740 (sparcv9 ICE on complex_value.cc in libstdc++ test suite) PR target/5740 * expr.c (emit_group_load): Use extract_bit_field if needed for CONCAT arguments. * g++.dg/opt/conj1.C: New test. From-SVN: r50975 --- gcc/expr.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'gcc/expr.c') diff --git a/gcc/expr.c b/gcc/expr.c index 5aed1dc..ebe05fc 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -2004,12 +2004,17 @@ emit_group_load (dst, orig_src, ssize) } else if (GET_CODE (src) == CONCAT) { - if (bytepos == 0 - && bytelen == GET_MODE_SIZE (GET_MODE (XEXP (src, 0)))) - tmps[i] = XEXP (src, 0); - else if (bytepos == (HOST_WIDE_INT) GET_MODE_SIZE (GET_MODE (XEXP (src, 0))) - && bytelen == GET_MODE_SIZE (GET_MODE (XEXP (src, 1)))) - tmps[i] = XEXP (src, 1); + if ((bytepos == 0 + && bytelen == GET_MODE_SIZE (GET_MODE (XEXP (src, 0)))) + || (bytepos == (HOST_WIDE_INT) GET_MODE_SIZE (GET_MODE (XEXP (src, 0))) + && bytelen == GET_MODE_SIZE (GET_MODE (XEXP (src, 1))))) + { + tmps[i] = XEXP (src, bytepos != 0); + if (! CONSTANT_P (tmps[i]) + && (GET_CODE (tmps[i]) != REG || GET_MODE (tmps[i]) != mode)) + tmps[i] = extract_bit_field (tmps[i], bytelen * BITS_PER_UNIT, + 0, 1, NULL_RTX, mode, mode, ssize); + } else if (bytepos == 0) { rtx mem = assign_stack_temp (GET_MODE (src), -- cgit v1.1