diff options
author | uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-07-18 21:01:59 +0000 |
---|---|---|
committer | uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-07-18 21:01:59 +0000 |
commit | fd31868bb90a812d6a71088ba5435078224b3fad (patch) | |
tree | a8a0c2387eb83cb793323e9deb36bf624b5da376 /gcc/config | |
parent | 1ac0d401b2d426b74c8bc7ba639c2e0b179d2cdc (diff) | |
download | gcc-fd31868bb90a812d6a71088ba5435078224b3fad.tar.gz |
PR target/36786
* config/i386/i386.md (x86_64_shift_adj_1): Rename from
x86_64_shift_adj.
(x86_64_shift_adj_2): New expander.
(x86_64_shift_adj_3): Ditto.
* config/i386/i386.c (ix86_split_ashr): Use gen_x86_64_shift_adj_3
to split TImode operands.
(ix86_split_ashl): Use gen_x86_64_shift_adj_2 to split TImode operands.
(ix86_split_lshr): Ditto.
testsuite/ChangeLog:
PR target/36786
* gcc.target/i386/pr36786.c: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@137967 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/i386/i386.c | 23 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 60 |
2 files changed, 73 insertions, 10 deletions
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index d910bd24250..e68f35a24c6 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -14723,10 +14723,13 @@ ix86_split_ashl (rtx *operands, rtx scratch, enum machine_mode mode) ix86_expand_clear (scratch); emit_insn ((mode == DImode ? gen_x86_shift_adj_1 - : gen_x86_64_shift_adj) (high[0], low[0], operands[2], scratch)); + : gen_x86_64_shift_adj_1) (high[0], low[0], operands[2], + scratch)); } else - emit_insn (gen_x86_shift_adj_2 (high[0], low[0], operands[2])); + emit_insn ((mode == DImode + ? gen_x86_shift_adj_2 + : gen_x86_64_shift_adj_2) (high[0], low[0], operands[2])); } void @@ -14800,11 +14803,13 @@ ix86_split_ashr (rtx *operands, rtx scratch, enum machine_mode mode) GEN_INT (single_width - 1))); emit_insn ((mode == DImode ? gen_x86_shift_adj_1 - : gen_x86_64_shift_adj) (low[0], high[0], operands[2], - scratch)); + : gen_x86_64_shift_adj_1) (low[0], high[0], operands[2], + scratch)); } else - emit_insn (gen_x86_shift_adj_3 (low[0], high[0], operands[2])); + emit_insn ((mode == DImode + ? gen_x86_shift_adj_3 + : gen_x86_64_shift_adj_3) (low[0], high[0], operands[2])); } } @@ -14863,11 +14868,13 @@ ix86_split_lshr (rtx *operands, rtx scratch, enum machine_mode mode) ix86_expand_clear (scratch); emit_insn ((mode == DImode ? gen_x86_shift_adj_1 - : gen_x86_64_shift_adj) (low[0], high[0], operands[2], - scratch)); + : gen_x86_64_shift_adj_1) (low[0], high[0], operands[2], + scratch)); } else - emit_insn (gen_x86_shift_adj_2 (low[0], high[0], operands[2])); + emit_insn ((mode == DImode + ? gen_x86_shift_adj_2 + : gen_x86_64_shift_adj_2) (low[0], high[0], operands[2])); } } diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 45e5595fab2..e7a9827c5b9 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -10917,7 +10917,7 @@ (set_attr "athlon_decode" "vector") (set_attr "amdfam10_decode" "vector")]) -(define_expand "x86_64_shift_adj" +(define_expand "x86_64_shift_adj_1" [(set (reg:CCZ FLAGS_REG) (compare:CCZ (and:QI (match_operand:QI 2 "register_operand" "") (const_int 64)) @@ -10933,6 +10933,34 @@ "TARGET_64BIT" "") +(define_expand "x86_64_shift_adj_2" + [(use (match_operand:DI 0 "register_operand" "")) + (use (match_operand:DI 1 "register_operand" "")) + (use (match_operand:QI 2 "register_operand" ""))] + "TARGET_64BIT" +{ + rtx label = gen_label_rtx (); + rtx tmp; + + emit_insn (gen_testqi_ccz_1 (operands[2], GEN_INT (64))); + + tmp = gen_rtx_REG (CCZmode, FLAGS_REG); + tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx); + tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp, + gen_rtx_LABEL_REF (VOIDmode, label), + pc_rtx); + tmp = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp)); + JUMP_LABEL (tmp) = label; + + emit_move_insn (operands[0], operands[1]); + ix86_expand_clear (operands[1]); + + emit_label (label); + LABEL_NUSES (label) = 1; + + DONE; +}) + (define_expand "ashldi3" [(set (match_operand:DI 0 "shiftdi_operand" "") (ashift:DI (match_operand:DI 1 "ashldi_input_operand" "") @@ -11880,7 +11908,35 @@ "" "ix86_expand_binary_operator (ASHIFTRT, DImode, operands); DONE;") -(define_insn "*ashrdi3_63_rex64" +(define_expand "x86_64_shift_adj_3" + [(use (match_operand:DI 0 "register_operand" "")) + (use (match_operand:DI 1 "register_operand" "")) + (use (match_operand:QI 2 "register_operand" ""))] + "" +{ + rtx label = gen_label_rtx (); + rtx tmp; + + emit_insn (gen_testqi_ccz_1 (operands[2], GEN_INT (64))); + + tmp = gen_rtx_REG (CCZmode, FLAGS_REG); + tmp = gen_rtx_EQ (VOIDmode, tmp, const0_rtx); + tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp, + gen_rtx_LABEL_REF (VOIDmode, label), + pc_rtx); + tmp = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp)); + JUMP_LABEL (tmp) = label; + + emit_move_insn (operands[0], operands[1]); + emit_insn (gen_ashrdi3_63_rex64 (operands[1], operands[1], GEN_INT (63))); + + emit_label (label); + LABEL_NUSES (label) = 1; + + DONE; +}) + +(define_insn "ashrdi3_63_rex64" [(set (match_operand:DI 0 "nonimmediate_operand" "=*d,rm") (ashiftrt:DI (match_operand:DI 1 "nonimmediate_operand" "*a,0") (match_operand:DI 2 "const_int_operand" "i,i"))) |