@@ -86,6 +86,8 @@ impl std::fmt::Debug for Op {
8686 Self :: GE_INT => write ! ( f, "GeInt({}, {}, {})" , self . a( ) , self . b( ) , self . c( ) ) ,
8787 Self :: JUMP_IF_LE_INT_IMM => write ! ( f, "JumpIfLeIntImm({}, {}, {})" , self . a( ) , self . b( ) as i8 , self . c( ) as i8 ) ,
8888 Self :: JUMP_IF_GT_INT_IMM => write ! ( f, "JumpIfGtIntImm({}, {}, {})" , self . a( ) , self . b( ) as i8 , self . c( ) as i8 ) ,
89+ Self :: JUMP_IF_LT_INT_IMM => write ! ( f, "JumpIfLtIntImm({}, {}, {})" , self . a( ) , self . b( ) as i8 , self . c( ) as i8 ) ,
90+ Self :: JUMP_IF_GE_INT_IMM => write ! ( f, "JumpIfGeIntImm({}, {}, {})" , self . a( ) , self . b( ) as i8 , self . c( ) as i8 ) ,
8991 _ => write ! ( f, "Unknown(0x{:08x})" , self . 0 ) ,
9092 }
9193 }
@@ -171,6 +173,8 @@ impl Op {
171173 // Combined compare-and-jump for integers (most common loop pattern)
172174 pub const JUMP_IF_LE_INT_IMM : u8 = 64 ; // ABC: src, imm (i8), offset (i8) - jump if src <= imm
173175 pub const JUMP_IF_GT_INT_IMM : u8 = 65 ; // ABC: src, imm (i8), offset (i8) - jump if src > imm (for opposite)
176+ pub const JUMP_IF_LT_INT_IMM : u8 = 66 ; // ABC: src, imm (i8), offset (i8) - jump if src < imm
177+ pub const JUMP_IF_GE_INT_IMM : u8 = 67 ; // ABC: src, imm (i8), offset (i8) - jump if src >= imm
174178
175179 // ========== Constructors ==========
176180
@@ -580,6 +584,16 @@ impl Op {
580584 Self :: abc ( Self :: JUMP_IF_GT_INT_IMM , src, imm as u8 , offset as u8 )
581585 }
582586
587+ #[ inline( always) ]
588+ pub const fn jump_if_lt_int_imm ( src : Reg , imm : i8 , offset : i8 ) -> Self {
589+ Self :: abc ( Self :: JUMP_IF_LT_INT_IMM , src, imm as u8 , offset as u8 )
590+ }
591+
592+ #[ inline( always) ]
593+ pub const fn jump_if_ge_int_imm ( src : Reg , imm : i8 , offset : i8 ) -> Self {
594+ Self :: abc ( Self :: JUMP_IF_GE_INT_IMM , src, imm as u8 , offset as u8 )
595+ }
596+
583597 // ========== Jump patching helpers ==========
584598
585599 /// Check if this is a jump instruction (for patching)
@@ -593,6 +607,7 @@ impl Op {
593607 || op == Self :: JUMP_IF_GT_IMM || op == Self :: JUMP_IF_GE_IMM
594608 || op == Self :: JUMP_IF_NIL || op == Self :: JUMP_IF_NOT_NIL
595609 || op == Self :: JUMP_IF_LE_INT_IMM || op == Self :: JUMP_IF_GT_INT_IMM
610+ || op == Self :: JUMP_IF_LT_INT_IMM || op == Self :: JUMP_IF_GE_INT_IMM
596611 }
597612
598613 /// Patch the offset of a jump instruction
@@ -602,7 +617,12 @@ impl Op {
602617 let a = self . a ( ) ;
603618 let b = self . b ( ) ;
604619 // Combined compare-and-jump use ABC format with C as 8-bit offset
605- if opcode >= Self :: JUMP_IF_LT && opcode <= Self :: JUMP_IF_GE_IMM {
620+ if ( opcode >= Self :: JUMP_IF_LT && opcode <= Self :: JUMP_IF_GE_IMM )
621+ || opcode == Self :: JUMP_IF_LE_INT_IMM
622+ || opcode == Self :: JUMP_IF_GT_INT_IMM
623+ || opcode == Self :: JUMP_IF_LT_INT_IMM
624+ || opcode == Self :: JUMP_IF_GE_INT_IMM
625+ {
606626 // For these opcodes: A=left/src, B=right/imm, C=offset (i8)
607627 * self = Self :: abc ( opcode, a, b, new_offset as i8 as u8 ) ;
608628 } else if opcode == Self :: JUMP {
@@ -671,7 +691,8 @@ impl Chunk {
671691 jump_targets[ target] = true ;
672692 }
673693 } else if ( opcode >= Op :: JUMP_IF_LT && opcode <= Op :: JUMP_IF_GE_IMM )
674- || opcode == Op :: JUMP_IF_LE_INT_IMM || opcode == Op :: JUMP_IF_GT_INT_IMM {
694+ || opcode == Op :: JUMP_IF_LE_INT_IMM || opcode == Op :: JUMP_IF_GT_INT_IMM
695+ || opcode == Op :: JUMP_IF_LT_INT_IMM || opcode == Op :: JUMP_IF_GE_INT_IMM {
675696 // These use i8 offset in C byte
676697 let offset = op. c ( ) as i8 as isize ;
677698 let target = ( i as isize + 1 + offset) as usize ;
@@ -720,7 +741,8 @@ impl Chunk {
720741 }
721742 Op :: JUMP_IF_LT_IMM | Op :: JUMP_IF_LE_IMM |
722743 Op :: JUMP_IF_GT_IMM | Op :: JUMP_IF_GE_IMM |
723- Op :: JUMP_IF_LE_INT_IMM | Op :: JUMP_IF_GT_INT_IMM => {
744+ Op :: JUMP_IF_LE_INT_IMM | Op :: JUMP_IF_GT_INT_IMM |
745+ Op :: JUMP_IF_LT_INT_IMM | Op :: JUMP_IF_GE_INT_IMM => {
724746 ever_live |= 1u128 << op. a ( ) ;
725747 }
726748 _ => { }
@@ -869,7 +891,8 @@ impl Chunk {
869891
870892 Op :: JUMP_IF_LT_IMM | Op :: JUMP_IF_LE_IMM |
871893 Op :: JUMP_IF_GT_IMM | Op :: JUMP_IF_GE_IMM |
872- Op :: JUMP_IF_LE_INT_IMM | Op :: JUMP_IF_GT_INT_IMM => {
894+ Op :: JUMP_IF_LE_INT_IMM | Op :: JUMP_IF_GT_INT_IMM |
895+ Op :: JUMP_IF_LT_INT_IMM | Op :: JUMP_IF_GE_INT_IMM => {
873896 let src = op. a ( ) ;
874897 live |= 1u128 << src;
875898 }
0 commit comments