diff -r bc702c8c3881 -r 06894dd0d0be src/arch/isa_parser.py --- a/src/arch/isa_parser.py Sat Apr 21 15:08:35 2012 -0500 +++ b/src/arch/isa_parser.py Sat Apr 21 15:09:58 2012 -0500 @@ -520,7 +520,11 @@ def makeConstructor(self): c = '' if self.is_src: + if self.read_condition: + c += '\n\tif (%s) {' % (self.read_condition) c += '\n\t_srcRegIdx[_numSrcRegs++] = %s;'% (self.reg_spec) + if self.read_condition: + c += '\n\t}' if self.is_dest: c += '\n\t_destRegIdx[%d] = %s;' % \ (self.dest_reg_idx, self.reg_spec) @@ -532,7 +536,13 @@ if self.read_code != None: return self.buildReadCode('readIntRegOperand') int_reg_val = 'xc->readIntRegOperand(this, srcRegIndex++)' - return '%s = %s;\n' % (self.base_name, int_reg_val) + c = '' + if self.read_condition: + c += 'if (%s) {\n' % (self.read_condition) + c += '%s = %s;\n' % (self.base_name, int_reg_val) + if self.read_condition: + c += '}\n' + return c def makeWrite(self): if (self.ctype == 'float' or self.ctype == 'double'): @@ -1797,6 +1807,14 @@ else: write_code = None if len(val) > 7: + read_condition = val[7] + else: + read_condition = None + if len(val) > 8: + write_condition = val[8] + else: + write_condition = None + if len(val) > 9: error(lineno, 'error: too many attributes for operand "%s"' % base_cls_name) @@ -1823,8 +1841,8 @@ makeList(src_flags), makeList(dest_flags)) # Accumulate attributes of new operand class in tmp_dict tmp_dict = {} - attrList = ['reg_spec', 'flags', 'sort_pri', - 'read_code', 'write_code'] + attrList = ['reg_spec', 'flags', 'sort_pri', 'read_code', + 'write_code', 'read_condition', 'write_condition'] if dflt_ext: dflt_ctype = self.operandTypeMap[dflt_ext] attrList.extend(['dflt_ctype', 'dflt_ext'])