isa_parser.py (10934:5af8f40d8f2c) isa_parser.py (10935:acd48ddd725f)
1# Copyright (c) 2014 ARM Limited
2# All rights reserved
3#
4# The license below extends only to copyright in the software and shall
5# not be construed as granting a license to any other intellectual
6# property including but not limited to intellectual property relating
7# to a hardware implementation of the functionality of the software
8# licensed hereunder. You may use the software subject to the license

--- 501 unchanged lines hidden (view full) ---

510 return 0
511
512 def isIntReg(self):
513 return 0
514
515 def isCCReg(self):
516 return 0
517
1# Copyright (c) 2014 ARM Limited
2# All rights reserved
3#
4# The license below extends only to copyright in the software and shall
5# not be construed as granting a license to any other intellectual
6# property including but not limited to intellectual property relating
7# to a hardware implementation of the functionality of the software
8# licensed hereunder. You may use the software subject to the license

--- 501 unchanged lines hidden (view full) ---

510 return 0
511
512 def isIntReg(self):
513 return 0
514
515 def isCCReg(self):
516 return 0
517
518 def isVectorReg(self):
519 return 0
520
521 def isControlReg(self):
522 return 0
523
524 def isPCState(self):
525 return 0
526
527 def isPCPart(self):
528 return self.isPCState() and self.reg_spec

--- 220 unchanged lines hidden (view full) ---

749 {
750 %s final_val = %s;
751 xc->setCCRegOperand(this, %s, final_val);\n
752 if (traceData) { traceData->setData(final_val); }
753 }''' % (wcond, self.ctype, self.base_name, windex)
754
755 return wb
756
518 def isControlReg(self):
519 return 0
520
521 def isPCState(self):
522 return 0
523
524 def isPCPart(self):
525 return self.isPCState() and self.reg_spec

--- 220 unchanged lines hidden (view full) ---

746 {
747 %s final_val = %s;
748 xc->setCCRegOperand(this, %s, final_val);\n
749 if (traceData) { traceData->setData(final_val); }
750 }''' % (wcond, self.ctype, self.base_name, windex)
751
752 return wb
753
757class VectorRegOperand(Operand):
758 def isReg(self):
759 return 1
760
761 def isVectorReg(self):
762 return 1
763
764 def __init__(self, parser, full_name, ext, is_src, is_dest):
765 ## Vector registers are always treated as source registers since
766 ## not the whole of them might be written, in which case we need
767 ## to retain the earlier value.
768 super(VectorRegOperand, self).__init__(parser, full_name, ext,
769 True, is_dest)
770 self.size = 0
771
772 def finalize(self, predRead, predWrite):
773 self.flags = self.getFlags()
774 self.constructor = self.makeConstructor(predRead, predWrite)
775 self.op_decl = self.makeDecl()
776
777 if self.is_src:
778 self.op_rd = self.makeRead(predRead)
779 self.op_src_decl = self.makeDecl()
780 else:
781 self.op_rd = ''
782 self.op_src_decl = ''
783
784 if self.is_dest:
785 self.op_wb = self.makeWrite(predWrite)
786 self.op_dest_decl = self.makeDecl()
787 else:
788 self.op_wb = ''
789 self.op_dest_decl = ''
790
791 def makeConstructor(self, predRead, predWrite):
792 c_src = ''
793 c_dest = ''
794
795 if self.is_src:
796 c_src = '\n\t_srcRegIdx[_numSrcRegs++] = %s + Vector_Reg_Base;' % \
797 (self.reg_spec)
798 if self.hasReadPred():
799 c_src = '\n\tif (%s) {%s\n\t}' % \
800 (self.read_predicate, c_src)
801
802 if self.is_dest:
803 c_dest = '\n\t_destRegIdx[_numDestRegs++] = %s + Vector_Reg_Base;' % \
804 (self.reg_spec)
805 c_dest += '\n\t_numVectorDestRegs++;'
806 if self.hasWritePred():
807 c_dest = '\n\tif (%s) {%s\n\t}' % \
808 (self.write_predicate, c_dest)
809
810 return c_src + c_dest
811
812 def makeRead(self, predRead):
813 if self.read_code != None:
814 return self.buildReadCode('readVectorRegOperand')
815
816 vector_reg_val = ''
817 if predRead:
818 vector_reg_val = 'xc->readVectorRegOperand(this, _sourceIndex++)'
819 if self.hasReadPred():
820 vector_reg_val = '(%s) ? %s : 0' % \
821 (self.read_predicate, vector_reg_val)
822 else:
823 vector_reg_val = 'xc->readVectorRegOperand(this, %d)' % \
824 self.src_reg_idx
825
826 return '%s = %s;\n' % (self.base_name, vector_reg_val)
827
828 def makeWrite(self, predWrite):
829 if self.write_code != None:
830 return self.buildWriteCode('setVectorRegOperand')
831
832 if predWrite:
833 wp = 'true'
834 if self.hasWritePred():
835 wp = self.write_predicate
836
837 wcond = 'if (%s)' % (wp)
838 windex = '_destIndex++'
839 else:
840 wcond = ''
841 windex = '%d' % self.dest_reg_idx
842
843 wb = '''
844 %s
845 {
846 TheISA::VectorReg final_val = %s;
847 xc->setVectorRegOperand(this, %s, final_val);\n
848 if (traceData) { traceData->setData(final_val); }
849 }''' % (wcond, self.base_name, windex)
850
851 return wb
852
853 def makeDecl(self):
854 ctype = 'TheISA::VectorReg'
855 return '%s %s;\n' % (ctype, self.base_name)
856
857class ControlRegOperand(Operand):
858 def isReg(self):
859 return 1
860
861 def isControlReg(self):
862 return 1
863
864 def makeConstructor(self, predRead, predWrite):

