summaryrefslogtreecommitdiff
path: root/gcc/optabs.c
diff options
context:
space:
mode:
authorTorbjorn Granlund <tege@gnu.org>1994-06-29 00:21:32 +0000
committerTorbjorn Granlund <tege@gnu.org>1994-06-29 00:21:32 +0000
commit5035bbfe580b4b077ad71cd751fcac4fa5ca6e5c (patch)
treeba373501a32fa00e4a9459910ee4aafed75fbfc6 /gcc/optabs.c
parentdbb5b3cec9e704192a12f4b435cd74c0c5300df3 (diff)
downloadgcc-5035bbfe580b4b077ad71cd751fcac4fa5ca6e5c.tar.gz
(smul_highpart_optab, umul_highpart_optab): New variables.
(expand_binop): Handle [us]mul_highpart_optab as commutative. (init_optabs): Initialize [us]mul_highpart_optab. (expand_binop): Convert OP0 to mode for library calls. From-SVN: r7595
Diffstat (limited to 'gcc/optabs.c')
-rw-r--r--gcc/optabs.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/gcc/optabs.c b/gcc/optabs.c
index 7eaa809bbf0..df2f8c94ea3 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -42,6 +42,8 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
optab add_optab;
optab sub_optab;
optab smul_optab;
+optab smul_highpart_optab;
+optab umul_highpart_optab;
optab smul_widen_optab;
optab umul_widen_optab;
optab sdiv_optab;
@@ -383,7 +385,9 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods)
Also try to make the last operand a constant. */
if (GET_RTX_CLASS (binoptab->code) == 'c'
|| binoptab == smul_widen_optab
- || binoptab == umul_widen_optab)
+ || binoptab == umul_widen_optab
+ || binoptab == smul_highpart_optab
+ || binoptab == umul_highpart_optab)
{
commutative_op = 1;
@@ -1484,6 +1488,9 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods)
op1x = convert_to_mode (word_mode, op1, 1);
}
+ if (GET_MODE (op0) != mode)
+ op0 = convert_to_mode (mode, op0, unsignedp);
+
/* Pass 1 for NO_QUEUE so we don't lose any increments
if the libcall is cse'd or moved. */
value = emit_library_call_value (binoptab->handlers[(int) mode].libfunc,
@@ -3727,6 +3734,8 @@ init_optabs ()
add_optab = init_optab (PLUS);
sub_optab = init_optab (MINUS);
smul_optab = init_optab (MULT);
+ smul_highpart_optab = init_optab (UNKNOWN);
+ umul_highpart_optab = init_optab (UNKNOWN);
smul_widen_optab = init_optab (UNKNOWN);
umul_widen_optab = init_optab (UNKNOWN);
sdiv_optab = init_optab (DIV);