summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>2009-06-22 11:54:59 +0000
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>2009-06-22 11:54:59 +0000
commit110eae0386ebafdc88a763a03d1c320317eca961 (patch)
treeec049216288a8ea05bf54ad556f23b2f05c86f35 /gcc
parentec91c4afe10de7e1134bcafa1dedfe058d404c9e (diff)
downloadgcc-110eae0386ebafdc88a763a03d1c320317eca961.tar.gz
* config/arm/arm.c (arm_print_operand): Deal with HIGH.
* config/arm/constraints.md (j): New constraint for movw operands. (N): Remove thumb2 meaning. * config/arm/arm.md (*arm_movw): Delete. (*arm_movsi_insn): Use j constraint for movw instead of N constraint. * config/arm/vfp.md (*arm_movsi_vfp, *thumb2_movsi_vfp): Likewise. * config/arm/thumb2.md (*thumb2_movsi_insn): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@148788 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/arm/arm.c6
-rw-r--r--gcc/config/arm/arm.md11
-rw-r--r--gcc/config/arm/constraints.md15
-rw-r--r--gcc/config/arm/thumb2.md2
-rw-r--r--gcc/config/arm/vfp.md4
6 files changed, 30 insertions, 18 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6a8cef5e43f..4804cfa7609 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2009-06-22 Nathan Sidwell <nathan@codesourcery.com>
+
+ * config/arm/arm.c (arm_print_operand): Deal with HIGH.
+ * config/arm/constraints.md (j): New constraint for movw operands.
+ (N): Remove thumb2 meaning.
+ * config/arm/arm.md (*arm_movw): Delete.
+ (*arm_movsi_insn): Use j constraint for movw instead of N constraint.
+ * config/arm/vfp.md (*arm_movsi_vfp, *thumb2_movsi_vfp): Likewise.
+ * config/arm/thumb2.md (*thumb2_movsi_insn): Likewise.
+
2009-06-22 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/40492
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 6f615c59312..7a11d52c296 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -14097,6 +14097,12 @@ arm_print_operand (FILE *stream, rtx x, int code)
default:
gcc_assert (GET_CODE (x) != NEG);
fputc ('#', stream);
+ if (GET_CODE (x) == HIGH)
+ {
+ fputs (":lower16:", stream);
+ x = XEXP (x, 0);
+ }
+
output_addr_const (stream, x);
break;
}
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index 47972424dbf..8423e9464b1 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -5086,18 +5086,9 @@
(set_attr "length" "4")]
)
-(define_insn "*arm_movw"
- [(set (match_operand:SI 0 "nonimmediate_operand" "=r")
- (high:SI (match_operand:SI 1 "general_operand" "i")))]
- "TARGET_32BIT"
- "movw%?\t%0, #:lower16:%c1"
- [(set_attr "predicable" "yes")
- (set_attr "length" "4")]
-)
-
(define_insn "*arm_movsi_insn"
[(set (match_operand:SI 0 "nonimmediate_operand" "=rk,r,r,r,rk,m")
- (match_operand:SI 1 "general_operand" "rk, I,K,N,mi,rk"))]
+ (match_operand:SI 1 "general_operand" "rk, I,K,j,mi,rk"))]
"TARGET_ARM && ! TARGET_IWMMXT
&& !(TARGET_HARD_FLOAT && TARGET_VFP)
&& ( register_operand (operands[0], SImode)
diff --git a/gcc/config/arm/constraints.md b/gcc/config/arm/constraints.md
index f71599edbd4..edb0215a90e 100644
--- a/gcc/config/arm/constraints.md
+++ b/gcc/config/arm/constraints.md
@@ -25,7 +25,7 @@
;; In ARM state, 'l' is an alias for 'r'
;; The following normal constraints have been used:
-;; in ARM/Thumb-2 state: G, H, I, J, K, L, M
+;; in ARM/Thumb-2 state: G, H, I, j, J, K, L, M
;; in Thumb-1 state: I, J, K, L, M, N, O
;; The following multi-letter normal constraints have been used:
@@ -66,6 +66,13 @@
(define_register_constraint "h" "TARGET_THUMB ? HI_REGS : NO_REGS"
"In Thumb state the core registers @code{r8}-@code{r15}.")
+(define_constraint "j"
+ "A constant suitable for a MOVW instruction. (ARM/Thumb-2)"
+ (and (match_test "TARGET_32BIT && arm_arch_thumb2")
+ (ior (match_code "high")
+ (and (match_code "const_int")
+ (match_test "(ival & 0xffff0000) == 0")))))
+
(define_register_constraint "k" "STACK_REG"
"@internal The stack register.")
@@ -117,11 +124,9 @@
: ((ival >= 0 && ival <= 1020) && ((ival & 3) == 0))")))
(define_constraint "N"
- "In ARM/Thumb-2 state a constant suitable for a MOVW instruction.
- In Thumb-1 state a constant in the range 0-31."
+ "Thumb-1 state a constant in the range 0-31."
(and (match_code "const_int")
- (match_test "TARGET_32BIT ? arm_arch_thumb2 && ((ival & 0xffff0000) == 0)
- : (ival >= 0 && ival <= 31)")))
+ (match_test "!TARGET_32BIT && (ival >= 0 && ival <= 31)")))
(define_constraint "O"
"In Thumb-1 state a constant that is a multiple of 4 in the range
diff --git a/gcc/config/arm/thumb2.md b/gcc/config/arm/thumb2.md
index 6ed6fb36cf4..0c5c2dbd9ce 100644
--- a/gcc/config/arm/thumb2.md
+++ b/gcc/config/arm/thumb2.md
@@ -225,7 +225,7 @@
(define_insn "*thumb2_movsi_insn"
[(set (match_operand:SI 0 "nonimmediate_operand" "=rk,r,r,r,rk,m")
- (match_operand:SI 1 "general_operand" "rk ,I,K,N,mi,rk"))]
+ (match_operand:SI 1 "general_operand" "rk ,I,K,j,mi,rk"))]
"TARGET_THUMB2 && ! TARGET_IWMMXT
&& !(TARGET_HARD_FLOAT && TARGET_VFP)
&& ( register_operand (operands[0], SImode)
diff --git a/gcc/config/arm/vfp.md b/gcc/config/arm/vfp.md
index eb18864ecbf..06c2019bd34 100644
--- a/gcc/config/arm/vfp.md
+++ b/gcc/config/arm/vfp.md
@@ -51,7 +51,7 @@
;; problems because small constants get converted into adds.
(define_insn "*arm_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,N,mi,rk,r,*t,*t,*Uvi,*t"))]
+ (match_operand:SI 1 "general_operand" "rk, I,K,j,mi,rk,r,*t,*t,*Uvi,*t"))]
"TARGET_ARM && TARGET_VFP && TARGET_HARD_FLOAT
&& ( s_register_operand (operands[0], SImode)
|| s_register_operand (operands[1], SImode))"
@@ -88,7 +88,7 @@
(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,N,mi,rk,r,*t,*t,*Uvi,*t"))]
+ (match_operand:SI 1 "general_operand" "rk, I,K,j,mi,rk,r,*t,*t,*Uvi,*t"))]
"TARGET_THUMB2 && TARGET_VFP && TARGET_HARD_FLOAT
&& ( s_register_operand (operands[0], SImode)
|| s_register_operand (operands[1], SImode))"