| @@ -0,0 +1,257 @@ |
| 1 | +# riscv64 ABI stress |
| 2 | +# see tools/abi8.py |
| 3 | + |
| 4 | +type :fi1 = { h, s } # in a gp & fp pair |
| 5 | +type :fi2 = { s, w } # ditto |
| 6 | +type :uw = { { w } } |
| 7 | +type :fi3 = { s, :uw } # in a single gp reg |
| 8 | +type :ss = { s, s } # in two fp regs |
| 9 | +type :sd = { s, d } # ditto |
| 10 | +type :ww = { w, w } # in a single gp reg |
| 11 | +type :lb = { l, b } # in two gp regs |
| 12 | +type :big = { b 17 } # by reference |
| 13 | + |
| 14 | +data $ctoqbestr = { b "c->qbe(%d)", b 0 } |
| 15 | +data $emptystr = { b 0 } |
| 16 | + |
| 17 | +export |
| 18 | +function $qfn0(s %p0, s %p1, s %p2, s %p3, s %p4, s %p5, s %p6, s %p7, s %p8) { |
| 19 | +@start |
| 20 | + %r0 =w call $printf(l $ctoqbestr, w 0) |
| 21 | + call $ps(s %p8) |
| 22 | + %r1 =w call $puts(l $emptystr) |
| 23 | + ret |
| 24 | +} |
| 25 | +export |
| 26 | +function $qfn1(w %p0, s %p1, :fi1 %p2) { |
| 27 | +@start |
| 28 | + %r0 =w call $printf(l $ctoqbestr, w 1) |
| 29 | + call $pw(w %p0) |
| 30 | + call $ps(s %p1) |
| 31 | + call $pfi1(l %p2) |
| 32 | + %r1 =w call $puts(l $emptystr) |
| 33 | + ret |
| 34 | +} |
| 35 | +export |
| 36 | +function $qfn2(w %p0, :fi2 %p1, s %p2) { |
| 37 | +@start |
| 38 | + %r0 =w call $printf(l $ctoqbestr, w 2) |
| 39 | + call $pw(w %p0) |
| 40 | + call $pfi2(l %p1) |
| 41 | + call $ps(s %p2) |
| 42 | + %r1 =w call $puts(l $emptystr) |
| 43 | + ret |
| 44 | +} |
| 45 | +export |
| 46 | +function $qfn3(w %p0, s %p1, :fi3 %p2) { |
| 47 | +@start |
| 48 | + %r0 =w call $printf(l $ctoqbestr, w 3) |
| 49 | + call $pw(w %p0) |
| 50 | + call $ps(s %p1) |
| 51 | + call $pfi3(l %p2) |
| 52 | + %r1 =w call $puts(l $emptystr) |
| 53 | + ret |
| 54 | +} |
| 55 | +export |
| 56 | +function $qfn4(:ss %p0) { |
| 57 | +@start |
| 58 | + %r0 =w call $printf(l $ctoqbestr, w 4) |
| 59 | + call $pss(l %p0) |
| 60 | + %r1 =w call $puts(l $emptystr) |
| 61 | + ret |
| 62 | +} |
| 63 | +export |
| 64 | +function $qfn5(d %p0, d %p1, d %p2, d %p3, d %p4, d %p5, d %p6, :ss %p7, s %p8, l %p9) { |
| 65 | +@start |
| 66 | + %r0 =w call $printf(l $ctoqbestr, w 5) |
| 67 | + call $pss(l %p7) |
| 68 | + call $ps(s %p8) |
| 69 | + call $pl(l %p9) |
| 70 | + %r1 =w call $puts(l $emptystr) |
| 71 | + ret |
| 72 | +} |
| 73 | +export |
| 74 | +function $qfn6(:lb %p0) { |
| 75 | +@start |
| 76 | + %r0 =w call $printf(l $ctoqbestr, w 6) |
| 77 | + call $plb(l %p0) |
| 78 | + %r1 =w call $puts(l $emptystr) |
| 79 | + ret |
| 80 | +} |
| 81 | +export |
| 82 | +function $qfn7(w %p0, w %p1, w %p2, w %p3, w %p4, w %p5, w %p6, :lb %p7) { |
| 83 | +@start |
| 84 | + %r0 =w call $printf(l $ctoqbestr, w 7) |
| 85 | + call $plb(l %p7) |
| 86 | + %r1 =w call $puts(l $emptystr) |
| 87 | + ret |
| 88 | +} |
| 89 | +export |
| 90 | +function $qfn8(w %p0, w %p1, w %p2, w %p3, w %p4, w %p5, w %p6, w %p7, :lb %p8) { |
| 91 | +@start |
| 92 | + %r0 =w call $printf(l $ctoqbestr, w 8) |
| 93 | + call $plb(l %p8) |
| 94 | + %r1 =w call $puts(l $emptystr) |
| 95 | + ret |
| 96 | +} |
| 97 | +export |
| 98 | +function $qfn9(:big %p0) { |
| 99 | +@start |
| 100 | + %r0 =w call $printf(l $ctoqbestr, w 9) |
| 101 | + call $pbig(l %p0) |
| 102 | + %r1 =w call $puts(l $emptystr) |
| 103 | + ret |
| 104 | +} |
| 105 | +export |
| 106 | +function $qfn10(w %p0, w %p1, w %p2, w %p3, w %p4, w %p5, w %p6, w %p7, :big %p8, s %p9, l %p10) { |
| 107 | +@start |
| 108 | + %r0 =w call $printf(l $ctoqbestr, w 10) |
| 109 | + call $pbig(l %p8) |
| 110 | + call $ps(s %p9) |
| 111 | + call $pl(l %p10) |
| 112 | + %r1 =w call $puts(l $emptystr) |
| 113 | + ret |
| 114 | +} |
| 115 | + |
| 116 | +export |
| 117 | +function w $main() { |
| 118 | +@start |
| 119 | + |
| 120 | + call $cfn0(s 0, s 0, s 0, s 0, s 0, s 0, s 0, s 0, s s_9.9) |
| 121 | + call $cfn1(w 1, s s_2.2, :fi1 $fi1) |
| 122 | + call $cfn2(w 1, :fi2 $fi2, s s_3.3) |
| 123 | + call $cfn3(w 1, s s_2.2, :fi3 $fi3) |
| 124 | + call $cfn4(:ss $ss) |
| 125 | + call $cfn5(d 0, d 0, d 0, d 0, d 0, d 0, d 0, :ss $ss, s s_9.9, l 10) |
| 126 | + call $cfn6(:lb $lb) |
| 127 | + call $cfn7(w 0, w 0, w 0, w 0, w 0, w 0, w 0, :lb $lb) |
| 128 | + call $cfn8(w 0, w 0, w 0, w 0, w 0, w 0, w 0, w 0, :lb $lb) |
| 129 | + call $cfn9(:big $big) |
| 130 | + call $cfn10(w 0, w 0, w 0, w 0, w 0, w 0, w 0, w 0, :big $big, s s_10.10, l 11) |
| 131 | + |
| 132 | + ret 0 |
| 133 | +} |
| 134 | + |
| 135 | +# >>> driver |
| 136 | +# #include <stdio.h> |
| 137 | +# typedef struct { short h; float s; } Sfi1; |
| 138 | +# typedef struct { float s; int w; } Sfi2; |
| 139 | +# typedef struct { float s; union { int w; } u; } Sfi3; |
| 140 | +# typedef struct { float s0, s1; } Sss; |
| 141 | +# typedef struct { float s; double d; } Ssd; |
| 142 | +# typedef struct { int w0, w1; } Sww; |
| 143 | +# typedef struct { long l; char b; } Slb; |
| 144 | +# typedef struct { char b[17]; } Sbig; |
| 145 | +# Sfi1 zfi1, fi1 = { -123, 4.56 }; |
| 146 | +# Sfi2 zfi2, fi2 = { 1.23, 456 }; |
| 147 | +# Sfi3 zfi3, fi3 = { 3.45, 567 }; |
| 148 | +# Sss zss, ss = { 1.23, 45.6 }; |
| 149 | +# Ssd zsd, sd = { 2.34, 5.67 }; |
| 150 | +# Sww zww, ww = { -123, -456 }; |
| 151 | +# Slb zlb, lb = { 123, 'z' }; |
| 152 | +# Sbig zbig, big = { "abcdefhijklmnopqr" }; |
| 153 | +# void pfi1(Sfi1 *s) { printf(" { %d, %g }", s->h, s->s); } |
| 154 | +# void pfi2(Sfi2 *s) { printf(" { %g, %d }", s->s, s->w); } |
| 155 | +# void pfi3(Sfi3 *s) { printf(" { %g, %d }", s->s, s->u.w); } |
| 156 | +# void pss(Sss *s) { printf(" { %g, %g }", s->s0, s->s1); } |
| 157 | +# void psd(Ssd *s) { printf(" { %g, %g }", s->s, s->d); } |
| 158 | +# void pww(Sww *s) { printf(" { %d, %d }", s->w0, s->w1); } |
| 159 | +# void plb(Slb *s) { printf(" { %ld, '%c' }", s->l, s->b); } |
| 160 | +# void pbig(Sbig *s) { printf(" \"%.17s\"", s->b); } |
| 161 | +# void pw(int w) { printf(" %d", w); } |
| 162 | +# void pl(long l) { printf(" %ld", l); } |
| 163 | +# void ps(float s) { printf(" %g", s); } |
| 164 | +# void pd(double d) { printf(" %g", d); } |
| 165 | +# /* --------------------------- */ |
| 166 | +# extern void qfn0(float, float, float, float, float, float, float, float, float); |
| 167 | +# void cfn0(float p0, float p1, float p2, float p3, float p4, float p5, float p6, float p7, float p8) { |
| 168 | +# printf("qbe->c(%d)", 0); |
| 169 | +# ps(p8); puts(""); |
| 170 | +# qfn0(p0, p1, p2, p3, p4, p5, p6, p7, p8); |
| 171 | +# } |
| 172 | +# extern void qfn1(int, float, Sfi1); |
| 173 | +# void cfn1(int p0, float p1, Sfi1 p2) { |
| 174 | +# printf("qbe->c(%d)", 1); |
| 175 | +# pw(p0); ps(p1); pfi1(&p2); puts(""); |
| 176 | +# qfn1(p0, p1, p2); |
| 177 | +# } |
| 178 | +# extern void qfn2(int, Sfi2, float); |
| 179 | +# void cfn2(int p0, Sfi2 p1, float p2) { |
| 180 | +# printf("qbe->c(%d)", 2); |
| 181 | +# pw(p0); pfi2(&p1); ps(p2); puts(""); |
| 182 | +# qfn2(p0, p1, p2); |
| 183 | +# } |
| 184 | +# extern void qfn3(int, float, Sfi3); |
| 185 | +# void cfn3(int p0, float p1, Sfi3 p2) { |
| 186 | +# printf("qbe->c(%d)", 3); |
| 187 | +# pw(p0); ps(p1); pfi3(&p2); puts(""); |
| 188 | +# qfn3(p0, p1, p2); |
| 189 | +# } |
| 190 | +# extern void qfn4(Sss); |
| 191 | +# void cfn4(Sss p0) { |
| 192 | +# printf("qbe->c(%d)", 4); |
| 193 | +# pss(&p0); puts(""); |
| 194 | +# qfn4(p0); |
| 195 | +# } |
| 196 | +# extern void qfn5(double, double, double, double, double, double, double, Sss, float, long); |
| 197 | +# void cfn5(double p0, double p1, double p2, double p3, double p4, double p5, double p6, Sss p7, float p8, long p9) { |
| 198 | +# printf("qbe->c(%d)", 5); |
| 199 | +# pss(&p7); ps(p8); pl(p9); puts(""); |
| 200 | +# qfn5(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9); |
| 201 | +# } |
| 202 | +# extern void qfn6(Slb); |
| 203 | +# void cfn6(Slb p0) { |
| 204 | +# printf("qbe->c(%d)", 6); |
| 205 | +# plb(&p0); puts(""); |
| 206 | +# qfn6(p0); |
| 207 | +# } |
| 208 | +# extern void qfn7(int, int, int, int, int, int, int, Slb); |
| 209 | +# void cfn7(int p0, int p1, int p2, int p3, int p4, int p5, int p6, Slb p7) { |
| 210 | +# printf("qbe->c(%d)", 7); |
| 211 | +# plb(&p7); puts(""); |
| 212 | +# qfn7(p0, p1, p2, p3, p4, p5, p6, p7); |
| 213 | +# } |
| 214 | +# extern void qfn8(int, int, int, int, int, int, int, int, Slb); |
| 215 | +# void cfn8(int p0, int p1, int p2, int p3, int p4, int p5, int p6, int p7, Slb p8) { |
| 216 | +# printf("qbe->c(%d)", 8); |
| 217 | +# plb(&p8); puts(""); |
| 218 | +# qfn8(p0, p1, p2, p3, p4, p5, p6, p7, p8); |
| 219 | +# } |
| 220 | +# extern void qfn9(Sbig); |
| 221 | +# void cfn9(Sbig p0) { |
| 222 | +# printf("qbe->c(%d)", 9); |
| 223 | +# pbig(&p0); puts(""); |
| 224 | +# qfn9(p0); |
| 225 | +# } |
| 226 | +# extern void qfn10(int, int, int, int, int, int, int, int, Sbig, float, long); |
| 227 | +# void cfn10(int p0, int p1, int p2, int p3, int p4, int p5, int p6, int p7, Sbig p8, float p9, long p10) { |
| 228 | +# printf("qbe->c(%d)", 10); |
| 229 | +# pbig(&p8); ps(p9); pl(p10); puts(""); |
| 230 | +# qfn10(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); |
| 231 | +# } |
| 232 | +# <<< |
| 233 | + |
| 234 | +# >>> output |
| 235 | +# qbe->c(0) 9.9 |
| 236 | +# c->qbe(0) 9.9 |
| 237 | +# qbe->c(1) 1 2.2 { -123, 4.56 } |
| 238 | +# c->qbe(1) 1 2.2 { -123, 4.56 } |
| 239 | +# qbe->c(2) 1 { 1.23, 456 } 3.3 |
| 240 | +# c->qbe(2) 1 { 1.23, 456 } 3.3 |
| 241 | +# qbe->c(3) 1 2.2 { 3.45, 567 } |
| 242 | +# c->qbe(3) 1 2.2 { 3.45, 567 } |
| 243 | +# qbe->c(4) { 1.23, 45.6 } |
| 244 | +# c->qbe(4) { 1.23, 45.6 } |
| 245 | +# qbe->c(5) { 1.23, 45.6 } 9.9 10 |
| 246 | +# c->qbe(5) { 1.23, 45.6 } 9.9 10 |
| 247 | +# qbe->c(6) { 123, 'z' } |
| 248 | +# c->qbe(6) { 123, 'z' } |
| 249 | +# qbe->c(7) { 123, 'z' } |
| 250 | +# c->qbe(7) { 123, 'z' } |
| 251 | +# qbe->c(8) { 123, 'z' } |
| 252 | +# c->qbe(8) { 123, 'z' } |
| 253 | +# qbe->c(9) "abcdefhijklmnopqr" |
| 254 | +# c->qbe(9) "abcdefhijklmnopqr" |
| 255 | +# qbe->c(10) "abcdefhijklmnopqr" 10.1 11 |
| 256 | +# c->qbe(10) "abcdefhijklmnopqr" 10.1 11 |
| 257 | +# <<< |