Changeset 140 for trunk


Ignore:
Timestamp:
May 7, 2008, 10:41:02 AM (11 years ago)
Author:
lindanl
Message:

End Tag matching with SIMD compare.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/engine.c

    r139 r140  
    645645        char * end_elem_name = (char *)GetCodeUnitPtr(name_start);
    646646       
    647         for(int i=0; i<lgth; i++) {
    648                 if (start_elem_name[i] != end_elem_name[i])
    649                         WF_Error(wfErr_GIMatch);
    650         }
    651         if (start_elem_name[lgth] != '\0') WF_Error(wfErr_GIMatch);
     647        BytePack byte_compare =  simd_eq_8(sisd_load_unaligned((BytePack *) end_elem_name),
     648                                                           sisd_load_unaligned((BytePack *) start_elem_name));
     649        if (lgth < 16) {
     650                int expected_bits = ~(-1 << lgth);
     651            if ((_mm_movemask_epi8(byte_compare) & expected_bits) != expected_bits) {
     652                        WF_Error(wfErr_GIMatch);
     653            }
     654        }
     655        else {
     656            /* Must compare with bytes beyond the first 16.  Set up to
     657               compare 16 bytes at a time, with the first additional compare
     658               overlapping with the first byte_compare. */
     659            int pos = (lgth - 1) % PACKSIZE + 1;
     660            byte_compare =  simd_or(byte_compare, simd_eq_8(sisd_load_unaligned((BytePack *) &end_elem_name[pos]),
     661                                                                                        sisd_load_unaligned((BytePack *) &start_elem_name[pos])));
     662            pos += 16;
     663            while (pos < lgth) {
     664                if (_mm_movemask_epi8(byte_compare) != 0xFFFF) {
     665                        WF_Error(wfErr_GIMatch);
     666                }
     667                byte_compare =  simd_eq_8(sisd_load_unaligned((BytePack *) &end_elem_name[pos]),
     668                                                  sisd_load_unaligned((BytePack *) &start_elem_name[pos]));
     669                pos += 16;
     670            }
     671            if (_mm_movemask_epi8(byte_compare) != 0xFFFF) {
     672                        WF_Error(wfErr_GIMatch);
     673            }
     674        }
     675//     
     676//      for(int i=0; i<lgth; i++) {
     677//              if (start_elem_name[i] != end_elem_name[i])
     678//                      WF_Error(wfErr_GIMatch);
     679//      }
     680//      if (start_elem_name[lgth] != '\0') WF_Error(wfErr_GIMatch);
     681
    652682        if (AtChar<C,'>'>(cur())) {
    653683                Advance(1);
Note: See TracChangeset for help on using the changeset viewer.