384526 reduce number of spill instructions generated by VEX register allocator v3
384584 Callee saved registers listed first for AMD64, X86, and PPC architectures
n-i-bz Fix missing workq_ops operations (macOS)
+385182 PPC64 is missing support for the DSCR
Release 3.13.0 (15 June 2017)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
vex_state->guest_TEXASR = 0;
vex_state->guest_PPR = 0x4ULL << 50; // medium priority
vex_state->guest_PSPB = 0x100; // an arbitrary non-zero value to start with
+ vex_state->guest_DSCR = 0;
}
#define OFFB_TFIAR offsetofPPCGuestState(guest_TFIAR)
#define OFFB_PPR offsetofPPCGuestState(guest_PPR)
#define OFFB_PSPB offsetofPPCGuestState(guest_PSPB)
+#define OFFB_DSCR offsetofPPCGuestState(guest_DSCR)
/*------------------------------------------------------------*/
* automatically decrement. Could be added later if
* needed.
*/
+ PPC_GST_DSCR, // Data Stream Control Register
PPC_GST_MAX
} PPC_GST;
case PPC_GST_PSPB:
return IRExpr_Get( OFFB_PSPB, ty );
+ case PPC_GST_DSCR:
+ return IRExpr_Get( OFFB_DSCR, ty );
+
default:
vex_printf("getGST(ppc): reg = %u", reg);
vpanic("getGST(ppc)");
mkU64( 0x1C000000000000) ) ) );
break;
}
+ case PPC_GST_DSCR:
+ vassert( ty_src == Ity_I64 );
+ stmt( IRStmt_Put( OFFB_DSCR, src ) );
+ break;
+
default:
vex_printf("putGST(ppc): reg = %u", reg);
vpanic("putGST(ppc)");
putIReg( rD_addr, mkWidenFrom32(ty, getGST( PPC_GST_XER ),
/* Signed */False) );
break;
+ case 0x3: // 131
+ DIP("mfspr r%u (DSCR)\n", rD_addr);
+ putIReg( rD_addr, getGST( PPC_GST_DSCR) );
+ break;
case 0x8:
DIP("mflr r%u\n", rD_addr);
putIReg( rD_addr, getGST( PPC_GST_LR ) );
DIP("mtxer r%u\n", rS_addr);
putGST( PPC_GST_XER, mkNarrowTo32(ty, mkexpr(rS)) );
break;
+ case 0x3:
+ DIP("mtspr r%u (DSCR)\n", rS_addr);
+ putGST( PPC_GST_DSCR, mkexpr(rS) );
+ break;
case 0x8:
DIP("mtlr r%u\n", rS_addr);
putGST( PPC_GST_LR, mkexpr(rS) );
/* 1388 */ ULong guest_PPR; // Program Priority register
/* 1396 */ UInt guest_TEXASRU; // Transaction EXception And Summary Register Upper
/* 1400 */ UInt guest_PSPB; // Problem State Priority Boost register
+ /* 1404 */ ULong guest_DSCR; // Data Stream Control register
/* Padding to make it have an 16-aligned size */
- /* 1404 */ UInt padding2;
/* 1408 */ UInt padding3;
/* 1412 */ UInt padding4;
}
/* 1686 */ ULong guest_PPR; // Program Priority register
/* 1694 */ UInt guest_TEXASRU; // Transaction EXception And Summary Register Upper
/* 1698 */ UInt guest_PSPB; // Problem State Priority Boost register
+ /* 1702 */ ULong guest_DSCR; // Data Stream Control register
/* Padding to make it have an 16-aligned size */
- /* 1698 */ UInt padding1;
- /* 1702 UInt padding2; */
- /* 1706 UInt padding3; */
+ /* 1710 */ UInt padding1;
+ /* 1714 */ UInt padding2;
+ /* 1718 */ UInt padding3;
}
VexGuestPPC64State;
if (o == GOF(TFIAR) && sz == 8) return -1;
if (o == GOF(PPR) && sz == 8) return -1;
if (o == GOF(PSPB) && sz == 8) return -1;
+ if (o == GOF(DSCR) && sz == 8) return -1;
// With ISA 2.06, the "Vector-Scalar Floating-point" category
// provides facilities to support vector and scalar binary floating-
static void mc_post_reg_write ( CorePart part, ThreadId tid,
PtrdiffT offset, SizeT size)
{
-# define MAX_REG_WRITE_SIZE 1728
+# define MAX_REG_WRITE_SIZE 1744
UChar area[MAX_REG_WRITE_SIZE];
tl_assert(size <= MAX_REG_WRITE_SIZE);
VG_(memset)(area, V_BITS8_DEFINED, size);