- x = get_Mul_right(left);
-
- if (x == get_Mul_right(right)) {
- /* (a * x) +/- (b * x) */
- a = get_Mul_left(left);
- b = get_Mul_left(right);
- goto transform;
- } else if (x == get_Mul_left(right)) {
- /* (a * x) +/- (x * b) */
- a = get_Mul_left(left);
- b = get_Mul_right(right);
- goto transform;
+ if (x == get_Shl_right(right)) {
+ /* (a << x) +/- (b << x) ==> (a +/- b) << x */
+ a = get_Shl_left(left);
+ b = get_Shl_left(right);
+ goto transform;
+ }
+ } else if (op == op_Mul) {
+ x = get_Mul_left(left);
+
+ if (x == get_Mul_left(right)) {
+ /* (x * a) +/- (x * b) ==> (a +/- b) * x */
+ a = get_Mul_right(left);
+ b = get_Mul_right(right);
+ goto transform;
+ } else if (x == get_Mul_right(right)) {
+ /* (x * a) +/- (b * x) ==> (a +/- b) * x */
+ a = get_Mul_right(left);
+ b = get_Mul_left(right);
+ goto transform;
+ }
+
+ x = get_Mul_right(left);
+
+ if (x == get_Mul_right(right)) {
+ /* (a * x) +/- (b * x) ==> (a +/- b) * x */
+ a = get_Mul_left(left);
+ b = get_Mul_left(right);
+ goto transform;
+ } else if (x == get_Mul_left(right)) {
+ /* (a * x) +/- (x * b) ==> (a +/- b) * x */
+ a = get_Mul_left(left);
+ b = get_Mul_right(right);
+ goto transform;
+ }