Index: binutils/gas/expr.c |
diff --git a/binutils/gas/expr.c b/binutils/gas/expr.c |
index b9ce5741981d7a0a41f2b91621ed58d77c90a3da..fbfdffc675830a62b99478efda1435b6d49a16d2 100644 |
--- a/binutils/gas/expr.c |
+++ b/binutils/gas/expr.c |
@@ -1997,6 +1997,7 @@ resolve_expression (expressionS *expressionP) |
/* Help out with CSE. */ |
valueT final_val = expressionP->X_add_number; |
symbolS *add_symbol = expressionP->X_add_symbol; |
+ symbolS *orig_add_symbol = add_symbol; |
symbolS *op_symbol = expressionP->X_op_symbol; |
operatorT op = expressionP->X_op; |
valueT left, right; |
@@ -2078,6 +2079,7 @@ resolve_expression (expressionS *expressionP) |
left = right; |
seg_left = seg_right; |
add_symbol = op_symbol; |
+ orig_add_symbol = expressionP->X_op_symbol; |
op = O_symbol; |
break; |
} |
@@ -2122,18 +2124,19 @@ resolve_expression (expressionS *expressionP) |
{ |
if (op == O_bit_exclusive_or || op == O_bit_inclusive_or) |
{ |
- if (seg_right != absolute_section || right != 0) |
+ if (!(seg_right == absolute_section && right == 0)) |
{ |
seg_left = seg_right; |
left = right; |
add_symbol = op_symbol; |
+ orig_add_symbol = expressionP->X_op_symbol; |
} |
op = O_symbol; |
break; |
} |
else if (op == O_left_shift || op == O_right_shift) |
{ |
- if (seg_left != absolute_section || left != 0) |
+ if (!(seg_left == absolute_section && left == 0)) |
{ |
op = O_symbol; |
break; |
@@ -2149,6 +2152,7 @@ resolve_expression (expressionS *expressionP) |
seg_left = seg_right; |
left = right; |
add_symbol = op_symbol; |
+ orig_add_symbol = expressionP->X_op_symbol; |
op = O_symbol; |
break; |
} |
@@ -2158,11 +2162,11 @@ resolve_expression (expressionS *expressionP) |
op = O_symbol; |
break; |
} |
- else if (left != right |
- || ((seg_left != reg_section || seg_right != reg_section) |
- && (seg_left != undefined_section |
- || seg_right != undefined_section |
- || add_symbol != op_symbol))) |
+ else if (!(left == right |
+ && ((seg_left == reg_section && seg_right == reg_section) |
+ || (seg_left == undefined_section |
+ && seg_right == undefined_section |
+ && add_symbol == op_symbol)))) |
return 0; |
else if (op == O_bit_and || op == O_bit_inclusive_or) |
{ |
@@ -2233,7 +2237,7 @@ resolve_expression (expressionS *expressionP) |
op = O_constant; |
else if (seg_left == reg_section && final_val == 0) |
op = O_register; |
- else if (add_symbol != expressionP->X_add_symbol) |
+ else if (!symbol_same_p (add_symbol, orig_add_symbol)) |
final_val += left; |
expressionP->X_add_symbol = add_symbol; |
} |