aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Wilson <wilson@gcc.gnu.org>1997-04-30 16:45:13 -0700
committerJim Wilson <wilson@gcc.gnu.org>1997-04-30 16:45:13 -0700
commit3cce8bc65cfe0e5d4edbe644fce071755184db0c (patch)
treeb60eebec9a5a00063047a4fee736cf6ff8fa72bc
parentad4ff31086d8e338ebd7b30725145f6ad57d63ae (diff)
downloadgcc-3cce8bc65cfe0e5d4edbe644fce071755184db0c.zip
gcc-3cce8bc65cfe0e5d4edbe644fce071755184db0c.tar.gz
gcc-3cce8bc65cfe0e5d4edbe644fce071755184db0c.tar.bz2
(paradoxical_extendhidi2, paradoxical_extendqidi2): New patterns.
From-SVN: r13995
-rw-r--r--gcc/config/mips/mips.md30
1 files changed, 30 insertions, 0 deletions
diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md
index d74edf7..1abd60b 100644
--- a/gcc/config/mips/mips.md
+++ b/gcc/config/mips/mips.md
@@ -2497,6 +2497,36 @@ move\\t%0,%z4\\n\\
(set_attr "mode" "DI")
(set_attr "length" "1,1,2")])
+;; These can be created when a paradoxical subreg operand with an implicit
+;; sign_extend operator is reloaded. Because of the subreg, this is really
+;; a zero extend.
+;; ??? It might be possible to eliminate the need for these patterns by adding
+;; more support to reload for implicit sign_extend operators.
+(define_insn "*paradoxical_extendhidi2"
+ [(set (match_operand:DI 0 "register_operand" "=d,d")
+ (sign_extend:DI
+ (subreg:SI (match_operand:HI 1 "memory_operand" "R,m") 0)))]
+ "TARGET_64BIT"
+ "*
+{
+ return mips_move_1word (operands, insn, TRUE);
+}"
+ [(set_attr "type" "load,load")
+ (set_attr "mode" "DI")
+ (set_attr "length" "1,2")])
+
+(define_insn "*paradoxical_extendqidi2"
+ [(set (match_operand:DI 0 "register_operand" "=d,d")
+ (sign_extend:DI
+ (subreg:SI (match_operand:QI 1 "memory_operand" "R,m") 0)))]
+ "TARGET_64BIT"
+ "*
+{
+ return mips_move_1word (operands, insn, TRUE);
+}"
+ [(set_attr "type" "load,load")
+ (set_attr "mode" "DI")
+ (set_attr "length" "1,2")])
;;
;; ....................