--- 51 unchanged lines hidden (view full) ---

916
917 def makeConstructor(self, predRead, predWrite):
918 return ''
919
920 def makeDecl(self):
921 # Note that initializations in the declarations are solely
922 # to avoid 'uninitialized variable' errors from the compiler.
923 # Declare memory data variable.
754class ControlRegOperand(Operand):
755 def isReg(self):
756 return 1
757
758 def isControlReg(self):
759 return 1
760
761 def makeConstructor(self, predRead, predWrite):

--- 51 unchanged lines hidden (view full) ---

813
814 def makeConstructor(self, predRead, predWrite):
815 return ''
816
817 def makeDecl(self):
818 # Note that initializations in the declarations are solely
819 # to avoid 'uninitialized variable' errors from the compiler.
820 # Declare memory data variable.
924 if 'IsVector' in self.flags:
925 return 'TheISA::VectorReg %s;\n' % self.base_name
926 else:
927 return '%s %s = 0;\n' % (self.ctype, self.base_name)
821 return '%s %s = 0;\n' % (self.ctype, self.base_name)
928
929 def makeRead(self, predRead):
930 if self.read_code != None:
931 return self.buildReadCode()
932 return ''
933
934 def makeWrite(self, predWrite):
935 if self.write_code != None:

--- 74 unchanged lines hidden (view full) ---

1010 self.sort()
1011 # enumerate source & dest register operands... used in building
1012 # constructor later
1013 self.numSrcRegs = 0
1014 self.numDestRegs = 0
1015 self.numFPDestRegs = 0
1016 self.numIntDestRegs = 0
1017 self.numCCDestRegs = 0
822
823 def makeRead(self, predRead):
824 if self.read_code != None:
825 return self.buildReadCode()
826 return ''
827
828 def makeWrite(self, predWrite):
829 if self.write_code != None:

--- 74 unchanged lines hidden (view full) ---

904 self.sort()
905 # enumerate source & dest register operands... used in building
906 # constructor later
907 self.numSrcRegs = 0
908 self.numDestRegs = 0
909 self.numFPDestRegs = 0
910 self.numIntDestRegs = 0
911 self.numCCDestRegs = 0
1018 self.numVectorDestRegs = 0
1019 self.numMiscDestRegs = 0
1020 self.memOperand = None
1021
1022 # Flags to keep track if one or more operands are to be read/written
1023 # conditionally.
1024 self.predRead = False
1025 self.predWrite = False
1026

--- 6 unchanged lines hidden (view full) ---

1033 op_desc.dest_reg_idx = self.numDestRegs
1034 self.numDestRegs += 1
1035 if op_desc.isFloatReg():
1036 self.numFPDestRegs += 1
1037 elif op_desc.isIntReg():
1038 self.numIntDestRegs += 1
1039 elif op_desc.isCCReg():
1040 self.numCCDestRegs += 1
912 self.numMiscDestRegs = 0
913 self.memOperand = None
914
915 # Flags to keep track if one or more operands are to be read/written
916 # conditionally.
917 self.predRead = False
918 self.predWrite = False
919

