aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1992-10-05 06:30:54 +0000
committerRichard Stallman <rms@gnu.org>1992-10-05 06:30:54 +0000
commit2d7050fdca69677d8f6b4de9ff499abfb3b60fa1 (patch)
tree13bd6ab0af0fd6e841b4dc24f5a4df3cabed206e /gcc
parentdecdfa827101f082b55286b7c0aa3fe8858bc6e9 (diff)
downloadgcc-2d7050fdca69677d8f6b4de9ff499abfb3b60fa1.zip
gcc-2d7050fdca69677d8f6b4de9ff499abfb3b60fa1.tar.gz
gcc-2d7050fdca69677d8f6b4de9ff499abfb3b60fa1.tar.bz2
(expand_expr): Use gen_realpart, gen_imagpart.
(expand_expr): For ABS_EXPR, give expand_unop the operand's mode. (expand_expr): For REALPART_EXPR, IMAGPART_EXPR, just return that part. From-SVN: r2322
Diffstat (limited to 'gcc')
-rw-r--r--gcc/expr.c40
1 files changed, 19 insertions, 21 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index 8705e40..84046a6 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -4417,6 +4417,16 @@ expand_expr (exp, target, tmode, modifier)
case ABS_EXPR:
op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0);
+ /* Handle complex values specially. */
+ {
+ enum machine_mode opmode
+ = TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)));
+
+ if (GET_MODE_CLASS (opmode) == MODE_COMPLEX_INT
+ || GET_MODE_CLASS (opmode) == MODE_COMPLEX_FLOAT)
+ return expand_complex_abs (opmode, op0, target, unsignedp);
+ }
+
/* Unsigned abs is simply the operand. Testing here means we don't
risk generating incorrect code below. */
if (TREE_UNSIGNED (type))
@@ -5130,8 +5140,8 @@ expand_expr (exp, target, tmode, modifier)
emit_insn (gen_rtx (CLOBBER, VOIDmode, target));
/* Move the real (op0) and imaginary (op1) parts to their location. */
- emit_move_insn (gen_lowpart (mode, target), op0);
- emit_move_insn (gen_highpart (mode, target), op1);
+ emit_move_insn (gen_realpart (mode, target), op0);
+ emit_move_insn (gen_imagpart (mode, target), op1);
/* Complex construction should appear as a single unit. */
group_insns (prev);
@@ -5140,24 +5150,12 @@ expand_expr (exp, target, tmode, modifier)
}
case REALPART_EXPR:
- {
- enum machine_mode mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (exp)));
- op0 = expand_expr (TREE_OPERAND (exp, 0), 0, VOIDmode, 0);
- if (! target)
- target = gen_reg_rtx (mode);
- emit_move_insn (target, gen_lowpart (mode, op0));
- return target;
- }
+ op0 = expand_expr (TREE_OPERAND (exp, 0), 0, VOIDmode, 0);
+ return gen_realpart (mode, op0);
case IMAGPART_EXPR:
- {
- enum machine_mode mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (exp)));
- op0 = expand_expr (TREE_OPERAND (exp, 0), 0, VOIDmode, 0);
- if (! target)
- target = gen_reg_rtx (mode);
- emit_move_insn (target, gen_highpart (mode, op0));
- return target;
- }
+ op0 = expand_expr (TREE_OPERAND (exp, 0), 0, VOIDmode, 0);
+ return gen_imagpart (mode, op0);
case CONJ_EXPR:
{
@@ -5177,11 +5175,11 @@ expand_expr (exp, target, tmode, modifier)
emit_insn (gen_rtx (CLOBBER, VOIDmode, target));
/* Store the realpart and the negated imagpart to target. */
- emit_move_insn (gen_lowpart (mode, target), gen_lowpart (mode, op0));
+ emit_move_insn (gen_realpart (mode, target), gen_realpart (mode, op0));
- imag_t = gen_highpart (mode, target);
+ imag_t = gen_imagpart (mode, target);
temp = expand_unop (mode, neg_optab,
- gen_highpart (mode, op0), imag_t, 0);
+ gen_imagpart (mode, op0), imag_t, 0);
if (temp != imag_t)
emit_move_insn (imag_t, temp);