/* operator name, is it pure, pretty name */O(Obad, 1, OTmisc, "BAD")O(Oauto, 1, OTpre, "auto")O(Oadd, 1, OTbin, "+")O(Osub, 1, OTbin, "-")O(Omul, 1, OTbin, "*")O(Odiv, 1, OTbin, "/")O(Omod, 1, OTbin, "%")O(Oneg, 1, OTpre, "-")O(Obor, 1, OTbin, "|")O(Oband, 1, OTbin, "&")O(Obxor, 1, OTbin, "^")O(Obsl, 1, OTbin, "<<")O(Obsr, 1, OTbin, ">>")O(Obnot, 1, OTpre, "~")O(Opreinc, 1, OTpre, "++")O(Opostinc, 1, OTpost, "++")O(Opredec, 1, OTpre, "--")O(Opostdec, 1, OTpost, "--")O(Oaddr, 1, OTpre, "&")O(Oderef, 1, OTpost, "#")O(Olor, 1, OTbin, "||")O(Oland, 1, OTbin, "&&")O(Olnot, 1, OTpre, "!")O(Oeq, 1, OTbin, "==")O(One, 1, OTbin, "!=")O(Ogt, 1, OTbin, ">")O(Oge, 1, OTbin, ">=")O(Olt, 1, OTbin, "<")O(Ole, 1, OTbin, "<=")O(Oasn, 1, OTbin, "=")O(Oaddeq, 1, OTbin, "+=")O(Osubeq, 1, OTbin, "-=")O(Omuleq, 1, OTbin, "*=")O(Odiveq, 1, OTbin, "/=")O(Omodeq, 1, OTbin, "%=")O(Oboreq, 1, OTbin, "|=")O(Obandeq, 1, OTbin, "&=")O(Obxoreq, 1, OTbin, "^=")O(Obsleq, 1, OTbin, "<<=")O(Obsreq, 1, OTbin, ">>=")O(Oidx, 1, OTmisc, NULL)O(Oslice, 1, OTmisc, NULL)O(Omemb, 1, OTmisc, NULL)O(Otupmemb, 1, OTmisc, NULL)O(Osize, 1, OTmisc, NULL)O(Ocall, 0, OTmisc, NULL)O(Ocast, 1, OTmisc, NULL)O(Oret, 1, OTpre, "->")O(Ojmp, 0, OTpre, "goto")O(Obreak, 0, OTzarg, "break")O(Ocontinue, 0, OTzarg, "continue")O(Ovar, 1, OTmisc, NULL)O(Ogap, 1, OTmisc, NULL)O(Olit, 1, OTmisc, NULL)O(Oucon, 1, OTmisc, "`")O(Otup, 1, OTmisc, NULL)O(Ostruct, 1, OTmisc, NULL)O(Oarr, 1, OTmisc, NULL)O(Otern, 1, OTmisc, "?:") /* all below this point are backend-only */O(Odead, 0, OTmisc, "DEAD") /* dead code */O(Oundef, 0, OTmisc, "UNDEF") /* undefined var */O(Odef, 0, OTmisc, "DEF") /* defined var */O(Ocjmp, 1, OTmisc, "CJMP") /* conditional jump */O(Ovjmp, 1, OTmisc, "VJMP") /* variable arg list jump */O(Oset, 1, OTbin, "=") /* store to var */O(Osllen, 1, OTpre, "SLLEN") /* size of slice */O(Oslbase, 1, OTpre, "SLBASE") /* base of sice */O(Outag, 1, OTpre, "UTAG") /* tag of union */O(Oudata, 1, OTpre, "UDATA") /* pointer to contents of union */O(Otupget, 1, OTpre, "TUPGET") /* pointer to contents of union */O(Oblit, 1, OTbin, "BLIT") /* blit memory */O(Oclear, 1, OTpre, "CLEAR") /* zero */O(Ocallind, 1, OTpre, "CALL") /* call with environment */ /* integer conversions */O(Otrunc, 1, OTmisc, NULL) /* truncating cast */O(Ozwiden, 1, OTmisc, NULL) /* zero-extending widening cast */O(Oswiden, 1, OTmisc, NULL) /* sign-extending widening cast */ /* float conversions */O(Oflt2int, 1, OTmisc, NULL) /* float to int conversion */O(Oint2flt, 1, OTmisc, NULL) /* int to float conversion */O(Oflt2flt, 1, OTmisc, NULL) /* flt32<->flt64 conversion */ /* floating arithmetic */O(Ofadd, 1, OTmisc, NULL)O(Ofsub, 1, OTmisc, NULL)O(Ofmul, 1, OTmisc, NULL)O(Ofdiv, 1, OTmisc, NULL)O(Ofneg, 1, OTmisc, NULL) /* floating point comparisons */O(Ofeq, 1, OTmisc, NULL)O(Ofne, 1, OTmisc, NULL)O(Ofgt, 1, OTmisc, NULL)O(Ofge, 1, OTmisc, NULL)O(Oflt, 1, OTmisc, NULL)O(Ofle, 1, OTmisc, NULL) /* unsigned comparisons */O(Oueq, 1, OTmisc, NULL)O(Oune, 1, OTmisc, NULL)O(Ougt, 1, OTmisc, NULL)O(Ouge, 1, OTmisc, NULL)O(Oult, 1, OTmisc, NULL)O(Oule, 1, OTmisc, NULL)
/* operator name, is it pure, pretty name */
O(Obad, 1, OTmisc, "BAD")
O(Oauto, 1, OTpre, "auto")
O(Oadd, 1, OTbin, "+")
O(Osub, 1, OTbin, "-")
O(Omul, 1, OTbin, "*")
O(Odiv, 1, OTbin, "/")
O(Omod, 1, OTbin, "%")
O(Oneg, 1, OTpre, "-")
O(Obor, 1, OTbin, "|")
O(Oband, 1, OTbin, "&")
O(Obxor, 1, OTbin, "^")
O(Obsl, 1, OTbin, "<<")
O(Obsr, 1, OTbin, ">>")
O(Obnot, 1, OTpre, "~")
O(Opreinc, 1, OTpre, "++")
O(Opostinc, 1, OTpost, "++")
O(Opredec, 1, OTpre, "--")
O(Opostdec, 1, OTpost, "--")
O(Oaddr, 1, OTpre, "&")
O(Oderef, 1, OTpost, "#")
O(Olor, 1, OTbin, "||")
O(Oland, 1, OTbin, "&&")
O(Olnot, 1, OTpre, "!")
O(Oeq, 1, OTbin, "==")
O(One, 1, OTbin, "!=")
O(Ogt, 1, OTbin, ">")
O(Oge, 1, OTbin, ">=")
O(Olt, 1, OTbin, "<")
O(Ole, 1, OTbin, "<=")
O(Oasn, 1, OTbin, "=")
O(Oaddeq, 1, OTbin, "+=")
O(Osubeq, 1, OTbin, "-=")
O(Omuleq, 1, OTbin, "*=")
O(Odiveq, 1, OTbin, "/=")
O(Omodeq, 1, OTbin, "%=")
O(Oboreq, 1, OTbin, "|=")
O(Obandeq, 1, OTbin, "&=")
O(Obxoreq, 1, OTbin, "^=")
O(Obsleq, 1, OTbin, "<<=")
O(Obsreq, 1, OTbin, ">>=")
O(Oidx, 1, OTmisc, NULL)
O(Oslice, 1, OTmisc, NULL)
O(Omemb, 1, OTmisc, NULL)
O(Otupmemb, 1, OTmisc, NULL)
O(Osize, 1, OTmisc, NULL)
O(Ocall, 0, OTmisc, NULL)
O(Ocast, 1, OTmisc, NULL)
O(Oret, 1, OTpre, "->")
O(Ojmp, 0, OTpre, "goto")
O(Obreak, 0, OTzarg, "break")
O(Ocontinue, 0, OTzarg, "continue")
O(Ovar, 1, OTmisc, NULL)
O(Ogap, 1, OTmisc, NULL)
O(Olit, 1, OTmisc, NULL)
O(Oucon, 1, OTmisc, "`")
O(Otup, 1, OTmisc, NULL)
O(Ostruct, 1, OTmisc, NULL)
O(Oarr, 1, OTmisc, NULL)
O(Otern, 1, OTmisc, "?:")
/* all below this point are backend-only */
O(Odead, 0, OTmisc, "DEAD") /* dead code */
O(Oundef, 0, OTmisc, "UNDEF") /* undefined var */
O(Odef, 0, OTmisc, "DEF") /* defined var */
O(Ocjmp, 1, OTmisc, "CJMP") /* conditional jump */
O(Ovjmp, 1, OTmisc, "VJMP") /* variable arg list jump */
O(Oset, 1, OTbin, "=") /* store to var */
O(Osllen, 1, OTpre, "SLLEN") /* size of slice */
O(Oslbase, 1, OTpre, "SLBASE") /* base of sice */
O(Outag, 1, OTpre, "UTAG") /* tag of union */
O(Oudata, 1, OTpre, "UDATA") /* pointer to contents of union */
O(Otupget, 1, OTpre, "TUPGET") /* pointer to contents of union */
O(Oblit, 1, OTbin, "BLIT") /* blit memory */
O(Oclear, 1, OTpre, "CLEAR") /* zero */
O(Ocallind, 1, OTpre, "CALL") /* call with environment */
/* integer conversions */
O(Otrunc, 1, OTmisc, NULL) /* truncating cast */
O(Ozwiden, 1, OTmisc, NULL) /* zero-extending widening cast */
O(Oswiden, 1, OTmisc, NULL) /* sign-extending widening cast */
/* float conversions */
O(Oflt2int, 1, OTmisc, NULL) /* float to int conversion */
O(Oint2flt, 1, OTmisc, NULL) /* int to float conversion */
O(Oflt2flt, 1, OTmisc, NULL) /* flt32<->flt64 conversion */
/* floating arithmetic */
O(Ofadd, 1, OTmisc, NULL)
O(Ofsub, 1, OTmisc, NULL)
O(Ofmul, 1, OTmisc, NULL)
O(Ofdiv, 1, OTmisc, NULL)
O(Ofneg, 1, OTmisc, NULL)
/* floating point comparisons */
O(Ofeq, 1, OTmisc, NULL)
O(Ofne, 1, OTmisc, NULL)
O(Ofgt, 1, OTmisc, NULL)
O(Ofge, 1, OTmisc, NULL)
O(Oflt, 1, OTmisc, NULL)
O(Ofle, 1, OTmisc, NULL)
/* unsigned comparisons */
O(Oueq, 1, OTmisc, NULL)
O(Oune, 1, OTmisc, NULL)
O(Ougt, 1, OTmisc, NULL)
O(Ouge, 1, OTmisc, NULL)
O(Oult, 1, OTmisc, NULL)
O(Oule, 1, OTmisc, NULL)