diff options
author | m.hayes <m.hayes@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-07-30 08:42:57 +0000 |
---|---|---|
committer | m.hayes <m.hayes@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-07-30 08:42:57 +0000 |
commit | bd91fc92e2492ed0bf993e08edebef8acc1a177f (patch) | |
tree | f7f4b331d3a6e2e40b98b8626171fc2b20caee67 /gcc/config/c4x/c4x.md | |
parent | 59b15c4f83abd529c8bbc6a8c426b51ac571f6c9 (diff) | |
download | gcc-bd91fc92e2492ed0bf993e08edebef8acc1a177f.tar.gz |
* config/c4x/c4x.c (c4x_emit_move_sequence): Use loadqi_big_constant
and loadhi_big_constant if applicable.
* config/c4x/c4x.md (loadqi_big_constant, loadhi_big_constant): Tweak
and add new splitter.s
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@35339 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/c4x/c4x.md')
-rw-r--r-- | gcc/config/c4x/c4x.md | 114 |
1 files changed, 111 insertions, 3 deletions
diff --git a/gcc/config/c4x/c4x.md b/gcc/config/c4x/c4x.md index 89fe2d0bb16..12da60ed0a9 100644 --- a/gcc/config/c4x/c4x.md +++ b/gcc/config/c4x/c4x.md @@ -1133,6 +1133,23 @@ (define_split [(set (match_operand:QI 0 "reg_operand" "") + (match_operand:QI 1 "const_int_operand" "")) + (clobber (reg:QI 16))] + "! TARGET_C3X + && ! IS_INT16_CONST (INTVAL (operands[1])) + && ! IS_HIGH_CONST (INTVAL (operands[1])) + && reload_completed + && std_reg_operand (operands[0], QImode)" + [(set (match_dup 0) (match_dup 2)) + (set (match_dup 0) (ior:QI (match_dup 0) (match_dup 3)))] + " +{ + operands[2] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) & ~0xffff); + operands[3] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) & 0xffff); +}") + +(define_split + [(set (match_operand:QI 0 "reg_operand" "") (match_operand:QI 1 "const_int_operand" ""))] "! TARGET_C3X && ! IS_INT16_CONST (INTVAL (operands[1])) @@ -1149,6 +1166,28 @@ (define_split [(set (match_operand:QI 0 "reg_operand" "") + (match_operand:QI 1 "const_int_operand" "")) + (clobber (reg:QI 16))] + "TARGET_C3X && ! TARGET_SMALL + && ! IS_INT16_CONST (INTVAL (operands[1])) + && reload_completed + && std_reg_operand (operands[0], QImode) + && c4x_shiftable_constant (operands[1]) < 0" + [(set (match_dup 0) (match_dup 2)) + (set (match_dup 0) (ashift:QI (match_dup 0) (match_dup 4))) + (set (match_dup 0) (ior:QI (match_dup 0) (match_dup 3)))] + " +{ + /* Generate two's complement value of 16 MSBs. */ + operands[2] = gen_rtx (CONST_INT, VOIDmode, + (((INTVAL (operands[1]) >> 16) & 0xffff) + - 0x8000) ^ ~0x7fff); + operands[3] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[1]) & 0xffff); + operands[4] = gen_rtx (CONST_INT, VOIDmode, 16); +}") + +(define_split + [(set (match_operand:QI 0 "reg_operand" "") (match_operand:QI 1 "const_int_operand" ""))] "TARGET_C3X && ! TARGET_SMALL && ! IS_INT16_CONST (INTVAL (operands[1])) @@ -1170,6 +1209,28 @@ (define_split [(set (match_operand:QI 0 "reg_operand" "") + (match_operand:QI 1 "const_int_operand" "")) + (clobber (reg:QI 16))] + "TARGET_C3X + && ! IS_INT16_CONST (INTVAL (operands[1])) + && reload_completed + && std_reg_operand (operands[0], QImode) + && c4x_shiftable_constant (operands[1]) >= 0" + [(set (match_dup 0) (match_dup 2)) + (set (match_dup 0) (ashift:QI (match_dup 0) (match_dup 3)))] + " +{ + /* Generate two's complement value of MSBs. */ + int shift = c4x_shiftable_constant (operands[1]); + + operands[2] = gen_rtx (CONST_INT, VOIDmode, + (((INTVAL (operands[1]) >> shift) & 0xffff) + - 0x8000) ^ ~0x7fff); + operands[3] = gen_rtx (CONST_INT, VOIDmode, shift); +}") + +(define_split + [(set (match_operand:QI 0 "reg_operand" "") (match_operand:QI 1 "const_int_operand" ""))] "TARGET_C3X && ! IS_INT16_CONST (INTVAL (operands[1])) @@ -1191,6 +1252,29 @@ (define_split [(set (match_operand:QI 0 "reg_operand" "") + (match_operand:QI 1 "const_int_operand" "")) + (clobber (reg:QI 16))] + "! TARGET_SMALL + && ! IS_INT16_CONST (INTVAL (operands[1])) + && ! IS_HIGH_CONST (INTVAL (operands[1])) + && reload_completed + && ! std_reg_operand (operands[0], QImode)" + [(set (match_dup 2) (high:QI (match_dup 3))) + (set (match_dup 0) (match_dup 4)) + (use (match_dup 1))] + " +{ + rtx dp_reg = gen_rtx_REG (Pmode, DP_REGNO); + operands[2] = dp_reg; + operands[3] = force_const_mem (Pmode, operands[1]); + operands[4] = change_address (operands[3], QImode, + gen_rtx_LO_SUM (Pmode, dp_reg, + XEXP (operands[3], 0))); + operands[3] = XEXP (operands[3], 0); +}") + +(define_split + [(set (match_operand:QI 0 "reg_operand" "") (match_operand:QI 1 "const_int_operand" ""))] "! TARGET_SMALL && ! IS_INT16_CONST (INTVAL (operands[1])) @@ -1213,6 +1297,27 @@ (define_split [(set (match_operand:QI 0 "reg_operand" "") + (match_operand:QI 1 "const_int_operand" "")) + (clobber (reg:QI 16))] + "TARGET_SMALL + && ! IS_INT16_CONST (INTVAL (operands[1])) + && ! IS_HIGH_CONST (INTVAL (operands[1])) + && reload_completed + && ((TARGET_C3X && c4x_shiftable_constant (operands[1]) < 0) + || ! std_reg_operand (operands[0], QImode))" + [(set (match_dup 0) (match_dup 2)) + (use (match_dup 1))] + " +{ + rtx dp_reg = gen_rtx_REG (Pmode, DP_REGNO); + operands[2] = force_const_mem (Pmode, operands[1]); + operands[2] = change_address (operands[2], QImode, + gen_rtx_LO_SUM (Pmode, dp_reg, + XEXP (operands[2], 0))); +}") + +(define_split + [(set (match_operand:QI 0 "reg_operand" "") (match_operand:QI 1 "const_int_operand" ""))] "TARGET_SMALL && ! IS_INT16_CONST (INTVAL (operands[1])) @@ -1233,7 +1338,8 @@ (define_split [(set (match_operand:HI 0 "reg_operand" "") - (match_operand:HI 1 "const_int_operand" ""))] + (match_operand:HI 1 "const_int_operand" "")) + (clobber (reg:QI 16))] "reload_completed" [(set (match_dup 2) (match_dup 4)) (set (match_dup 3) (match_dup 5))] @@ -1315,7 +1421,8 @@ (define_insn "loadhi_big_constant" [(set (match_operand:HI 0 "reg_operand" "=c*d") - (match_operand:HI 1 "const_int_operand" ""))] + (match_operand:HI 1 "const_int_operand" "")) + (clobber (reg:QI 16))] "" "#" [(set_attr "type" "multi")]) @@ -1336,7 +1443,8 @@ (define_insn "loadqi_big_constant" [(set (match_operand:QI 0 "reg_operand" "=c*d") - (match_operand:QI 1 "const_int_operand" ""))] + (match_operand:QI 1 "const_int_operand" "")) + (clobber (reg:QI 16))] "! IS_INT16_CONST (INTVAL (operands[1])) && ! IS_HIGH_CONST (INTVAL (operands[1]))" "#" |