Perché stai usando le maschere di bit? Non sarebbe meglio controllare tutti questi eventi con una singola istruzione STTNI e quindi utilizzare l'indice restituito per elaborare l'evento restituito (se presente)?
(edit) vorrei provare a essere più utile ...
(darò per scontato che si sta utilizzando le stringhe con zero finale di caratteri a 8 bit. Fatemi sapere se questo non è il caso.)
Penso che farei meglio a mettere il delimitatore, la nuova riga, la citazione e l'escape in un unico registro (come stringa terminata da null) e usare PCMPISTRI invece di PCMPISTRM usando ogni valore. Per la parola di controllo che si desidera indicare: Byte non firmati, Uguale a Qualsiasi, Polarità positiva, Minima. (Piuttosto sicuro di aver capito bene.)
È quindi possibile utilizzare JA per verificare simultaneamente se uno dei 4 caratteri speciali è stato colpito o se è stata raggiunta la fine della stringa. Se è così, sfoglia il ciclo per affrontarlo. In caso contrario, aggiungere ECX al puntatore xmm2/m128 e tornare al PCMPISTRI.
Prima istruzione del codice per gestire un "colpo" è aggiungere ECX al puntatore xmm2/m128, quindi elaborare ciascuna possibilità a turno. Suggerisco di ordinarli dal più probabile al minimo.
Così, l'ASM dovrebbe finire cercando qualcosa di simile:
XOR ECX, ECX
TAG1:
ADD EAX, ECX
PCMPISTRI XMM1, [EAX], 0x0 ; also writes ECX = index
JA TAG1
ADD EAX, ECX
CMP BYTE PTR[EAX], "delimiter"
JE "handle delimiter"
CMP BYTE PTR[EAX], "newline"
JE "handle newline"
CMP BYTE PTR[EAX], "quotation"
JE "handle quotation"
CMP BYTE PTR[EAX], "escape"
JE "handle escape"
CMP BYTE PTR[EAX], "end of string"
JE "handle end of string"
Ti lascerò decidere quale sia il miglior modo per delimitatori di test è. :)
Quando stavo sviluppando le istruzioni che ero solito essere in grado di ottenere il compilatore per generare il codice asm sopra usando intrinsics. È passato un po 'di tempo da quando ho lavorato con le istruzioni, quindi non sono sicuro che il compilatore medio funzionerà o meno. (Sarebbe interessante sapere quali risultati ottieni.)
Tra l'altro, le versioni maschera delle istruzioni non hanno tutti i tipi di usi, solo che non sono la scelta migliore per trovare il primo o l'ultimo di qualcosa dal momento che le versioni "I" delle istruzioni calcolerà l'offset per te. Le versioni di maschera sono buone per il conteggio o solo l'elaborazione di determinati oggetti tra altre cose più esotiche. in questo momento li sto usando per contare A, C G e T in stringhe di DNA.
Si noti che il carattere di virgoletta potrebbe potenzialmente essere sfuggito, che probabilmente sarà difficile da gestire con l'approccio che hai tracciato. –
Da una risposta di solo collegamento cancellata: Esiste un'implementazione funzionante (ma non di produzione pronta) su [github: 'csvmonkey'] (https://github.com/dw/csvmonkey). Libreria di intestazione C++. È veloce ma "Per ora è soprattutto un codice giocattolo". Forse un buon punto di partenza, tranne che non c'è nessuna licenza elencata. –