@@ -2347,7 +2347,7 @@
(define_insn "*movsi_internal"
[(set (match_operand:SI 0 "nonimmediate_operand"
"=r,m ,*y,*y,?rm,?*y,*v,*v,*v,m ,?r ,?r,?*Yi,*k ,*rm")
- (match_operand:SI 1 "general_operand"
+ (match_operand:SI 1 "ix86_general_operand"
"g ,re,C ,*y,*y ,rm ,C ,*v,m ,*v,*Yj,*v,r ,*krm,*k"))]
"!(MEM_P (operands[0]) && MEM_P (operands[1]))"
{
@@ -2564,7 +2564,7 @@
(define_insn "*movqi_internal"
[(set (match_operand:QI 0 "nonimmediate_operand"
"=q,q ,q ,r,r ,?r,m ,k,k,r ,m,k")
- (match_operand:QI 1 "general_operand"
+ (match_operand:QI 1 "ix86_general_operand"
"q ,qn,qm,q,rn,qm,qn,r ,k,k,k,m"))]
"!(MEM_P (operands[0]) && MEM_P (operands[1]))"
{
@@ -367,6 +367,12 @@
}
})
+;; Return true if OP is general operand representable on ix86
+(define_predicate "ix86_general_operand"
+ (and (match_operand 0 "general_operand")
+ (ior (not (match_code "symbol_ref"))
+ (match_test "!ix86_force_load_from_GOT_p (op)"))))
+
;; Return true if size of VALUE can be stored in a sign
;; extended immediate field.
(define_predicate "x86_64_immediate_size_operand"
@@ -1036,6 +1042,9 @@
struct ix86_address parts;
int ok;
+ if (ix86_force_load_from_GOT_p (op))
+ return false;
+
if (!CONST_INT_P (op)
&& mode != VOIDmode
&& GET_MODE (op) != mode)