Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit4482411

Browse files
committed
cacheline improvement
1 parentb218020 commit4482411

File tree

1 file changed

+37
-39
lines changed

1 file changed

+37
-39
lines changed

‎pike.c‎

Lines changed: 37 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,12 @@ enum
7171
WEND,
7272
BOL,
7373
EOL,
74+
// Other (special) instructions
75+
SAVE,
7476
// Instructions which take relative offset as arg
7577
JMP,
7678
SPLIT,
7779
RSPLIT,
78-
// Other (special) instructions
79-
SAVE,
8080
};
8181

8282
// Return codes for re_sizecode() and re_comp()
@@ -129,15 +129,11 @@ void re_dumpcode(rcode *prog)
129129
printf("%4d: ",pc);i++;
130130
switch(code[pc++]) {
131131
default:
132-
pc=prog->unilen;
133-
break;
134-
caseSPLIT:
135-
printf("split %d (%d) #%d\n",pc+code[pc]+2,code[pc],code[pc+1]);
136-
pc+=2;
137-
break;
138-
caseRSPLIT:
139-
printf("rsplit %d (%d) #%d\n",pc+code[pc]+2,code[pc],code[pc+1]);
140-
pc+=2;
132+
if (code[pc-1]<0)
133+
printf("rsplit %d (%d) #%d\n",pc+code[pc]+1,code[pc],code[pc-1]);
134+
else
135+
printf("split %d (%d) #%d\n",pc+code[pc]+1,code[pc],code[pc-1]);
136+
pc++;
141137
break;
142138
caseJMP:
143139
printf("jmp %d (%d)\n",pc+code[pc]+1,code[pc]);
@@ -278,8 +274,8 @@ static int _compilecode(const char **re_loc, rcode *prog, int sizecode)
278274
re++;
279275
if (*re=='}') {
280276
EMIT(PC,RSPLIT);
281-
EMIT(PC+1,REL(PC,PC-size-1));
282-
PC+=3;
277+
EMIT(PC+1,REL(PC,PC-size));
278+
PC+=2;
283279
maxcnt=mincnt;
284280
}
285281
while (isdigit((unsignedchar)*re))
@@ -293,27 +289,26 @@ static int _compilecode(const char **re_loc, rcode *prog, int sizecode)
293289
}
294290
for (i=maxcnt-mincnt;i>0;i--) {
295291
EMIT(PC++,SPLIT);
296-
EMIT(PC++,REL(PC-1,PC+((size+3)*i)));
297-
PC++;
292+
EMIT(PC++,REL(PC,PC+((size+2)*i)));
298293
if (code)
299294
memcpy(&code[PC],&code[term],size*sizeof(int));
300295
PC+=size;
301296
}
302297
break;
303298
case'?':
304299
if (PC==term) gotosyntax_error;
305-
INSERT_CODE(term,3,PC);
300+
INSERT_CODE(term,2,PC);
306301
if (re[1]=='?') {
307302
EMIT(term,RSPLIT);
308303
re++;
309304
}else
310305
EMIT(term,SPLIT);
311-
EMIT(term+1,REL(term,PC-1));
306+
EMIT(term+1,REL(term,PC));
312307
term=PC;
313308
break;
314309
case'*':
315310
if (PC==term) gotosyntax_error;
316-
INSERT_CODE(term,3,PC);
311+
INSERT_CODE(term,2,PC);
317312
EMIT(PC,JMP);
318313
EMIT(PC+1,REL(PC,term));
319314
PC+=2;
@@ -322,7 +317,7 @@ static int _compilecode(const char **re_loc, rcode *prog, int sizecode)
322317
re++;
323318
}else
324319
EMIT(term,SPLIT);
325-
EMIT(term+1,REL(term,PC-1));
320+
EMIT(term+1,REL(term,PC));
326321
term=PC;
327322
break;
328323
case'+':
@@ -332,18 +327,18 @@ static int _compilecode(const char **re_loc, rcode *prog, int sizecode)
332327
re++;
333328
}else
334329
EMIT(PC,RSPLIT);
335-
EMIT(PC+1,REL(PC-1,term));
336-
PC+=3;
330+
EMIT(PC+1,REL(PC,term));
331+
PC+=2;
337332
term=PC;
338333
break;
339334
case'|':
340335
if (alt_label)
341336
alt_stack[altc++]=alt_label;
342-
INSERT_CODE(start,3,PC);
337+
INSERT_CODE(start,2,PC);
343338
EMIT(PC++,JMP);
344339
alt_label=PC++;
345340
EMIT(start,SPLIT);
346-
EMIT(start+1,REL(start,PC-1));
341+
EMIT(start+1,REL(start,PC));
347342
term=PC;
348343
break;
349344
case'^':
@@ -360,7 +355,7 @@ static int _compilecode(const char **re_loc, rcode *prog, int sizecode)
360355
if (code&&alt_label) {
361356
EMIT(alt_label,REL(alt_label,PC)+1);
362357
for (intalts=altc;altc;altc--) {
363-
intat=alt_stack[alts-altc]+altc*3;
358+
intat=alt_stack[alts-altc]+altc*2;
364359
EMIT(at,REL(at,PC)+1);
365360
}
366361
}
@@ -397,17 +392,19 @@ int re_comp(rcode *prog, const char *re, int nsubs)
397392
if (res<0)returnres;
398393
// If unparsed chars left
399394
if (*re)returnRE_SYNTAX_ERROR;
400-
inticnt=0,scnt=0;
395+
inticnt=0,scnt=SPLIT;
401396
for (inti=0;i<prog->unilen;i++)
402397
switch (prog->insts[i]) {
403398
caseCLASS:
404399
i+=prog->insts[i+2]*2+2;
405400
icnt++;
406401
break;
407402
caseSPLIT:
403+
prog->insts[i++]=scnt++;
404+
icnt++;
405+
break;
408406
caseRSPLIT:
409-
prog->insts[i+2]=scnt++;
410-
i++;
407+
prog->insts[i]=-scnt++;
411408
caseJMP:
412409
caseSAVE:
413410
caseCHAR:
@@ -440,11 +437,11 @@ if (--csub->ref == 0) { \
440437

441438
#defineonclist(nn)
442439
#defineonnlist(nn) \
443-
if (sparse[npc[2]] < sparsesz) \
444-
if (sdense[sparse[npc[2]]] ==npc[2]) \
440+
if (sparse[spc] < sparsesz) \
441+
if (sdense[sparse[spc]] ==spc) \
445442
deccheck(nn) \
446-
sdense[sparsesz] =npc[2]; \
447-
sparse[npc[2]] = sparsesz++; \
443+
sdense[sparsesz] =spc; \
444+
sparse[spc] = sparsesz++; \
448445

449446
#definefastrec(nn,list,listidx) \
450447
nsub->ref++; \
@@ -486,7 +483,7 @@ else if (spc == JMP) { \
486483
si = 0; \
487484
rec##nn: \
488485
spc = *npc; \
489-
if (spc < WBEG) { \
486+
if ((unsigned int)spc < WBEG) { \
490487
list[listidx].sub = nsub; \
491488
list[listidx++].pc = npc; \
492489
rec_check##nn: \
@@ -498,10 +495,10 @@ if (spc < WBEG) { \
498495
continue; \
499496
} \
500497
next##nn: \
501-
if (spc== SPLIT) { \
498+
if (spc> JMP) { \
502499
on##list(nn) \
503-
npc +=3; \
504-
pcs[si] = npc + npc[-2]; \
500+
npc +=2; \
501+
pcs[si] = npc + npc[-1]; \
505502
fastrec(nn, list, listidx) \
506503
} else if (spc == SAVE) { \
507504
if (nsub->ref > 1) { \
@@ -518,11 +515,12 @@ if (spc == SPLIT) { \
518515
|| !isword(_sp)) \
519516
deccheck(nn) \
520517
npc++; goto rec##nn; \
521-
} else if (spc == RSPLIT) { \
518+
} else if (spc < 0) { \
519+
spc = -spc; \
522520
on##list(nn) \
523-
npc +=3; \
521+
npc +=2; \
524522
pcs[si] = npc; \
525-
npc += npc[-2]; \
523+
npc += npc[-1]; \
526524
fastrec(nn, list, listidx) \
527525
} else if (spc == WEND) { \
528526
if (isword(_sp)) \
@@ -553,7 +551,7 @@ int re_pikevm(rcode *prog, const char *s, const char **subp, int nsubp)
553551
int*pcs[prog->splits];
554552
unsignedintsdense[prog->splits],sparse[prog->splits];
555553
rsub*subs[prog->splits];
556-
charnsubs[rsubsize* (prog->len-prog->splits+3)];
554+
charnsubs[rsubsize* (prog->len-prog->splits+14)];
557555
rsub*nsub,*s1,*matched=NULL,*freesub=NULL;
558556
rthread_clist[prog->len+1],_nlist[prog->len+1];
559557
_clist[0].pc=insts,_nlist[0].pc=insts;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp