Changeset 567 for proto


Ignore:
Timestamp:
Aug 9, 2010, 9:26:33 AM (9 years ago)
Author:
lindanl
Message:

matching tag names up to 16 bytes

Location:
proto/parabix2
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • proto/parabix2/parabix2_compilable.py

    r564 r567  
    403403        #return (CT_callouts, callouts, refs, u16hi, u16lo, delmask, error, lex, u16delmask, EOF_mask)
    404404        tag_marks = callouts.EmptyTagMarks | LAngleFollow
    405         return (CT_callouts, callouts, refs, error, lex, EOF_mask, name_check, name_start_check, control, tag_marks)
    406 
    407        
     405        return (CT_callouts, callouts, refs, error, lex, EOF_mask, name_check, name_start_check, control, tag_marks, ElemNameFollows)
     406
     407       
  • proto/parabix2/src/tag_matcher.cpp

    r565 r567  
     1
     2#define MAX_DEPTH 100
    13
    24class tag_matcher {
    35  public:
    46  SIMD_type tagMarks[BUFFER_SIZE/BLOCK_SIZE];
    5   int tagMarks_index;
     7  int stream_index;
    68  char * srcbuf;
    7   int tag_depth; 
     9  int depth;
     10  SIMD_type tag_stack[MAX_DEPTH];
     11  int tag_lgth_stack[MAX_DEPTH];
     12  SIMD_type tagNameFollows[BUFFER_SIZE/BLOCK_SIZE+1]; // 1 extra block for sentinel
     13  int buf_base;
     14  enum TagMatchState {InStartTag, InEndTag, Clear} state;
    815   
    916  tag_matcher(char * src);
    1017  ~tag_matcher(); 
    1118  int StreamScan(int chars_avail);
    12   void store_tagMarks(SIMD_type tagMark);
     19  void store_streams(SIMD_type tagMark, SIMD_type tagNameFollow);
    1320  int tag_match(int pos);
     21  void Advance_buffer();
    1422};
    1523
    1624int tag_matcher:: tag_match(int pos) {
    17 //      printf("%c\n",srcbuf[pos]);
     25//      printf("%c\n",srcbuf[pos]);
    1826        if(srcbuf[pos]=='/' ){
    19           tag_depth--;
    20           if (tag_depth<0)
     27          pos++;
     28          depth--;
     29          if (depth<0)
    2130            return pos;
     31          int matchlen = cfzl(~_mm_movemask_epi8(simd_eq_8(tag_stack[depth], sisd_load_unaligned((SIMD_type*)&srcbuf[pos]))));
     32          if (matchlen > tag_lgth_stack[depth]) return 0;
     33          else if ((matchlen == tag_lgth_stack[depth]) && ((srcbuf[pos+matchlen] == '>') ||(srcbuf[pos+matchlen] <= ' '))) return 0;
     34          else if (pos + matchlen >= BUFFER_SIZE) {
     35            matchlen = BUFFER_SIZE - pos;
     36            tag_stack[depth] = sisd_srl(tag_stack[depth], sisd_from_int(matchlen*8));
     37            tag_lgth_stack[depth] -= matchlen;
     38            state = InEndTag;
     39          }
     40          else {
     41              fprintf(stderr,"tag name mismatch at position = %i\n",buf_base+pos);
     42              exit(-1);
     43          }
    2244        }
    23         else if(srcbuf[pos]=='>')
    24           tag_depth--;
    25         else
    26           tag_depth++;
     45        else if(srcbuf[pos]=='>'){
     46          depth--;
     47        }
     48        else {
     49          if(depth<MAX_DEPTH){
     50            int end_pos = bitstream_scan(tagNameFollows,pos);
     51            tag_lgth_stack[depth] = end_pos-pos;
     52            tag_stack[depth] = sisd_load_unaligned((SIMD_type*)&srcbuf[pos]);
     53            if(end_pos<BUFFER_SIZE){
     54              depth++;
     55            }
     56            else{
     57              state = InStartTag;
     58            }
     59          }
     60          else{
     61            fprintf(stderr,"Max nesting depth exceeded at position =%i. depth = %i\n",buf_base+pos, depth);
     62            exit(-1);
     63          }
     64        }
    2765        return 0;
    2866}
     
    4482                block_pos += 8 * sizeof(ScanBlock);
    4583        }
     84
    4685        return 0;
    4786}
    4887
    49 void tag_matcher::store_tagMarks(SIMD_type tagMark){
    50   tagMarks[tagMarks_index] = tagMark;
    51   tagMarks_index++; 
     88void tag_matcher::store_streams(SIMD_type tagMark, SIMD_type tagNameFollow){
     89  tagMarks[stream_index] = tagMark;
     90  tagNameFollows[stream_index] = tagNameFollow;
     91  stream_index++; 
     92  if(stream_index==1){
     93    if(state == InStartTag) {     
     94      state = Clear;
     95      int remain_lgth = bitstream_scan(tagNameFollows,0);
     96      SIMD_type shft = sisd_from_int(8*tag_lgth_stack[depth]);
     97      tag_stack[depth] = simd_or(simd_andc(tag_stack[depth],sisd_sll(simd_const_1(1),shft)),
     98                                sisd_sll(sisd_load_unaligned((SIMD_type*)srcbuf),shft));
     99      tag_lgth_stack[depth] += remain_lgth;
     100      depth++;
     101    }
     102    else if (state == InEndTag) {
     103      int matchlen = cfzl(~_mm_movemask_epi8(simd_eq_8(tag_stack[depth], sisd_load_unaligned((SIMD_type*)srcbuf))));
     104     
     105      state = Clear;
     106      if (matchlen > tag_lgth_stack[depth]) return ;
     107      else if ((matchlen == tag_lgth_stack[depth]) && ((srcbuf[matchlen] == '>') ||(srcbuf[matchlen] <= ' '))) return;
     108      else {
     109          fprintf(stderr,"tag name mismatch at position = %i\n",buf_base);
     110          exit(-1);
     111      }
     112    }
     113  } 
    52114}
    53115
    54116tag_matcher::tag_matcher(char * src){
    55   tagMarks_index = 0;
    56   tag_depth = 0;
     117  stream_index = 0;
     118  depth = 0;
    57119  srcbuf = src;
     120  buf_base = 0;
     121  state = Clear;
     122  tagNameFollows[BUFFER_SIZE/BLOCK_SIZE]=simd_const_1(1);  //sentinel
    58123}
    59124
     
    61126 
    62127}
     128
     129void tag_matcher::Advance_buffer(){
     130  buf_base += BUFFER_SIZE;
     131  stream_index=0;
     132}
  • proto/parabix2/template_tag_match.c

    r565 r567  
    325325        }
    326326           
    327         t.store_tagMarks(tag_marks);
     327        t.store_streams(tag_marks, ElemNameFollows);
    328328       
    329329        block_pos += BLOCK_SIZE;
     
    361361        }
    362362           
    363         t.store_tagMarks(tag_marks);
     363        t.store_streams(tag_marks, ElemNameFollows);
    364364
    365365        block_pos += BLOCK_SIZE;
     
    368368
    369369    t.StreamScan(chars_avail);
    370     t.tagMarks_index=0;
     370    t.Advance_buffer();
    371371
    372372    PERF_SEC_END(parser_timer, chars_avail);
     
    380380   
    381381  }
    382   if(t.tag_depth!=0){
    383     fprintf(stderr, "tag matching error (depth %i) at position %i\n", t.tag_depth, buffer_last);
     382  if(t.depth!=0){
     383    fprintf(stderr, "tag matching error (depth %i) at position %i\n", t.depth, buffer_last);
    384384    exit(-1);
    385385  }       
Note: See TracChangeset for help on using the changeset viewer.