From bb73dfea8892bb8f36a9c6e5ae55ceec6093d420 Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Sun, 28 Jul 2019 16:59:34 +0200 Subject: [PATCH] Join the bits muching into a single line to improve dev builds Also this rectifies many of the tons of https://rust-lang.github.io/rust-clippy/master/index.html#identity_op lints we're getting. Signed-off-by: Daniel Egger --- CHANGELOG.md | 2 ++ src/generate/register.rs | 38 ++++++++++++++++++++++++++++---------- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c645fc2..770958bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Changed - Break ultra-long single line output into multiple lines for better usability +- Joined field write proxy into a single line to help dev builds +- Elimated useless 0 shifts to reduce generated code size and fix a clippy lint ### Fixed diff --git a/src/generate/register.rs b/src/generate/register.rs index e31e0041..7e6d35d6 100644 --- a/src/generate/register.rs +++ b/src/generate/register.rs @@ -323,7 +323,7 @@ pub fn fields( let bits = &f.bits; let mask = &f.mask; - let offset = &f.offset; + let offset: usize = f.offset.parse().unwrap(); let fty = &f.ty; let lookup_results = lookup( @@ -341,8 +341,15 @@ pub fn fields( } else { quote! { as #fty } }; - let value = quote! { - ((self.bits >> #offset) & #mask) #cast + let value = if offset != 0 { + let offset = &f.offset; + quote! { + ((self.bits >> #offset) & #mask) #cast + } + } else { + quote! { + (self.bits & #mask) #cast + } }; if let Some((evs, base)) = lookup_filter(&lookup_results, Usage::Read) { @@ -720,13 +727,24 @@ pub fn fields( }); } - proxy_items.push(quote! { - ///Writes raw bits to the field - #[inline(always)] - pub #unsafety fn #bits(self, value: #fty) -> &'a mut W { - self.w.bits &= !(#mask << #offset); - self.w.bits |= ((value as #rty) & #mask) << #offset; - self.w + proxy_items.push(if offset != 0 { + let offset = &f.offset; + quote! { + ///Writes raw bits to the field + #[inline(always)] + pub #unsafety fn #bits(self, value: #fty) -> &'a mut W { + self.w.bits = (self.w.bits & !(#mask << #offset)) | (((value as #rty) & #mask) << #offset); + self.w + } + } + } else { + quote! { + ///Writes raw bits to the field + #[inline(always)] + pub #unsafety fn #bits(self, value: #fty) -> &'a mut W { + self.w.bits = (self.w.bits & !#mask) | ((value as #rty) & #mask); + self.w + } } });