Diffstat (limited to 'README.md')
-rw-r--r--README.md56
1 files changed, 56 insertions, 0 deletions
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2a1389f
--- /dev/null
+++ b/README.md
@@ -0,0 +1,56 @@
+# lower
+
+lowers expressions to their "desugared" form.
+
+e.g
+
+`a * b + c` => `(a.mul(b)).add(c)`
+
+note that it is _extremely pervasive_, so
+
+```rust
+lower::math! { fn main() -> u8 {
+ const X: u8 = 31 * 2;
+ return 2 * X + 2;
+} }
+```
+
+expands to
+
+```rust
+fn main() -> u8 {
+ const X: u8 = 31.mul(2);
+ return (2.mul(X)).add(2);
+}
+```
+
+it should work for most expressions.
+
+also implements some modules that let it work with some core intrinsics (`f*_fast`, `f*_algebraic`). (nightly only!)
+
+## why
+
+rust added an amazing feature called algebraic math (thanks orlp), allowing us to use `f*_algebraic`. however, dont you hate it when your
+
+```rs
+fn madd<const N: usize>(x: [[f32; 3]; N]) -> [f32; N] {
+ x.map(|[a, b, c]| a * b + c) // not optimized! cant use `(v)fmadd`
+}
+```
+
+turns into
+
+```rs
+fn madd<const N: usize>(x: [[f32; 3]; N]) -> [f32; N] {
+ x.map(|[a, b, c]| core::intrinsics::fadd_algebraic(core::intrinsics::fmul_algebraic(a, b), c)) // readability in shambles
+}
+```
+
+this crate allows you to
+
+```rs
+fn madd<const N: usize>(x: [[f32; 3]; N]) -> [f32; N] {
+ // wow! such readability! ultimate simd!
+ lower::algebraic! { x.map(|[a, b, c]| a * b + c) }
+}
+```