summaryrefslogtreecommitdiff
path: root/gcc/config/arm/vfp.md
diff options
context:
space:
mode:
authorjules <jules@138bc75d-0d04-0410-961f-82ee72b054a4>2010-04-15 14:39:22 +0000
committerjules <jules@138bc75d-0d04-0410-961f-82ee72b054a4>2010-04-15 14:39:22 +0000
commit93bda8332e7f5defb88fe06be06d29e8ebc73dbb (patch)
tree3307259b566036b040ad6fb53a3da135d84fe218 /gcc/config/arm/vfp.md
parent8a84c748fb5e8af580e9411e056a58451f301de2 (diff)
downloadgcc-93bda8332e7f5defb88fe06be06d29e8ebc73dbb.tar.gz
gcc/
* config/arm/thumb2.md (thumb2_movsi_insn): Split ldr and str alternatives according to use of high and low regs. * config/arm/vfp.md (thumb2_movsi_vfp): Likewise. * config/arm/arm.h (CONDITIONAL_REGISTER_USAGE): Use high regs when optimizing for size on Thumb-2. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158378 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/arm/vfp.md')
-rw-r--r--gcc/config/arm/vfp.md24
1 files changed, 14 insertions, 10 deletions
diff --git a/gcc/config/arm/vfp.md b/gcc/config/arm/vfp.md
index 57c2192d1e9..02d527b79c5 100644
--- a/gcc/config/arm/vfp.md
+++ b/gcc/config/arm/vfp.md
@@ -86,9 +86,11 @@
(set_attr "neg_pool_range" "*,*,*,*,4084,*,*,*,*,1008,*")]
)
+;; See thumb2.md:thumb2_movsi_insn for an explanation of the split
+;; high/low register alternatives for loads and stores here.
(define_insn "*thumb2_movsi_vfp"
- [(set (match_operand:SI 0 "nonimmediate_operand" "=rk,r,r,r,rk,m,*t,r, *t,*t, *Uv")
- (match_operand:SI 1 "general_operand" "rk, I,K,j,mi,rk,r,*t,*t,*Uvi,*t"))]
+ [(set (match_operand:SI 0 "nonimmediate_operand" "=rk,r,r,r, l,*hk,m, *m,*t, r,*t,*t, *Uv")
+ (match_operand:SI 1 "general_operand" "rk, I,K,j,mi,*mi,l,*hk, r,*t,*t,*Uvi,*t"))]
"TARGET_THUMB2 && TARGET_VFP && TARGET_HARD_FLOAT
&& ( s_register_operand (operands[0], SImode)
|| s_register_operand (operands[1], SImode))"
@@ -102,25 +104,27 @@
case 3:
return \"movw%?\\t%0, %1\";
case 4:
- return \"ldr%?\\t%0, %1\";
case 5:
- return \"str%?\\t%1, %0\";
+ return \"ldr%?\\t%0, %1\";
case 6:
- return \"fmsr%?\\t%0, %1\\t%@ int\";
case 7:
- return \"fmrs%?\\t%0, %1\\t%@ int\";
+ return \"str%?\\t%1, %0\";
case 8:
+ return \"fmsr%?\\t%0, %1\\t%@ int\";
+ case 9:
+ return \"fmrs%?\\t%0, %1\\t%@ int\";
+ case 10:
return \"fcpys%?\\t%0, %1\\t%@ int\";
- case 9: case 10:
+ case 11: case 12:
return output_move_vfp (operands);
default:
gcc_unreachable ();
}
"
[(set_attr "predicable" "yes")
- (set_attr "type" "*,*,*,*,load1,store1,r_2_f,f_2_r,fcpys,f_load,f_store")
- (set_attr "pool_range" "*,*,*,*,4096,*,*,*,*,1020,*")
- (set_attr "neg_pool_range" "*,*,*,*, 0,*,*,*,*,1008,*")]
+ (set_attr "type" "*,*,*,*,load1,load1,store1,store1,r_2_f,f_2_r,fcpys,f_load,f_store")
+ (set_attr "pool_range" "*,*,*,*,1020,4096,*,*,*,*,*,1020,*")
+ (set_attr "neg_pool_range" "*,*,*,*, 0, 0,*,*,*,*,*,1008,*")]
)