Merge pull request #1975 from MaxGraey/more-peephole-opts

peepmatic: add reminder by a power of two rule
This commit is contained in:
Nick Fitzgerald
2020-07-06 16:32:16 -07:00
committed by GitHub
4 changed files with 13 additions and 1 deletions

View File

@@ -191,3 +191,9 @@
(=> (when (udiv_imm $C $x) (=> (when (udiv_imm $C $x)
(is-power-of-two $C)) (is-power-of-two $C))
(ushr_imm $(log2 $C) $x)) (ushr_imm $(log2 $C) $x))
;; Remainder by a power of two -> bitwise and with decreased by one constant.
(=> (when (urem_imm $C $x)
(is-power-of-two $C)
(fits-in-native-word $C))
(band_imm $(isub $C 1) $x))

View File

@@ -237,6 +237,10 @@ pub enum UnquoteOperator {
#[peepmatic(params(iNN, iNN), result(iNN))] #[peepmatic(params(iNN, iNN), result(iNN))]
Imul, Imul,
/// Compile-time `isub` of two constant values.
#[peepmatic(params(iNN, iNN), result(iNN))]
Isub,
/// Take the base-2 log of a power of two integer. /// Take the base-2 log of a power of two integer.
#[peepmatic(params(iNN), result(iNN))] #[peepmatic(params(iNN), result(iNN))]
Log2, Log2,

View File

@@ -77,7 +77,8 @@ where
| UnquoteOperator::Bor | UnquoteOperator::Bor
| UnquoteOperator::Bxor | UnquoteOperator::Bxor
| UnquoteOperator::Iadd | UnquoteOperator::Iadd
| UnquoteOperator::Imul => unreachable!("not a unary unquote operator: {:?}", operator), | UnquoteOperator::Imul
| UnquoteOperator::Isub => unreachable!("not a unary unquote operator: {:?}", operator),
} }
} }
@@ -99,6 +100,7 @@ where
UnquoteOperator::Bxor => fold_ints!(a, b, |x, y| x ^ y), UnquoteOperator::Bxor => fold_ints!(a, b, |x, y| x ^ y),
UnquoteOperator::Iadd => fold_ints!(a, b, |x, y| x.wrapping_add(y)), UnquoteOperator::Iadd => fold_ints!(a, b, |x, y| x.wrapping_add(y)),
UnquoteOperator::Imul => fold_ints!(a, b, |x, y| x.wrapping_mul(y)), UnquoteOperator::Imul => fold_ints!(a, b, |x, y| x.wrapping_mul(y)),
UnquoteOperator::Isub => fold_ints!(a, b, |x, y| x.wrapping_sub(y)),
UnquoteOperator::Log2 | UnquoteOperator::Neg => { UnquoteOperator::Log2 | UnquoteOperator::Neg => {
unreachable!("not a binary unquote operator: {:?}", operator) unreachable!("not a binary unquote operator: {:?}", operator)
} }