Merge pull request #1975 from MaxGraey/more-peephole-opts
peepmatic: add reminder by a power of two rule
This commit is contained in:
@@ -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))
|
||||||
|
|||||||
Binary file not shown.
@@ -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,
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user