# HG changeset patch # User Michael Pavone # Date 1549473204 28800 # Node ID 89ddf41a50bb7f175f6972dde9058a9111ea880a # Parent cd6f4cea97b60b07b71534e22054ad110fd3730d Optimization of flag calculation for flags that just copy a bit from the result in CPU DSL diff -r cd6f4cea97b6 -r 89ddf41a50bb cpu_dsl.py --- a/cpu_dsl.py Wed Feb 06 08:54:56 2019 -0800 +++ b/cpu_dsl.py Wed Feb 06 09:13:24 2019 -0800 @@ -333,6 +333,7 @@ autoUpdate, explicit = prog.flags.parseFlagUpdate(params[0]) output = [] parity = None + directFlags = {} for flag in autoUpdate: calc = prog.flags.flagCalc[flag] calc,_,resultBit = calc.partition('-') @@ -365,13 +366,10 @@ resultBit = int(resultBit) + prog.paramSize(prog.lastDst) - 8 if type(storage) is tuple: reg,storageBit = storage - reg = prog.resolveParam(reg, None, {}) if storageBit == resultBit: - #TODO: optimize this case - output.append('\n\t{reg} = ({reg} & ~{mask}U) | ({res} & {mask}U);'.format( - reg = reg, mask = 1 << resultBit, res = myRes - )) + directFlags.setdefault((reg, myRes), []).append(resultBit) else: + reg = prog.resolveParam(reg, None, {}) if resultBit > storageBit: op = '>>' shift = resultBit - storageBit @@ -416,6 +414,18 @@ parityDst = name else: raise Exception('Unknown flag calc type: ' + calc) + for reg, myRes in directFlags: + bits = directFlags[(reg, myRes)] + resolved = prog.resolveParam(reg, None, {}) + if len(bits) == len(prog.flags.storageToFlags[reg]): + output.append('\n\t{reg} = {res};'.format(reg = resolved, res = myRes)) + else: + mask = 0 + for bit in bits: + mask |= 1 << bit + output.append('\n\t{reg} = ({reg} & ~{mask}U) | ({res} & {mask}U);'.format( + reg = resolved, mask = mask, res = myRes + )) if prog.carryFlowDst: if prog.lastOp.op != 'cmp': output.append('\n\t{dst} = {tmpdst};'.format(dst = prog.resolveParam(prog.lastDst, prog.currentScope, {}), tmpdst = prog.carryFlowDst)) @@ -1090,6 +1100,7 @@ self.flagCalc = {} self.flagStorage = {} self.flagReg = None + self.storageToFlags = {} self.maxBit = -1 def processLine(self, parts): @@ -1110,6 +1121,8 @@ self.flagBits[flag] = bit self.flagCalc[flag] = calc self.flagStorage[flag] = storage + storage,_,storebit = storage.partition('.') + self.storageToFlags.setdefault(storage, []).append((storebit, flag)) return self def getStorage(self, flag):