@@ -265,6 +265,9 @@ impl<'arena> Env<'arena> {
265265 env. define_prim_fun ( S8Div , [ & S8_TYPE , & S8_TYPE ] , & S8_TYPE ) ;
266266 env. define_prim_fun ( S8Abs , [ & S8_TYPE ] , & S8_TYPE ) ;
267267 env. define_prim_fun ( S8UAbs , [ & S8_TYPE ] , & U8_TYPE ) ;
268+ env. define_prim_fun ( S8ExtendS16 , [ & S8_TYPE ] , & S16_TYPE ) ;
269+ env. define_prim_fun ( S8ExtendS32 , [ & S8_TYPE ] , & S32_TYPE ) ;
270+ env. define_prim_fun ( S8ExtendS64 , [ & S8_TYPE ] , & S64_TYPE ) ;
268271
269272 env. define_prim_fun ( S16Eq , [ & S16_TYPE , & S16_TYPE ] , & BOOL_TYPE ) ;
270273 env. define_prim_fun ( S16Neq , [ & S16_TYPE , & S16_TYPE ] , & BOOL_TYPE ) ;
@@ -279,6 +282,9 @@ impl<'arena> Env<'arena> {
279282 env. define_prim_fun ( S16Div , [ & S16_TYPE , & S16_TYPE ] , & S16_TYPE ) ;
280283 env. define_prim_fun ( S16Abs , [ & S16_TYPE ] , & S16_TYPE ) ;
281284 env. define_prim_fun ( S16UAbs , [ & S16_TYPE ] , & U16_TYPE ) ;
285+ env. define_prim_fun ( S16TruncateS8 , [ & S16_TYPE ] , & S8_TYPE ) ;
286+ env. define_prim_fun ( S16ExtendS32 , [ & S16_TYPE ] , & S32_TYPE ) ;
287+ env. define_prim_fun ( S16ExtendS64 , [ & S16_TYPE ] , & S64_TYPE ) ;
282288
283289 env. define_prim_fun ( S32Eq , [ & S32_TYPE , & S32_TYPE ] , & BOOL_TYPE ) ;
284290 env. define_prim_fun ( S32Neq , [ & S32_TYPE , & S32_TYPE ] , & BOOL_TYPE ) ;
@@ -293,6 +299,9 @@ impl<'arena> Env<'arena> {
293299 env. define_prim_fun ( S32Div , [ & S32_TYPE , & S32_TYPE ] , & S32_TYPE ) ;
294300 env. define_prim_fun ( S32Abs , [ & S32_TYPE ] , & S32_TYPE ) ;
295301 env. define_prim_fun ( S32UAbs , [ & S32_TYPE ] , & U32_TYPE ) ;
302+ env. define_prim_fun ( S32TruncateS8 , [ & S32_TYPE ] , & S8_TYPE ) ;
303+ env. define_prim_fun ( S32TruncateS16 , [ & S32_TYPE ] , & S16_TYPE ) ;
304+ env. define_prim_fun ( S32ExtendS64 , [ & S32_TYPE ] , & S64_TYPE ) ;
296305
297306 env. define_prim_fun ( S64Eq , [ & S64_TYPE , & S64_TYPE ] , & BOOL_TYPE ) ;
298307 env. define_prim_fun ( S64Neq , [ & S64_TYPE , & S64_TYPE ] , & BOOL_TYPE ) ;
@@ -307,6 +316,9 @@ impl<'arena> Env<'arena> {
307316 env. define_prim_fun ( S64Div , [ & S64_TYPE , & S64_TYPE ] , & S64_TYPE ) ;
308317 env. define_prim_fun ( S64Abs , [ & S64_TYPE ] , & S64_TYPE ) ;
309318 env. define_prim_fun ( S64UAbs , [ & S64_TYPE ] , & U64_TYPE ) ;
319+ env. define_prim_fun ( S64TruncateS8 , [ & S64_TYPE ] , & S8_TYPE ) ;
320+ env. define_prim_fun ( S64TruncateS16 , [ & S64_TYPE ] , & S16_TYPE ) ;
321+ env. define_prim_fun ( S64TruncateS32 , [ & S64_TYPE ] , & S32_TYPE ) ;
310322
311323 env. define_prim (
312324 OptionSome ,
@@ -731,6 +743,9 @@ pub fn step(prim: Prim) -> Step {
731743 Prim :: S8Div => const_step ! ( [ x: S8 , y: S8 ] => Const :: S8 ( i8 :: checked_div( * x, * y) ?) ) ,
732744 Prim :: S8Abs => const_step ! ( [ x: S8 ] => Const :: S8 ( i8 :: abs( * x) ) ) ,
733745 Prim :: S8UAbs => const_step ! ( [ x: S8 ] => Const :: U8 ( i8 :: unsigned_abs( * x) , UIntStyle :: Decimal ) ) ,
746+ Prim :: S8ExtendS16 => const_step ! ( [ x: S8 ] => Const :: S16 ( i16 :: from( * x) ) ) ,
747+ Prim :: S8ExtendS32 => const_step ! ( [ x: S8 ] => Const :: S32 ( i32 :: from( * x) ) ) ,
748+ Prim :: S8ExtendS64 => const_step ! ( [ x: S8 ] => Const :: S64 ( i64 :: from( * x) ) ) ,
734749
735750 Prim :: S16Eq => const_step ! ( [ x: S16 , y: S16 ] => Const :: Bool ( x == y) ) ,
736751 Prim :: S16Neq => const_step ! ( [ x: S16 , y: S16 ] => Const :: Bool ( x != y) ) ,
@@ -745,6 +760,9 @@ pub fn step(prim: Prim) -> Step {
745760 Prim :: S16Div => const_step ! ( [ x: S16 , y: S16 ] => Const :: S16 ( i16 :: checked_div( * x, * y) ?) ) ,
746761 Prim :: S16Abs => const_step ! ( [ x: S16 ] => Const :: S16 ( i16 :: abs( * x) ) ) ,
747762 Prim :: S16UAbs => const_step ! ( [ x: S16 ] => Const :: U16 ( i16 :: unsigned_abs( * x) , UIntStyle :: Decimal ) ) ,
763+ Prim :: S16TruncateS8 => const_step ! ( [ x: S16 ] => Const :: S8 ( * x as i8 ) ) ,
764+ Prim :: S16ExtendS32 => const_step ! ( [ x: S16 ] => Const :: S32 ( i32 :: from( * x) ) ) ,
765+ Prim :: S16ExtendS64 => const_step ! ( [ x: S16 ] => Const :: S64 ( i64 :: from( * x) ) ) ,
748766
749767 Prim :: S32Eq => const_step ! ( [ x: S32 , y: S32 ] => Const :: Bool ( x == y) ) ,
750768 Prim :: S32Neq => const_step ! ( [ x: S32 , y: S32 ] => Const :: Bool ( x != y) ) ,
@@ -759,6 +777,9 @@ pub fn step(prim: Prim) -> Step {
759777 Prim :: S32Div => const_step ! ( [ x: S32 , y: S32 ] => Const :: S32 ( i32 :: checked_div( * x, * y) ?) ) ,
760778 Prim :: S32Abs => const_step ! ( [ x: S32 ] => Const :: S32 ( i32 :: abs( * x) ) ) ,
761779 Prim :: S32UAbs => const_step ! ( [ x: S32 ] => Const :: U32 ( i32 :: unsigned_abs( * x) , UIntStyle :: Decimal ) ) ,
780+ Prim :: S32TruncateS8 => const_step ! ( [ x: S32 ] => Const :: S8 ( * x as i8 ) ) ,
781+ Prim :: S32TruncateS16 => const_step ! ( [ x: S32 ] => Const :: S16 ( * x as i16 ) ) ,
782+ Prim :: S32ExtendS64 => const_step ! ( [ x: S32 ] => Const :: S64 ( i64 :: from( * x) ) ) ,
762783
763784 Prim :: S64Eq => const_step ! ( [ x: S64 , y: S64 ] => Const :: Bool ( x == y) ) ,
764785 Prim :: S64Neq => const_step ! ( [ x: S64 , y: S64 ] => Const :: Bool ( x != y) ) ,
@@ -773,6 +794,9 @@ pub fn step(prim: Prim) -> Step {
773794 Prim :: S64Div => const_step ! ( [ x: S64 , y: S64 ] => Const :: S64 ( i64 :: checked_div( * x, * y) ?) ) ,
774795 Prim :: S64Abs => const_step ! ( [ x: S64 ] => Const :: S64 ( i64 :: abs( * x) ) ) ,
775796 Prim :: S64UAbs => const_step ! ( [ x: S64 ] => Const :: U64 ( i64 :: unsigned_abs( * x) , UIntStyle :: Decimal ) ) ,
797+ Prim :: S64TruncateS8 => const_step ! ( [ x: S64 ] => Const :: S8 ( * x as i8 ) ) ,
798+ Prim :: S64TruncateS16 => const_step ! ( [ x: S64 ] => Const :: S16 ( * x as i16 ) ) ,
799+ Prim :: S64TruncateS32 => const_step ! ( [ x: S64 ] => Const :: S32 ( * x as i32 ) ) ,
776800
777801 Prim :: OptionFold => step ! ( env, [ _, _, on_none, on_some, option] => {
778802 match option. match_prim_spine( ) ? {
0 commit comments