1// Copyright (c) 2007 The Hewlett-Packard Development Company 2// All rights reserved. 3// 4// Redistribution and use of this software in source and binary forms, 5// with or without modification, are permitted provided that the 6// following conditions are met: 7// 8// The software must be used only for Non-Commercial Use which means any --- 207 unchanged lines hidden (view full) --- 216 src1(_src1), imm8(_imm8), dest(_dest), 217 setStatus(_setStatus), dataSize(_dataSize), ext(_ext) 218 { 219 buildMe(); 220 } 221}}; 222 223let {{ |
224 class RegOp(X86Microop): |
225 def __init__(self, dest, src1, src2): 226 self.dest = dest 227 self.src1 = src1 228 self.src2 = src2 229 self.setStatus = False 230 self.dataSize = 1 231 self.ext = 0 232 --- 5 unchanged lines hidden (view full) --- 238 "mnemonic" : self.mnemonic, 239 "flags" : self.microFlagsText(microFlags), 240 "src1" : self.src1, "src2" : self.src2, 241 "dest" : self.dest, 242 "setStatus" : self.setStatus, 243 "dataSize" : self.dataSize, 244 "ext" : self.ext} 245 |
246 class RegOpImm(X86Microop): |
247 def __init__(self, dest, src1, imm): 248 self.dest = dest 249 self.src1 = src1 250 self.imm = imm 251 self.setStatus = False 252 self.dataSize = 1 253 self.ext = 0 254 --- 14 unchanged lines hidden (view full) --- 269let {{ 270 271 # Make these empty strings so that concatenating onto 272 # them will always work. 273 header_output = "" 274 decoder_output = "" 275 exec_output = "" 276 |
277 def defineMicroRegOp(mnemonic, code): |
278 global header_output 279 global decoder_output 280 global exec_output |
281 global microopClasses |
282 Name = mnemonic 283 name = mnemonic.lower() 284 285 # Find op2 in each of the instruction definitions. Create two versions 286 # of the code, one with an integer operand, and one with an immediate 287 # operand. 288 matcher = re.compile("op2(?P<typeQual>\\.\\w+)?") 289 regCode = matcher.sub("SrcReg2", code) 290 immCode = matcher.sub("imm8", code) 291 292 # Build up the all register version of this micro op 293 iop = InstObjParams(name, Name, 'X86MicroOpBase', {"code" : regCode}) 294 header_output += MicroRegOpDeclare.subst(iop) 295 decoder_output += MicroRegOpConstructor.subst(iop) 296 exec_output += MicroRegOpExecute.subst(iop) 297 298 class RegOpChild(RegOp): 299 def __init__(self, dest, src1, src2): |
300 super(RegOpChild, self).__init__(dest, src1, src2) 301 self.className = Name |
302 self.mnemonic = name 303 304 microopClasses[name] = RegOpChild 305 306 # Build up the immediate version of this micro op 307 iop = InstObjParams(name + "i", Name, 308 'X86MicroOpBase', {"code" : immCode}) 309 header_output += MicroRegOpImmDeclare.subst(iop) 310 decoder_output += MicroRegOpImmConstructor.subst(iop) 311 exec_output += MicroRegOpImmExecute.subst(iop) 312 313 class RegOpImmChild(RegOpImm): 314 def __init__(self, dest, src1, imm): |
315 super(RegOpImmChild, self).__init__(dest, src1, imm) 316 self.className = Name + "Imm" |
317 self.mnemonic = name + "i" 318 319 microopClasses[name + "i"] = RegOpChild 320 |
321 defineMicroRegOp('Add', 'DestReg = merge(DestReg, SrcReg1 + op2, dataSize)') #Needs to set OF,CF,SF 322 defineMicroRegOp('Or', 'DestReg = merge(DestReg, SrcReg1 | op2, dataSize)') 323 defineMicroRegOp('Adc', 'DestReg = merge(DestReg, SrcReg1 + op2, dataSize)') #Needs to add in CF, set OF,CF,SF 324 defineMicroRegOp('Sbb', 'DestReg = merge(DestReg, SrcReg1 - op2, dataSize)') #Needs to subtract CF, set OF,CF,SF 325 defineMicroRegOp('And', 'DestReg = merge(DestReg, SrcReg1 & op2, dataSize)') 326 defineMicroRegOp('Sub', 'DestReg = merge(DestReg, SrcReg1 - op2, dataSize)') #Needs to set OF,CF,SF 327 defineMicroRegOp('Xor', 'DestReg = merge(DestReg, SrcReg1 ^ op2, dataSize)') 328 defineMicroRegOp('Cmp', 'DestReg = merge(DestReg, DestReg - op2, dataSize)') #Needs to set OF,CF,SF and not DestReg 329 defineMicroRegOp('Mov', 'DestReg = merge(SrcReg1, op2, dataSize)') |
330 331}}; |