Mercurial > repos > blastem
comparison cpu_dsl.py @ 1750:01236179fc71
Optimization to memory access in new Z80 core
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 09 Feb 2019 11:34:31 -0800 |
parents | e4fe5a450d05 |
children | d6d4c006a7b3 |
comparison
equal
deleted
inserted
replaced
1749:e4fe5a450d05 | 1750:01236179fc71 |
---|---|
1030 self.regToArray = {} | 1030 self.regToArray = {} |
1031 | 1031 |
1032 def addReg(self, name, size): | 1032 def addReg(self, name, size): |
1033 self.regs[name] = size | 1033 self.regs[name] = size |
1034 | 1034 |
1035 def addPointer(self, name, size): | 1035 def addPointer(self, name, size, count): |
1036 self.pointers[name] = size | 1036 self.pointers[name] = (size, count) |
1037 | 1037 |
1038 def addRegArray(self, name, size, regs): | 1038 def addRegArray(self, name, size, regs): |
1039 self.regArrays[name] = (size, regs) | 1039 self.regArrays[name] = (size, regs) |
1040 idx = 0 | 1040 idx = 0 |
1041 if not type(regs) is int: | 1041 if not type(regs) is int: |
1068 def isNamedArray(self, array): | 1068 def isNamedArray(self, array): |
1069 return array in self.regArrays and type(self.regArrays[array][1]) is int | 1069 return array in self.regArrays and type(self.regArrays[array][1]) is int |
1070 | 1070 |
1071 def processLine(self, parts): | 1071 def processLine(self, parts): |
1072 if len(parts) == 3: | 1072 if len(parts) == 3: |
1073 self.addRegArray(parts[0], int(parts[1]), int(parts[2])) | 1073 if parts[1].startswith('ptr'): |
1074 self.addPointer(parts[0], parts[1][3:], int(parts[2])) | |
1075 else: | |
1076 self.addRegArray(parts[0], int(parts[1]), int(parts[2])) | |
1074 elif len(parts) > 2: | 1077 elif len(parts) > 2: |
1075 self.addRegArray(parts[0], int(parts[1]), parts[2:]) | 1078 self.addRegArray(parts[0], int(parts[1]), parts[2:]) |
1076 else: | 1079 else: |
1077 if parts[1].startswith('ptr'): | 1080 if parts[1].startswith('ptr'): |
1078 self.addPointer(parts[0], parts[1][3:]) | 1081 self.addPointer(parts[0], parts[1][3:], 1) |
1079 else: | 1082 else: |
1080 self.addReg(parts[0], int(parts[1])) | 1083 self.addReg(parts[0], int(parts[1])) |
1081 return self | 1084 return self |
1082 | 1085 |
1083 def writeHeader(self, otype, hFile): | 1086 def writeHeader(self, otype, hFile): |
1084 fieldList = [] | 1087 fieldList = [] |
1085 for pointer in self.pointers: | 1088 for pointer in self.pointers: |
1086 stars = '*' | 1089 stars = '*' |
1087 ptype = self.pointers[pointer] | 1090 ptype, count = self.pointers[pointer] |
1088 while ptype.startswith('ptr'): | 1091 while ptype.startswith('ptr'): |
1089 stars += '*' | 1092 stars += '*' |
1090 ptype = ptype[3:] | 1093 ptype = ptype[3:] |
1091 if ptype.isdigit(): | 1094 if ptype.isdigit(): |
1092 ptype = 'uint{sz}_t'.format(sz=ptype) | 1095 ptype = 'uint{sz}_t'.format(sz=ptype) |
1093 hFile.write('\n\t{ptype} {stars}{nm};'.format(nm=pointer, ptype=ptype, stars=stars)) | 1096 if count > 1: |
1097 arr = '[{n}]'.format(n=count) | |
1098 else: | |
1099 arr = '' | |
1100 hFile.write('\n\t{ptype} {stars}{nm}{arr};'.format(nm=pointer, ptype=ptype, stars=stars, arr=arr)) | |
1094 for reg in self.regs: | 1101 for reg in self.regs: |
1095 if not self.isRegArrayMember(reg): | 1102 if not self.isRegArrayMember(reg): |
1096 fieldList.append((self.regs[reg], 1, reg)) | 1103 fieldList.append((self.regs[reg], 1, reg)) |
1097 for arr in self.regArrays: | 1104 for arr in self.regArrays: |
1098 size,regs = self.regArrays[arr] | 1105 size,regs = self.regArrays[arr] |