ldstop.isa (7874:c7f15c60898e) ldstop.isa (7967:b243dc8cec8b)
1// Copyright (c) 2007-2008 The Hewlett-Packard Development Company
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

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

296 "flags" : self.microFlagsText(microFlags),
297 "scale" : self.scale, "index" : self.index,
298 "base" : self.base,
299 "disp" : self.disp,
300 "segment" : self.segment, "data" : self.data,
301 "dataSize" : self.dataSize, "addressSize" : self.addressSize,
302 "memFlags" : self.memFlags}
303 return allocator
1// Copyright (c) 2007-2008 The Hewlett-Packard Development Company
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

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

296 "flags" : self.microFlagsText(microFlags),
297 "scale" : self.scale, "index" : self.index,
298 "base" : self.base,
299 "disp" : self.disp,
300 "segment" : self.segment, "data" : self.data,
301 "dataSize" : self.dataSize, "addressSize" : self.addressSize,
302 "memFlags" : self.memFlags}
303 return allocator
304
305 class BigLdStOp(X86Microop):
306 def __init__(self, data, segment, addr, disp,
307 dataSize, addressSize, baseFlags, atCPL0, prefetch):
308 self.data = data
309 [self.scale, self.index, self.base] = addr
310 self.disp = disp
311 self.segment = segment
312 self.dataSize = dataSize
313 self.addressSize = addressSize
314 self.memFlags = baseFlags
315 if atCPL0:
316 self.memFlags += " | (CPL0FlagBit << FlagShift)"
317 if prefetch:
318 self.memFlags += " | Request::PREFETCH"
319 self.memFlags += " | (machInst.legacy.addr ? " + \
320 "(AddrSizeFlagBit << FlagShift) : 0)"
321
322 def getAllocator(self, microFlags):
323 allocString = '''
324 (%(dataSize)s >= 4) ?
325 (StaticInstPtr)(new %(class_name)sBig(machInst,
326 macrocodeBlock, %(flags)s, %(scale)s, %(index)s,
327 %(base)s, %(disp)s, %(segment)s, %(data)s,
328 %(dataSize)s, %(addressSize)s, %(memFlags)s)) :
329 (StaticInstPtr)(new %(class_name)s(machInst,
330 macrocodeBlock, %(flags)s, %(scale)s, %(index)s,
331 %(base)s, %(disp)s, %(segment)s, %(data)s,
332 %(dataSize)s, %(addressSize)s, %(memFlags)s))
333 '''
334 allocator = allocString % {
335 "class_name" : self.className,
336 "flags" : self.microFlagsText(microFlags),
337 "scale" : self.scale, "index" : self.index,
338 "base" : self.base,
339 "disp" : self.disp,
340 "segment" : self.segment, "data" : self.data,
341 "dataSize" : self.dataSize, "addressSize" : self.addressSize,
342 "memFlags" : self.memFlags}
343 return allocator
304}};
305
306let {{
307
308 # Make these empty strings so that concatenating onto
309 # them will always work.
310 header_output = ""
311 decoder_output = ""
312 exec_output = ""
313
314 calculateEA = '''
315 EA = bits(SegBase + scale * Index + Base + disp, addressSize * 8 - 1, 0);
316 '''
317
344}};
345
346let {{
347
348 # Make these empty strings so that concatenating onto
349 # them will always work.
350 header_output = ""
351 decoder_output = ""
352 exec_output = ""
353
354 calculateEA = '''
355 EA = bits(SegBase + scale * Index + Base + disp, addressSize * 8 - 1, 0);
356 '''
357
318 def defineMicroLoadOp(mnemonic, code, mem_flags="0"):
358 def defineMicroLoadOp(mnemonic, code, bigCode='',
359 mem_flags="0", big=True):
319 global header_output
320 global decoder_output
321 global exec_output
322 global microopClasses
323 Name = mnemonic
324 name = mnemonic.lower()
325
326 # Build up the all register version of this micro op
360 global header_output
361 global decoder_output
362 global exec_output
363 global microopClasses
364 Name = mnemonic
365 name = mnemonic.lower()
366
367 # Build up the all register version of this micro op
327 iop = InstObjParams(name, Name, 'X86ISA::LdStOp',
328 {"code": code,
329 "ea_code": calculateEA})
330 header_output += MicroLdStOpDeclare.subst(iop)
331 decoder_output += MicroLdStOpConstructor.subst(iop)
332 exec_output += MicroLoadExecute.subst(iop)
333 exec_output += MicroLoadInitiateAcc.subst(iop)
334 exec_output += MicroLoadCompleteAcc.subst(iop)
368 iops = [InstObjParams(name, Name, 'X86ISA::LdStOp',
369 {"code": code, "ea_code": calculateEA})]
370 if big:
371 iops += [InstObjParams(name, Name + "Big", 'X86ISA::LdStOp',
372 {"code": bigCode, "ea_code": calculateEA})]
373 for iop in iops:
374 header_output += MicroLdStOpDeclare.subst(iop)
375 decoder_output += MicroLdStOpConstructor.subst(iop)
376 exec_output += MicroLoadExecute.subst(iop)
377 exec_output += MicroLoadInitiateAcc.subst(iop)
378 exec_output += MicroLoadCompleteAcc.subst(iop)
335
379
336 class LoadOp(LdStOp):
380 base = LdStOp
381 if big:
382 base = BigLdStOp
383 class LoadOp(base):
337 def __init__(self, data, segment, addr, disp = 0,
338 dataSize="env.dataSize",
339 addressSize="env.addressSize",
340 atCPL0=False, prefetch=False):
341 super(LoadOp, self).__init__(data, segment, addr,
342 disp, dataSize, addressSize, mem_flags,
343 atCPL0, prefetch)
344 self.className = Name
345 self.mnemonic = name
346
347 microopClasses[name] = LoadOp
348
384 def __init__(self, data, segment, addr, disp = 0,
385 dataSize="env.dataSize",
386 addressSize="env.addressSize",
387 atCPL0=False, prefetch=False):
388 super(LoadOp, self).__init__(data, segment, addr,
389 disp, dataSize, addressSize, mem_flags,
390 atCPL0, prefetch)
391 self.className = Name
392 self.mnemonic = name
393
394 microopClasses[name] = LoadOp
395
349 defineMicroLoadOp('Ld', 'Data = merge(Data, Mem, dataSize);')
396 defineMicroLoadOp('Ld', 'Data = merge(Data, Mem, dataSize);',
397 'Data = Mem & mask(dataSize * 8);')
350 defineMicroLoadOp('Ldst', 'Data = merge(Data, Mem, dataSize);',
398 defineMicroLoadOp('Ldst', 'Data = merge(Data, Mem, dataSize);',
351 '(StoreCheck << FlagShift)')
399 'Data = Mem & mask(dataSize * 8);',
400 '(StoreCheck << FlagShift)')
352 defineMicroLoadOp('Ldstl', 'Data = merge(Data, Mem, dataSize);',
401 defineMicroLoadOp('Ldstl', 'Data = merge(Data, Mem, dataSize);',
353 '(StoreCheck << FlagShift) | Request::LOCKED')
354 defineMicroLoadOp('Ldfp', 'FpData.uqw = Mem;')
402 'Data = Mem & mask(dataSize * 8);',
403 '(StoreCheck << FlagShift) | Request::LOCKED')
404 defineMicroLoadOp('Ldfp', 'FpData.uqw = Mem;', big = False)
355
356 def defineMicroStoreOp(mnemonic, code, \
357 postCode="", completeCode="", mem_flags="0"):
358 global header_output
359 global decoder_output
360 global exec_output
361 global microopClasses
362 Name = mnemonic

--- 83 unchanged lines hidden ---
405
406 def defineMicroStoreOp(mnemonic, code, \
407 postCode="", completeCode="", mem_flags="0"):
408 global header_output
409 global decoder_output
410 global exec_output
411 global microopClasses
412 Name = mnemonic

--- 83 unchanged lines hidden ---