more changes towards word level support for arrays
authorbdemsky <bdemsky>
Wed, 14 Oct 2009 09:42:58 +0000 (09:42 +0000)
committerbdemsky <bdemsky>
Wed, 14 Oct 2009 09:42:58 +0000 (09:42 +0000)
Robust/src/Analysis/Loops/WriteBarrier.java
Robust/src/IR/Flat/BuildCode.java
Robust/src/Runtime/STM/array.h

index 16a6d79deba9799c5c2c518a4c85476f98bcaa73..144674aee0f78786cb050b623d69c2eaab085f98 100644 (file)
@@ -38,6 +38,11 @@ public class WriteBarrier {
        FlatSetElementNode fsen=(FlatSetElementNode)fn;
        return !nb.contains(fsen.getDst());
       }
+    case FKind.FlatElementNode:
+      {
+       FlatElementNode fen=(FlatElementNode)fn;
+       return !nb.contains(fen.getSrc());
+      }
     case FKind.FlatSetFieldNode:
       {
        FlatSetFieldNode fsfn=(FlatSetFieldNode)fn;
@@ -80,7 +85,8 @@ public class WriteBarrier {
       case FKind.FlatSetElementNode:
        {
          FlatSetElementNode fsen=(FlatSetElementNode)fn;
-         nb.add(fsen.getDst());
+         if (!state.STMARRAY)
+           nb.add(fsen.getDst());
          break;
        }
       case FKind.FlatSetFieldNode:
index 5bc9fb6a19f1ea2f93fa37e1879d3304cffeb6ef..144085e0c5fe4be551a5da1807082a2cc0f66a1f 100644 (file)
@@ -3674,7 +3674,11 @@ public class BuildCode {
     if (state.SINGLETM) {
       //Single machine transaction case
       String dst=generateTemp(fm, fen.getDst(),lb);
-      output.println(dst +"=(("+ type+"*)(((char *) &("+ generateTemp(fm,fen.getSrc(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fen.getIndex(),lb)+"];");
+      if (!state.STMARRAY||wb.needBarrier(fen)||locality.getNodePreTempInfo(lb, fen).get(fen.getSrc())==LocalityAnalysis.SCRATCH) {
+       output.println(dst +"=(("+ type+"*)(((char *) &("+ generateTemp(fm,fen.getSrc(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fen.getIndex(),lb)+"];");
+      } else {
+       output.println("STMGETARRAY("+dst+", "+ generateTemp(fm,fen.getSrc(),lb)+", "+generateTemp(fm, fen.getIndex(),lb)+", "+type+");");
+      }
 
       if (elementtype.isPtr()&&locality.getAtomic(lb).get(fen).intValue()>0&&
           locality.getNodePreTempInfo(lb, fen).get(fen.getSrc())!=LocalityAnalysis.SCRATCH) {
@@ -3688,7 +3692,6 @@ public class BuildCode {
       Integer status=locality.getNodePreTempInfo(lb,fen).get(fen.getSrc());
       if (status==LocalityAnalysis.GLOBAL) {
        String dst=generateTemp(fm, fen.getDst(),lb);
-
        if (elementtype.isPtr()) {
          output.println(dst +"=(("+ type+"*)(((char *) &("+ generateTemp(fm,fen.getSrc(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fen.getIndex(),lb)+"];");
          output.println("TRANSREAD("+dst+", "+dst+");");
@@ -3731,7 +3734,7 @@ public class BuildCode {
 
     if (state.SINGLETM && locality.getAtomic(lb).get(fsen).intValue()>0) {
       //Transaction set element case
-      if (wb.needBarrier(fsen)&&
+      if (!state.STMARRAY&&wb.needBarrier(fsen)&&
           locality.getNodePreTempInfo(lb, fsen).get(fsen.getDst())!=LocalityAnalysis.SCRATCH) {
        output.println("*((unsigned int *)&("+generateTemp(fm,fsen.getDst(),lb)+"->___objstatus___))|=DIRTY;");
       }
@@ -3744,10 +3747,18 @@ public class BuildCode {
        } else {
          output.println("INTPTR srcoid=(INTPTR)"+src+";");
        }
-       output.println("((INTPTR*)(((char *) &("+ generateTemp(fm,fsen.getDst(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fsen.getIndex(),lb)+"]=srcoid;");
+       if (state.STMARRAY&&locality.getNodePreTempInfo(lb, fsen).get(fsen.getDst())!=LocalityAnalysis.SCRATCH&&wb.needBarrier(fsen)) {
+         output.println("STMSETARRAY("+generateTemp(fm, fsen.getDst(),lb)+", "+generateTemp(fm, fsen.getIndex(),lb)+", srcoid, INTPTR);");
+       } else {
+         output.println("((INTPTR*)(((char *) &("+ generateTemp(fm,fsen.getDst(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fsen.getIndex(),lb)+"]=srcoid;");
+       }
        output.println("}");
       } else {
-       output.println("(("+type +"*)(((char *) &("+ generateTemp(fm,fsen.getDst(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fsen.getIndex(),lb)+"]="+generateTemp(fm,fsen.getSrc(),lb)+";");
+       if (state.STMARRAY&&locality.getNodePreTempInfo(lb, fsen).get(fsen.getDst())!=LocalityAnalysis.SCRATCH&&wb.needBarrier(fsen)) {
+         output.println("STMSETARRAY("+generateTemp(fm, fsen.getDst(),lb)+", "+generateTemp(fm, fsen.getIndex(),lb)+", "+ generateTemp(fm, fsen.getSrc(), lb) +", "+type+");");
+       } else {
+         output.println("(("+type +"*)(((char *) &("+ generateTemp(fm,fsen.getDst(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fsen.getIndex(),lb)+"]="+generateTemp(fm,fsen.getSrc(),lb)+";");
+       }
       }
     } else if (state.DSM && locality.getAtomic(lb).get(fsen).intValue()>0) {
       Integer statussrc=locality.getNodePreTempInfo(lb,fsen).get(fsen.getSrc());
@@ -3755,7 +3766,7 @@ public class BuildCode {
       boolean srcglobal=statussrc==LocalityAnalysis.GLOBAL;
       boolean dstglobal=statusdst==LocalityAnalysis.GLOBAL;
       boolean dstlocal=statusdst==LocalityAnalysis.LOCAL;
-
+      
       if (dstglobal) {
        if (wb.needBarrier(fsen))
          output.println("*((unsigned int *)&("+generateTemp(fm,fsen.getDst(),lb)+"->___localcopy___))|=DIRTY;");
index de5b88b0ce896ff1fa0a258e844e835dca029421..b32e89904fcc1c5ea2b8127a8fa70983987ad892 100644 (file)
     int byteindex=index*sizeof(type);                                  \
     int * lengthoff=&array->___length___;                              \
     int *status;                                                       \
-    GETLOCKPTR(status, array, byteindex);                              \
-    if ((*status)==STMNONE) {                                          \
-      arraycopy(array, byteindex);                                     \
-      *status=STMCLEAN;};                                              \
+    if (array!=array->___objlocation___) {                             \
+      GETLOCKPTR(status, array, byteindex);                            \
+      if ((*status)==STMNONE) {                                                \
+       arraycopy(array, byteindex);                                    \
+       *status=STMCLEAN;};                                             \
+    }                                                                  \
     dst=((type *)(((char *) lengthoff)+sizeof(int)))[index];           \
   }