Skip to content

Commit 821a513

Browse files
committed
[Cranelift] implement urem and use imm64 ops
1 parent 946a61f commit 821a513

3 files changed

Lines changed: 42 additions & 28 deletions

File tree

cranelift/codegen/src/isle_prelude.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,17 @@ macro_rules! isle_common_prelude_methods {
100100
Some(Imm64::new(result).mask_to_width(type_width))
101101
}
102102

103+
#[inline]
104+
fn imm64_urem(&mut self, ty: Type, x: Imm64, y: Imm64) -> Option<Imm64> {
105+
let type_width = ty.bits();
106+
assert!(type_width <= 64);
107+
let mask = self.ty_mask(ty);
108+
let x = (x.bits() as u64) & mask;
109+
let y = (y.bits() as u64) & mask;
110+
let result = x.checked_rem(y)?;
111+
Some(Imm64::new(result as i64).mask_to_width(type_width))
112+
}
113+
103114
#[inline]
104115
fn imm64_add(&mut self, ty: Type, x: Imm64, y: Imm64) -> Imm64 {
105116
let ty_mask = self.ty_mask(ty) as i64;

cranelift/codegen/src/opts/cprop.isle

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,21 @@
1313

1414
(rule (simplify
1515
(iadd (fits_in_64 ty)
16-
(iconst ty (u64_from_imm64 k1))
17-
(iconst ty (u64_from_imm64 k2))))
18-
(subsume (iconst ty (imm64_masked ty (u64_wrapping_add k1 k2)))))
16+
(iconst ty k1)
17+
(iconst ty k2)))
18+
(subsume (iconst ty (imm64_add ty k1 k2))))
1919

2020
(rule (simplify
2121
(isub (fits_in_64 ty)
22-
(iconst ty (u64_from_imm64 k1))
23-
(iconst ty (u64_from_imm64 k2))))
24-
(subsume (iconst ty (imm64_masked ty (u64_wrapping_sub k1 k2)))))
22+
(iconst ty k1)
23+
(iconst ty k2)))
24+
(subsume (iconst ty (imm64_sub ty k1 k2))))
2525

2626
(rule (simplify
2727
(imul (fits_in_64 ty)
28-
(iconst ty (u64_from_imm64 k1))
29-
(iconst ty (u64_from_imm64 k2))))
30-
(subsume (iconst ty (imm64_masked ty (u64_wrapping_mul k1 k2)))))
28+
(iconst ty k1)
29+
(iconst ty k2)))
30+
(subsume (iconst ty (imm64_mul ty k1 k2))))
3131

3232
(rule (simplify_skeleton
3333
(sdiv (iconst ty k1)
@@ -42,39 +42,39 @@
4242
(iconst ty d))
4343

4444
(rule (simplify_skeleton
45-
(udiv (iconst_u ty k1)
46-
(iconst_u ty k2)))
47-
(if-let d (u64_checked_div k1 k2))
48-
(iconst ty (imm64_masked ty d)))
45+
(udiv (iconst ty k1)
46+
(iconst ty k2)))
47+
(if-let d (imm64_udiv ty k1 k2))
48+
(iconst ty d))
4949

5050
(rule (simplify_skeleton
51-
(urem (iconst_u ty k1)
52-
(iconst_u ty k2)))
53-
(if-let d (u64_checked_rem k1 k2))
54-
(iconst ty (imm64_masked ty d)))
51+
(urem (iconst ty k1)
52+
(iconst ty k2)))
53+
(if-let d (imm64_urem ty k1 k2))
54+
(iconst ty d))
5555

5656
(rule (simplify
5757
(bor (fits_in_64 ty)
58-
(iconst ty (u64_from_imm64 k1))
59-
(iconst ty (u64_from_imm64 k2))))
60-
(subsume (iconst ty (imm64_masked ty (u64_or k1 k2)))))
58+
(iconst ty k1)
59+
(iconst ty k2)))
60+
(subsume (iconst ty (imm64_or ty k1 k2))))
6161

6262
(rule (simplify
6363
(band (fits_in_64 ty)
64-
(iconst ty (u64_from_imm64 k1))
65-
(iconst ty (u64_from_imm64 k2))))
66-
(subsume (iconst ty (imm64_masked ty (u64_and k1 k2)))))
64+
(iconst ty k1)
65+
(iconst ty k2)))
66+
(subsume (iconst ty (imm64_and ty k1 k2))))
6767

6868
(rule (simplify
6969
(bxor (fits_in_64 ty)
70-
(iconst ty (u64_from_imm64 k1))
71-
(iconst ty (u64_from_imm64 k2))))
72-
(subsume (iconst ty (imm64_masked ty (u64_xor k1 k2)))))
70+
(iconst ty k1)
71+
(iconst ty k2)))
72+
(subsume (iconst ty (imm64_xor ty k1 k2))))
7373

7474
(rule (simplify
7575
(bnot (fits_in_64 ty)
76-
(iconst ty (u64_from_imm64 k))))
77-
(subsume (iconst ty (imm64_masked ty (u64_not k)))))
76+
(iconst ty k)))
77+
(subsume (iconst ty (imm64_not ty k))))
7878

7979
(rule (simplify (ishl (fits_in_64 ty)
8080
(iconst ty k1)

cranelift/codegen/src/prelude.isle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@
7979
(decl pure partial imm64_srem (Type Imm64 Imm64) Imm64)
8080
(extern constructor imm64_srem imm64_srem)
8181

82+
(decl pure partial imm64_urem (Type Imm64 Imm64) Imm64)
83+
(extern constructor imm64_urem imm64_urem)
84+
8285
(decl pure imm64_add (Type Imm64 Imm64) Imm64)
8386
(extern constructor imm64_add imm64_add)
8487

0 commit comments

Comments
 (0)