diff options
| -rw-r--r-- | gcc/config/arm/arm.md | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md index 13e81e495ed..86113e7135e 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -6417,7 +6417,7 @@ (match_operator 3 "comparison_operator" [(plus:SI (match_operand:SI 1 "s_register_operand" "%l,l,l,0") - (match_operand:SI 2 "reg_or_int_operand" "J,l,I,L")) + (match_operand:SI 2 "reg_or_int_operand" "J,l,L,IJ")) (const_int 0)]) (label_ref (match_operand 4 "" "")) (pc))) @@ -6438,10 +6438,16 @@ output_asm_insn (\"cmn\t%1, %2\", operands); break; case 2: - output_asm_insn (\"add\t%0, %1, %2\", operands); + if (INTVAL (operands[2]) < 0) + output_asm_insn (\"sub\t%0, %1, %2\", operands); + else + output_asm_insn (\"add\t%0, %1, %2\", operands); break; case 3: - output_asm_insn (\"add\t%0, %0, %2\", operands); + if (INTVAL (operands[2]) < 0) + output_asm_insn (\"sub\t%0, %0, %2\", operands); + else + output_asm_insn (\"add\t%0, %0, %2\", operands); break; } |

