1- // instructions.rs
21// spell-checker: disable
32use super :: { JitCompileError , JitSig , JitType } ;
43use alloc:: collections:: BTreeSet ;
@@ -31,14 +30,8 @@ enum ElementShape {
3130struct TupleShape ( Vec < ElementShape > ) ;
3231#[ derive( Clone ) ]
3332enum Local {
34- Scalar {
35- var : Variable ,
36- ty : JitType ,
37- } ,
38- Object {
39- var : Variable ,
40- kind : Rc < ObjectKind > ,
41- }
33+ Scalar { var : Variable , ty : JitType } ,
34+ Object { var : Variable , kind : Rc < ObjectKind > } ,
4235}
4336#[ derive( Debug ) ]
4437enum JitValue {
@@ -126,11 +119,13 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
126119 compiler
127120 }
128121
122+ /// Pops Multiple Values off the Stack, returning a Vector
129123 fn pop_multiple ( & mut self , count : usize ) -> Vec < JitValue > {
130124 let stack_len = self . stack . len ( ) ;
131125 self . stack . drain ( stack_len - count..) . collect ( )
132126 }
133127
128+ /// Generates a local out of a jitvalue
134129 fn local_from_value (
135130 builder : & mut FunctionBuilder < ' _ > ,
136131 value : JitValue ,
@@ -152,22 +147,30 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
152147 }
153148 }
154149
155- fn local_to_value ( builder : & mut FunctionBuilder < ' _ > , local : & Local ) -> Result < JitValue , JitCompileError > {
150+ /// Generates a JitValue out of a Local
151+ fn local_to_value (
152+ builder : & mut FunctionBuilder < ' _ > ,
153+ local : & Local ,
154+ ) -> Result < JitValue , JitCompileError > {
156155 match local {
157156 Local :: Scalar { var, ty } => Ok ( JitValue :: from_type_and_value (
158157 ty. clone ( ) ,
159158 builder. use_var ( * var) ,
160159 ) ) ,
161- Local :: Object { var, kind } => Ok ( JitValue :: Object ( builder. use_var ( * var) , kind. clone ( ) ) ) ,
160+ Local :: Object { var, kind } => {
161+ Ok ( JitValue :: Object ( builder. use_var ( * var) , kind. clone ( ) ) )
162+ }
162163 }
163164 }
165+ /// Stores a Local into the variables array
164166 fn store_variable ( & mut self , idx : oparg:: VarNum , val : JitValue ) -> Result < ( ) , JitCompileError > {
165167 #[ expect( clippy:: mut_mut, reason = "This seems like a false positive" ) ]
166168 let builder = & mut self . builder ;
167169 let local = Self :: local_from_value ( builder, val) ?;
168170 self . variables [ idx] = Some ( local) ;
169171 Ok ( ( ) )
170172 }
173+ /// Generates a boolean value out of a JitValue, Nulls FuncRefs and Objects aren't supported
171174 fn boolean_val ( & mut self , val : JitValue ) -> Result < Value , JitCompileError > {
172175 match val {
173176 JitValue :: Float ( val) => {
@@ -183,7 +186,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
183186 JitValue :: Bool ( val) => Ok ( val) ,
184187 JitValue :: None => Ok ( self . builder . ins ( ) . iconst ( types:: I8 , 0 ) ) ,
185188 JitValue :: Null | JitValue :: FuncRef ( _) | JitValue :: Object ( _, _) => {
186- Err ( JitCompileError :: NotSupported )
189+ Err ( JitCompileError :: NotSupported )
187190 }
188191 }
189192 }
@@ -376,7 +379,10 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
376379 } ;
377380 Ok ( value)
378381 }
379- fn build_heap_tuple ( & mut self , elements : Vec < JitValue > ) -> Result < ( Value , Rc < TupleShape > ) , JitCompileError > {
382+ fn build_heap_tuple (
383+ & mut self ,
384+ elements : Vec < JitValue > ,
385+ ) -> Result < ( Value , Rc < TupleShape > ) , JitCompileError > {
380386 let len_val = self . builder . ins ( ) . iconst ( types:: I64 , elements. len ( ) as i64 ) ;
381387 let call = self . builder . ins ( ) . call ( self . alloc_func , & [ len_val] ) ;
382388 let ptr = self . builder . inst_results ( call) [ 0 ] ;
@@ -404,11 +410,17 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
404410 let offset = 8 + 8 * i as i32 ;
405411 let value = match element_shape {
406412 ElementShape :: Scalar ( ty) => {
407- let val = self . builder . ins ( ) . load ( ty. to_cranelift ( ) , MemFlags :: new ( ) , ptr, offset) ;
413+ let val =
414+ self . builder
415+ . ins ( )
416+ . load ( ty. to_cranelift ( ) , MemFlags :: new ( ) , ptr, offset) ;
408417 JitValue :: from_type_and_value ( ty. clone ( ) , val)
409418 }
410419 ElementShape :: Object ( kind) => {
411- let val = self . builder . ins ( ) . load ( types:: I64 , MemFlags :: new ( ) , ptr, offset) ;
420+ let val = self
421+ . builder
422+ . ins ( )
423+ . load ( types:: I64 , MemFlags :: new ( ) , ptr, offset) ;
412424 JitValue :: Object ( val, kind. clone ( ) )
413425 }
414426 } ;
@@ -418,9 +430,9 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
418430 }
419431 fn return_value ( & mut self , val : JitValue ) -> Result < ( ) , JitCompileError > {
420432 let ( cr_val, ret_ty) = match val {
421- JitValue :: Int ( v) => ( v, JitType :: Int ) ,
422- JitValue :: Float ( v) => ( v, JitType :: Float ) ,
423- JitValue :: Bool ( v) => ( v, JitType :: Bool ) ,
433+ JitValue :: Int ( v) => ( v, JitType :: Int ) ,
434+ JitValue :: Float ( v) => ( v, JitType :: Float ) ,
435+ JitValue :: Bool ( v) => ( v, JitType :: Bool ) ,
424436 JitValue :: Object ( p, _) => ( p, JitType :: Object ) ,
425437 //JitValue::None => (self.none_ptr(), JitType::Object),
426438 _ => return Err ( JitCompileError :: NotSupported ) ,
@@ -429,7 +441,9 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
429441 // single abi type
430442 if self . sig . ret . is_none ( ) {
431443 self . sig . ret = Some ( ret_ty. clone ( ) ) ;
432- self . builder . func . signature
444+ self . builder
445+ . func
446+ . signature
433447 . returns
434448 . push ( AbiParam :: new ( ret_ty. to_cranelift ( ) ) ) ;
435449 }
@@ -611,7 +625,8 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
611625 Instruction :: BuildTuple { count } => {
612626 let elements = self . pop_multiple ( count. get ( arg) as usize ) ;
613627 let ( ptr, shape) = self . build_heap_tuple ( elements) ?;
614- self . stack . push ( JitValue :: Object ( ptr, Rc :: new ( ObjectKind :: Tuple ( shape) ) ) ) ;
628+ self . stack
629+ . push ( JitValue :: Object ( ptr, Rc :: new ( ObjectKind :: Tuple ( shape) ) ) ) ;
615630 Ok ( ( ) )
616631 }
617632 Instruction :: Call { argc } => {
@@ -622,7 +637,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
622637 let arg = self . stack . pop ( ) . ok_or ( JitCompileError :: BadBytecode ) ?;
623638 args. push ( arg. into_value ( ) . unwrap ( ) ) ;
624639 }
625-
640+
626641 // Pop self_or_null (should be Null for JIT-compiled recursive calls)
627642 let self_or_null = self . stack . pop ( ) . ok_or ( JitCompileError :: BadBytecode ) ?;
628643 if !matches ! ( self_or_null, JitValue :: Null ) {
@@ -1369,7 +1384,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
13691384 even_block,
13701385 & [ inf_f. into ( ) ] ,
13711386 ) ;
1372-
1387+
13731388 self . builder . switch_to_block ( odd_block) ;
13741389 let phi_neg_inf = self . builder . block_params ( odd_block) [ 0 ] ;
13751390 self . builder . ins ( ) . jump ( merge_block, & [ phi_neg_inf. into ( ) ] ) ;
@@ -1388,7 +1403,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
13881403 self . builder
13891404 . ins ( )
13901405 . brif ( cmp_lt, a_neg_block, & [ ] , a_pos_block, & [ ] ) ;
1391-
1406+
13921407 // ----- Case: a > 0: Compute a^b = exp(b * ln(a)) using double–double arithmetic.
13931408 self . builder . switch_to_block ( a_pos_block) ;
13941409 let ln_a_dd = self . dd_ln ( a) ;
@@ -1426,7 +1441,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
14261441 let remainder = self . builder . ins ( ) . band ( b_i64, one_i) ;
14271442 let zero_i = self . builder . ins ( ) . iconst ( i64_ty, 0 ) ;
14281443 let is_odd = self . builder . ins ( ) . icmp ( IntCC :: NotEqual , remainder, zero_i) ;
1429-
1444+
14301445 let odd_block = self . builder . create_block ( ) ;
14311446 let even_block = self . builder . create_block ( ) ;
14321447 // Append block parameters for both branches:
@@ -1542,7 +1557,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
15421557 let is_odd = self . builder . ins ( ) . icmp_imm ( IntCC :: Equal , is_odd, 1 ) ;
15431558 let mul_result = self . builder . ins ( ) . imul ( result_phi, base_phi) ;
15441559 let new_result = self . builder . ins ( ) . select ( is_odd, mul_result, result_phi) ;
1545-
1560+
15461561 // Square the base and divide exponent by 2
15471562 let squared_base = self . builder . ins ( ) . imul ( base_phi, base_phi) ;
15481563 let new_exp = self . builder . ins ( ) . sshr_imm ( exp_phi, 1 ) ;
@@ -1561,8 +1576,7 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
15611576 self . builder . seal_block ( loop_block) ;
15621577 self . builder . seal_block ( continue_block) ;
15631578 self . builder . seal_block ( exit_block) ;
1564-
1579+
15651580 res
15661581 }
1567-
1568- }
1582+ }
0 commit comments