Commit 76184def by Doug Evans

(find_split_point): Handle NULL return from make_extraction.

(make_field_assignment): Likewise.

From-SVN: r11552
parent 0d4ae18a
...@@ -2610,12 +2610,15 @@ find_split_point (loc, insn) ...@@ -2610,12 +2610,15 @@ find_split_point (loc, insn)
&& XEXP (*split, 0) == SET_DEST (x) && XEXP (*split, 0) == SET_DEST (x)
&& XEXP (*split, 1) == const0_rtx) && XEXP (*split, 1) == const0_rtx)
{ {
SUBST (SET_SRC (x), rtx extraction = make_extraction (GET_MODE (SET_DEST (x)),
make_extraction (GET_MODE (SET_DEST (x)),
XEXP (SET_SRC (x), 0), XEXP (SET_SRC (x), 0),
pos, NULL_RTX, 1, 1, 0, 0)); pos, NULL_RTX, 1, 1, 0, 0);
if (extraction != 0)
{
SUBST (SET_SRC (x), extraction);
return find_split_point (loc, insn); return find_split_point (loc, insn);
} }
}
break; break;
case SIGN_EXTEND: case SIGN_EXTEND:
...@@ -5050,7 +5053,10 @@ expand_field_assignment (x) ...@@ -5050,7 +5053,10 @@ expand_field_assignment (x)
IN_COMPARE is non-zero if we are in a COMPARE. This means that a IN_COMPARE is non-zero if we are in a COMPARE. This means that a
ZERO_EXTRACT should be built even for bits starting at bit 0. ZERO_EXTRACT should be built even for bits starting at bit 0.
MODE is the desired mode of the result (if IN_DEST == 0). */ MODE is the desired mode of the result (if IN_DEST == 0).
The result is an RTX for the extraction or NULL_RTX if the target
can't handle it. */
static rtx static rtx
make_extraction (mode, inner, pos, pos_rtx, len, make_extraction (mode, inner, pos, pos_rtx, len,
...@@ -6553,7 +6559,9 @@ make_field_assignment (x) ...@@ -6553,7 +6559,9 @@ make_field_assignment (x)
{ {
assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1), assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
1, 1, 1, 0); 1, 1, 1, 0);
if (assign != 0)
return gen_rtx (SET, VOIDmode, assign, const0_rtx); return gen_rtx (SET, VOIDmode, assign, const0_rtx);
return x;
} }
else if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == SUBREG else if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == SUBREG
...@@ -6567,7 +6575,9 @@ make_field_assignment (x) ...@@ -6567,7 +6575,9 @@ make_field_assignment (x)
assign = make_extraction (VOIDmode, dest, 0, assign = make_extraction (VOIDmode, dest, 0,
XEXP (SUBREG_REG (XEXP (src, 0)), 1), XEXP (SUBREG_REG (XEXP (src, 0)), 1),
1, 1, 1, 0); 1, 1, 1, 0);
if (assign != 0)
return gen_rtx (SET, VOIDmode, assign, const0_rtx); return gen_rtx (SET, VOIDmode, assign, const0_rtx);
return x;
} }
/* If SRC is (ior (ashift (const_int 1) POS DEST)), this is a set of a /* If SRC is (ior (ashift (const_int 1) POS DEST)), this is a set of a
...@@ -6578,7 +6588,9 @@ make_field_assignment (x) ...@@ -6578,7 +6588,9 @@ make_field_assignment (x)
{ {
assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1), assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
1, 1, 1, 0); 1, 1, 1, 0);
if (assign != 0)
return gen_rtx (SET, VOIDmode, assign, const1_rtx); return gen_rtx (SET, VOIDmode, assign, const1_rtx);
return x;
} }
/* The other case we handle is assignments into a constant-position /* The other case we handle is assignments into a constant-position
...@@ -6613,6 +6625,8 @@ make_field_assignment (x) ...@@ -6613,6 +6625,8 @@ make_field_assignment (x)
return x; return x;
assign = make_extraction (VOIDmode, dest, pos, NULL_RTX, len, 1, 1, 0); assign = make_extraction (VOIDmode, dest, pos, NULL_RTX, len, 1, 1, 0);
if (assign == 0)
return x;
/* The mode to use for the source is the mode of the assignment, or of /* The mode to use for the source is the mode of the assignment, or of
what is inside a possible STRICT_LOW_PART. */ what is inside a possible STRICT_LOW_PART. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment