regop.isa (5062:4c98f8cdcc11) regop.isa (5063:8eb72b1bd3c6)
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

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

416 abstract = True
417 flag_code = \
418 "ccFlagBits = genFlags(ccFlagBits, ext, DestReg, psrc1, ~op2, true);"
419
420 class CondRegOp(RegOp):
421 abstract = True
422 cond_check = "checkCondition(ccFlagBits)"
423
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

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

416 abstract = True
417 flag_code = \
418 "ccFlagBits = genFlags(ccFlagBits, ext, DestReg, psrc1, ~op2, true);"
419
420 class CondRegOp(RegOp):
421 abstract = True
422 cond_check = "checkCondition(ccFlagBits)"
423
424 class RdRegOp(RegOp):
425 abstract = True
426 def __init__(self, dest, src1=None, dataSize="env.dataSize"):
427 if not src1:
428 src1 = dest
429 super(RdRegOp, self).__init__(dest, src1, "NUM_INTREGS", None, dataSize)
430
431 class WrRegOp(RegOp):
432 abstract = True
433 def __init__(self, src1, src2, flags=None, dataSize="env.dataSize"):
434 super(WrRegOp, self).__init__("NUM_INTREGS", src1, src2, flags, dataSize)
435
424 class Add(FlagRegOp):
425 code = 'DestReg = merge(DestReg, psrc1 + op2, dataSize);'
426
427 class Or(LogicRegOp):
428 code = 'DestReg = merge(DestReg, psrc1 | op2, dataSize);'
429
430 class Adc(FlagRegOp):
431 code = '''

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

443 code = 'DestReg = merge(DestReg, psrc1 & op2, dataSize)'
444
445 class Sub(SubRegOp):
446 code = 'DestReg = merge(DestReg, psrc1 - op2, dataSize)'
447
448 class Xor(LogicRegOp):
449 code = 'DestReg = merge(DestReg, psrc1 ^ op2, dataSize)'
450
436 class Add(FlagRegOp):
437 code = 'DestReg = merge(DestReg, psrc1 + op2, dataSize);'
438
439 class Or(LogicRegOp):
440 code = 'DestReg = merge(DestReg, psrc1 | op2, dataSize);'
441
442 class Adc(FlagRegOp):
443 code = '''

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

455 code = 'DestReg = merge(DestReg, psrc1 & op2, dataSize)'
456
457 class Sub(SubRegOp):
458 code = 'DestReg = merge(DestReg, psrc1 - op2, dataSize)'
459
460 class Xor(LogicRegOp):
461 code = 'DestReg = merge(DestReg, psrc1 ^ op2, dataSize)'
462
451 class Mul1s(FlagRegOp):
463 class Mul1s(WrRegOp):
452 code = '''
464 code = '''
453 int signPos = (dataSize * 8) / 2 - 1;
454 IntReg srcVal1 = psrc1 | (-bits(psrc1, signPos) << signPos);
455 IntReg srcVal2 = op2 | (-bits(psrc1, signPos) << signPos);
456 DestReg = merge(DestReg, srcVal1 * srcVal2, dataSize)
465 ProdLow = psrc1 * op2;
466 int halfSize = (dataSize * 8) / 2;
467 int64_t spsrc1_h = spsrc1 >> halfSize;
468 int64_t spsrc1_l = spsrc1 & mask(halfSize);
469 int64_t spsrc2_h = sop2 >> halfSize;
470 int64_t spsrc2_l = sop2 & mask(halfSize);
471 ProdHi = ((spsrc1_l * spsrc2_h + spsrc1_h * spsrc2_l +
472 ((spsrc1_l * spsrc2_l) >> halfSize)) >> halfSize) +
473 spsrc1_h * spsrc2_h;
457 '''
458
474 '''
475
459 class Mul1u(FlagRegOp):
476 class Mul1u(WrRegOp):
460 code = '''
477 code = '''
478 ProdLow = psrc1 * op2;
461 int halfSize = (dataSize * 8) / 2;
479 int halfSize = (dataSize * 8) / 2;
462 IntReg srcVal1 = psrc1 & mask(halfSize);
463 IntReg srcVal2 = op2 & mask(halfSize);
464 DestReg = merge(DestReg, srcVal1 * srcVal2, dataSize)
480 uint64_t psrc1_h = psrc1 >> halfSize;
481 uint64_t psrc1_l = psrc1 & mask(halfSize);
482 uint64_t psrc2_h = op2 >> halfSize;
483 uint64_t psrc2_l = op2 & mask(halfSize);
484 ProdHi = ((psrc1_l * psrc2_h + psrc1_h * psrc2_l +
485 ((psrc1_l * psrc2_l) >> halfSize)) >> halfSize) +
486 psrc1_h * psrc2_h;
465 '''
466
487 '''
488
467 class Mulel(FlagRegOp):
468 code = 'DestReg = merge(DestReg, psrc1 * op2, dataSize);'
489 class Mulel(RdRegOp):
490 code = 'DestReg = merge(SrcReg1, ProdLow, dataSize);'
469
470 # Neither of these is quite correct because it assumes that right shifting
471 # a signed or unsigned value does sign or zero extension respectively.
472 # The C standard says that what happens on a right shift with a 1 in the
473 # MSB position is undefined. On x86 and under likely most compilers the
474 # "right thing" happens, but this isn't a guarantee.
491
492 # Neither of these is quite correct because it assumes that right shifting
493 # a signed or unsigned value does sign or zero extension respectively.
494 # The C standard says that what happens on a right shift with a 1 in the
495 # MSB position is undefined. On x86 and under likely most compilers the
496 # "right thing" happens, but this isn't a guarantee.
475 class Muleh(FlagRegOp):
476 code = '''
477 int halfSize = (dataSize * 8) / 2;
478 uint64_t psrc1_h = psrc1 >> halfSize;
479 uint64_t psrc1_l = psrc1 & mask(halfSize);
480 uint64_t psrc2_h = op2 >> halfSize;
481 uint64_t psrc2_l = op2 & mask(halfSize);
482 uint64_t result =
483 ((psrc1_l * psrc2_h + psrc1_h * psrc2_l +
484 ((psrc1_l * psrc2_l) >> halfSize)) >> halfSize) +
485 psrc1_h * psrc2_h;
486 DestReg = merge(DestReg, result, dataSize);
487 '''
497 class Muleh(RdRegOp):
498 def __init__(self, dest, src1=None, flags=None, dataSize="env.dataSize"):
499 if not src1:
500 src1 = dest
501 super(RdRegOp, self).__init__(dest, src1, "NUM_INTREGS", flags, dataSize)
502 code = 'DestReg = merge(SrcReg1, ProdHi, dataSize);'
503 flag_code = '''
504 if (ProdHi)
505 ccFlagBits = ccFlagBits | (ext & (CFBit | OFBit | ECFBit));
506 else
507 ccFlagBits = ccFlagBits & ~(ext & (CFBit | OFBit | ECFBit));
508 '''
488
509
489 class Mulehs(FlagRegOp):
490 code = '''
491 int halfSize = (dataSize * 8) / 2;
492 int64_t spsrc1_h = spsrc1 >> halfSize;
493 int64_t spsrc1_l = spsrc1 & mask(halfSize);
494 int64_t spsrc2_h = sop2 >> halfSize;
495 int64_t spsrc2_l = sop2 & mask(halfSize);
496 int64_t result =
497 ((spsrc1_l * spsrc2_h + spsrc1_h * spsrc2_l +
498 ((spsrc1_l * spsrc2_l) >> halfSize)) >> halfSize) +
499 spsrc1_h * spsrc2_h;
500 DestReg = merge(DestReg, result, dataSize);
501 '''
502
503 class Div1(FlagRegOp):
504 code = '''
505 int halfSize = (dataSize * 8) / 2;
506 IntReg quotient = (psrc1 / op2) & mask(halfSize);
507 IntReg remainder = (psrc1 % op2) & mask(halfSize);
508 IntReg result = quotient | (remainder << halfSize);
509 DestReg = merge(DestReg, result, dataSize);
510 '''

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

608 bits(psrc1, dataSize * 8 - 1,
609 dataSize * 8 - shiftAmt + 1);
610 DestReg = merge(DestReg, top | bottom, dataSize);
611 }
612 else
613 DestReg = DestReg;
614 '''
615
510 class Div1(FlagRegOp):
511 code = '''
512 int halfSize = (dataSize * 8) / 2;
513 IntReg quotient = (psrc1 / op2) & mask(halfSize);
514 IntReg remainder = (psrc1 % op2) & mask(halfSize);
515 IntReg result = quotient | (remainder << halfSize);
516 DestReg = merge(DestReg, result, dataSize);
517 '''

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

615 bits(psrc1, dataSize * 8 - 1,
616 dataSize * 8 - shiftAmt + 1);
617 DestReg = merge(DestReg, top | bottom, dataSize);
618 }
619 else
620 DestReg = DestReg;
621 '''
622
616 class WrRegOp(RegOp):
617 abstract = True
618 def __init__(self, src1, src2, flags=None, dataSize="env.dataSize"):
619 super(WrRegOp, self).__init__("NUM_INTREGS", src1, src2, flags, dataSize)
620
621 class Wrip(WrRegOp, CondRegOp):
622 code = 'RIP = psrc1 + op2'
623 else_code="RIP = RIP;"
624
625 class Br(WrRegOp, CondRegOp):
626 code = 'nuIP = psrc1 + op2;'
627 else_code='nuIP = nuIP;'
628
629 class Wruflags(WrRegOp):
630 code = 'ccFlagBits = psrc1 ^ op2'
631
623 class Wrip(WrRegOp, CondRegOp):
624 code = 'RIP = psrc1 + op2'
625 else_code="RIP = RIP;"
626
627 class Br(WrRegOp, CondRegOp):
628 code = 'nuIP = psrc1 + op2;'
629 else_code='nuIP = nuIP;'
630
631 class Wruflags(WrRegOp):
632 code = 'ccFlagBits = psrc1 ^ op2'
633
632 class RdRegOp(RegOp):
633 abstract = True
634 def __init__(self, dest, src1 = "NUM_INTREGS", dataSize="env.dataSize"):
635 super(RdRegOp, self).__init__(dest, src1, "NUM_INTREGS", None, dataSize)
636
637 class Rdip(RdRegOp):
638 code = 'DestReg = RIP'
639
640 class Ruflags(RdRegOp):
641 code = 'DestReg = ccFlagBits'
642
643 class Ruflag(RegOp):
644 code = '''

--- 85 unchanged lines hidden ---
634 class Rdip(RdRegOp):
635 code = 'DestReg = RIP'
636
637 class Ruflags(RdRegOp):
638 code = 'DestReg = ccFlagBits'
639
640 class Ruflag(RegOp):
641 code = '''

--- 85 unchanged lines hidden ---