qbe

Internal scc patchset buffer for QBE
Log | Files | Refs | README | LICENSE

ops.h (7845B)


      1 #ifndef X /* amd64 */
      2 	#define X(NMemArgs, SetsZeroFlag, LeavesFlags)
      3 #endif
      4 
      5 #ifndef V /* riscv64 */
      6 	#define V(Imm)
      7 #endif
      8 
      9 
     10 #define T(a,b,c,d,e,f,g,h) {                          \
     11 	{[Kw]=K##a, [Kl]=K##b, [Ks]=K##c, [Kd]=K##d}, \
     12 	{[Kw]=K##e, [Kl]=K##f, [Ks]=K##g, [Kd]=K##h}  \
     13 }
     14 
     15 
     16 /*********************/
     17 /* PUBLIC OPERATIONS */
     18 /*********************/
     19 
     20 /* Arithmetic and Bits */
     21 O(add,     T(w,l,s,d, w,l,s,d), 1) X(2, 1, 0) V(1)
     22 O(sub,     T(w,l,s,d, w,l,s,d), 1) X(2, 1, 0) V(0)
     23 O(neg,     T(w,l,s,d, x,x,x,x), 1) X(1, 1, 0) V(0)
     24 O(div,     T(w,l,s,d, w,l,s,d), 1) X(0, 0, 0) V(0)
     25 O(rem,     T(w,l,e,e, w,l,e,e), 1) X(0, 0, 0) V(0)
     26 O(udiv,    T(w,l,e,e, w,l,e,e), 1) X(0, 0, 0) V(0)
     27 O(urem,    T(w,l,e,e, w,l,e,e), 1) X(0, 0, 0) V(0)
     28 O(mul,     T(w,l,s,d, w,l,s,d), 1) X(2, 0, 0) V(0)
     29 O(and,     T(w,l,e,e, w,l,e,e), 1) X(2, 1, 0) V(1)
     30 O(or,      T(w,l,e,e, w,l,e,e), 1) X(2, 1, 0) V(1)
     31 O(xor,     T(w,l,e,e, w,l,e,e), 1) X(2, 1, 0) V(1)
     32 O(sar,     T(w,l,e,e, w,w,e,e), 1) X(1, 1, 0) V(1)
     33 O(shr,     T(w,l,e,e, w,w,e,e), 1) X(1, 1, 0) V(1)
     34 O(shl,     T(w,l,e,e, w,w,e,e), 1) X(1, 1, 0) V(1)
     35 
     36 /* Comparisons */
     37 O(ceqw,    T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) V(0)
     38 O(cnew,    T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) V(0)
     39 O(csgew,   T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) V(0)
     40 O(csgtw,   T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) V(0)
     41 O(cslew,   T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) V(0)
     42 O(csltw,   T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) V(1)
     43 O(cugew,   T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) V(0)
     44 O(cugtw,   T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) V(0)
     45 O(culew,   T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) V(0)
     46 O(cultw,   T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) V(1)
     47 
     48 O(ceql,    T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) V(0)
     49 O(cnel,    T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) V(0)
     50 O(csgel,   T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) V(0)
     51 O(csgtl,   T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) V(0)
     52 O(cslel,   T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) V(0)
     53 O(csltl,   T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) V(1)
     54 O(cugel,   T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) V(0)
     55 O(cugtl,   T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) V(0)
     56 O(culel,   T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) V(0)
     57 O(cultl,   T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) V(1)
     58 
     59 O(ceqs,    T(s,s,e,e, s,s,e,e), 1) X(0, 1, 0) V(0)
     60 O(cges,    T(s,s,e,e, s,s,e,e), 1) X(0, 1, 0) V(0)
     61 O(cgts,    T(s,s,e,e, s,s,e,e), 1) X(0, 1, 0) V(0)
     62 O(cles,    T(s,s,e,e, s,s,e,e), 1) X(0, 1, 0) V(0)
     63 O(clts,    T(s,s,e,e, s,s,e,e), 1) X(0, 1, 0) V(0)
     64 O(cnes,    T(s,s,e,e, s,s,e,e), 1) X(0, 1, 0) V(0)
     65 O(cos,     T(s,s,e,e, s,s,e,e), 1) X(0, 1, 0) V(0)
     66 O(cuos,    T(s,s,e,e, s,s,e,e), 1) X(0, 1, 0) V(0)
     67 
     68 O(ceqd,    T(d,d,e,e, d,d,e,e), 1) X(0, 1, 0) V(0)
     69 O(cged,    T(d,d,e,e, d,d,e,e), 1) X(0, 1, 0) V(0)
     70 O(cgtd,    T(d,d,e,e, d,d,e,e), 1) X(0, 1, 0) V(0)
     71 O(cled,    T(d,d,e,e, d,d,e,e), 1) X(0, 1, 0) V(0)
     72 O(cltd,    T(d,d,e,e, d,d,e,e), 1) X(0, 1, 0) V(0)
     73 O(cned,    T(d,d,e,e, d,d,e,e), 1) X(0, 1, 0) V(0)
     74 O(cod,     T(d,d,e,e, d,d,e,e), 1) X(0, 1, 0) V(0)
     75 O(cuod,    T(d,d,e,e, d,d,e,e), 1) X(0, 1, 0) V(0)
     76 
     77 /* Memory */
     78 O(storeb,  T(w,e,e,e, m,e,e,e), 0) X(0, 0, 1) V(0)
     79 O(storeh,  T(w,e,e,e, m,e,e,e), 0) X(0, 0, 1) V(0)
     80 O(storew,  T(w,e,e,e, m,e,e,e), 0) X(0, 0, 1) V(0)
     81 O(storel,  T(l,e,e,e, m,e,e,e), 0) X(0, 0, 1) V(0)
     82 O(stores,  T(s,e,e,e, m,e,e,e), 0) X(0, 0, 1) V(0)
     83 O(stored,  T(d,e,e,e, m,e,e,e), 0) X(0, 0, 1) V(0)
     84 
     85 O(loadsb,  T(m,m,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
     86 O(loadub,  T(m,m,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
     87 O(loadsh,  T(m,m,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
     88 O(loaduh,  T(m,m,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
     89 O(loadsw,  T(m,m,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
     90 O(loaduw,  T(m,m,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
     91 O(load,    T(m,m,m,m, x,x,x,x), 0) X(0, 0, 1) V(0)
     92 
     93 /* Extensions and Truncations */
     94 O(extsb,   T(w,w,e,e, x,x,e,e), 1) X(0, 0, 1) V(0)
     95 O(extub,   T(w,w,e,e, x,x,e,e), 1) X(0, 0, 1) V(0)
     96 O(extsh,   T(w,w,e,e, x,x,e,e), 1) X(0, 0, 1) V(0)
     97 O(extuh,   T(w,w,e,e, x,x,e,e), 1) X(0, 0, 1) V(0)
     98 O(extsw,   T(e,w,e,e, e,x,e,e), 1) X(0, 0, 1) V(0)
     99 O(extuw,   T(e,w,e,e, e,x,e,e), 1) X(0, 0, 1) V(0)
    100 
    101 O(exts,    T(e,e,e,s, e,e,e,x), 1) X(0, 0, 1) V(0)
    102 O(truncd,  T(e,e,d,e, e,e,x,e), 1) X(0, 0, 1) V(0)
    103 O(stosi,   T(s,s,e,e, x,x,e,e), 1) X(0, 0, 1) V(0)
    104 O(stoui,   T(s,s,e,e, x,x,e,e), 1) X(0, 0, 1) V(0)
    105 O(dtosi,   T(d,d,e,e, x,x,e,e), 1) X(0, 0, 1) V(0)
    106 O(dtoui,   T(d,d,e,e, x,x,e,e), 1) X(0, 0, 1) V(0)
    107 O(swtof,   T(e,e,w,w, e,e,x,x), 1) X(0, 0, 1) V(0)
    108 O(uwtof,   T(e,e,w,w, e,e,x,x), 1) X(0, 0, 1) V(0)
    109 O(sltof,   T(e,e,l,l, e,e,x,x), 1) X(0, 0, 1) V(0)
    110 O(ultof,   T(e,e,l,l, e,e,x,x), 1) X(0, 0, 1) V(0)
    111 O(cast,    T(s,d,w,l, x,x,x,x), 1) X(0, 0, 1) V(0)
    112 
    113 /* Stack Allocation */
    114 O(alloc4,  T(e,l,e,e, e,x,e,e), 0) X(0, 0, 0) V(0)
    115 O(alloc8,  T(e,l,e,e, e,x,e,e), 0) X(0, 0, 0) V(0)
    116 O(alloc16, T(e,l,e,e, e,x,e,e), 0) X(0, 0, 0) V(0)
    117 
    118 /* Variadic Function Helpers */
    119 O(vaarg,   T(m,m,m,m, x,x,x,x), 0) X(0, 0, 0) V(0)
    120 O(vastart, T(m,e,e,e, x,e,e,e), 0) X(0, 0, 0) V(0)
    121 
    122 O(copy,    T(w,l,s,d, x,x,x,x), 0) X(0, 0, 1) V(0)
    123 
    124 /* Debug */
    125 O(dbgloc,  T(w,l,s,d, x,x,x,x), 0) X(0, 0, 1) V(0)
    126 
    127 /****************************************/
    128 /* INTERNAL OPERATIONS (keep nop first) */
    129 /****************************************/
    130 
    131 /* Miscellaneous and Architecture-Specific Operations */
    132 O(nop,     T(x,x,x,x, x,x,x,x), 0) X(0, 0, 1) V(0)
    133 O(addr,    T(m,m,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
    134 O(blit0,   T(m,e,e,e, m,e,e,e), 0) X(0, 1, 0) V(0)
    135 O(blit1,   T(w,e,e,e, x,e,e,e), 0) X(0, 1, 0) V(0)
    136 O(swap,    T(w,l,s,d, w,l,s,d), 0) X(1, 0, 0) V(0)
    137 O(sign,    T(w,l,e,e, x,x,e,e), 0) X(0, 0, 0) V(0)
    138 O(salloc,  T(e,l,e,e, e,x,e,e), 0) X(0, 0, 0) V(0)
    139 O(xidiv,   T(w,l,e,e, x,x,e,e), 0) X(1, 0, 0) V(0)
    140 O(xdiv,    T(w,l,e,e, x,x,e,e), 0) X(1, 0, 0) V(0)
    141 O(xcmp,    T(w,l,s,d, w,l,s,d), 0) X(1, 1, 0) V(0)
    142 O(xtest,   T(w,l,e,e, w,l,e,e), 0) X(1, 1, 0) V(0)
    143 O(acmp,    T(w,l,e,e, w,l,e,e), 0) X(0, 0, 0) V(0)
    144 O(acmn,    T(w,l,e,e, w,l,e,e), 0) X(0, 0, 0) V(0)
    145 O(afcmp,   T(e,e,s,d, e,e,s,d), 0) X(0, 0, 0) V(0)
    146 O(reqz,    T(w,l,e,e, x,x,e,e), 0) X(0, 0, 0) V(0)
    147 O(rnez,    T(w,l,e,e, x,x,e,e), 0) X(0, 0, 0) V(0)
    148 
    149 /* Arguments, Parameters, and Calls */
    150 O(par,     T(x,x,x,x, x,x,x,x), 0) X(0, 0, 0) V(0)
    151 O(parsb,   T(x,x,x,x, x,x,x,x), 0) X(0, 0, 0) V(0)
    152 O(parub,   T(x,x,x,x, x,x,x,x), 0) X(0, 0, 0) V(0)
    153 O(parsh,   T(x,x,x,x, x,x,x,x), 0) X(0, 0, 0) V(0)
    154 O(paruh,   T(x,x,x,x, x,x,x,x), 0) X(0, 0, 0) V(0)
    155 O(parc,    T(e,x,e,e, e,x,e,e), 0) X(0, 0, 0) V(0)
    156 O(pare,    T(e,x,e,e, e,x,e,e), 0) X(0, 0, 0) V(0)
    157 O(arg,     T(w,l,s,d, x,x,x,x), 0) X(0, 0, 0) V(0)
    158 O(argsb,   T(w,e,e,e, x,x,x,x), 0) X(0, 0, 0) V(0)
    159 O(argub,   T(w,e,e,e, x,x,x,x), 0) X(0, 0, 0) V(0)
    160 O(argsh,   T(w,e,e,e, x,x,x,x), 0) X(0, 0, 0) V(0)
    161 O(arguh,   T(w,e,e,e, x,x,x,x), 0) X(0, 0, 0) V(0)
    162 O(argc,    T(e,x,e,e, e,l,e,e), 0) X(0, 0, 0) V(0)
    163 O(arge,    T(e,l,e,e, e,x,e,e), 0) X(0, 0, 0) V(0)
    164 O(argv,    T(x,x,x,x, x,x,x,x), 0) X(0, 0, 0) V(0)
    165 O(call,    T(m,m,m,m, x,x,x,x), 0) X(0, 0, 0) V(0)
    166 
    167 /* Flags Setting */
    168 O(flagieq,  T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
    169 O(flagine,  T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
    170 O(flagisge, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
    171 O(flagisgt, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
    172 O(flagisle, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
    173 O(flagislt, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
    174 O(flagiuge, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
    175 O(flagiugt, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
    176 O(flagiule, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
    177 O(flagiult, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
    178 O(flagfeq,  T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
    179 O(flagfge,  T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
    180 O(flagfgt,  T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
    181 O(flagfle,  T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
    182 O(flagflt,  T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
    183 O(flagfne,  T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
    184 O(flagfo,   T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
    185 O(flagfuo,  T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
    186 
    187 
    188 #undef T
    189 #undef X
    190 #undef V
    191 #undef O
    192 
    193 /*
    194 | column -t -o ' '
    195 */