abi5.ssa 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. # returning structs from C
  2. type :st1 = { b 17 }
  3. type :st2 = { w }
  4. type :st3 = { s, w }
  5. type :st4 = { w, d }
  6. type :st5 = { s, l }
  7. type :st6 = { b 16 }
  8. type :st7 = { s, d }
  9. type :st8 = { w 4 }
  10. type :un9 = { { b } { s } }
  11. type :st9 = { w, :un9 }
  12. type :sta = { b, s }
  13. type :stb = { b, b, s }
  14. data $fmt1 = { b "t1: %s\n", b 0 }
  15. data $fmt2 = { b "t2: %d\n", b 0 }
  16. data $fmt3 = { b "t3: %f %d\n", b 0 }
  17. data $fmt4 = { b "t4: %d %f\n", b 0 }
  18. data $fmt5 = { b "t5: %f %lld\n", b 0 }
  19. data $fmt6 = { b "t6: %s\n", b 0 }
  20. data $fmt7 = { b "t7: %f %f\n", b 0 }
  21. data $fmt8 = { b "t8: %d %d %d %d\n", b 0 }
  22. data $fmt9 = { b "t9: %d %f\n", b 0 }
  23. data $fmta = { b "ta: %d %f\n", b 0 }
  24. data $fmtb = { b "tb: %d %d %f\n", b 0 }
  25. export
  26. function $test() {
  27. @start
  28. %r1 =:st1 call $t1()
  29. %i1 =w call $printf(l $fmt1, ..., l %r1)
  30. %r2 =:st2 call $t2()
  31. %w2 =w loadw %r2
  32. %i2 =w call $printf(l $fmt2, ..., w %w2)
  33. %r3 =:st3 call $t3()
  34. %s3 =s loads %r3
  35. %r34 =l add %r3, 4
  36. %w3 =w loadw %r34
  37. %p3 =d exts %s3
  38. %i3 =w call $printf(l $fmt3, ..., d %p3, w %w3)
  39. %r4 =:st4 call $t4()
  40. %w4 =w loadw %r4
  41. %r48 =l add 8, %r4
  42. %d4 =d loadd %r48
  43. %i4 =w call $printf(l $fmt4, ..., w %w4, d %d4)
  44. %r5 =:st5 call $t5()
  45. %s5 =s loads %r5
  46. %d5 =d exts %s5
  47. %r58 =l add %r5, 8
  48. %l5 =l loadl %r58
  49. %i5 =w call $printf(l $fmt5, ..., d %d5, l %l5)
  50. %r6 =:st6 call $t6()
  51. %i6 =w call $printf(l $fmt6, ..., l %r6)
  52. %r7 =:st7 call $t7()
  53. %s7 =s loads %r7
  54. %d71 =d exts %s7
  55. %r78 =l add %r7, 8
  56. %d72 =d loadd %r78
  57. %i7 =w call $printf(l $fmt7, ..., d %d71, d %d72)
  58. %r8 =:st8 call $t8()
  59. %r84 =l add 4, %r8
  60. %r88 =l add 4, %r84
  61. %r812 =l add 4, %r88
  62. %w81 =w loadw %r8
  63. %w82 =w loadw %r84
  64. %w83 =w loadw %r88
  65. %w84 =w loadw %r812
  66. %i8 =w call $printf(l $fmt8, ..., w %w81, w %w82, w %w83, w %w84)
  67. %r9 =:st9 call $t9()
  68. %r94 =l add 4, %r9
  69. %w9 =w loadw %r9
  70. %s9 =s loads %r94
  71. %d9 =d exts %s9
  72. %i9 =w call $printf(l $fmt9, ..., w %w9, d %d9)
  73. %ra =:sta call $ta()
  74. %ra4 =l add 4, %ra
  75. %wa =w loadsb %ra
  76. %sa =s loads %ra4
  77. %da =d exts %sa
  78. %ia =w call $printf(l $fmta, ..., w %wa, d %da)
  79. %rb =:stb call $tb()
  80. %rb1 =l add 1, %rb
  81. %rb4 =l add 4, %rb
  82. %w0b =w loadsb %rb
  83. %w1b =w loadsb %rb1
  84. %sb =s loads %rb4
  85. %db =d exts %sb
  86. %ib =w call $printf(l $fmtb, ..., w %w0b, w %w1b, d %db)
  87. ret
  88. }
  89. # >>> driver
  90. # typedef struct { char t[17]; } st1;
  91. # typedef struct { int i; } st2;
  92. # typedef struct { float f; int i; } st3;
  93. # typedef struct { int i; double d; } st4;
  94. # typedef struct { float f; long l; } st5;
  95. # typedef struct { char t[16]; } st6;
  96. # typedef struct { float f; double d; } st7;
  97. # typedef struct { int i[4]; } st8;
  98. # typedef struct { int i; union { char c; float f; } u; } st9;
  99. # typedef struct { char c; float f; } sta;
  100. # typedef struct { char c0, c1; float f; } stb;
  101. # extern void test(void);
  102. # st1 t1() { return (st1){"abcdefghijklmnop"}; }
  103. # st2 t2() { return (st2){2}; }
  104. # st3 t3() { return (st3){3.0,30}; }
  105. # st4 t4() { return (st4){4,-40}; }
  106. # st5 t5() { return (st5){5.5,-55}; }
  107. # st6 t6() { return (st6){"abcdefghijklmno"}; }
  108. # st7 t7() { return (st7){7.77,77.7}; }
  109. # st8 t8() { return (st8){-8,88,-888,8888}; }
  110. # st9 t9() { return (st9){9,{.f=9.9}}; }
  111. # sta ta() { return (sta){-10,10.1}; }
  112. # stb tb() { return (stb){-1,11,11.11}; }
  113. # int main() { test(); return 0; }
  114. # <<<
  115. # >>> output
  116. # t1: abcdefghijklmnop
  117. # t2: 2
  118. # t3: 3.000000 30
  119. # t4: 4 -40.000000
  120. # t5: 5.500000 -55
  121. # t6: abcdefghijklmno
  122. # t7: 7.770000 77.700000
  123. # t8: -8 88 -888 8888
  124. # t9: 9 9.900000
  125. # ta: -10 10.100000
  126. # tb: -1 11 11.110000
  127. # <<<