Commit 75c7257f by James Greenhalgh Committed by James Greenhalgh

[AArch64] Fix possible wrong code generation when comparing DImode values.

gcc/
	* config/aarch64/aarch64-simd.md
	(aarch64_cm<optab>di): Add clobber of CC_REGNUM to unsplit pattern.

From-SVN: r199241
parent af6d44b5
2013-05-23 James Greenhalgh <james.greenhalgh@arm.com>
* config/aarch64/aarch64-simd.md
(aarch64_cm<optab>di): Add clobber of CC_REGNUM to unsplit pattern.
2013-05-23 Richard Biener <rguenther@suse.de> 2013-05-23 Richard Biener <rguenther@suse.de>
PR middle-end/57381 PR middle-end/57381
......
...@@ -3280,7 +3280,8 @@ ...@@ -3280,7 +3280,8 @@
(COMPARISONS:DI (COMPARISONS:DI
(match_operand:DI 1 "register_operand" "w,w,r") (match_operand:DI 1 "register_operand" "w,w,r")
(match_operand:DI 2 "aarch64_simd_reg_or_zero" "w,ZDz,r") (match_operand:DI 2 "aarch64_simd_reg_or_zero" "w,ZDz,r")
)))] )))
(clobber (reg:CC CC_REGNUM))]
"TARGET_SIMD" "TARGET_SIMD"
"@ "@
cm<n_optab>\t%d0, %d<cmp_1>, %d<cmp_2> cm<n_optab>\t%d0, %d<cmp_1>, %d<cmp_2>
...@@ -3291,15 +3292,7 @@ ...@@ -3291,15 +3292,7 @@
happening in the 'w' constraint cases. */ happening in the 'w' constraint cases. */
&& GP_REGNUM_P (REGNO (operands[0])) && GP_REGNUM_P (REGNO (operands[0]))
&& GP_REGNUM_P (REGNO (operands[1]))" && GP_REGNUM_P (REGNO (operands[1]))"
[(set (reg:CC CC_REGNUM) [(const_int 0)]
(compare:CC
(match_dup 1)
(match_dup 2)))
(set (match_dup 0)
(neg:DI
(COMPARISONS:DI
(match_operand 3 "cc_register" "")
(const_int 0))))]
{ {
enum machine_mode mode = SELECT_CC_MODE (<CMP>, operands[1], operands[2]); enum machine_mode mode = SELECT_CC_MODE (<CMP>, operands[1], operands[2]);
rtx cc_reg = aarch64_gen_compare_reg (<CMP>, operands[1], operands[2]); rtx cc_reg = aarch64_gen_compare_reg (<CMP>, operands[1], operands[2]);
...@@ -3332,7 +3325,8 @@ ...@@ -3332,7 +3325,8 @@
(UCOMPARISONS:DI (UCOMPARISONS:DI
(match_operand:DI 1 "register_operand" "w,r") (match_operand:DI 1 "register_operand" "w,r")
(match_operand:DI 2 "aarch64_simd_reg_or_zero" "w,r") (match_operand:DI 2 "aarch64_simd_reg_or_zero" "w,r")
)))] )))
(clobber (reg:CC CC_REGNUM))]
"TARGET_SIMD" "TARGET_SIMD"
"@ "@
cm<n_optab>\t%d0, %d<cmp_1>, %d<cmp_2> cm<n_optab>\t%d0, %d<cmp_1>, %d<cmp_2>
...@@ -3342,17 +3336,9 @@ ...@@ -3342,17 +3336,9 @@
happening in the 'w' constraint cases. */ happening in the 'w' constraint cases. */
&& GP_REGNUM_P (REGNO (operands[0])) && GP_REGNUM_P (REGNO (operands[0]))
&& GP_REGNUM_P (REGNO (operands[1]))" && GP_REGNUM_P (REGNO (operands[1]))"
[(set (reg:CC CC_REGNUM) [(const_int 0)]
(compare:CC
(match_dup 1)
(match_dup 2)))
(set (match_dup 0)
(neg:DI
(UCOMPARISONS:DI
(match_operand 3 "cc_register" "")
(const_int 0))))]
{ {
enum machine_mode mode = SELECT_CC_MODE (<CMP>, operands[1], operands[2]); enum machine_mode mode = CCmode;
rtx cc_reg = aarch64_gen_compare_reg (<CMP>, operands[1], operands[2]); rtx cc_reg = aarch64_gen_compare_reg (<CMP>, operands[1], operands[2]);
rtx comparison = gen_rtx_<CMP> (mode, operands[1], operands[2]); rtx comparison = gen_rtx_<CMP> (mode, operands[1], operands[2]);
emit_insn (gen_cstoredi_neg (operands[0], comparison, cc_reg)); emit_insn (gen_cstoredi_neg (operands[0], comparison, cc_reg));
...@@ -3385,7 +3371,8 @@ ...@@ -3385,7 +3371,8 @@
(and:DI (and:DI
(match_operand:DI 1 "register_operand" "w,r") (match_operand:DI 1 "register_operand" "w,r")
(match_operand:DI 2 "register_operand" "w,r")) (match_operand:DI 2 "register_operand" "w,r"))
(const_int 0))))] (const_int 0))))
(clobber (reg:CC CC_REGNUM))]
"TARGET_SIMD" "TARGET_SIMD"
"@ "@
cmtst\t%d0, %d1, %d2 cmtst\t%d0, %d1, %d2
...@@ -3395,16 +3382,7 @@ ...@@ -3395,16 +3382,7 @@
happening in the 'w' constraint cases. */ happening in the 'w' constraint cases. */
&& GP_REGNUM_P (REGNO (operands[0])) && GP_REGNUM_P (REGNO (operands[0]))
&& GP_REGNUM_P (REGNO (operands[1]))" && GP_REGNUM_P (REGNO (operands[1]))"
[(set (reg:CC_NZ CC_REGNUM) [(const_int 0)]
(compare:CC_NZ
(and:DI (match_dup 1)
(match_dup 2))
(const_int 0)))
(set (match_dup 0)
(neg:DI
(ne:DI
(match_operand 3 "cc_register" "")
(const_int 0))))]
{ {
rtx and_tree = gen_rtx_AND (DImode, operands[1], operands[2]); rtx and_tree = gen_rtx_AND (DImode, operands[1], operands[2]);
enum machine_mode mode = SELECT_CC_MODE (NE, and_tree, const0_rtx); enum machine_mode mode = SELECT_CC_MODE (NE, and_tree, const0_rtx);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment