| 1 | |
| 2 | #define ix0 0 |
| 3 | #define lx0 0 |
| 4 | #define ix1 1 |
| 5 | #define lx1 1 |
| 6 | #define ix2 2 |
| 7 | #define lx2 2 |
| 8 | #define ix4 4 |
| 9 | #define lx4 4 |
| 10 | #if __WORDSIZE == 32 |
| 11 | # define ix7fe 0x7ffffffe |
| 12 | # define ix7f 0x7fffffff |
| 13 | # define ix80 0x80000000 |
| 14 | # define iff 0xffffffff |
| 15 | # define ife 0xfffffffe |
| 16 | # define ifd 0xfffffffd |
| 17 | # define ifc 0xfffffffc |
| 18 | #else |
| 19 | # define ix7fe 0x7ffffffffffffffe |
| 20 | # define ix7f 0x7fffffffffffffff |
| 21 | # define ix80 0x8000000000000000 |
| 22 | # define iff 0xffffffffffffffff |
| 23 | # define ife 0xfffffffffffffffe |
| 24 | # define ifd 0xfffffffffffffffd |
| 25 | # define ifc 0xfffffffffffffffc |
| 26 | #endif |
| 27 | |
| 28 | /* check jumps are taken and result value is correct */ |
| 29 | #define bopr_t(l, u, op, r0, r1, il, ir, iv) \ |
| 30 | movi %r0 il \ |
| 31 | movi %r1 ir \ |
| 32 | b##op##r##u op##u##r##l##r0##r1 %r0 %r1 \ |
| 33 | /* validate did jump */ \ |
| 34 | movi %r0 0x5a5a5a5a \ |
| 35 | op##u##r##l##r0##r1: \ |
| 36 | beqi op##u##r##l##ok##r0##r1 %r0 iv \ |
| 37 | calli @abort \ |
| 38 | op##u##r##l##ok##r0##r1: |
| 39 | #define bopi_t(l, u, op, r0, il, ir, iv) \ |
| 40 | movi %r0 il \ |
| 41 | b##op##i##u op##u##i##l##r0##r1 %r0 ir \ |
| 42 | /* validate did jump */ \ |
| 43 | movi %r0 0x5a5a5a5a \ |
| 44 | op##u##i##l##r0##r1: \ |
| 45 | beqi op##u##i##l##ok##r0##r1 %r0 iv \ |
| 46 | calli @abort \ |
| 47 | op##u##i##l##ok##r0##r1: |
| 48 | #define bopr_f(l, u, op, r0, r1, il, ir, iv) \ |
| 49 | movi %r0 il \ |
| 50 | movi %r1 ir \ |
| 51 | b##op##r##u op##u##r##l##r0##r1 %r0 %r1 \ |
| 52 | beqi op##u##r##l##ok##r0##r1 %r0 iv \ |
| 53 | op##u##r##l##r0##r1: \ |
| 54 | calli @abort \ |
| 55 | op##u##r##l##ok##r0##r1: |
| 56 | #define bopi_f(l, u, op, r0, il, ir, iv) \ |
| 57 | movi %r0 il \ |
| 58 | b##op##i##u op##u##i##l##r0##r1 %r0 ir \ |
| 59 | beqi op##u##i##l##ok##r0##r1 %r0 iv \ |
| 60 | op##u##i##l##r0##r1: \ |
| 61 | calli @abort \ |
| 62 | op##u##i##l##ok##r0##r1: |
| 63 | #define ccop(cc, l, u, op, r0, r1, il, ir, iv) \ |
| 64 | bopr##cc(l, u, op, r0, r1, i##il, i##ir, i##iv) \ |
| 65 | bopi##cc(l, u, op, r0, i##il, i##ir, i##iv) |
| 66 | #define tadd(l, u, r0, r1, il, ir, iv) \ |
| 67 | ccop(_t, l, u, oadd, r0, r1, il, ir, iv) \ |
| 68 | ccop(_f, l, u, xadd, r0, r1, il, ir, iv) |
| 69 | #define fadd(l, u, r0, r1, il, ir, iv) \ |
| 70 | ccop(_f, l, u, oadd, r0, r1, il, ir, iv) \ |
| 71 | ccop(_t, l, u, xadd, r0, r1, il, ir, iv) |
| 72 | #define tsub(l, u, r0, r1, il, ir, iv) \ |
| 73 | ccop(_t, l, u, osub, r0, r1, il, ir, iv) \ |
| 74 | ccop(_f, l, u, xsub, r0, r1, il, ir, iv) |
| 75 | #define fsub(l, u, r0, r1, il, ir, iv) \ |
| 76 | ccop(_f, l, u, osub, r0, r1, il, ir, iv) \ |
| 77 | ccop(_t, l, u, xsub, r0, r1, il, ir, iv) |
| 78 | |
| 79 | #define xopr6(l,op,r0,r1,r2,r3,r4,r5,llo,lhi,rlo,rhi,vlo,vhi) \ |
| 80 | movi %r1 llo \ |
| 81 | movi %r2 lhi \ |
| 82 | movi %r4 rlo \ |
| 83 | movi %r5 rhi \ |
| 84 | op##cr %r0 %r1 %r4 \ |
| 85 | op##xr %r3 %r2 %r5 \ |
| 86 | beqi op##l##L##r0##r1##r2##r3##r4##r5 %r0 vlo \ |
| 87 | calli @abort \ |
| 88 | op##l##L##r0##r1##r2##r3##r4##r5: \ |
| 89 | beqi op##l##H##r0##r1##r2##r3##r4##r5 %r3 vhi \ |
| 90 | calli @abort \ |
| 91 | op##l##H##r0##r1##r2##r3##r4##r5: |
| 92 | #define xopr4_(l,op,r0,r1,r2,r3,llo,lhi,rlo,rhi,vlo,vhi) \ |
| 93 | movi %r0 llo \ |
| 94 | movi %r1 lhi \ |
| 95 | movi %r2 rlo \ |
| 96 | movi %r3 rhi \ |
| 97 | op##cr %r0 %r0 %r2 \ |
| 98 | op##xr %r1 %r1 %r3 \ |
| 99 | beqi op##l##L_##r0##r1##r2##r3 %r0 vlo \ |
| 100 | calli @abort \ |
| 101 | op##l##L_##r0##r1##r2##r3: \ |
| 102 | beqi op##l##H_##r0##r1##r2##r3 %r1 vhi \ |
| 103 | calli @abort \ |
| 104 | op##l##H_##r0##r1##r2##r3: |
| 105 | #define xopr_4(l,op,r0,r1,r2,r3,llo,lhi,rlo,rhi,vlo,vhi) \ |
| 106 | movi %r0 rlo \ |
| 107 | movi %r1 rhi \ |
| 108 | movi %r2 llo \ |
| 109 | movi %r3 lhi \ |
| 110 | op##cr %r0 %r2 %r0 \ |
| 111 | op##xr %r1 %r3 %r1 \ |
| 112 | beqi op##l##_L##r0##r1##r2##r3 %r0 vlo \ |
| 113 | calli @abort \ |
| 114 | op##l##_L##r0##r1##r2##r3: \ |
| 115 | beqi op##l##_H##r0##r1##r2##r3 %r1 vhi \ |
| 116 | calli @abort \ |
| 117 | op##l##_H##r0##r1##r2##r3: |
| 118 | |
| 119 | #define xaddr(l,llo,lhi,rlo,rhi,vlo,vhi) \ |
| 120 | xopr6(l,add,r0,r1,r2,v0,v1,v2,i##llo,i##lhi,i##rlo,i##rhi,i##vlo,i##vhi) \ |
| 121 | xopr4_(l,add,r0,r1,r2,v0,i##llo,i##lhi,i##rlo,i##rhi,i##vlo,i##vhi) \ |
| 122 | xopr_4(l,add,r0,r1,r2,v0,i##llo,i##lhi,i##rlo,i##rhi,i##vlo,i##vhi) |
| 123 | #define xsubr(l,llo,lhi,rlo,rhi,vlo,vhi) \ |
| 124 | xopr6(l,sub,r0,r1,r2,v0,v1,v2,i##llo,i##lhi,i##rlo,i##rhi,i##vlo,i##vhi) \ |
| 125 | xopr4_(l,sub,r0,r1,r2,v0,i##llo,i##lhi,i##rlo,i##rhi,i##vlo,i##vhi) \ |
| 126 | xopr_4(l,sub,r0,r1,r2,v0,i##llo,i##lhi,i##rlo,i##rhi,i##vlo,i##vhi) |
| 127 | |
| 128 | .data 16 |
| 129 | ok: |
| 130 | .c "ok\n" |
| 131 | |
| 132 | .code |
| 133 | prolog |
| 134 | |
| 135 | tadd(__LINE__, , r0, r1, x7f, x1, x80) |
| 136 | fadd(__LINE__, , r0, r1, x7fe, x1, x7f) |
| 137 | tsub(__LINE__, , r0, r1, x80, x1, x7f) |
| 138 | fsub(__LINE__, , r0, r1, x7f, x1, x7fe) |
| 139 | tadd(__LINE__, _u, r0, r1, ff, x1, x0) |
| 140 | fadd(__LINE__, _u, r0, r1, x7f, x1, x80) |
| 141 | tsub(__LINE__, _u, r0, r1, x0, x1, ff) |
| 142 | fsub(__LINE__, _u, r0, r1, x80, x1, x7f) |
| 143 | |
| 144 | /* 0xffffffffffffffff + 1 = 0x10000000000000000 */ |
| 145 | xaddr(__LINE__, ff, ff, x1, x0, x0, x0) |
| 146 | |
| 147 | /* 1 + 0xffffffffffffffff = 0x10000000000000000 */ |
| 148 | xaddr(__LINE__, x1, x0, ff, ff, x0, x0) |
| 149 | |
| 150 | /* 0xfffffffeffffffff + 1 = 0xffffffff00000000 */ |
| 151 | xaddr(__LINE__, ff, fe, x1, x0, x0, ff) |
| 152 | |
| 153 | /* 1 + 0xfffffffeffffffff = 0xffffffff00000000 */ |
| 154 | xaddr(__LINE__, x1, x0, ff, fe, x0, ff) |
| 155 | |
| 156 | /* 0xfffffffefffffffe + 2 = 0xffffffff00000000 */ |
| 157 | xaddr(__LINE__, fe, fe, x2, x0, x0, ff) |
| 158 | |
| 159 | /* 2 + 0xfffffffefffffffe = 0xffffffff00000000 */ |
| 160 | xaddr(__LINE__, x2, x0, fe, fe, x0, ff) |
| 161 | |
| 162 | /* 0xffffffffffffffff - 1 = 0xfffffffffffffffe */ |
| 163 | xsubr(__LINE__, ff, ff, x1, x0, fe, ff) |
| 164 | |
| 165 | /* 1 - 0xffffffffffffffff = -0xfffffffffffffffe */ |
| 166 | xsubr(__LINE__, x1, x0, ff, ff, x2, x0) |
| 167 | |
| 168 | /* 0xfffffffeffffffff - 1 = 0xfffffffefffffffe */ |
| 169 | xsubr(__LINE__, ff, fe, x1, x0, fe, fe) |
| 170 | |
| 171 | /* 1 - 0xfffffffeffffffff = -0xfffffffefffffffe */ |
| 172 | xsubr(__LINE__, x1, x0, ff, fe, x2, x1) |
| 173 | |
| 174 | /* 0xfffffffefffffffe - 2 = 0xfffffffefffffffc */ |
| 175 | xsubr(__LINE__, fe, fe, x2, x0, fc, fe) |
| 176 | |
| 177 | /* 2 + 0xfffffffefffffffe = -0xfffffffefffffffc */ |
| 178 | xsubr(__LINE__, x2, x0, fe, fe, x4, x1) |
| 179 | |
| 180 | prepare |
| 181 | pushargi ok |
| 182 | ellipsis |
| 183 | finishi @printf |
| 184 | |
| 185 | ret |
| 186 | epilog |