* config/i386/i386.h (MASK_CLASS_P): New define.
* config/i386/i386.c (inline_secondary_memory_needed): Ensure that
there are no registers from different register sets also when
mask registers are used. Update function comment.
* config/i386/i386.md (*movsi_internal): Split (*k/*krm) alternative
to (*k/*r) and (*k/*km) alternatives.
From-SVN: r244548
+2017-01-17 Uros Bizjak <ubizjak@gmail.com>
+
+ * config/i386/i386.h (MASK_CLASS_P): New define.
+ * config/i386/i386.c (inline_secondary_memory_needed): Ensure that
+ there are no registers from different register sets also when
+ mask registers are used. Update function comment.
+ * config/i386/i386.md (*movsi_internal): Split (*k/*krm) alternative
+ to (*k/*r) and (*k/*km) alternatives.
+
2017-01-17 Wilco Dijkstra <wdijkstr@arm.com>
* config/aarch64/aarch64.md (eh_return): Remove pattern and splitter.
definitions accordingly.
2017-01-17 Kito Cheng <kito.cheng@gmail.com>
- Kuan-Lin Chen <kuanlinchentw@gmail.com>
+ Kuan-Lin Chen <kuanlinchentw@gmail.com>
PR target/79079
* internal-fn.c (expand_mul_overflow): Use convert_modes instead of
Revert:
2016-12-02 Tadek Kijkowski <tkijkowski@gmail.com>
- * Makefile.in (PREPROCESSOR_DEFINES): Add a level of indirection
- for several include directories that may be relative to sysroot.
- * config/i386/x-mingw32 (gplus_includedir): Define.
- (gplus_tool_includedir, gplus_backward_include_dir): Likewise.
- (native_system_includedir): Likewise.
- * config/i386/mingw32.h (STANDARD_STARTFILE_PREFIX_1): Do not
- override if TARGET_SYSTEM_ROOT is defined.
- (NATIVE_SYSTEM_HEADER_DIR): Likewise.
+ * Makefile.in (PREPROCESSOR_DEFINES): Add a level of indirection
+ for several include directories that may be relative to sysroot.
+ * config/i386/x-mingw32 (gplus_includedir): Define.
+ (gplus_tool_includedir, gplus_backward_include_dir): Likewise.
+ (native_system_includedir): Likewise.
+ * config/i386/mingw32.h (STANDARD_STARTFILE_PREFIX_1): Do not
+ override if TARGET_SYSTEM_ROOT is defined.
+ (NATIVE_SYSTEM_HEADER_DIR): Likewise.
PR tree-optimization/79090
PR tree-optimization/33562
return false;
}
-/* If we are copying between general and FP registers, we need a memory
- location. The same is true for SSE and MMX registers.
+/* If we are copying between registers from different register sets
+ (e.g. FP and integer), we may need a memory location.
- To optimize register_move_cost performance, allow inline variant.
-
- The macro can't work reliably when one of the CLASSES is class containing
- registers from multiple units (SSE, MMX, integer). We avoid this by never
- combining those units in single alternative in the machine description.
+ The function can't work reliably when one of the CLASSES is a class
+ containing registers from multiple sets. We avoid this by never combining
+ different sets in a single alternative in the machine description.
Ensure that this constraint holds to avoid unexpected surprises.
- When STRICT is false, we are being called from REGISTER_MOVE_COST, so do not
- enforce these sanity checks. */
+ When STRICT is false, we are being called from REGISTER_MOVE_COST,
+ so do not enforce these sanity checks.
+
+ To optimize register_move_cost performance, define inline variant. */
static inline bool
inline_secondary_memory_needed (enum reg_class class1, enum reg_class class2,
{
if (lra_in_progress && (class1 == NO_REGS || class2 == NO_REGS))
return false;
+
if (MAYBE_FLOAT_CLASS_P (class1) != FLOAT_CLASS_P (class1)
|| MAYBE_FLOAT_CLASS_P (class2) != FLOAT_CLASS_P (class2)
|| MAYBE_SSE_CLASS_P (class1) != SSE_CLASS_P (class1)
|| MAYBE_SSE_CLASS_P (class2) != SSE_CLASS_P (class2)
|| MAYBE_MMX_CLASS_P (class1) != MMX_CLASS_P (class1)
- || MAYBE_MMX_CLASS_P (class2) != MMX_CLASS_P (class2))
+ || MAYBE_MMX_CLASS_P (class2) != MMX_CLASS_P (class2)
+ || MAYBE_MASK_CLASS_P (class1) != MASK_CLASS_P (class1)
+ || MAYBE_MASK_CLASS_P (class2) != MASK_CLASS_P (class2))
{
gcc_assert (!strict || lra_in_progress);
return true;
return true;
/* Between mask and general, we have moves no larger than word size. */
- if ((MAYBE_MASK_CLASS_P (class1) != MAYBE_MASK_CLASS_P (class2))
+ if ((MASK_CLASS_P (class1) != MASK_CLASS_P (class2))
&& (GET_MODE_SIZE (mode) > UNITS_PER_WORD))
return true;
reg_class_subset_p ((CLASS), ALL_SSE_REGS)
#define MMX_CLASS_P(CLASS) \
((CLASS) == MMX_REGS)
+#define MASK_CLASS_P(CLASS) \
+ reg_class_subset_p ((CLASS), MASK_REGS)
#define MAYBE_INTEGER_CLASS_P(CLASS) \
reg_classes_intersect_p ((CLASS), GENERAL_REGS)
#define MAYBE_FLOAT_CLASS_P(CLASS) \
(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")
+ "=r,m ,*y,*y,?rm,?*y,*v,*v,*v,m ,?r ,?r,?*Yi,*k,*k ,*rm")
(match_operand:SI 1 "general_operand"
- "g ,re,C ,*y,*y ,rm ,C ,*v,m ,*v,*Yj,*v,r ,*krm,*k"))]
+ "g ,re,C ,*y,*y ,rm ,C ,*v,m ,*v,*Yj,*v,r ,*r,*km,*k"))]
"!(MEM_P (operands[0]) && MEM_P (operands[1]))"
{
switch (get_attr_type (insn))
(const_string "sselog1")
(eq_attr "alternative" "7,8,9,10,12")
(const_string "ssemov")
- (eq_attr "alternative" "13,14")
+ (eq_attr "alternative" "13,14,15")
(const_string "mskmov")
(and (match_operand 0 "register_operand")
(match_operand 1 "pic_32bit_operand"))