--- 6 unchanged lines hidden (view full) ---

926 op_desc.dest_reg_idx = self.numDestRegs
927 self.numDestRegs += 1
928 if op_desc.isFloatReg():
929 self.numFPDestRegs += 1
930 elif op_desc.isIntReg():
931 self.numIntDestRegs += 1
932 elif op_desc.isCCReg():
933 self.numCCDestRegs += 1
1041 elif op_desc.isVectorReg():
1042 self.numVectorDestRegs += 1
1043 elif op_desc.isControlReg():
1044 self.numMiscDestRegs += 1
1045 elif op_desc.isMem():
1046 if self.memOperand:
1047 error("Code block has more than one memory operand.")
1048 self.memOperand = op_desc
1049
1050 # Check if this operand has read/write predication. If true, then

--- 180 unchanged lines hidden (view full) ---

1231 # The header of the constructor declares the variables to be used
1232 # in the body of the constructor.
1233 header = ''
1234 header += '\n\t_numSrcRegs = 0;'
1235 header += '\n\t_numDestRegs = 0;'
1236 header += '\n\t_numFPDestRegs = 0;'
1237 header += '\n\t_numIntDestRegs = 0;'
1238 header += '\n\t_numCCDestRegs = 0;'
934 elif op_desc.isControlReg():
935 self.numMiscDestRegs += 1
936 elif op_desc.isMem():
937 if self.memOperand:
938 error("Code block has more than one memory operand.")
939 self.memOperand = op_desc
940
941 # Check if this operand has read/write predication. If true, then

--- 180 unchanged lines hidden (view full) ---

1122 # The header of the constructor declares the variables to be used
1123 # in the body of the constructor.
1124 header = ''
1125 header += '\n\t_numSrcRegs = 0;'
1126 header += '\n\t_numDestRegs = 0;'
1127 header += '\n\t_numFPDestRegs = 0;'
1128 header += '\n\t_numIntDestRegs = 0;'
1129 header += '\n\t_numCCDestRegs = 0;'
1239 header += '\n\t_numVectorDestRegs = 0;'
1240
1241 self.constructor = header + \
1242 self.operands.concatAttrStrings('constructor')
1243
1244 self.flags = self.operands.concatAttrLists('flags')
1245
1246 self.op_class = None
1247

--- 1149 unchanged lines hidden (view full) ---

2397 self.operandNameMap = operand_name
2398
2399 # Define operand variables.
2400 operands = user_dict.keys()
2401 extensions = self.operandTypeMap.keys()
2402
2403 operandsREString = r'''
2404 (?<!\w) # neg. lookbehind assertion: prevent partial matches
1130
1131 self.constructor = header + \
1132 self.operands.concatAttrStrings('constructor')
1133
1134 self.flags = self.operands.concatAttrLists('flags')
1135
1136 self.op_class = None
1137

--- 1149 unchanged lines hidden (view full) ---

2287 self.operandNameMap = operand_name
2288
2289 # Define operand variables.
2290 operands = user_dict.keys()
2291 extensions = self.operandTypeMap.keys()
2292
2293 operandsREString = r'''
2294 (?<!\w) # neg. lookbehind assertion: prevent partial matches
2405 ((%s)(?:_(%s))?(?:\[\w+\])?) # match: operand with optional '_'
2406 # then suffix, and then an optional array index.
2295 ((%s)(?:_(%s))?) # match: operand with optional '_' then suffix
2407 (?!\w) # neg. lookahead assertion: prevent partial matches
2408 ''' % (string.join(operands, '|'), string.join(extensions, '|'))
2409
2410 self.operandsRE = re.compile(operandsREString, re.MULTILINE|re.VERBOSE)
2411
2412 # Same as operandsREString, but extension is mandatory, and only two
2413 # groups are returned (base and ext, not full name as above).
2414 # Used for subtituting '_' for '.' to make C++ identifiers.

--- 113 unchanged lines hidden ---
2296 (?!\w) # neg. lookahead assertion: prevent partial matches
2297 ''' % (string.join(operands, '|'), string.join(extensions, '|'))
2298
2299 self.operandsRE = re.compile(operandsREString, re.MULTILINE|re.VERBOSE)
2300
2301 # Same as operandsREString, but extension is mandatory, and only two
2302 # groups are returned (base and ext, not full name as above).
2303 # Used for subtituting '_' for '.' to make C++ identifiers.

--- 113 unchanged lines hidden ---