diff options
author | sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-06-14 00:23:24 +0000 |
---|---|---|
committer | sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-06-14 00:23:24 +0000 |
commit | 67cae17de23d17d2d7965a48e52faa34c7b1eea9 (patch) | |
tree | d1c6b35e51dfdd36a8b467ad966b3ec9ea84cce1 /gcc/expr.c | |
parent | 6f812203aaa99db5131d96adfe4f04734951e917 (diff) | |
download | ppe42-gcc-67cae17de23d17d2d7965a48e52faa34c7b1eea9.tar.gz ppe42-gcc-67cae17de23d17d2d7965a48e52faa34c7b1eea9.zip |
* expr.c (expand_expr <COMPLEX_CST>): Handle the case of
expanding a complex constant into a CONCAT target.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@67928 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 23 |
1 files changed, 23 insertions, 0 deletions
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); |