+ if (var->op == O_SYM and regnum(var->value.sym) != -1) {
+ eval(exp);
+ setreg(regnum(var->value.sym), pop(Address));
+ } else {
+ addr = lval(var);
+ varsize = size(var->nodetype);
+ expsize = size(exp->nodetype);
+ eval(exp);
+ if (varsize == sizeof(float) and expsize == sizeof(double)) {
+ fvalue = (float) pop(double);
+ dwrite(&fvalue, addr, sizeof(fvalue));
+ } else {
+ if (varsize < sizeof(long)) {
+ lvalue = 0;
+ popn(expsize, &lvalue);
+ if (varsize == sizeof(char)) {
+ cvalue = lvalue;
+ dwrite(&cvalue, addr, sizeof(cvalue));
+ } else if (varsize == sizeof(short)) {
+ svalue = lvalue;
+ dwrite(&svalue, addr, sizeof(svalue));
+ } else {
+ error("[internal error: bad size %d in assign]", varsize);
+ }
+ } else {
+ if (expsize <= varsize) {
+ sp -= expsize;
+ dwrite(sp, addr, expsize);
+ } else {
+ sp -= expsize;
+ dwrite(sp, addr, varsize);
+ }
+ }
+ }