Skip to content

Commit 059f971

Browse files
committed
Add truncation prims
1 parent ef003d6 commit 059f971

File tree

4 files changed

+30
-0
lines changed

4 files changed

+30
-0
lines changed

fathom/src/core.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,7 @@ def_prims! {
452452
U16And => "u16_and",
453453
U16Or => "u16_or",
454454
U16Xor => "u16_xor",
455+
U16TruncateU8 => "u16_truncate_u8",
455456
U16ExtendU32 => "u16_extend_u32",
456457
U16ExtendU64 => "u16_extend_u64",
457458

@@ -471,6 +472,8 @@ def_prims! {
471472
U32And => "u32_and",
472473
U32Or => "u32_or",
473474
U32Xor => "u32_xor",
475+
U32TruncateU8 => "u32_truncate_u8",
476+
U32TruncateU16 => "u32_truncate_u16",
474477
U32ExtendU64 => "u32_extend_u64",
475478

476479
U64Eq => "u64_eq",
@@ -489,6 +492,9 @@ def_prims! {
489492
U64And => "u64_and",
490493
U64Or => "u64_or",
491494
U64Xor => "u64_xor",
495+
U64TruncateU8 => "u64_truncate_u8",
496+
U64TruncateU16 => "u64_truncate_u16",
497+
U64TruncateU32 => "u64_truncate_u32",
492498

493499
S8Eq => "s8_eq",
494500
S8Neq => "s8_neq",

fathom/src/core/prim.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ impl<'arena> Env<'arena> {
208208
env.define_prim_fun(U16And, [&U16_TYPE, &U16_TYPE], &U16_TYPE);
209209
env.define_prim_fun(U16Or, [&U16_TYPE, &U16_TYPE], &U16_TYPE);
210210
env.define_prim_fun(U16Xor, [&U16_TYPE, &U16_TYPE], &U16_TYPE);
211+
env.define_prim_fun(U16TruncateU8, [&U16_TYPE], &U8_TYPE);
211212
env.define_prim_fun(U16ExtendU32, [&U16_TYPE], &U32_TYPE);
212213
env.define_prim_fun(U16ExtendU64, [&U16_TYPE], &U64_TYPE);
213214

@@ -227,6 +228,8 @@ impl<'arena> Env<'arena> {
227228
env.define_prim_fun(U32And, [&U32_TYPE, &U32_TYPE], &U32_TYPE);
228229
env.define_prim_fun(U32Or, [&U32_TYPE, &U32_TYPE], &U32_TYPE);
229230
env.define_prim_fun(U32Xor, [&U32_TYPE, &U32_TYPE], &U32_TYPE);
231+
env.define_prim_fun(U32TruncateU8, [&U32_TYPE], &U8_TYPE);
232+
env.define_prim_fun(U32TruncateU16, [&U32_TYPE], &U16_TYPE);
230233
env.define_prim_fun(U32ExtendU64, [&U32_TYPE], &U64_TYPE);
231234

232235
env.define_prim_fun(U64Eq, [&U64_TYPE, &U64_TYPE], &BOOL_TYPE);
@@ -245,6 +248,9 @@ impl<'arena> Env<'arena> {
245248
env.define_prim_fun(U64And, [&U64_TYPE, &U64_TYPE], &U64_TYPE);
246249
env.define_prim_fun(U64Or, [&U64_TYPE, &U64_TYPE], &U64_TYPE);
247250
env.define_prim_fun(U64Xor, [&U64_TYPE, &U64_TYPE], &U64_TYPE);
251+
env.define_prim_fun(U64TruncateU8, [&U64_TYPE], &U8_TYPE);
252+
env.define_prim_fun(U64TruncateU16, [&U64_TYPE], &U16_TYPE);
253+
env.define_prim_fun(U64TruncateU32, [&U64_TYPE], &U32_TYPE);
248254

249255
env.define_prim_fun(S8Eq, [&S8_TYPE, &S8_TYPE], &BOOL_TYPE);
250256
env.define_prim_fun(S8Neq, [&S8_TYPE, &S8_TYPE], &BOOL_TYPE);
@@ -668,6 +674,7 @@ pub fn step(prim: Prim) -> Step {
668674
Prim::U16And => const_step!([x, xst: U16, y, yst: U16] => Const::U16(u16::bitand(*x, *y), UIntStyle::merge(*xst, *yst))),
669675
Prim::U16Or => const_step!([x, xst: U16, y, yst: U16] => Const::U16(u16::bitor(*x, *y), UIntStyle::merge(*xst, *yst))),
670676
Prim::U16Xor => const_step!([x, xst: U16, y, yst: U16] => Const::U16(u16::bitxor(*x, *y), UIntStyle::merge(*xst, *yst))),
677+
Prim::U16TruncateU8 => const_step!([x, xst: U16] => Const::U8(*x as u8, *xst)),
671678
Prim::U16ExtendU32 => const_step!([x, xst: U16] => Const::U32(u32::from(*x), *xst)),
672679
Prim::U16ExtendU64 => const_step!([x, xst: U16] => Const::U64(u64::from(*x), *xst)),
673680

@@ -687,6 +694,8 @@ pub fn step(prim: Prim) -> Step {
687694
Prim::U32And => const_step!([x, xst: U32, y, yst: U32] => Const::U32(u32::bitand(*x, *y), UIntStyle::merge(*xst, *yst))),
688695
Prim::U32Or => const_step!([x, xst: U32, y, yst: U32] => Const::U32(u32::bitor(*x, *y), UIntStyle::merge(*xst, *yst))),
689696
Prim::U32Xor => const_step!([x, xst: U32, y, yst: U32] => Const::U32(u32::bitxor(*x, *y), UIntStyle::merge(*xst, *yst))),
697+
Prim::U32TruncateU8 => const_step!([x, xst: U32] => Const::U8(*x as u8, *xst)),
698+
Prim::U32TruncateU16 => const_step!([x, xst: U32] => Const::U16(*x as u16, *xst)),
690699
Prim::U32ExtendU64 => const_step!([x, xst: U32] => Const::U64(u64::from(*x), *xst)),
691700

692701
Prim::U64Eq => const_step!([x: U64, y: U64] => Const::Bool(x == y)),
@@ -705,6 +714,9 @@ pub fn step(prim: Prim) -> Step {
705714
Prim::U64And => const_step!([x, xst: U64, y, yst: U64] => Const::U64(u64::bitand(*x, *y), UIntStyle::merge(*xst, *yst))),
706715
Prim::U64Or => const_step!([x, xst: U64, y, yst: U64] => Const::U64(u64::bitor(*x, *y), UIntStyle::merge(*xst, *yst))),
707716
Prim::U64Xor => const_step!([x, xst: U64, y, yst: U64] => Const::U64(u64::bitxor(*x, *y), UIntStyle::merge(*xst, *yst))),
717+
Prim::U64TruncateU8 => const_step!([x, xst: U64] => Const::U8(*x as u8, *xst)),
718+
Prim::U64TruncateU16 => const_step!([x, xst: U64] => Const::U16(*x as u16, *xst)),
719+
Prim::U64TruncateU32 => const_step!([x, xst: U64] => Const::U32(*x as u32, *xst)),
708720

709721
Prim::S8Eq => const_step!([x: S8, y: S8] => Const::Bool(x == y)),
710722
Prim::S8Neq => const_step!([x: S8, y: S8] => Const::Bool(x != y)),

tests/succeed/primitives.fathom

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ let _ = u16_shr : U16 -> U8 -> U16;
104104
let _ = u16_and : U16 -> U16 -> U16;
105105
let _ = u16_or : U16 -> U16 -> U16;
106106
let _ = u16_xor : U16 -> U16 -> U16;
107+
let _ = u16_truncate_u8 : U16 -> U8;
107108
let _ = u16_extend_u32 : U16 -> U32;
108109
let _ = u16_extend_u64 : U16 -> U64;
109110

@@ -123,6 +124,8 @@ let _ = u32_shr : U32 -> U8 -> U32;
123124
let _ = u32_and : U32 -> U32 -> U32;
124125
let _ = u32_or : U32 -> U32 -> U32;
125126
let _ = u32_xor : U32 -> U32 -> U32;
127+
let _ = u32_truncate_u8 : U32 -> U8;
128+
let _ = u32_truncate_u16 : U32 -> U16;
126129
let _ = u32_extend_u64 : U32 -> U64;
127130

128131
let _ = u64_eq : U64 -> U64 -> Bool;
@@ -141,6 +144,9 @@ let _ = u64_shr : U64 -> U8 -> U64;
141144
let _ = u64_and : U64 -> U64 -> U64;
142145
let _ = u64_or : U64 -> U64 -> U64;
143146
let _ = u64_xor : U64 -> U64 -> U64;
147+
let _ = u64_truncate_u8 : U64 -> U8;
148+
let _ = u64_truncate_u16 : U64 -> U16;
149+
let _ = u64_truncate_u32 : U64 -> U32;
144150

145151
let _ = s8_eq : S8 -> S8 -> Bool;
146152
let _ = s8_neq : S8 -> S8 -> Bool;

tests/succeed/primitives.snap

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ let _ : U16 -> U8 -> U16 = u16_shr;
9797
let _ : U16 -> U16 -> U16 = u16_and;
9898
let _ : U16 -> U16 -> U16 = u16_or;
9999
let _ : U16 -> U16 -> U16 = u16_xor;
100+
let _ : U16 -> U8 = u16_truncate_u8;
100101
let _ : U16 -> U32 = u16_extend_u32;
101102
let _ : U16 -> U64 = u16_extend_u64;
102103
let _ : U32 -> U32 -> Bool = u32_eq;
@@ -115,6 +116,8 @@ let _ : U32 -> U8 -> U32 = u32_shr;
115116
let _ : U32 -> U32 -> U32 = u32_and;
116117
let _ : U32 -> U32 -> U32 = u32_or;
117118
let _ : U32 -> U32 -> U32 = u32_xor;
119+
let _ : U32 -> U8 = u32_truncate_u8;
120+
let _ : U32 -> U16 = u32_truncate_u16;
118121
let _ : U32 -> U64 = u32_extend_u64;
119122
let _ : U64 -> U64 -> Bool = u64_eq;
120123
let _ : U64 -> U64 -> Bool = u64_neq;
@@ -132,6 +135,9 @@ let _ : U64 -> U8 -> U64 = u64_shr;
132135
let _ : U64 -> U64 -> U64 = u64_and;
133136
let _ : U64 -> U64 -> U64 = u64_or;
134137
let _ : U64 -> U64 -> U64 = u64_xor;
138+
let _ : U64 -> U8 = u64_truncate_u8;
139+
let _ : U64 -> U16 = u64_truncate_u16;
140+
let _ : U64 -> U32 = u64_truncate_u32;
135141
let _ : S8 -> S8 -> Bool = s8_eq;
136142
let _ : S8 -> S8 -> Bool = s8_neq;
137143
let _ : S8 -> S8 -> Bool = s8_gt;

0 commit comments

Comments
 (0)