abi8.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #!/usr/bin/python3
  2. # support script to create
  3. # the abi8.ssa test
  4. def ctype(arg):
  5. if arg[0] == 'p': return ctype(arg[1:])
  6. if arg[0] == ':': return 'S' + arg[1:]
  7. return {'w':'int', 'l':'long',
  8. 's':'float', 'd':'double'}[arg]
  9. def cparam(iarg):
  10. return ctype(iarg[1]) + ' p' + str(iarg[0])
  11. def gencfn(id, args):
  12. out = '# extern void qfn' + id + '('
  13. out += ', '.join(map(ctype, args)) + ');\n'
  14. out += '# void cfn' + id + '('
  15. out += ', '.join(map(cparam, enumerate(args)))
  16. out += ') {\n'
  17. out += '# \tprintf("qbe->c(%d)", ' + id + ');\n'
  18. out += '# \t'
  19. for (i, arg) in enumerate(args):
  20. if arg[0] != 'p': continue
  21. ty = arg[1:]
  22. if ty[0] == ':':
  23. out += 'p' + ty[1:] + '(&'
  24. else:
  25. out += 'p' + ty + '('
  26. out += 'p' + str(i) + '); '
  27. out += 'puts("");\n'
  28. out += '# \tqfn' + id + '('
  29. out += ', '.join('p'+str(i) for i in range(len(args)))
  30. out += ');\n'
  31. out += '# }\n'
  32. return out
  33. def qparam(iarg):
  34. ty = iarg[1][1:] if iarg[1][0] == 'p' else iarg[1]
  35. return ty + ' %p' + str(iarg[0])
  36. def genqfn(id, args):
  37. out = 'export\nfunction $qfn' + id + '('
  38. out += ', '.join(map(qparam, enumerate(args)))
  39. out += ') {\n'
  40. out += '@start\n'
  41. out += '\t%r0 =w call $printf(l $ctoqbestr, w ' + id + ')\n'
  42. for (i, arg) in enumerate(args):
  43. if arg[0] != 'p': continue
  44. ty = arg[1:]
  45. if ty[0] == ':':
  46. out += '\tcall $p' + ty[1:]
  47. out += '(l %p' + str(i) + ')\n'
  48. else:
  49. out += '\tcall $p' + ty
  50. out += '(' + ty + ' %p' + str(i) + ')\n'
  51. out += '\t%r1 =w call $puts(l $emptystr)\n'
  52. out += '\tret\n'
  53. out += '}\n'
  54. return out
  55. def carg(iarg):
  56. i, arg = iarg
  57. print = arg[0] == 'p'
  58. ty = arg if not print else arg[1:]
  59. if ty[0] == ':':
  60. if print:
  61. return ty + ' $' + ty[1:]
  62. else:
  63. return ty + ' $z' + ty[1:]
  64. if not print:
  65. return ty + ' 0'
  66. if ty == 'w' or ty == 'l':
  67. return ty + ' ' + str(i+1)
  68. if ty == 's' or ty == 'd':
  69. flt = str(i+1) + '.' + str(i+1)
  70. return ty + ' ' + ty + '_' + flt
  71. def genmaincall(id, args):
  72. out = '\tcall $cfn' + id + '('
  73. out += ', '.join(map(carg, enumerate(args)))
  74. out += ')\n'
  75. return out
  76. def gen(tvec):
  77. for i, t in enumerate(tvec):
  78. print(genqfn(str(i), t), end='')
  79. print('')
  80. for i, t in enumerate(tvec):
  81. print(genmaincall(str(i), t), end='')
  82. print('')
  83. for i, t in enumerate(tvec):
  84. print(gencfn(str(i), t), end='')
  85. TVEC = [
  86. ['s']*8 + ['ps'],
  87. ['pw', 'ps', 'p:fi1'],
  88. ['pw', 'p:fi2', 'ps'],
  89. ['pw', 'ps', 'p:fi3'],
  90. ['p:ss'],
  91. ['d']*7 + ['p:ss', 'ps', 'pl'],
  92. ['p:lb'],
  93. ['w']*7 + ['p:lb'],
  94. ['w']*8 + ['p:lb'],
  95. [ 'p:big' ],
  96. ['w']*8 + ['p:big', 'ps', 'pl'],
  97. ]
  98. if __name__ == '__main__':
  99. gen(TVEC)