diff options
Diffstat (limited to 'src/cmd/gc/walk.c')
-rw-r--r-- | src/cmd/gc/walk.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index c552c0928..4cb412c6c 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -1143,10 +1143,10 @@ loop: * rewrite div and mod into function calls * on 32-bit architectures. */ - switch(n->op) { - case ODIV: - case OMOD: - et = n->left->type->etype; + switch(n->op) { + case ODIV: + case OMOD: + et = n->left->type->etype; if(widthptr > 4 || (et != TUINT64 && et != TINT64)) break; if(et == TINT64) @@ -1163,9 +1163,21 @@ loop: n->right = nod(OCONV, n->right, N); n->right->type = types[et]; r = nod(OCALL, l, list(n->left, n->right)); + r = nod(OCONV, r, N); + r->type = n->left->left->type; walktype(r, Erv); indir(n, r); goto ret; + + case OASOP: + et = n->left->type->etype; + if(widthptr > 4 || (et != TUINT64 && et != TINT64)) + break; + l = saferef(n->left); + r = nod(OAS, l, nod(n->etype, l, n->right)); + walktype(r, Etop); + indir(n, r); + goto ret; } if(t == T) |