From 9ad58e0979547afaf85fd0edaec5609e07b25ed3 Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Sat, 14 Jun 2003 00:23:24 +0000 Subject: [PATCH] expr.c (expand_expr ): Handle the case of expanding a complex constant into a CONCAT target. * expr.c (expand_expr ): Handle the case of expanding a complex constant into a CONCAT target. From-SVN: r67928 --- gcc/ChangeLog | 5 +++++ gcc/expr.c | 23 +++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c1db08a1aae..4737fa0e3c5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2003-06-13 Roger Sayle + + * expr.c (expand_expr ): Handle the case of + expanding a complex constant into a CONCAT target. + 2003-06-13 Zack Weinberg * config/svr3.h (ASM_FILE_START): Don't use ASM_FILE_START_1. diff --git a/gcc/expr.c b/gcc/expr.c index d4c7e1d9df4..3131a33e50d 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -6980,6 +6980,29 @@ expand_expr (exp, target, tmode, modifier) TYPE_MODE (TREE_TYPE (exp))); case COMPLEX_CST: + /* Handle evaluating a complex constant in a CONCAT target. */ + if (original_target && GET_CODE (original_target) == CONCAT) + { + enum machine_mode mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (exp))); + rtx rtarg, itarg; + + rtarg = XEXP (original_target, 0); + itarg = XEXP (original_target, 1); + + /* Move the real and imaginary parts separately. */ + op0 = expand_expr (TREE_REALPART (exp), rtarg, mode, 0); + op1 = expand_expr (TREE_IMAGPART (exp), itarg, mode, 0); + + if (op0 != rtarg) + emit_move_insn (rtarg, op0); + if (op1 != itarg) + emit_move_insn (itarg, op1); + + return original_target; + } + + /* ... fall through ... */ + case STRING_CST: temp = output_constant_def (exp, 1); -- 2.30.2