Changeset 3122 for proto/RE


Ignore:
Timestamp:
May 8, 2013, 4:36:24 PM (6 years ago)
Author:
bhull
Message:

RE strategy changes

Location:
proto/RE
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • proto/RE/input/test/test1.in

    r3005 r3122  
    1 ccaccaccacacccccc
     1attttttttttttasd
     2asdbbbb
     3asdjasdabbbbbbbbbc
  • proto/RE/output/ccinput

    r3113 r3122  
    1 lex.cc1 = [\x74]
    2 lex.cc2 = [\x61]
     1lex.cc2 = [\x61-\x66]
    32lex.cc0 = [\x00-\x09\x0B-\xFF]
    4 lex.cc3 = [\x73]
    5 lex.cc4 = [\x64]
     3lex.cc3 = [\x68-\x6E]
     4lex.cc1 = [\x64-\x6D]
    65lex.LF = [\x0A]
    76
  • proto/RE/output/lib/simd-lib/carryQ.hpp

    r3005 r3122  
    218218        }
    219219
    220 //      IDISA_ALWAYS_INLINE BitBlock get_pending64(uint16_t advance_n_blkno) const
    221 //      {
    222 //              return pending64[advance_n_blkno];
    223 //      }
     220
     221        // Deprecated in PabloJ, retained for legacy compiler.
     222        IDISA_ALWAYS_INLINE BitBlock get_pending64(uint16_t advance_n_blkno) const
     223        {
     224                return cq[CarryCount + advance_n_blkno];
     225        }
    224226
    225227        IDISA_ALWAYS_INLINE BitBlock Pending64(uint16_t advance_n_blkno) const
  • proto/RE/output/lib/simd-lib/pabloSupport.hpp

    r3005 r3122  
    2424
    2525const BitBlock simd_const_1 = mvmd<BLOCK_SIZE/4>::fill4(0,0,0,1);
     26
     27const BitBlock simd_sign_bit = bitblock::slli<BLOCK_SIZE-1>(simd_const_1);
     28
     29IDISA_ALWAYS_INLINE BitBlock Dequeue_bit(BitBlock & q) {
     30        BitBlock bit = simd_and(q, simd_const_1);
     31        q = simd<64>::srli<1>(q);
     32        return bit;
     33}
    2634
    2735IDISA_ALWAYS_INLINE BitBlock pablo_blk_Advance(BitBlock strm, BitBlock carryin, BitBlock & rslt) {
     
    5260        add_ci_co(marker, charclass, carryin, carryout, sum);
    5361        rslt = simd_andc(sum, charclass);
     62        return carryout;
     63}
     64
     65IDISA_ALWAYS_INLINE BitBlock pablo_blk_MatchStar(BitBlock marker, BitBlock charclass, BitBlock carryin, BitBlock & rslt) {
     66        BitBlock carryout, sum;
     67        add_ci_co(simd_and(charclass, marker), charclass, carryin, carryout, sum);
     68        rslt = simd_or(simd_xor(sum, charclass), marker);
    5469        return carryout;
    5570}
     
    103118}
    104119
    105 
     120template <typename T> IDISA_ALWAYS_INLINE BitBlock pablo_blk_match(T bytedata[], const T match_str[], BitBlock v, int len) {
     121        union {BitBlock bitblock; ScanWord elems[sizeof(BitBlock)/sizeof(ScanWord)];} u;
     122        u.bitblock = v;
     123        int pos;
     124        ScanWord s, t, bit;
     125        for (unsigned int i = 0; i < sizeof(BitBlock)/sizeof(ScanWord); i++) {
     126                s = u.elems[i];
     127                while (s != 0) {
     128                        pos = scan_forward_zeroes(s);
     129                        t = s;
     130                        s = s & (s - 1); // clear rightmost bit
     131                        if (memcmp((void *) &bytedata[pos], (void *) match_str, len * sizeof(T))) {
     132                                // Strings do not match; filter the result.
     133                                bit = s ^ t;
     134                                u.elems[i] ^= bit;
     135                        }
     136                }
     137        }
     138        return u.bitblock;
     139}
    106140
    107141#endif // PABLOSUPPORT_HPP_
  • proto/RE/output/re_debug.py

    r3113 r3122  
    3737        cc2 = (0)
    3838        cc3 = (0)
    39         cc4 = (0)
    4039        LF = (0) 
    4140
     
    5150        m1=0
    5251        m2=0
     52        m3=0
     53        m4=0
    5354        m0=~0
    54         m0 = (m0 & ~bitutil.Advance(lex.cc0))
    55         m0 = bitutil.Advance((m0 & lex.cc0))
    5655        m1 = m0
    57         m1 = bitutil.Advance((m1 & lex.cc1))
    58         m1 = bitutil.Advance((m1 & lex.cc1))
    59         m1 = bitutil.Advance((m1 & lex.cc1))
     56        m1 = bitutil.Advance((m1 & lex.cc2))
     57        m3 = m1
     58        m3 = bitutil.Advance((m3 & lex.cc0))
     59        m3 = bitutil.Advance((m3 & lex.cc1))
     60        m3 = bitutil.Advance((m3 & lex.cc0))
     61        m1 = (m1 | m3)
     62        m3 = bitutil.Advance((m3 & lex.cc0))
     63        m3 = bitutil.Advance((m3 & lex.cc1))
     64        m3 = bitutil.Advance((m3 & lex.cc0))
     65        m1 = (m1 | m3)
     66        m1 = bitutil.Advance((m1 & lex.cc3))
     67        m1 = bitutil.Advance((m1 & lex.cc2))
     68        m3 = m1
     69        m3 = bitutil.Advance((m3 & lex.cc0))
     70        m3 = bitutil.Advance((m3 & lex.cc1))
     71        m3 = bitutil.Advance((m3 & lex.cc0))
     72        m1 = (m1 | m3)
     73        m3 = bitutil.Advance((m3 & lex.cc0))
     74        m3 = bitutil.Advance((m3 & lex.cc1))
     75        m3 = bitutil.Advance((m3 & lex.cc0))
     76        m1 = (m1 | m3)
     77        m1 = bitutil.Advance((m1 & lex.cc3))
    6078        m0 = m1
    61         m1 = m0
    62         m1 = bitutil.Advance((m1 & lex.cc1))
    63         m0 = (m0 | m1)
    64         m1 = bitutil.Advance((m1 & lex.cc1))
    65         m0 = (m0 | m1)
    66         m1 = bitutil.Advance((m1 & lex.cc1))
    67         m0 = (m0 | m1)
    68         m1 = bitutil.Advance((m1 & lex.cc1))
    69         m0 = (m0 | m1)
    70         m1 = bitutil.Advance((m1 & lex.cc1))
    71         m0 = (m0 | m1)
    72         m1 = bitutil.Advance((m1 & lex.cc1))
    73         m0 = (m0 | m1)
    74         m1 = bitutil.Advance((m1 & lex.cc1))
    75         m0 = (m0 | m1)
    76         m1 = bitutil.Advance((m1 & lex.cc1))
    77         m0 = (m0 | m1)
    78         m1 = bitutil.Advance((m1 & lex.cc1))
    79         m0 = (m0 | m1)
    80         m1 = bitutil.Advance((m1 & lex.cc1))
    81         m0 = (m0 | m1)
    82         m0 = bitutil.Advance((m0 & lex.cc2))
    83         m0 = bitutil.Advance((m0 & lex.cc3))
    84         m0 = bitutil.Advance((m0 & lex.cc4))
    8579        bitutil.print_aligned_streams([('       Input Data', u8data),
    8680        ('      lex.cc0', bitutil.bitstream2string(lex.cc0, lgth+1)),
     
    8882        ('      lex.cc2', bitutil.bitstream2string(lex.cc2, lgth+1)),
    8983        ('      lex.cc3', bitutil.bitstream2string(lex.cc3, lgth+1)),
    90         ('      lex.cc4', bitutil.bitstream2string(lex.cc4, lgth+1)),
    9184        ('      m0', bitutil.bitstream2string(m0, lgth+1)),
    9285        ('      m1', bitutil.bitstream2string(m1, lgth+1)),
    93         ('      m2', bitutil.bitstream2string(m2, lgth+1))])
     86        ('      m2', bitutil.bitstream2string(m2, lgth+1)),
     87        ('      m3', bitutil.bitstream2string(m3, lgth+1)),
     88        ('      m4', bitutil.bitstream2string(m4, lgth+1))])
    9489        return
    9590
  • proto/RE/output/re_pablo.py

    r3113 r3122  
    3535        cc2 = (0)
    3636        cc3 = (0)
    37         cc4 = (0)
    3837        LF = (0) 
    3938
     
    4847        m1=0
    4948        m2=0
     49        m3=0
     50        m4=0
    5051        m0=~0
    51         m0 = (m0 & ~pablo.Advance(lex.cc0))
    52         m0 = pablo.Advance((m0 & lex.cc0))
    5352        m1 = m0
    54         m1 = pablo.Advance((m1 & lex.cc1))
    55         m1 = pablo.Advance((m1 & lex.cc1))
    56         m1 = pablo.Advance((m1 & lex.cc1))
     53        m1 = pablo.Advance((m1 & lex.cc2))
     54        m3 = m1
     55        m3 = pablo.Advance((m3 & lex.cc0))
     56        m3 = pablo.Advance((m3 & lex.cc1))
     57        m3 = pablo.Advance((m3 & lex.cc0))
     58        m1 = (m1 | m3)
     59        m3 = pablo.Advance((m3 & lex.cc0))
     60        m3 = pablo.Advance((m3 & lex.cc1))
     61        m3 = pablo.Advance((m3 & lex.cc0))
     62        m1 = (m1 | m3)
     63        m1 = pablo.Advance((m1 & lex.cc3))
     64        m1 = pablo.Advance((m1 & lex.cc2))
     65        m3 = m1
     66        m3 = pablo.Advance((m3 & lex.cc0))
     67        m3 = pablo.Advance((m3 & lex.cc1))
     68        m3 = pablo.Advance((m3 & lex.cc0))
     69        m1 = (m1 | m3)
     70        m3 = pablo.Advance((m3 & lex.cc0))
     71        m3 = pablo.Advance((m3 & lex.cc1))
     72        m3 = pablo.Advance((m3 & lex.cc0))
     73        m1 = (m1 | m3)
     74        m1 = pablo.Advance((m1 & lex.cc3))
    5775        m0 = m1
    58         m1 = m0
    59         m1 = pablo.Advance((m1 & lex.cc1))
    60         m0 = (m0 | m1)
    61         m1 = pablo.Advance((m1 & lex.cc1))
    62         m0 = (m0 | m1)
    63         m1 = pablo.Advance((m1 & lex.cc1))
    64         m0 = (m0 | m1)
    65         m1 = pablo.Advance((m1 & lex.cc1))
    66         m0 = (m0 | m1)
    67         m1 = pablo.Advance((m1 & lex.cc1))
    68         m0 = (m0 | m1)
    69         m1 = pablo.Advance((m1 & lex.cc1))
    70         m0 = (m0 | m1)
    71         m1 = pablo.Advance((m1 & lex.cc1))
    72         m0 = (m0 | m1)
    73         m1 = pablo.Advance((m1 & lex.cc1))
    74         m0 = (m0 | m1)
    75         m1 = pablo.Advance((m1 & lex.cc1))
    76         m0 = (m0 | m1)
    77         m1 = pablo.Advance((m1 & lex.cc1))
    78         m0 = (m0 | m1)
    79         m0 = pablo.Advance((m0 & lex.cc2))
    80         m0 = pablo.Advance((m0 & lex.cc3))
    81         m0 = pablo.Advance((m0 & lex.cc4))
    8276        output.matches = m0
    8377       
  • proto/RE/src/codeGenerator/CodeGenerator.java

    r3113 r3122  
    5555       
    5656
    57                 //only one child?
    5857                ASTNode child = node.child(0);
    5958                ASTNode repetitionIndicator = node.child(1);
     
    6766        NodeState childState = nodeStates.get(child);
    6867               
    69         LextantToken lT = (LextantToken) node.getToken();
    70                 String repetitionType = lT.getLextant().getPrimaryLexeme();
    7168
    7269                Output cursorAssign = oG.makeAssignment(oG.makeVariable(childState.getCursorVariable()), oG.makeVariable(nodeState.getCursorVariable()));
     
    8481                if (lB>0) {
    8582                        boolean lHandled=false;
     83
     84                        if (childState.isCharacterClass()) {
     85
     86
     87
     88                                if (lB>5&&lHandled==false) {
     89                                        int curPos = 1;
     90                                        String curVariable = "t"+Integer.toString(curPos);
     91                                        Output logCode = oG.makeAssignment(oG.makeVariable(curVariable),oG.makeVariable(characterClassVariables.get(childState.getCharacterClassRepresentationString())));
     92                                        int nextPos=2;
     93                                        String nextVariable = "t"+Integer.toString(nextPos);
     94                                        while(curPos<lB) {
     95                                                logCode = oG.combineStatements(logCode, oG.makeAssignment(oG.makeVariable(nextVariable),oG.makeAnd(oG.makeAdvance(oG.makeVariable(curVariable),nextPos-curPos),oG.makeVariable(curVariable))));
     96                                                curPos=nextPos;
     97                                                curVariable=nextVariable;
     98                                                nextPos=nextPos*2;
     99                                                if (nextPos>lB) {
     100                                                        nextPos = lB;
     101                                                }
     102                                                nextVariable = "t"+Integer.toString(nextPos);
     103                                        }
     104
     105                                        out = logCode;
     106                                        out = oG.combineStatements(out, oG.makeAssignment(oG.makeVariable(nodeState.getCursorVariable()),oG.makeAdvance(oG.makeAnd(oG.makeAdvance(oG.makeVariable(nodeState.getCursorVariable()),lB-1),oG.makeVariable(curVariable)))));
     107                                        lHandled=true;
     108
     109                                }
     110                        }
    86111
    87112
     
    112137                                        uHandled=true;
    113138                                }
     139                                if(uB-lB>4&&uHandled==false) {
     140                                        int curPos = 1;
     141                                        String curVariable = "t"+Integer.toString(curPos);
     142                                        Output logCode = oG.makeAssignment(oG.makeVariable(curVariable),oG.makeNot(oG.makeVariable(nodeState.getCursorVariable())));
     143                                        int nextPos=2;
     144                                        String nextVariable = "t"+Integer.toString(nextPos);
     145                                        while(curPos<(1+uB-lB)) {
     146                                                logCode = oG.combineStatements(logCode, oG.makeAssignment(oG.makeVariable(nextVariable),oG.makeAnd(oG.makeAdvance(oG.makeVariable(curVariable),nextPos-curPos),oG.makeVariable(curVariable))));
     147                                                curPos=nextPos;
     148                                                curVariable=nextVariable;
     149                                                nextPos=nextPos*2;
     150                                                if (nextPos>(1+uB-lB)) {
     151                                                        nextPos = 1+uB-lB;
     152                                                }
     153                                                nextVariable = "t"+Integer.toString(nextPos);
     154                                        }
     155
     156                                        out = oG.combineStatements(out,logCode);
     157                                        Output matchStar = oG.makeMatchStar(oG.makeVariable(nodeState.getCursorVariable()), oG.makeVariable(characterClassVariables.get(childState.getCharacterClassRepresentationString())));
     158                                        out = oG.combineStatements(out, oG.makeAssignment(oG.makeVariable(nodeState.getCursorVariable()),oG.makeAnd(matchStar,oG.makeNot(oG.makeVariable(curVariable)))));
     159                                        uHandled=true;
     160
     161                                }
     162
    114163
    115164                        }
  • proto/RE/src/codeGenerator/OutputGenerator.java

    r3113 r3122  
    44        public Output makeAssignment(Output lhs, Output rhs);
    55        public Output makeAdvance(Output op);
     6        public Output makeAdvance(Output op, int amount);
    67        public Output makeAnd(Output op1, Output op2);
    78        public Output makeOr(Output op1, Output op2);
  • proto/RE/src/codeGenerator/PythonGenerator.java

    r3113 r3122  
    1313
    1414                return new PythonOutput("pablo.Advance("+op+")");
     15
     16        }
     17        @Override
     18        public Output makeAdvance(Output op, int amount) {
     19
     20                return new PythonOutput("pablo.Advance("+op+","+Integer.toString(amount)+")");
     21
    1522        }
    1623
Note: See TracChangeset for help on using the changeset viewer.