From 91e7c9c5ad7b644cdec0491121ab110403057f2a Mon Sep 17 00:00:00 2001 From: Surma Date: Fri, 15 Feb 2019 09:47:26 +0000 Subject: [PATCH] Make Rust rotate code smaller (#462) * Make Rust rotate code smaller * Back on the rust happy path --- codecs/rotate/.gitignore | 2 + codecs/rotate/Cargo.toml | 14 +++++++ codecs/rotate/build.sh | 11 +++-- codecs/rotate/rotate.rs | 29 +++++++++----- codecs/rotate/rotate.wasm | Bin 3128 -> 533 bytes package-lock.json | 82 ++++++++++++++++++++++++++++---------- 6 files changed, 100 insertions(+), 38 deletions(-) create mode 100644 codecs/rotate/.gitignore create mode 100644 codecs/rotate/Cargo.toml diff --git a/codecs/rotate/.gitignore b/codecs/rotate/.gitignore new file mode 100644 index 00000000..a9d37c56 --- /dev/null +++ b/codecs/rotate/.gitignore @@ -0,0 +1,2 @@ +target +Cargo.lock diff --git a/codecs/rotate/Cargo.toml b/codecs/rotate/Cargo.toml new file mode 100644 index 00000000..63cab201 --- /dev/null +++ b/codecs/rotate/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "rotate" +version = "0.1.0" +authors = ["Surma "] +edition = "2018" + +[lib] +name = "rotate" +path = "rotate.rs" +crate-type = ["cdylib", "rlib"] + +[profile.release] +lto = true +opt-level = "s" diff --git a/codecs/rotate/build.sh b/codecs/rotate/build.sh index 61c11a30..954438af 100755 --- a/codecs/rotate/build.sh +++ b/codecs/rotate/build.sh @@ -7,12 +7,11 @@ echo "Compiling wasm" echo "=============================================" ( rustup run nightly \ - rustc \ - --target=wasm32-unknown-unknown \ - -C opt-level=3 \ - -o rotate.wasm \ - rotate.rs - wasm-strip rotate.wasm + cargo build \ + --target wasm32-unknown-unknown \ + --release + cp target/wasm32-unknown-unknown/release/rotate.wasm . + wasm-strip rotate.wasm ) echo "=============================================" echo "Compiling wasm done" diff --git a/codecs/rotate/rotate.rs b/codecs/rotate/rotate.rs index 335899c1..4a766c1e 100644 --- a/codecs/rotate/rotate.rs +++ b/codecs/rotate/rotate.rs @@ -1,8 +1,22 @@ -#![no_std] -#![no_main] +use std::slice::from_raw_parts_mut; -use core::panic::PanicInfo; -use core::slice::from_raw_parts_mut; +// This function is taken from +// https://rustwasm.github.io/book/reference/code-size.html +#[cfg(not(debug_assertions))] +#[inline] +pub fn unwrap_abort(o: Option) -> T { + use std::process; + match o { + Some(t) => t, + None => process::abort(), + } +} + +// Normal panic-y behavior for debug builds +#[cfg(debug_assertions)] +unsafe fn unchecked_unwrap(o: Option) -> T { + o.unwrap() +} #[no_mangle] fn rotate(input_width: isize, input_height: isize, rotate: isize) { @@ -69,13 +83,8 @@ fn rotate(input_width: isize, input_height: isize, rotate: isize) { for d2 in 0..d2_limit { for d1 in 0..d1_limit { let in_idx = (d1_start + d1 * d1_advance) * d1_multiplier + (d2_start + d2 * d2_advance) * d2_multiplier; - out_b[i as usize] = in_b[in_idx as usize]; + *unwrap_abort(out_b.get_mut(i as usize)) = *unwrap_abort(in_b.get(in_idx as usize)); i += 1; } } } - -#[panic_handler] -fn panic(_info: &PanicInfo) -> ! { - loop {} -} diff --git a/codecs/rotate/rotate.wasm b/codecs/rotate/rotate.wasm index 1cba4adcf3876080f85f4b157430c4c0d21ac8c0..a3ba42655643fae2907b391a42b85864db526183 100755 GIT binary patch literal 533 zcmY*Vy-ve05We#{NgKzsE895}6C-myP*`||G^mk~mC~y1!jy;yU}WbVcmSS*r{S(e zLddf3=lkySXG43~AOK)#Rsbs+h5^VDAlM9dh?o(=Jinv?<2ZhS8{mH|u5G^QHrxG+ z0oOE7UAt=@+e1fKHqE*{woUiECX?^C$M)FCJs(8Ed?)lngg|ETx7frtv-A)#Sjj(e z>5as1xbqZ;kTJ#~1rpfE&KW`>5)+BGLMIGqDPy7xMHP`ebBtkH(V21*k)e~8FpPkO z%8Q1UCuwbo^m!P<)Tv7@BHnvoWa#TMnq#ynI5s@#*)sL1u6~a4FbDaD`Ryss}b zpNS~R&PnB_XF10tSPCEjawTu~!O((BwhvxD;#Q85i7{yjS^}FZ12+cro}|CUlcaA} rM`AEys*$H+R>Wm6kmHIkQmEMTECtWGQgSYo;%09CI*ucNvmnP0S>;dc literal 3128 zcmb7GOK%)S5U%dt*X+#Ln<$5%M51Sigb{hnduGi6ccdhS2y)=U&30s?WW2HCM=X#~ zc4Hn25<(m~aYh`tz=0DA5(fkl7Y-mKB!u_@TsfJqdv@ZrlaL^L)!o(ARbPEo)jhPd zb%PNRJJ(s{!yy|kilG^Z%#0S>35pwYX?BM3Y+WMw8uSjYd;2I?{Sd z44E2@?vXtt_5JR|*go56-B`J?zWEj>dtu?)%F@k+t4muef^`=bmY24d7FO1l1#fMx zZ!c}H5VI^sirJzi+TAaYSvd5AU{gayp5Swnf0C<@_(d1WUIX*5*hQCN{EaTTTn)XZ zWNKJ?0^1zF77Vl{L6vzOtSw1?SFu-J;WTWhw0fRot4j|gnmD8o?N=HtWo@1gH8!#MbBdvEBW5Z{lI3g9S`r?$C!Yt1?B9}~q66$oR?r5EAb+T00*7C9N zloaQA&H+b#y$kml@8GP+_>3MvX2zwNNz9Hz(kUhN-qRMzex2*`9%GQJJ|AOX&v9^y zVmekz%sV+eaw)VMP@-LM^;zXjm)?gX;}|-<-OBKvoV6xm8{1XSRy8aMl>4MU{)t{f z{X&Y|aAlQJlzv0K4TK;byKBfchQX@eQh#BE>fBb}Xm8~?q8A8ctJ|e)$u_nJs}Jl7 z*g_nn_P+h)++}37>EVb=s7zg&Oo$xv+dDOaPLePzaI|2K+ z1I~CI1O!$a8-7V03)IbzyP zD^|NGr3ZIC=1lz$r$+ZloK8K)scYkI1#HD;DZmim0-22c(Q&(V-2WA`Yfq4l3PjQm z@s3AD^De-<0PnbQEleFsR4I1U|grVAP->HkEyXyA;!Bj0l}&v)QCFcDbTGM8AbVvPdK-Fhz z*i{^WT?<^*@NE4OGd_nt)Ln;!I9Jdlq>gKdAlX6RVL7h!x`5Hai1$E|-aqrO#t{1j zGPeBizCc9UweM)>b#wU0F#c=b=Cg$D12*rkIZ&fLpst|`19hBTQzZ9E=pLr2;(8*x z9i_928l2?1TGd>44jZYgPH=5K3Dq-%lAPB-B3gRFM(jW`+pa}Y55QbqC#$ghsVHW0L5%!}X3Zp2B zqa;eBEXt!I>c>GG#!(!{Nu0)6oX17nPl6;&q9jg|Bu%m;Pl}|U25Fc^X`Ci$nr3O9 z7HK~VvM`IXI7_lL%d$KxvVI=qVIJjip5$qs<#}G@{URvBA}Zn{DbgY<@}emEeL(EP ueIKU#IM#=V^rsowb3{F|z{EU$C-9qGx3S_zM#L}*{2b^@jHfXk#rQ9Wp&Y#c diff --git a/package-lock.json b/package-lock.json index 94fd4190..c54283cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2283,7 +2283,8 @@ "version": "2.1.1", "resolved": false, "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -2307,13 +2308,15 @@ "version": "1.0.0", "resolved": false, "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "resolved": false, "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2330,19 +2333,22 @@ "version": "1.1.0", "resolved": false, "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "resolved": false, "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "resolved": false, "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -2473,7 +2479,8 @@ "version": "2.0.3", "resolved": false, "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -2487,6 +2494,7 @@ "resolved": false, "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2503,6 +2511,7 @@ "resolved": false, "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2511,13 +2520,15 @@ "version": "0.0.8", "resolved": false, "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "resolved": false, "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -2538,6 +2549,7 @@ "resolved": false, "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -2626,7 +2638,8 @@ "version": "1.0.1", "resolved": false, "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -2640,6 +2653,7 @@ "resolved": false, "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -2735,7 +2749,8 @@ "version": "5.1.2", "resolved": false, "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -2777,6 +2792,7 @@ "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2798,6 +2814,7 @@ "resolved": false, "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -2846,13 +2863,15 @@ "version": "1.0.2", "resolved": false, "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "resolved": false, "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true + "dev": true, + "optional": true } } }, @@ -5851,7 +5870,8 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -5875,13 +5895,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5898,19 +5920,22 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -6041,7 +6066,8 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -6055,6 +6081,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -6071,6 +6098,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -6079,13 +6107,15 @@ "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.4.tgz", "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -6106,6 +6136,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -6194,7 +6225,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -6208,6 +6240,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -6303,7 +6336,8 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -6345,6 +6379,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -6366,6 +6401,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -6414,13 +6450,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", - "dev": true + "dev": true, + "optional": true } } },