@@ -250,14 +250,14 @@ proc `shr`*(a: Int128, b: int): Int128 =
250
250
if isNegative(a):
251
251
result .sdata(3 ) = - 1
252
252
result .sdata(2 ) = a.sdata(3 ) shr (b and 31 )
253
- result .udata[1 ] = cast [uint32 ](bitconcat(a.udata[2 ], a.udata[1 ]) shr (b and 31 ))
254
- result .udata[0 ] = cast [uint32 ](bitconcat(a.udata[1 ], a.udata[0 ]) shr (b and 31 ))
253
+ result .udata[1 ] = cast [uint32 ](bitconcat(a.udata[3 ], a.udata[2 ]) shr (b and 31 ))
254
+ result .udata[0 ] = cast [uint32 ](bitconcat(a.udata[2 ], a.udata[1 ]) shr (b and 31 ))
255
255
elif b < 96 :
256
256
if isNegative(a):
257
257
result .sdata(3 ) = - 1
258
258
result .sdata(2 ) = - 1
259
259
result .sdata(1 ) = a.sdata(3 ) shr (b and 31 )
260
- result .udata[0 ] = cast [uint32 ](bitconcat(a.udata[1 ], a.udata[0 ]) shr (b and 31 ))
260
+ result .udata[0 ] = cast [uint32 ](bitconcat(a.udata[3 ], a.udata[2 ]) shr (b and 31 ))
261
261
else : # b < 128
262
262
if isNegative(a):
263
263
result .sdata(3 ) = - 1
@@ -696,3 +696,86 @@ when isMainModule:
696
696
doAssert divMod(toInt128(- mb),toInt128( ma)) == (toInt128(- mb div ma), toInt128(- mb mod ma))
697
697
doAssert divMod(toInt128( mb),toInt128(- ma)) == (toInt128( mb div - ma), toInt128( mb mod - ma))
698
698
doAssert divMod(toInt128(- mb),toInt128(- ma)) == (toInt128(- mb div - ma), toInt128(- mb mod - ma))
699
+
700
+ let e = parseDecimalInt128(" 70997106675279150998592376708984375" )
701
+
702
+ let strArray = [
703
+ # toHex(e shr 0), toHex(e shr 1), toHex(e shr 2), toHex(e shr 3)
704
+ " 000dac6d782d266a37300c32591eee37" , " 0006d636bc1693351b9806192c8f771b" , " 00036b1b5e0b499a8dcc030c9647bb8d" , " 0001b58daf05a4cd46e601864b23ddc6" ,
705
+ " 0000dac6d782d266a37300c32591eee3" , " 00006d636bc1693351b9806192c8f771" , " 000036b1b5e0b499a8dcc030c9647bb8" , " 00001b58daf05a4cd46e601864b23ddc" ,
706
+ " 00000dac6d782d266a37300c32591eee" , " 000006d636bc1693351b9806192c8f77" , " 0000036b1b5e0b499a8dcc030c9647bb" , " 000001b58daf05a4cd46e601864b23dd" ,
707
+ " 000000dac6d782d266a37300c32591ee" , " 0000006d636bc1693351b9806192c8f7" , " 00000036b1b5e0b499a8dcc030c9647b" , " 0000001b58daf05a4cd46e601864b23d" ,
708
+ " 0000000dac6d782d266a37300c32591e" , " 00000006d636bc1693351b9806192c8f" , " 000000036b1b5e0b499a8dcc030c9647" , " 00000001b58daf05a4cd46e601864b23" ,
709
+ " 00000000dac6d782d266a37300c32591" , " 000000006d636bc1693351b9806192c8" , " 0000000036b1b5e0b499a8dcc030c964" , " 000000001b58daf05a4cd46e601864b2" ,
710
+ " 000000000dac6d782d266a37300c3259" , " 0000000006d636bc1693351b9806192c" , " 00000000036b1b5e0b499a8dcc030c96" , " 0000000001b58daf05a4cd46e601864b" ,
711
+ " 0000000000dac6d782d266a37300c325" , " 00000000006d636bc1693351b9806192" , " 000000000036b1b5e0b499a8dcc030c9" , " 00000000001b58daf05a4cd46e601864" ,
712
+ " 00000000000dac6d782d266a37300c32" , " 000000000006d636bc1693351b980619" , " 0000000000036b1b5e0b499a8dcc030c" , " 000000000001b58daf05a4cd46e60186" ,
713
+ " 000000000000dac6d782d266a37300c3" , " 0000000000006d636bc1693351b98061" , " 00000000000036b1b5e0b499a8dcc030" , " 0000000000001b58daf05a4cd46e6018" ,
714
+ " 0000000000000dac6d782d266a37300c" , " 00000000000006d636bc1693351b9806" , " 000000000000036b1b5e0b499a8dcc03" , " 00000000000001b58daf05a4cd46e601" ,
715
+ " 00000000000000dac6d782d266a37300" , " 000000000000006d636bc1693351b980" , " 0000000000000036b1b5e0b499a8dcc0" , " 000000000000001b58daf05a4cd46e60" ,
716
+ " 000000000000000dac6d782d266a3730" , " 0000000000000006d636bc1693351b98" , " 00000000000000036b1b5e0b499a8dcc" , " 0000000000000001b58daf05a4cd46e6" ,
717
+ " 0000000000000000dac6d782d266a373" , " 00000000000000006d636bc1693351b9" , " 000000000000000036b1b5e0b499a8dc" , " 00000000000000001b58daf05a4cd46e" ,
718
+ " 00000000000000000dac6d782d266a37" , " 000000000000000006d636bc1693351b" , " 0000000000000000036b1b5e0b499a8d" , " 000000000000000001b58daf05a4cd46" ,
719
+ " 000000000000000000dac6d782d266a3" , " 0000000000000000006d636bc1693351" , " 00000000000000000036b1b5e0b499a8" , " 0000000000000000001b58daf05a4cd4" ,
720
+ " 0000000000000000000dac6d782d266a" , " 00000000000000000006d636bc169335" , " 000000000000000000036b1b5e0b499a" , " 00000000000000000001b58daf05a4cd" ,
721
+ " 00000000000000000000dac6d782d266" , " 000000000000000000006d636bc16933" , " 0000000000000000000036b1b5e0b499" , " 000000000000000000001b58daf05a4c" ,
722
+ " 000000000000000000000dac6d782d26" , " 0000000000000000000006d636bc1693" , " 00000000000000000000036b1b5e0b49" , " 0000000000000000000001b58daf05a4" ,
723
+ " 0000000000000000000000dac6d782d2" , " 00000000000000000000006d636bc169" , " 000000000000000000000036b1b5e0b4" , " 00000000000000000000001b58daf05a" ,
724
+ " 00000000000000000000000dac6d782d" , " 000000000000000000000006d636bc16" , " 0000000000000000000000036b1b5e0b" , " 000000000000000000000001b58daf05" ,
725
+ " 000000000000000000000000dac6d782" , " 0000000000000000000000006d636bc1" , " 00000000000000000000000036b1b5e0" , " 0000000000000000000000001b58daf0" ,
726
+ " 0000000000000000000000000dac6d78" , " 00000000000000000000000006d636bc" , " 000000000000000000000000036b1b5e" , " 00000000000000000000000001b58daf" ,
727
+ " 00000000000000000000000000dac6d7" , " 000000000000000000000000006d636b" , " 0000000000000000000000000036b1b5" , " 000000000000000000000000001b58da" ,
728
+ " 000000000000000000000000000dac6d" , " 0000000000000000000000000006d636" , " 00000000000000000000000000036b1b" , " 0000000000000000000000000001b58d" ,
729
+ " 0000000000000000000000000000dac6" , " 00000000000000000000000000006d63" , " 000000000000000000000000000036b1" , " 00000000000000000000000000001b58" ,
730
+ " 00000000000000000000000000000dac" , " 000000000000000000000000000006d6" , " 0000000000000000000000000000036b" , " 000000000000000000000000000001b5" ,
731
+ " 000000000000000000000000000000da" , " 0000000000000000000000000000006d" , " 00000000000000000000000000000036" , " 0000000000000000000000000000001b" ,
732
+ " 0000000000000000000000000000000d" , " 00000000000000000000000000000006" , " 00000000000000000000000000000003" , " 00000000000000000000000000000001" ,
733
+ " 00000000000000000000000000000000" , " 00000000000000000000000000000000" , " 00000000000000000000000000000000" , " 00000000000000000000000000000000" ,
734
+ " 00000000000000000000000000000000" , " 00000000000000000000000000000000" , " 00000000000000000000000000000000" , " 00000000000000000000000000000000" ,
735
+ " 00000000000000000000000000000000" , " 00000000000000000000000000000000" , " 00000000000000000000000000000000" , " 00000000000000000000000000000000" ,
736
+ ]
737
+
738
+ for i in 0 ..< 128 :
739
+ let str1 = toHex(e shr i)
740
+ let str2 = strArray[i]
741
+ doAssert str1 == str2
742
+
743
+ let strArray2 = [
744
+ " 000dac6d782d266a37300c32591eee37" , " 001b58daf05a4cd46e601864b23ddc6e" , " 0036b1b5e0b499a8dcc030c9647bb8dc" , " 006d636bc1693351b9806192c8f771b8" ,
745
+ " 00dac6d782d266a37300c32591eee370" , " 01b58daf05a4cd46e601864b23ddc6e0" , " 036b1b5e0b499a8dcc030c9647bb8dc0" , " 06d636bc1693351b9806192c8f771b80" ,
746
+ " 0dac6d782d266a37300c32591eee3700" , " 1b58daf05a4cd46e601864b23ddc6e00" , " 36b1b5e0b499a8dcc030c9647bb8dc00" , " 6d636bc1693351b9806192c8f771b800" ,
747
+ " dac6d782d266a37300c32591eee37000" , " b58daf05a4cd46e601864b23ddc6e000" , " 6b1b5e0b499a8dcc030c9647bb8dc000" , " d636bc1693351b9806192c8f771b8000" ,
748
+ " ac6d782d266a37300c32591eee370000" , " 58daf05a4cd46e601864b23ddc6e0000" , " b1b5e0b499a8dcc030c9647bb8dc0000" , " 636bc1693351b9806192c8f771b80000" ,
749
+ " c6d782d266a37300c32591eee3700000" , " 8daf05a4cd46e601864b23ddc6e00000" , " 1b5e0b499a8dcc030c9647bb8dc00000" , " 36bc1693351b9806192c8f771b800000" ,
750
+ " 6d782d266a37300c32591eee37000000" , " daf05a4cd46e601864b23ddc6e000000" , " b5e0b499a8dcc030c9647bb8dc000000" , " 6bc1693351b9806192c8f771b8000000" ,
751
+ " d782d266a37300c32591eee370000000" , " af05a4cd46e601864b23ddc6e0000000" , " 5e0b499a8dcc030c9647bb8dc0000000" , " bc1693351b9806192c8f771b80000000" ,
752
+ " 782d266a37300c32591eee3700000000" , " f05a4cd46e601864b23ddc6e00000000" , " e0b499a8dcc030c9647bb8dc00000000" , " c1693351b9806192c8f771b800000000" ,
753
+ " 82d266a37300c32591eee37000000000" , " 05a4cd46e601864b23ddc6e000000000" , " 0b499a8dcc030c9647bb8dc000000000" , " 1693351b9806192c8f771b8000000000" ,
754
+ " 2d266a37300c32591eee370000000000" , " 5a4cd46e601864b23ddc6e0000000000" , " b499a8dcc030c9647bb8dc0000000000" , " 693351b9806192c8f771b80000000000" ,
755
+ " d266a37300c32591eee3700000000000" , " a4cd46e601864b23ddc6e00000000000" , " 499a8dcc030c9647bb8dc00000000000" , " 93351b9806192c8f771b800000000000" ,
756
+ " 266a37300c32591eee37000000000000" , " 4cd46e601864b23ddc6e000000000000" , " 99a8dcc030c9647bb8dc000000000000" , " 3351b9806192c8f771b8000000000000" ,
757
+ " 66a37300c32591eee370000000000000" , " cd46e601864b23ddc6e0000000000000" , " 9a8dcc030c9647bb8dc0000000000000" , " 351b9806192c8f771b80000000000000" ,
758
+ " 6a37300c32591eee3700000000000000" , " d46e601864b23ddc6e00000000000000" , " a8dcc030c9647bb8dc00000000000000" , " 51b9806192c8f771b800000000000000" ,
759
+ " a37300c32591eee37000000000000000" , " 46e601864b23ddc6e000000000000000" , " 8dcc030c9647bb8dc000000000000000" , " 1b9806192c8f771b8000000000000000" ,
760
+ " 37300c32591eee370000000000000000" , " 6e601864b23ddc6e0000000000000000" , " dcc030c9647bb8dc0000000000000000" , " b9806192c8f771b80000000000000000" ,
761
+ " 7300c32591eee3700000000000000000" , " e601864b23ddc6e00000000000000000" , " cc030c9647bb8dc00000000000000000" , " 9806192c8f771b800000000000000000" ,
762
+ " 300c32591eee37000000000000000000" , " 601864b23ddc6e000000000000000000" , " c030c9647bb8dc000000000000000000" , " 806192c8f771b8000000000000000000" ,
763
+ " 00c32591eee370000000000000000000" , " 01864b23ddc6e0000000000000000000" , " 030c9647bb8dc0000000000000000000" , " 06192c8f771b80000000000000000000" ,
764
+ " 0c32591eee3700000000000000000000" , " 1864b23ddc6e00000000000000000000" , " 30c9647bb8dc00000000000000000000" , " 6192c8f771b800000000000000000000" ,
765
+ " c32591eee37000000000000000000000" , " 864b23ddc6e000000000000000000000" , " 0c9647bb8dc000000000000000000000" , " 192c8f771b8000000000000000000000" ,
766
+ " 32591eee370000000000000000000000" , " 64b23ddc6e0000000000000000000000" , " c9647bb8dc0000000000000000000000" , " 92c8f771b80000000000000000000000" ,
767
+ " 2591eee3700000000000000000000000" , " 4b23ddc6e00000000000000000000000" , " 9647bb8dc00000000000000000000000" , " 2c8f771b800000000000000000000000" ,
768
+ " 591eee37000000000000000000000000" , " b23ddc6e000000000000000000000000" , " 647bb8dc000000000000000000000000" , " c8f771b8000000000000000000000000" ,
769
+ " 91eee370000000000000000000000000" , " 23ddc6e0000000000000000000000000" , " 47bb8dc0000000000000000000000000" , " 8f771b80000000000000000000000000" ,
770
+ " 1eee3700000000000000000000000000" , " 3ddc6e00000000000000000000000000" , " 7bb8dc00000000000000000000000000" , " f771b800000000000000000000000000" ,
771
+ " eee37000000000000000000000000000" , " ddc6e000000000000000000000000000" , " bb8dc000000000000000000000000000" , " 771b8000000000000000000000000000" ,
772
+ " ee370000000000000000000000000000" , " dc6e0000000000000000000000000000" , " b8dc0000000000000000000000000000" , " 71b80000000000000000000000000000" ,
773
+ " e3700000000000000000000000000000" , " c6e00000000000000000000000000000" , " 8dc00000000000000000000000000000" , " 1b800000000000000000000000000000" ,
774
+ " 37000000000000000000000000000000" , " 6e000000000000000000000000000000" , " dc000000000000000000000000000000" , " b8000000000000000000000000000000" ,
775
+ " 70000000000000000000000000000000" , " e0000000000000000000000000000000" , " c0000000000000000000000000000000" , " 80000000000000000000000000000000" ,
776
+ ]
777
+
778
+ for i in 0 ..< 128 :
779
+ let str1 = toHex(e shl i)
780
+ let str2 = strArray2[i]
781
+ doAssert str1 == str2
0 commit comments