aboutsummaryrefslogtreecommitdiff
path: root/load.c
diff options
context:
space:
mode:
Diffstat (limited to 'load.c')
-rw-r--r--load.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/load.c b/load.c
index ae9cfcf..f3a695b 100644
--- a/load.c
+++ b/load.c
@@ -92,14 +92,17 @@ cast(Ref *r, int cls, Loc *l)
cls0 = curf->tmp[r->val].cls;
if (cls0 == cls || (cls == Kw && cls0 == Kl))
return;
- assert(!KWIDE(cls0) || KWIDE(cls));
- if (KWIDE(cls) == KWIDE(cls0))
- *r = iins(cls, Ocast, *r, R, l);
- else {
- assert(cls == Kl);
+ if (KWIDE(cls0) < KWIDE(cls)) {
if (cls0 == Ks)
*r = iins(Kw, Ocast, *r, R, l);
*r = iins(Kl, Oextuw, *r, R, l);
+ if (cls == Kd)
+ *r = iins(Kd, Ocast, *r, R, l);
+ } else {
+ if (cls0 == Kd && cls != Kl)
+ *r = iins(Kl, Ocast, *r, R, l);
+ if (cls0 != Kd || cls != Kw)
+ *r = iins(cls, Ocast, *r, R, l);
}
}