|
From: <sv...@va...> - 2008-06-30 10:31:44
|
Author: sewardj
Date: 2008-06-30 11:31:47 +0100 (Mon, 30 Jun 2008)
New Revision: 1857
Log:
Add Imbe_SnoopedStoreBegin and Imbe_SnoopedStoreEnd, to be used for
bracketing snooped stores; fix up compilation pipeline to accept
(ignore) them.
Modified:
trunk/priv/guest-ppc/toIR.c
trunk/priv/host-ppc/isel.c
trunk/priv/ir/irdefs.c
trunk/pub/libvex_ir.h
Modified: trunk/priv/guest-ppc/toIR.c
===================================================================
--- trunk/priv/guest-ppc/toIR.c 2008-06-04 11:41:02 UTC (rev 1856)
+++ trunk/priv/guest-ppc/toIR.c 2008-06-30 10:31:47 UTC (rev 1857)
@@ -4895,9 +4895,13 @@
If resaddr != lwarx_resaddr, CR0[EQ] is undefined, and
whether rS is stored is dependent on that value. */
- /* Success? Do the (32bit) store */
+ /* Success? Do the (32bit) store. Mark the store as
+ snooped, so that threading tools can handle it differently
+ if necessary. */
+ stmt( IRStmt_MBE(Imbe_SnoopedStoreBegin) );
storeBE( mkexpr(EA), mkSzNarrow32(ty, mkexpr(rS)) );
-
+ stmt( IRStmt_MBE(Imbe_SnoopedStoreEnd) );
+
// Set CR0[LT GT EQ S0] = 0b001 || XER[SO]
putCR321(0, mkU8(1<<1));
break;
Modified: trunk/priv/host-ppc/isel.c
===================================================================
--- trunk/priv/host-ppc/isel.c 2008-06-04 11:41:02 UTC (rev 1856)
+++ trunk/priv/host-ppc/isel.c 2008-06-30 10:31:47 UTC (rev 1857)
@@ -3947,6 +3947,8 @@
return;
case Imbe_BusLock:
case Imbe_BusUnlock:
+ case Imbe_SnoopedStoreBegin:
+ case Imbe_SnoopedStoreEnd:
return;
default:
break;
Modified: trunk/priv/ir/irdefs.c
===================================================================
--- trunk/priv/ir/irdefs.c 2008-06-04 11:41:02 UTC (rev 1856)
+++ trunk/priv/ir/irdefs.c 2008-06-30 10:31:47 UTC (rev 1857)
@@ -745,10 +745,12 @@
void ppIRMBusEvent ( IRMBusEvent event )
{
switch (event) {
- case Imbe_Fence: vex_printf("Fence"); break;
- case Imbe_BusLock: vex_printf("BusLock"); break;
- case Imbe_BusUnlock: vex_printf("BusUnlock"); break;
- default: vpanic("ppIRMBusEvent");
+ case Imbe_Fence: vex_printf("Fence"); break;
+ case Imbe_BusLock: vex_printf("BusLock"); break;
+ case Imbe_BusUnlock: vex_printf("BusUnlock"); break;
+ case Imbe_SnoopedStoreBegin: vex_printf("SnoopedStoreBegin"); break;
+ case Imbe_SnoopedStoreEnd: vex_printf("SnoopedStoreEnd"); break;
+ default: vpanic("ppIRMBusEvent");
}
}
@@ -2534,6 +2536,7 @@
case Ist_MBE:
switch (stmt->Ist.MBE.event) {
case Imbe_Fence: case Imbe_BusLock: case Imbe_BusUnlock:
+ case Imbe_SnoopedStoreBegin: case Imbe_SnoopedStoreEnd:
break;
default: sanityCheckFail(bb,stmt,"IRStmt.MBE.event: unknown");
break;
Modified: trunk/pub/libvex_ir.h
===================================================================
--- trunk/pub/libvex_ir.h 2008-06-04 11:41:02 UTC (rev 1856)
+++ trunk/pub/libvex_ir.h 2008-06-30 10:31:47 UTC (rev 1857)
@@ -1336,7 +1336,9 @@
enum {
Imbe_Fence=0x18000,
Imbe_BusLock,
- Imbe_BusUnlock
+ Imbe_BusUnlock,
+ Imbe_SnoopedStoreBegin,
+ Imbe_SnoopedStoreEnd
}
IRMBusEvent;
|