@@ -538,33 +538,79 @@ class QAST::MASTRegexCompiler {
538
538
op(' const_i64' , $ lower , ival($ node [1 ]. value )),
539
539
op(' const_i64' , $ upper , ival($ node [2 ]. value )),
540
540
]);
541
- if $ node [0 ] eq ' ignorecase' {
541
+ if $ node [0 ] eq ' ignorecase+ignoremark' {
542
+ my $ succeed := label();
542
543
my $ s0 := $ ! regalloc . fresh_s();
543
544
my $ s1 := $ ! regalloc . fresh_s();
544
545
my $ i2 := $ ! regalloc . fresh_i();
546
+ my $ goal := $ node . negate ?? % ! reg <fail > !! $ succeed ;
547
+ merge_ins(@ ins , [
548
+ op(' substr_s' , $ s0 , % ! reg <tgt >, % ! reg <pos >, % ! reg <one >),
549
+ op(' lc' , $ s1 , $ s0 ),
550
+ op(' ordbaseat' , $ i0 , $ s1 , % ! reg <zero >),
551
+ op(' ge_i' , $ i1 , $ i0 , $ lower ),
552
+ op(' le_i' , $ i2 , $ i0 , $ upper ),
553
+ op(' band_i' , $ i1 , $ i1 , $ i2 ),
554
+ op(' if_i' , $ i1 , $ goal ),
555
+ op(' uc' , $ s1 , $ s0 ),
556
+ op(' ordbaseat' , $ i0 , $ s1 , % ! reg <zero >),
557
+ op(' ge_i' , $ i1 , $ i0 , $ lower ),
558
+ op(' le_i' , $ i2 , $ i0 , $ upper ),
559
+ op(' band_i' , $ i1 , $ i1 , $ i2 ),
560
+ op(' if_i' , $ i1 , $ goal ),
561
+ ]);
562
+ $ ! regalloc . release_register($ s0 , $ MVM_reg_str );
563
+ $ ! regalloc . release_register($ s1 , $ MVM_reg_str );
564
+ $ ! regalloc . release_register($ i2 , $ MVM_reg_int64 );
565
+ unless $ node . negate {
566
+ nqp :: push (@ ins , op(' goto' , % ! reg <fail >));
567
+ nqp :: push (@ ins , $ succeed );
568
+ }
569
+ }
570
+ elsif $ node [0 ] eq ' ignorecase' {
545
571
my $ succeed := label();
572
+ my $ s0 := $ ! regalloc . fresh_s();
573
+ my $ s1 := $ ! regalloc . fresh_s();
574
+ my $ i2 := $ ! regalloc . fresh_i();
546
575
my $ goal := $ node . negate ?? % ! reg <fail > !! $ succeed ;
547
576
merge_ins(@ ins , [
548
- op(' const_i64' , $ i2 , ival(1 )),
549
- op(' substr_s' , $ s0 , % ! reg <tgt >, % ! reg <pos >, $ i2 ),
577
+ op(' substr_s' , $ s0 , % ! reg <tgt >, % ! reg <pos >, % ! reg <one >),
550
578
op(' lc' , $ s1 , $ s0 ),
551
579
op(' ordfirst' , $ i0 , $ s1 ),
552
580
op(' ge_i' , $ i1 , $ i0 , $ lower ),
553
581
op(' le_i' , $ i2 , $ i0 , $ upper ),
554
- op(' bitand_i ' , $ i1 , $ i1 , $ i2 ),
582
+ op(' band_i ' , $ i1 , $ i1 , $ i2 ),
555
583
op(' if_i' , $ i1 , $ goal ),
556
584
op(' uc' , $ s1 , $ s0 ),
557
585
op(' ordfirst' , $ i0 , $ s1 ),
558
586
op(' ge_i' , $ i1 , $ i0 , $ lower ),
559
587
op(' le_i' , $ i2 , $ i0 , $ upper ),
560
- op(' bitand_i ' , $ i1 , $ i1 , $ i2 ),
588
+ op(' band_i ' , $ i1 , $ i1 , $ i2 ),
561
589
op(' if_i' , $ i1 , $ goal ),
562
590
]);
591
+ $ ! regalloc . release_register($ s0 , $ MVM_reg_str );
592
+ $ ! regalloc . release_register($ s1 , $ MVM_reg_str );
593
+ $ ! regalloc . release_register($ i2 , $ MVM_reg_int64 );
563
594
unless $ node . negate {
564
595
nqp :: push (@ ins , op(' goto' , % ! reg <fail >));
565
596
nqp :: push (@ ins , $ succeed );
566
597
}
567
598
}
599
+ elsif $ node [0 ] eq ' ignoremark' {
600
+ my $ succeed := label();
601
+ my $ goal := $ node . negate ?? $ succeed !! % ! reg <fail >;
602
+ merge_ins(@ ins , [
603
+ op(' ordbaseat' , $ i0 , % ! reg <tgt >, % ! reg <pos >),
604
+ op(' gt_i' , $ i1 , $ i0 , $ upper ),
605
+ op(' if_i' , $ i1 , $ goal ),
606
+ op(' lt_i' , $ i1 , $ i0 , $ lower ),
607
+ op(' if_i' , $ i1 , $ goal ),
608
+ ]);
609
+ if $ node . negate {
610
+ nqp :: push (@ ins , op(' goto' , % ! reg <fail >));
611
+ nqp :: push (@ ins , $ succeed );
612
+ }
613
+ }
568
614
else {
569
615
my $ succeed := label();
570
616
my $ goal := $ node . negate ?? $ succeed !! % ! reg <fail >;
0 commit comments