Commit 5222e470 by Jan Hubicka Committed by Jan Hubicka

emit-rtl.c (gen_highpart_mode): New.


	* emit-rtl.c (gen_highpart_mode): New.
	* rtl.h (gen_highpart_mode): Declare.
	* sparc.md (insn splitters): Use gen_highpart_mode, whenever the
	operand can be VOIDmode constant.

From-SVN: r43869
parent c6c222a8
Mon Jul 9 21:36:00 CEST 2001 Jan Hubicka <jh@suse.cz>
* emit-rtl.c (gen_highpart_mode): New.
* rtl.h (gen_highpart_mode): Declare.
* sparc.md (insn splitters): Use gen_highpart_mode, whenever the
operand can be VOIDmode constant.
Mon Jul 9 17:23:10 CEST 2001 Jan Hubicka <jh@suse.cz> Mon Jul 9 17:23:10 CEST 2001 Jan Hubicka <jh@suse.cz>
* flow.c (redirect_edge_and_branch_force): New. * flow.c (redirect_edge_and_branch_force): New.
......
...@@ -5633,7 +5633,7 @@ ...@@ -5633,7 +5633,7 @@
operands[4] = gen_lowpart (SImode, operands[1]); operands[4] = gen_lowpart (SImode, operands[1]);
operands[5] = gen_lowpart (SImode, operands[2]); operands[5] = gen_lowpart (SImode, operands[2]);
operands[6] = gen_highpart (SImode, operands[0]); operands[6] = gen_highpart (SImode, operands[0]);
operands[7] = gen_highpart (SImode, operands[1]); operands[7] = gen_highpart_mode (SImode, DImode, operands[1]);
#if HOST_BITS_PER_WIDE_INT == 32 #if HOST_BITS_PER_WIDE_INT == 32
if (GET_CODE (operands[2]) == CONST_INT) if (GET_CODE (operands[2]) == CONST_INT)
{ {
...@@ -5644,7 +5644,7 @@ ...@@ -5644,7 +5644,7 @@
} }
else else
#endif #endif
operands[8] = gen_highpart (SImode, operands[2]); operands[8] = gen_highpart_mode (SImode, DImode, operands[2]);
}") }")
(define_split (define_split
...@@ -5680,7 +5680,7 @@ ...@@ -5680,7 +5680,7 @@
} }
else else
#endif #endif
operands[8] = gen_highpart (SImode, operands[2]); operands[8] = gen_highpart_mode (SImode, DImode, operands[2]);
}") }")
;; LTU here means "carry set" ;; LTU here means "carry set"
...@@ -5714,7 +5714,7 @@ ...@@ -5714,7 +5714,7 @@
(ltu:SI (reg:CC_NOOV 100) (const_int 0)))) (ltu:SI (reg:CC_NOOV 100) (const_int 0))))
(set (match_dup 4) (const_int 0))] (set (match_dup 4) (const_int 0))]
"operands[3] = gen_lowpart (SImode, operands[0]); "operands[3] = gen_lowpart (SImode, operands[0]);
operands[4] = gen_highpart (SImode, operands[1]);") operands[4] = gen_highpart_mode (SImode, DImode, operands[1]);")
(define_insn "*addx_extend_sp64" (define_insn "*addx_extend_sp64"
[(set (match_operand:DI 0 "register_operand" "=r") [(set (match_operand:DI 0 "register_operand" "=r")
...@@ -5929,7 +5929,7 @@ ...@@ -5929,7 +5929,7 @@
{ {
rtx highp, lowp; rtx highp, lowp;
highp = gen_highpart (SImode, operands[2]); highp = gen_highpart_mode (SImode, DImode, operands[2]);
lowp = gen_lowpart (SImode, operands[2]); lowp = gen_lowpart (SImode, operands[2]);
if ((lowp == const0_rtx) if ((lowp == const0_rtx)
&& (operands[0] == operands[1])) && (operands[0] == operands[1]))
...@@ -5937,7 +5937,8 @@ ...@@ -5937,7 +5937,8 @@
emit_insn (gen_rtx_SET (VOIDmode, emit_insn (gen_rtx_SET (VOIDmode,
gen_highpart (SImode, operands[0]), gen_highpart (SImode, operands[0]),
gen_rtx_MINUS (SImode, gen_rtx_MINUS (SImode,
gen_highpart (SImode, operands[1]), gen_highpart_mode (SImode, DImode,
operands[1]),
highp))); highp)));
} }
else else
...@@ -5946,7 +5947,7 @@ ...@@ -5946,7 +5947,7 @@
gen_lowpart (SImode, operands[1]), gen_lowpart (SImode, operands[1]),
lowp)); lowp));
emit_insn (gen_subx (gen_highpart (SImode, operands[0]), emit_insn (gen_subx (gen_highpart (SImode, operands[0]),
gen_highpart (SImode, operands[1]), gen_highpart_mode (SImode, DImode, operands[1]),
highp)); highp));
} }
DONE; DONE;
...@@ -6800,7 +6801,7 @@ ...@@ -6800,7 +6801,7 @@
} }
else else
#endif #endif
operands[8] = gen_highpart (SImode, operands[3]); operands[8] = gen_highpart_mode (SImode, DImode, operands[3]);
operands[9] = gen_lowpart (SImode, operands[3]); operands[9] = gen_lowpart (SImode, operands[3]);
}") }")
......
...@@ -1146,6 +1146,23 @@ gen_highpart (mode, x) ...@@ -1146,6 +1146,23 @@ gen_highpart (mode, x)
abort (); abort ();
return result; return result;
} }
/* Like gen_highpart_mode, but accept mode of EXP operand in case EXP can
be VOIDmode constant. */
rtx
gen_highpart_mode (outermode, innermode, exp)
enum machine_mode outermode, innermode;
rtx exp;
{
if (GET_MODE (exp) != VOIDmode)
{
if (GET_MODE (exp) != innermode)
abort ();
return gen_highpart (outermode, exp);
}
return simplify_gen_subreg (outermode, exp, innermode,
subreg_highpart_offset (outermode, innermode));
}
/* Return offset in bytes to get OUTERMODE low part /* Return offset in bytes to get OUTERMODE low part
of the value in mode INNERMODE stored in memory in target format. */ of the value in mode INNERMODE stored in memory in target format. */
......
...@@ -1190,6 +1190,8 @@ extern rtx gen_lowpart_if_possible PARAMS ((enum machine_mode, rtx)); ...@@ -1190,6 +1190,8 @@ extern rtx gen_lowpart_if_possible PARAMS ((enum machine_mode, rtx));
/* In emit-rtl.c */ /* In emit-rtl.c */
extern rtx gen_highpart PARAMS ((enum machine_mode, rtx)); extern rtx gen_highpart PARAMS ((enum machine_mode, rtx));
extern rtx gen_highpart_mode PARAMS ((enum machine_mode,
enum machine_mode, rtx));
extern rtx gen_realpart PARAMS ((enum machine_mode, rtx)); extern rtx gen_realpart PARAMS ((enum machine_mode, rtx));
extern rtx gen_imagpart PARAMS ((enum machine_mode, rtx)); extern rtx gen_imagpart PARAMS ((enum machine_mode, rtx));
extern rtx operand_subword PARAMS ((rtx, unsigned int, int, extern rtx operand_subword PARAMS ((rtx, unsigned int, int,
......
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