diff options
Diffstat (limited to 'ir')
| -rw-r--r-- | ir/builder.c | 2 | ||||
| -rw-r--r-- | ir/fold.c | 4 | ||||
| -rw-r--r-- | ir/op.def | 3 |
3 files changed, 9 insertions, 0 deletions
diff --git a/ir/builder.c b/ir/builder.c index 6758533..206e66d 100644 --- a/ir/builder.c +++ b/ir/builder.c @@ -191,6 +191,8 @@ irunop(struct function *fn, enum op op, enum irclass k, union ref a) case Oexts32: case Oextu32: case Ocopy: break; + case Obswap16: case Obswap32: case Obswap64: + break; default: assert(!"unop?"); } return fn ? addinstr(fn, mkinstr(op, k, a)) : NOREF; @@ -1,4 +1,5 @@ #include "ir.h" +#include "../endian.h" static union ref foldint(enum op op, enum irclass k, union ref lr, union ref rr) @@ -24,6 +25,9 @@ foldint(enum op op, enum irclass k, union ref lr, union ref rr) case Oextu16: x = (ushort)l.s; break; case Oexts32: x = (int)l.s; break; case Oextu32: x = (uint)l.s; break; + case Obswap16: x = bswap16(l.u); break; + case Obswap32: x = bswap32(l.u); break; + case Obswap64: x = bswap64(l.u); break; case Oadd: x = l.u + r.u; break; case Osub: x = l.u - r.u; break; case Omul: x = l.u * r.u; break; @@ -20,6 +20,9 @@ _(exts16, 1) _(extu16, 1) _(exts32, 1) _(extu32, 1) +_(bswap16, 1) +_(bswap32, 1) +_(bswap64, 1) _(add, 2) _(sub, 2) _(mul, 2) |