Also restore the smallintconst case for binary ops.
Fixes #3835.
R=daniel.morsing, rsc
CC=golang-dev
https://golang.org/cl/
6999043
        }
 
 abop:  // asymmetric binary
-       if(nl->ullman >= nr->ullman) {
+       if(smallintconst(nr)) {
+               mgen(nl, &n1, res);
+               regalloc(&n2, nl->type, &n1);
+               gmove(&n1, &n2);
+               gins(a, nr, &n2);
+               gmove(&n2, res);
+               regfree(&n2);
+               mfree(&n1);
+       } else if(nl->ullman >= nr->ullman) {
                tempname(&nt, nl->type);
                cgen(nl, &nt);
                mgen(nr, &n2, N);
 
 void
 cgen_bmul(int op, Node *nl, Node *nr, Node *res)
 {
-       Node n1, n2, *tmp;
+       Node n1, n2, nt, *tmp;
        Type *t;
        int a;
 
                nr = tmp;
        }
 
+       tempname(&nt, nl->type);
+       cgen(nl, &nt);
        regalloc(&n1, t, res);
-       cgen(nl, &n1);
+       cgen(nr, &n1);
        regalloc(&n2, t, N);
-       cgen(nr, &n2);
+       gmove(&nt, &n2);
        a = optoas(op, t);
        gins(a, &n2, &n1);
        regfree(&n2);
 
                17 / 17 / 17 / 17 /
                17 / 17 / 17 / 17
 }
+
+func ChainMulBytes(a, b, c byte) byte {
+       return a*(a*(a*(a*(a*(a*(a*(a*(a*b+c)+c)+c)+c)+c)+c)+c)+c) + c
+}