Remove an unnecessary clone.

This commit is contained in:
2019-11-23 21:05:23 -08:00
parent 430401ba54
commit e223950c9f

View File

@@ -34,6 +34,7 @@ declareShiftOperators bitsize =
shlUsizeImpls = generateBaseUsizes struct_name shlUsizeImpls = generateBaseUsizes struct_name
shlActualImpl = concatMap actualShlImplLines [1..entries-1] shlActualImpl = concatMap actualShlImplLines [1..entries-1]
shrActualImpl = concatMap (actualShrImplLines entries) (reverse [0..entries-1]) shrActualImpl = concatMap (actualShrImplLines entries) (reverse [0..entries-1])
resAssign = map reassignSelf [0..entries-1]
testFileLit = Lit [] (Str (testFile bitsize) Cooked Unsuffixed mempty) mempty testFileLit = Lit [] (Str (testFile bitsize) Cooked Unsuffixed mempty) mempty
in [sourceFile| in [sourceFile|
#[cfg(test)] #[cfg(test)]
@@ -48,26 +49,26 @@ declareShiftOperators bitsize =
impl ShlAssign<usize> for $$struct_name { impl ShlAssign<usize> for $$struct_name {
fn shl_assign(&mut self, rhs: usize) { fn shl_assign(&mut self, rhs: usize) {
let copy = self.clone();
let digits = rhs / 64; let digits = rhs / 64;
let bits = rhs % 64; let bits = rhs % 64;
let shift = (64 - bits) as u32; let shift = (64 - bits) as u32;
let base0 = if digits == 0 { copy.value[0] } else { 0 }; let base0 = if digits == 0 { self.value[0] } else { 0 };
self.value[0] = base0 << bits; let res0 = base0 << bits;
$@{shlActualImpl} $@{shlActualImpl}
$@{resAssign}
} }
} }
impl ShrAssign<usize> for $$struct_name { impl ShrAssign<usize> for $$struct_name {
fn shr_assign(&mut self, rhs: usize) { fn shr_assign(&mut self, rhs: usize) {
let copy = self.clone();
let digits = rhs / 64; let digits = rhs / 64;
let bits = rhs % 64; let bits = rhs % 64;
let mask = !(0xFFFFFFFFFFFFFFFFu64 << bits); let mask = !(0xFFFFFFFFFFFFFFFFu64 << bits);
let shift = (64 - bits) as u32; let shift = (64 - bits) as u32;
$@{shrActualImpl} $@{shrActualImpl}
$@{resAssign}
} }
} }
@@ -101,15 +102,16 @@ actualShlImplLines i =
let basei = mkIdent ("base" ++ show i) let basei = mkIdent ("base" ++ show i)
basei1 = mkIdent ("base" ++ show (i - 1)) basei1 = mkIdent ("base" ++ show (i - 1))
carryi = mkIdent ("carry" ++ show i) carryi = mkIdent ("carry" ++ show i)
resi = mkIdent ("res" ++ show i)
liti = toLit i liti = toLit i
in [ in [
[stmt|let $$basei = if $$(liti) >= digits { [stmt|let $$basei = if $$(liti) >= digits {
copy.value[$$(liti)-digits] self.value[$$(liti)-digits]
} else { } else {
0 0
}; |] }; |]
, [stmt|let $$carryi = if shift == 64 { 0 } else { $$basei1 >> shift }; |] , [stmt|let $$carryi = if shift == 64 { 0 } else { $$basei1 >> shift }; |]
, [stmt|self.value[$$(liti)] = ($$basei << bits) | $$carryi; |] , [stmt|let $$resi = ($$basei << bits) | $$carryi; |]
] ]
actualShrImplLines :: Word -> Word -> [Stmt Span] actualShrImplLines :: Word -> Word -> [Stmt Span]
@@ -118,19 +120,26 @@ actualShrImplLines entries i =
carryi = mkIdent ("carry" ++ show i) carryi = mkIdent ("carry" ++ show i)
carryi1 = mkIdent ("carry" ++ show (i + 1)) carryi1 = mkIdent ("carry" ++ show (i + 1))
targeti = mkIdent ("target" ++ show i) targeti = mkIdent ("target" ++ show i)
resi = mkIdent ("res" ++ show i)
liti = toLit i liti = toLit i
litentries = toLit entries litentries = toLit entries
in [ in [
[stmt|let $$targeti = $$(liti) + digits; |] [stmt|let $$targeti = $$(liti) + digits; |]
, [stmt|let $$basei = if $$targeti >= $$(litentries) { 0 } else { copy.value[$$targeti] }; |] , [stmt|let $$basei = if $$targeti >= $$(litentries) { 0 } else { self.value[$$targeti] }; |]
, if i == 0 , if i == 0
then [stmt| {} |]; then [stmt| {} |];
else [stmt|let ($$carryi,_) = ($$basei & mask).overflowing_shl(shift); |] else [stmt|let ($$carryi,_) = ($$basei & mask).overflowing_shl(shift); |]
, if (i + 1) == entries , if (i + 1) == entries
then [stmt|self.value[$$(liti)] = $$basei >> bits ; |] then [stmt|let $$resi = $$basei >> bits ; |]
else [stmt|self.value[$$(liti)] = ($$basei >> bits) | $$carryi1; |] else [stmt|let $$resi = ($$basei >> bits) | $$carryi1; |]
] ]
reassignSelf :: Word -> Stmt Span
reassignSelf i =
let liti = toLit i
resi = mkIdent ("res" ++ show i)
in [stmt| self.value[$$(liti)] = $$resi; |]
generateBaseUsizes :: Ident -> [Item Span] generateBaseUsizes :: Ident -> [Item Span]
generateBaseUsizes sname = generateBaseUsizes sname =
generateBaseUsize sname (mkIdent "Shl") (mkIdent "shl") (mkIdent "shl_assign") ++ generateBaseUsize sname (mkIdent "Shl") (mkIdent "shl") (mkIdent "shl_assign") ++