| @@ -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 | # <<< |