| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- #!/usr/bin/python3
- # support script to create
- # the abi8.ssa test
- def ctype(arg):
- if arg[0] == 'p': return ctype(arg[1:])
- if arg[0] == ':': return 'S' + arg[1:]
- return {'w':'int', 'l':'long',
- 's':'float', 'd':'double'}[arg]
- def cparam(iarg):
- return ctype(iarg[1]) + ' p' + str(iarg[0])
- def gencfn(id, args):
- out = '# extern void qfn' + id + '('
- out += ', '.join(map(ctype, args)) + ');\n'
- out += '# void cfn' + id + '('
- out += ', '.join(map(cparam, enumerate(args)))
- out += ') {\n'
- out += '# \tprintf("qbe->c(%d)", ' + id + ');\n'
- out += '# \t'
- for (i, arg) in enumerate(args):
- if arg[0] != 'p': continue
- ty = arg[1:]
- if ty[0] == ':':
- out += 'p' + ty[1:] + '(&'
- else:
- out += 'p' + ty + '('
- out += 'p' + str(i) + '); '
- out += 'puts("");\n'
- out += '# \tqfn' + id + '('
- out += ', '.join('p'+str(i) for i in range(len(args)))
- out += ');\n'
- out += '# }\n'
- return out
- def qparam(iarg):
- ty = iarg[1][1:] if iarg[1][0] == 'p' else iarg[1]
- return ty + ' %p' + str(iarg[0])
- def genqfn(id, args):
- out = 'export\nfunction $qfn' + id + '('
- out += ', '.join(map(qparam, enumerate(args)))
- out += ') {\n'
- out += '@start\n'
- out += '\t%r0 =w call $printf(l $ctoqbestr, w ' + id + ')\n'
- for (i, arg) in enumerate(args):
- if arg[0] != 'p': continue
- ty = arg[1:]
- if ty[0] == ':':
- out += '\tcall $p' + ty[1:]
- out += '(l %p' + str(i) + ')\n'
- else:
- out += '\tcall $p' + ty
- out += '(' + ty + ' %p' + str(i) + ')\n'
- out += '\t%r1 =w call $puts(l $emptystr)\n'
- out += '\tret\n'
- out += '}\n'
- return out
- def carg(iarg):
- i, arg = iarg
- print = arg[0] == 'p'
- ty = arg if not print else arg[1:]
- if ty[0] == ':':
- if print:
- return ty + ' $' + ty[1:]
- else:
- return ty + ' $z' + ty[1:]
- if not print:
- return ty + ' 0'
- if ty == 'w' or ty == 'l':
- return ty + ' ' + str(i+1)
- if ty == 's' or ty == 'd':
- flt = str(i+1) + '.' + str(i+1)
- return ty + ' ' + ty + '_' + flt
- def genmaincall(id, args):
- out = '\tcall $cfn' + id + '('
- out += ', '.join(map(carg, enumerate(args)))
- out += ')\n'
- return out
- def gen(tvec):
- for i, t in enumerate(tvec):
- print(genqfn(str(i), t), end='')
- print('')
- for i, t in enumerate(tvec):
- print(genmaincall(str(i), t), end='')
- print('')
- for i, t in enumerate(tvec):
- print(gencfn(str(i), t), end='')
- TVEC = [
- ['s']*8 + ['ps'],
- ['pw', 'ps', 'p:fi1'],
- ['pw', 'p:fi2', 'ps'],
- ['pw', 'ps', 'p:fi3'],
- ['p:ss'],
- ['d']*7 + ['p:ss', 'ps', 'pl'],
- ['p:lb'],
- ['w']*7 + ['p:lb'],
- ['w']*8 + ['p:lb'],
- [ 'p:big' ],
- ['w']*8 + ['p:big', 'ps', 'pl'],
- ]
- if __name__ == '__main__':
- gen(TVEC)
|