Fix left shift.
This commit is contained in:
@@ -32,7 +32,7 @@ declareShiftOperators bitsize =
|
|||||||
entries = bitsize `div` 64
|
entries = bitsize `div` 64
|
||||||
unsignedShifts = generateUnsigneds struct_name
|
unsignedShifts = generateUnsigneds struct_name
|
||||||
shlUsizeImpls = generateBaseUsizes struct_name
|
shlUsizeImpls = generateBaseUsizes struct_name
|
||||||
shlActualImpl = concatMap (actualImplLines (toLit entries)) [1..entries-1]
|
shlActualImpl = concatMap actualImplLines [1..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)]
|
||||||
@@ -50,7 +50,7 @@ declareShiftOperators bitsize =
|
|||||||
let copy = self.clone();
|
let copy = self.clone();
|
||||||
let digits = rhs / 64;
|
let digits = rhs / 64;
|
||||||
let bits = rhs % 64;
|
let bits = rhs % 64;
|
||||||
let mask = !(0xFFFF_FFFF_FFFF_FFFF << bits);
|
let mask = !(0xFFFF_FFFF_FFFF_FFFFu64 << bits);
|
||||||
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 { copy.value[0] } else { 0 };
|
||||||
@@ -90,19 +90,19 @@ declareShiftOperators bitsize =
|
|||||||
}
|
}
|
||||||
|]
|
|]
|
||||||
|
|
||||||
actualImplLines :: Expr Span -> Word -> [Stmt Span]
|
actualImplLines :: Word -> [Stmt Span]
|
||||||
actualImplLines entries i =
|
actualImplLines 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)
|
||||||
liti = toLit i
|
liti = toLit i
|
||||||
in [
|
in [
|
||||||
[stmt|let $$basei = if $$(liti) > $$(entries) {
|
[stmt|let $$basei = if $$(liti) >= digits {
|
||||||
copy.value[$$(liti)-digits]
|
copy.value[$$(liti)-digits]
|
||||||
} else {
|
} else {
|
||||||
0
|
0
|
||||||
}; |]
|
}; |]
|
||||||
, [stmt|let ($$carryi,_) = ($$basei1 & mask).overflowing_shl(shift); |]
|
, [stmt|let $$carryi = if shift == 64 { 0 } else { $$basei1 >> shift }; |]
|
||||||
, [stmt|self.value[$$(liti)] = ($$basei << bits) | $$carryi; |]
|
, [stmt|self.value[$$(liti)] = ($$basei << bits) | $$carryi; |]
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user