specialize.isa (5294:7222bdaed33b) specialize.isa (5788:6d4161a36ca1)
1// -*- mode:c++ -*-
2
3// Copyright (c) 2007 The Hewlett-Packard Development Company
4// All rights reserved.
5//
6// Redistribution and use of this software in source and binary forms,
7// with or without modification, are permitted provided that the
8// following conditions are met:

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

81 blocks.append(new_blocks)
82 blocks.decode_block += '}\n'
83 return blocks
84}};
85
86let {{
87 def doRipRelativeDecode(Name, opTypes, env):
88 # print "RIPing %s with opTypes %s" % (Name, opTypes)
1// -*- mode:c++ -*-
2
3// Copyright (c) 2007 The Hewlett-Packard Development Company
4// All rights reserved.
5//
6// Redistribution and use of this software in source and binary forms,
7// with or without modification, are permitted provided that the
8// following conditions are met:

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

81 blocks.append(new_blocks)
82 blocks.decode_block += '}\n'
83 return blocks
84}};
85
86let {{
87 def doRipRelativeDecode(Name, opTypes, env):
88 # print "RIPing %s with opTypes %s" % (Name, opTypes)
89 normBlocks = specializeInst(Name + "_M", copy.copy(opTypes), copy.copy(env))
90 ripBlocks = specializeInst(Name + "_P", copy.copy(opTypes), copy.copy(env))
89 env.memoryInst = True
90 normEnv = copy.copy(env)
91 normEnv.addToDisassembly(
92 '''printMem(out, env.seg, env.scale, env.index, env.base,
93 machInst.displacement, env.addressSize, false);''')
94 normBlocks = specializeInst(Name + "_M", copy.copy(opTypes), normEnv)
95 ripEnv = copy.copy(env)
96 ripEnv.addToDisassembly(
97 '''printMem(out, env.seg, 1, 0, 0,
98 machInst.displacement, env.addressSize, true);''')
99 ripBlocks = specializeInst(Name + "_P", copy.copy(opTypes), ripEnv)
91
92 blocks = OutputBlocks()
93 blocks.append(normBlocks)
94 blocks.append(ripBlocks)
95
96 blocks.decode_block = '''
97 if(machInst.modRM.mod == 0 &&
98 machInst.modRM.rm == 5 &&

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

133 if opType.tag not in ("I", "J"):
134 if opType.size:
135 env.setSize(opType.size)
136
137 if opType.reg:
138 #Figure out what to do with fixed register operands
139 #This is the index to use, so we should stick it some place.
140 if opType.reg in ("A", "B", "C", "D"):
100
101 blocks = OutputBlocks()
102 blocks.append(normBlocks)
103 blocks.append(ripBlocks)
104
105 blocks.decode_block = '''
106 if(machInst.modRM.mod == 0 &&
107 machInst.modRM.rm == 5 &&

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

142 if opType.tag not in ("I", "J"):
143 if opType.size:
144 env.setSize(opType.size)
145
146 if opType.reg:
147 #Figure out what to do with fixed register operands
148 #This is the index to use, so we should stick it some place.
149 if opType.reg in ("A", "B", "C", "D"):
141 env.addReg("INTREG_R%sX" % opType.reg)
150 regString = "INTREG_R%sX" % opType.reg
142 else:
151 else:
143 env.addReg("INTREG_R%s" % opType.reg)
152 regString = "INTREG_R%s" % opType.reg
153 env.addReg(regString)
154 env.addToDisassembly(
155 "printReg(out, %s, regSize);\n" % regString)
144 Name += "_R"
145 elif opType.tag == "B":
146 # This refers to registers whose index is encoded as part of the opcode
156 Name += "_R"
157 elif opType.tag == "B":
158 # This refers to registers whose index is encoded as part of the opcode
159 env.addToDisassembly(
160 "printReg(out, %s, regSize);\n" % InstRegIndex)
147 Name += "_R"
148 env.addReg(InstRegIndex)
149 elif opType.tag == "M":
150 # This refers to memory. The macroop constructor sets up modrm
151 # addressing. Non memory modrm settings should cause an error.
152 env.doModRM = True
153 return doRipRelativeDecode(Name, opTypes, env)
154 elif opType.tag == None or opType.size == None:
155 raise Exception, "Problem parsing operand tag: %s" % opType.tag
156 elif opType.tag == "C":
157 # A control register indexed by the "reg" field
158 env.addReg(ModRMRegIndex)
161 Name += "_R"
162 env.addReg(InstRegIndex)
163 elif opType.tag == "M":
164 # This refers to memory. The macroop constructor sets up modrm
165 # addressing. Non memory modrm settings should cause an error.
166 env.doModRM = True
167 return doRipRelativeDecode(Name, opTypes, env)
168 elif opType.tag == None or opType.size == None:
169 raise Exception, "Problem parsing operand tag: %s" % opType.tag
170 elif opType.tag == "C":
171 # A control register indexed by the "reg" field
172 env.addReg(ModRMRegIndex)
173 env.addToDisassembly(
174 "ccprintf(out, \"CR%%d\", %s);\n" % ModRMRegIndex)
159 Name += "_C"
160 elif opType.tag == "D":
161 # A debug register indexed by the "reg" field
162 env.addReg(ModRMRegIndex)
175 Name += "_C"
176 elif opType.tag == "D":
177 # A debug register indexed by the "reg" field
178 env.addReg(ModRMRegIndex)
179 env.addToDisassembly(
180 "ccprintf(out, \"DR%%d\", %s);\n" % ModRMRegIndex)
163 Name += "_D"
164 elif opType.tag == "S":
165 # A segment selector register indexed by the "reg" field
166 env.addReg(ModRMRegIndex)
181 Name += "_D"
182 elif opType.tag == "S":
183 # A segment selector register indexed by the "reg" field
184 env.addReg(ModRMRegIndex)
185 env.addToDisassembly(
186 "printSegment(out, %s);\n" % ModRMRegIndex)
167 Name += "_S"
168 elif opType.tag in ("G", "P", "T", "V"):
169 # Use the "reg" field of the ModRM byte to select the register
170 env.addReg(ModRMRegIndex)
187 Name += "_S"
188 elif opType.tag in ("G", "P", "T", "V"):
189 # Use the "reg" field of the ModRM byte to select the register
190 env.addReg(ModRMRegIndex)
191 env.addToDisassembly(
192 "printReg(out, %s, regSize);\n" % ModRMRegIndex)
171 Name += "_R"
172 elif opType.tag in ("E", "Q", "W"):
173 # This might refer to memory or to a register. We need to
174 # divide it up farther.
175 regEnv = copy.copy(env)
176 regEnv.addReg(ModRMRMIndex)
193 Name += "_R"
194 elif opType.tag in ("E", "Q", "W"):
195 # This might refer to memory or to a register. We need to
196 # divide it up farther.
197 regEnv = copy.copy(env)
198 regEnv.addReg(ModRMRMIndex)
199 regEnv.addToDisassembly(
200 "printReg(out, %s, regSize);\n" % ModRMRMIndex)
177 # This refers to memory. The macroop constructor should set up
178 # modrm addressing.
179 memEnv = copy.copy(env)
180 memEnv.doModRM = True
181 return doSplitDecode("MODRM_MOD",
182 {"3" : (specializeInst, Name + "_R", copy.copy(opTypes), regEnv)},
183 (doRipRelativeDecode, Name, copy.copy(opTypes), memEnv))
184 elif opType.tag in ("I", "J"):
185 # Immediates
201 # This refers to memory. The macroop constructor should set up
202 # modrm addressing.
203 memEnv = copy.copy(env)
204 memEnv.doModRM = True
205 return doSplitDecode("MODRM_MOD",
206 {"3" : (specializeInst, Name + "_R", copy.copy(opTypes), regEnv)},
207 (doRipRelativeDecode, Name, copy.copy(opTypes), memEnv))
208 elif opType.tag in ("I", "J"):
209 # Immediates
210 env.addToDisassembly(
211 "ccprintf(out, \"%#x\", machInst.immediate);\n")
186 Name += "_I"
187 elif opType.tag == "O":
188 # Immediate containing a memory offset
189 Name += "_MI"
190 elif opType.tag in ("PR", "R", "VR"):
191 # Non register modrm settings should cause an error
192 env.addReg(ModRMRMIndex)
212 Name += "_I"
213 elif opType.tag == "O":
214 # Immediate containing a memory offset
215 Name += "_MI"
216 elif opType.tag in ("PR", "R", "VR"):
217 # Non register modrm settings should cause an error
218 env.addReg(ModRMRMIndex)
219 env.addToDisassembly(
220 "printReg(out, %s, regSize);\n" % ModRMRMIndex)
193 Name += "_R"
194 elif opType.tag in ("X", "Y"):
195 # This type of memory addressing is for string instructions.
196 # They'll use the right index and segment internally.
221 Name += "_R"
222 elif opType.tag in ("X", "Y"):
223 # This type of memory addressing is for string instructions.
224 # They'll use the right index and segment internally.
225 if opType.tag == "X":
226 env.addToDisassembly(
227 '''printMem(out, env.seg,
228 1, X86ISA::ZeroReg, X86ISA::INTREG_RSI, 0,
229 env.addressSize, false);''')
230 else:
231 env.addToDisassembly(
232 '''printMem(out, SEGMENT_REG_ES,
233 1, X86ISA::ZeroReg, X86ISA::INTREG_RDI, 0,
234 env.addressSize, false);''')
197 Name += "_M"
198 else:
199 raise Exception, "Unrecognized tag %s." % opType.tag
200
201 # Generate code to return a macroop of the given name which will
202 # operate in the "emulation environment" env
203 return genMacroop(Name, env)
204}};
235 Name += "_M"
236 else:
237 raise Exception, "Unrecognized tag %s." % opType.tag
238
239 # Generate code to return a macroop of the given name which will
240 # operate in the "emulation environment" env
241 return genMacroop(Name, env)
242}};