aboutsummaryrefslogtreecommitdiff
path: root/src/Experiments/NewPipeline/fancy_rewrite_head.out
diff options
context:
space:
mode:
authorGravatar Jason Gross <jgross@mit.edu>2018-06-19 00:03:37 -0400
committerGravatar Jason Gross <jasongross9@gmail.com>2018-07-21 03:47:14 +0100
commit875789c7756941296306b6781142f62d0d5e5fbe (patch)
tree9af2eb874de18744ffd66df9a8b8a85f642fe2dc /src/Experiments/NewPipeline/fancy_rewrite_head.out
parentcb1449271906998bb29c00d68c0bee4b58d2803c (diff)
Montgomery reduction in new pipeline
After | File Name | Before || Change | % Change -------------------------------------------------------------------------------------------------------- 18m19.81s | Total | 14m31.66s || +3m48.14s | +26.17% -------------------------------------------------------------------------------------------------------- 4m04.77s | Experiments/NewPipeline/Toplevel1 | 1m38.04s || +2m26.73s | +149.66% 5m12.44s | Experiments/NewPipeline/Rewriter | 4m20.00s || +0m52.43s | +20.16% 1m26.58s | Experiments/NewPipeline/Arithmetic | 0m55.51s || +0m31.07s | +55.97% 5m44.19s | Experiments/NewPipeline/SlowPrimeSynthesisExamples | 5m45.62s || -0m01.43s | -0.41% 1m29.48s | Experiments/NewPipeline/Toplevel2 | 1m29.73s || -0m00.25s | -0.27% 0m12.75s | Experiments/NewPipeline/CStringification | 0m12.71s || +0m00.03s | +0.31% 0m01.32s | Experiments/NewPipeline/GENERATEDIdentifiersWithoutTypes | 0m01.20s || +0m00.12s | +10.00% 0m01.31s | Experiments/NewPipeline/CLI | 0m01.33s || -0m00.02s | -1.50% 0m01.18s | Experiments/NewPipeline/StandaloneHaskellMain | 0m01.22s || -0m00.04s | -3.27% 0m01.12s | Experiments/NewPipeline/StandaloneOCamlMain | 0m01.21s || -0m00.08s | -7.43% 0m01.11s | Experiments/NewPipeline/Language | 0m01.14s || -0m00.02s | -2.63% 0m01.08s | Experiments/NewPipeline/AbstractInterpretation | 0m01.16s || -0m00.07s | -6.89% 0m00.90s | Experiments/NewPipeline/MiscCompilerPasses | 0m00.87s || +0m00.03s | +3.44% 0m00.74s | Experiments/NewPipeline/CompilersTestCases | 0m01.03s || -0m00.29s | -28.15% 0m00.44s | Experiments/NewPipeline/AbstractInterpretationProofs | 0m00.40s || +0m00.03s | +9.99% 0m00.41s | Experiments/NewPipeline/UnderLets | 0m00.50s || -0m00.09s | -18.00% After | File Name | Before || Change | % Change ------------------------------------------------------------------------------------------------------------------------- 107m58.13s | Total | 102m35.85s || +5m22.27s | +5.23% ------------------------------------------------------------------------------------------------------------------------- 4m32.58s | Experiments/NewPipeline/Toplevel1 | 1m50.07s || +2m42.50s | +147.64% N/A | ─abstract | 1m54.94s || -1m54.93s | -100.00% 1m54.19s | Specific/X2448/Karatsuba/C64/femul | N/A || +1m54.18s | ∞ 7m58.19s | Experiments/NewPipeline/Rewriter | 6m45.32s || +1m12.87s | +17.97% 2m13.30s | Experiments/NewPipeline/Arithmetic | 1m34.69s || +0m38.61s | +40.77% 5m30.50s | Curves/Weierstrass/Projective | 5m09.44s || +0m21.06s | +6.80% 12m00.73s | Curves/Weierstrass/AffineProofs | 11m43.07s || +0m17.65s | +2.51% 0m54.76s | Compilers/Z/ArithmeticSimplifierWf | 0m43.68s || +0m11.07s | +25.36% 10m06.67s | Experiments/SimplyTypedArithmetic | 9m58.44s || +0m08.22s | +1.37% 1m05.15s | Arithmetic/Karatsuba | 0m58.76s || +0m06.39s | +10.87% 0m41.15s | Specific/NISTP256/AMD128/femul | 0m47.16s || -0m06.00s | -12.74% 5m46.39s | Experiments/NewPipeline/SlowPrimeSynthesisExamples | 5m52.03s || -0m05.63s | -1.60% 2m14.99s | Specific/X25519/C64/ladderstep | 2m20.69s || -0m05.69s | -4.05% 0m48.64s | Specific/X25519/C32/freeze | 0m43.24s || +0m05.39s | +12.48% 0m26.80s | Specific/X25519/C64/fesquare | 0m20.83s || +0m05.97s | +28.66% 0m27.22s | Specific/X25519/C32/feadd | 0m31.34s || -0m04.12s | -13.14% 0m23.26s | Specific/NISTP256/AMD64/fenz | 0m19.10s || +0m04.16s | +21.78% 0m21.24s | Specific/NISTP256/AMD128/fesub | 0m25.24s || -0m04.00s | -15.84% 3m38.32s | Curves/Montgomery/XZProofs | 3m34.65s || +0m03.66s | +1.70% 1m14.93s | Compilers/Z/ArithmeticSimplifierInterp | 1m11.88s || +0m03.05s | +4.24% 0m16.16s | Arithmetic/Saturated/MontgomeryAPI | 0m12.26s || +0m03.90s | +31.81% 0m07.54s | Compilers/Z/Bounds/InterpretationLemmas/PullCast | 0m10.65s || -0m03.11s | -29.20% 2m29.22s | Specific/NISTP256/AMD64/femul | 2m31.90s || -0m02.68s | -1.76% 2m02.88s | Compilers/Named/MapCastInterp | 2m00.84s || +0m02.03s | +1.68% 1m54.19s | Curves/Weierstrass/Jacobian | 1m52.12s || +0m02.06s | +1.84% 1m30.98s | Specific/X25519/C32/femul | 1m28.28s || +0m02.70s | +3.05% 1m30.59s | Experiments/NewPipeline/Toplevel2 | 1m32.97s || -0m02.37s | -2.55% 1m20.73s | Demo | 1m18.51s || +0m02.21s | +2.82% 1m07.85s | Specific/X25519/C32/fesquare | 1m09.85s || -0m02.00s | -2.86% 0m31.78s | Specific/X25519/C32/fesub | 0m34.25s || -0m02.46s | -7.21% 0m31.18s | Arithmetic/Core | 0m33.92s || -0m02.74s | -8.07% 0m26.24s | Compilers/Z/CNotations | 0m28.35s || -0m02.11s | -7.44% 0m22.15s | Specific/X25519/C64/fecarry | 0m19.73s || +0m02.41s | +12.26% 0m21.61s | Arithmetic/Saturated/AddSub | 0m18.87s || +0m02.73s | +14.52% 0m21.58s | Specific/X25519/C64/fesub | 0m19.14s || +0m02.43s | +12.74% 0m14.37s | Arithmetic/Saturated/Core | 0m16.57s || -0m02.20s | -13.27% 2m57.98s | Curves/Montgomery/AffineProofs | 2m59.71s || -0m01.73s | -0.96% 1m46.10s | Spec/Test/X25519 | 1m47.38s || -0m01.28s | -1.19% 0m40.69s | Primitives/EdDSARepChange | 0m42.34s || -0m01.65s | -3.89% 0m40.29s | Specific/X25519/C32/fecarry | 0m42.21s || -0m01.92s | -4.54% 0m33.64s | Arithmetic/MontgomeryReduction/WordByWord/Abstract/Dependent/Proofs | 0m31.88s || +0m01.76s | +5.52% 0m31.96s | Specific/NISTP256/AMD64/feadd | 0m30.27s || +0m01.69s | +5.58% 0m23.14s | Specific/NISTP256/AMD128/feadd | 0m24.34s || -0m01.19s | -4.93% 0m18.76s | Specific/NISTP256/AMD128/feopp | 0m20.20s || -0m01.43s | -7.12% 0m18.62s | Compilers/Z/Syntax/Equality | 0m17.08s || +0m01.54s | +9.01% 0m15.06s | Util/ZUtil | 0m13.95s || +0m01.11s | +7.95% 0m14.13s | LegacyArithmetic/ArchitectureToZLikeProofs | 0m12.75s || +0m01.38s | +10.82% 0m12.43s | Compilers/Named/CompileInterpSideConditions | 0m10.85s || +0m01.58s | +14.56% 0m10.06s | Specific/NISTP256/AMD64/Synthesis | 0m11.31s || -0m01.25s | -11.05% 0m08.04s | Arithmetic/BarrettReduction/Generalized | 0m09.68s || -0m01.64s | -16.94% 0m06.25s | Specific/Framework/ArithmeticSynthesis/Montgomery | 0m05.18s || +0m01.07s | +20.65% 0m05.70s | LegacyArithmetic/InterfaceProofs | 0m07.21s || -0m01.50s | -20.94% 0m05.50s | Compilers/Z/Bounds/Pipeline/Definition | 0m06.57s || -0m01.07s | -16.28% 0m04.54s | LegacyArithmetic/Double/Proofs/Decode | 0m05.59s || -0m01.04s | -18.78% 0m04.32s | Compilers/Z/ArithmeticSimplifier | 0m05.36s || -0m01.04s | -19.40% 0m02.15s | Specific/Framework/ArithmeticSynthesis/Defaults | 0m03.49s || -0m01.34s | -38.39% N/A | Coqprime/PrimalityTest/EGroup | 0m01.32s || -0m01.32s | -100.00% N/A | Coqprime/Z/ZCAux | 0m01.08s || -0m01.08s | -100.00% 1m21.20s | Compilers/Z/Named/RewriteAddToAdcInterp | 1m21.80s || -0m00.59s | -0.73% 0m43.90s | Spec/Ed25519 | 0m43.40s || +0m00.50s | +1.15% 0m40.68s | Compilers/CommonSubexpressionEliminationWf | 0m40.81s || -0m00.13s | -0.31% 0m34.84s | Specific/NISTP256/AMD64/fesub | 0m33.87s || +0m00.97s | +2.86% 0m32.80s | Specific/X25519/C64/femul | 0m31.99s || +0m00.80s | +2.53% 0m30.69s | Curves/Edwards/XYZT/Basic | 0m30.20s || +0m00.49s | +1.62% 0m27.90s | Compilers/Named/MapCastWf | 0m27.10s || +0m00.79s | +2.95% 0m27.80s | Specific/X25519/C32/Synthesis | 0m28.14s || -0m00.33s | -1.20% 0m27.70s | bbv/Word | 0m27.58s || +0m00.12s | +0.43% 0m26.05s | Specific/NISTP256/AMD64/feopp | 0m26.52s || -0m00.46s | -1.77% 0m25.59s | Specific/X25519/C64/freeze | 0m25.20s || +0m00.39s | +1.54% 0m25.40s | Curves/Edwards/AffineProofs | 0m24.70s || +0m00.69s | +2.83% 0m22.94s | Compilers/Named/ContextProperties/NameUtil | 0m23.02s || -0m00.07s | -0.34% 0m22.14s | Algebra/Field | 0m21.80s || +0m00.33s | +1.55% 0m21.99s | Specific/NISTP256/AMD128/fenz | 0m21.30s || +0m00.68s | +3.23% 0m21.68s | Compilers/Named/ContextProperties/SmartMap | 0m22.15s || -0m00.46s | -2.12% 0m20.08s | Experiments/NewPipeline/CStringification | 0m19.13s || +0m00.94s | +4.96% 0m19.91s | Arithmetic/MontgomeryReduction/WordByWord/Abstract/Proofs | 0m19.60s || +0m00.30s | +1.58% 0m19.57s | Specific/X25519/C64/feadd | 0m19.12s || +0m00.44s | +2.35% 0m17.58s | Primitives/MxDHRepChange | 0m17.59s || -0m00.01s | -0.05% 0m17.56s | LegacyArithmetic/Double/Proofs/Multiply | 0m18.42s || -0m00.86s | -4.66% 0m15.44s | Arithmetic/MontgomeryReduction/Proofs | 0m14.96s || +0m00.47s | +3.20% 0m14.54s | Specific/X2448/Karatsuba/C64/Synthesis | 0m14.15s || +0m00.38s | +2.75% 0m14.18s | LegacyArithmetic/Double/Proofs/ShiftRightDoubleWordImmediate | 0m13.57s || +0m00.60s | +4.49% 0m13.88s | Algebra/Ring | 0m13.58s || +0m00.30s | +2.20% 0m13.44s | LegacyArithmetic/Double/Proofs/SpreadLeftImmediate | 0m13.40s || +0m00.03s | +0.29% 0m11.85s | LegacyArithmetic/Double/Proofs/RippleCarryAddSub | 0m11.82s || +0m00.02s | +0.25% 0m11.46s | Compilers/InlineConstAndOpWf | 0m11.58s || -0m00.11s | -1.03% 0m11.43s | Compilers/Named/RegisterAssignInterp | 0m11.26s || +0m00.16s | +1.50% 0m11.29s | Arithmetic/BarrettReduction/RidiculousFish | 0m10.73s || +0m00.55s | +5.21% 0m10.27s | Arithmetic/Saturated/MulSplit | 0m10.24s || +0m00.02s | +0.29% 0m10.07s | Util/ZUtil/ZSimplify/Autogenerated | 0m09.74s || +0m00.33s | +3.38% 0m09.72s | Util/FixedWordSizesEquality | 0m10.08s || -0m00.35s | -3.57% 0m09.25s | LegacyArithmetic/Pow2BaseProofs | 0m09.10s || +0m00.15s | +1.64% 0m08.74s | Compilers/InlineWf | 0m08.45s || +0m00.29s | +3.43% 0m08.65s | Util/FsatzAutoLemmas | 0m08.94s || -0m00.28s | -3.24% 0m08.30s | Util/ListUtil | 0m08.37s || -0m00.06s | -0.83% 0m08.12s | Compilers/LinearizeWf | 0m08.43s || -0m00.31s | -3.67% 0m07.92s | Specific/X25519/C64/Synthesis | 0m07.90s || +0m00.01s | +0.25% 0m07.72s | Arithmetic/BarrettReduction/HAC | 0m07.57s || +0m00.14s | +1.98% 0m07.64s | Compilers/Z/HexNotationConstants | 0m08.06s || -0m00.42s | -5.21% 0m07.62s | Util/ZUtil/Modulo | 0m07.58s || +0m00.04s | +0.52% 0m07.54s | Curves/Edwards/Pre | 0m07.92s || -0m00.37s | -4.79% 0m07.34s | Compilers/WfProofs | 0m06.72s || +0m00.62s | +9.22% 0m06.86s | Algebra/Field_test | 0m07.34s || -0m00.47s | -6.53% 0m06.80s | Compilers/Z/BinaryNotationConstants | 0m06.76s || +0m00.04s | +0.59% 0m06.00s | LegacyArithmetic/Double/Proofs/ShiftRight | 0m06.00s || +0m00.00s | +0.00% 0m05.58s | Compilers/Named/CompileWf | 0m05.85s || -0m00.26s | -4.61% 0m05.58s | Curves/Montgomery/Affine | 0m06.52s || -0m00.93s | -14.41% 0m05.31s | Specific/NISTP256/AMD128/Synthesis | 0m04.90s || +0m00.40s | +8.36% 0m05.17s | LegacyArithmetic/Double/Proofs/ShiftLeft | 0m05.14s || +0m00.03s | +0.58% 0m05.14s | Arithmetic/ModularArithmeticTheorems | 0m05.32s || -0m00.18s | -3.38% 0m04.93s | LegacyArithmetic/ZBoundedZ | 0m05.51s || -0m00.58s | -10.52% 0m04.90s | Compilers/Z/Bounds/InterpretationLemmas/IsBoundedBy | 0m05.62s || -0m00.71s | -12.81% 0m04.76s | Compilers/TestCase | 0m04.72s || +0m00.04s | +0.84% 0m04.74s | Arithmetic/MontgomeryReduction/WordByWord/Proofs | 0m05.51s || -0m00.76s | -13.97% 0m04.48s | Util/WordUtil | 0m04.51s || -0m00.02s | -0.66% 0m04.32s | Spec/MontgomeryCurve | 0m03.77s || +0m00.55s | +14.58% 0m04.13s | Compilers/InlineInterp | 0m04.29s || -0m00.16s | -3.72% 0m04.09s | Util/ZUtil/Div | 0m03.82s || +0m00.27s | +7.06% 0m03.96s | LegacyArithmetic/BarretReduction | 0m04.49s || -0m00.53s | -11.80% 0m03.93s | Compilers/EtaWf | 0m03.94s || -0m00.00s | -0.25% 0m03.81s | Compilers/Named/ContextProperties | 0m04.33s || -0m00.52s | -12.00% 0m03.69s | Specific/NISTP256/FancyMachine256/Montgomery | 0m03.77s || -0m00.08s | -2.12% 0m03.65s | Algebra/Group | 0m03.95s || -0m00.30s | -7.59% 0m03.63s | Arithmetic/Saturated/Freeze | 0m03.63s || +0m00.00s | +0.00% 0m03.54s | Compilers/Z/RewriteAddToAdcInterp | 0m03.26s || +0m00.28s | +8.58% 0m03.49s | Compilers/Named/CompileInterp | 0m03.55s || -0m00.05s | -1.69% 0m03.47s | Compilers/Z/Bounds/Relax | 0m03.12s || +0m00.35s | +11.21% 0m03.31s | Specific/NISTP256/FancyMachine256/Barrett | 0m03.70s || -0m00.39s | -10.54% 0m03.21s | Compilers/Named/NameUtilProperties | 0m03.16s || +0m00.04s | +1.58% 0m03.15s | Specific/NISTP256/FancyMachine256/Core | 0m02.96s || +0m00.18s | +6.41% 0m03.14s | Compilers/Named/ContextProperties/Proper | 0m03.67s || -0m00.52s | -14.44% 0m03.06s | Compilers/Z/JavaNotations | 0m03.18s || -0m00.12s | -3.77% 0m03.00s | Compilers/CommonSubexpressionEliminationProperties | 0m02.91s || +0m00.08s | +3.09% 0m02.94s | Compilers/WfReflective | 0m02.18s || +0m00.75s | +34.86% 0m02.91s | Util/ZUtil/Quot | 0m02.24s || +0m00.67s | +29.91% 0m02.80s | Arithmetic/CoreUnfolder | 0m02.53s || +0m00.27s | +10.67% 0m02.78s | Util/ZUtil/AddGetCarry | 0m02.78s || +0m00.00s | +0.00% 0m02.67s | Spec/WeierstrassCurve | 0m02.45s || +0m00.21s | +8.97% 0m02.54s | Compilers/Named/WfFromUnit | 0m02.61s || -0m00.06s | -2.68% 0m02.51s | Specific/Framework/ReificationTypes | 0m02.57s || -0m00.06s | -2.33% 0m02.45s | Arithmetic/BarrettReduction/Wikipedia | 0m02.72s || -0m00.27s | -9.92% 0m02.41s | Specific/Framework/OutputType | 0m02.49s || -0m00.08s | -3.21% 0m02.35s | Compilers/Named/InterpretToPHOASWf | 0m02.44s || -0m00.08s | -3.68% 0m02.31s | Util/NatUtil | 0m02.31s || +0m00.00s | +0.00% 0m02.26s | LegacyArithmetic/MontgomeryReduction | 0m02.40s || -0m00.14s | -5.83% 0m02.25s | Util/ZUtil/Pow2Mod | 0m02.19s || +0m00.06s | +2.73% 0m02.21s | Specific/Framework/ArithmeticSynthesis/Base | 0m02.23s || -0m00.02s | -0.89% 0m02.20s | Curves/Edwards/XYZT/Precomputed | 0m02.07s || +0m00.13s | +6.28% 0m02.16s | Arithmetic/PrimeFieldTheorems | 0m01.58s || +0m00.58s | +36.70% 0m02.16s | LegacyArithmetic/Double/Proofs/BitwiseOr | 0m02.20s || -0m00.04s | -1.81% 0m02.12s | LegacyArithmetic/Double/Proofs/LoadImmediate | 0m02.20s || -0m00.08s | -3.63% 0m02.06s | Util/QUtil | 0m02.08s || -0m00.02s | -0.96% 0m02.03s | Compilers/Relations | 0m02.31s || -0m00.28s | -12.12% 0m02.02s | Experiments/NewPipeline/GENERATEDIdentifiersWithoutTypes | 0m01.99s || +0m00.03s | +1.50% 0m02.00s | Util/Tuple | 0m01.75s || +0m00.25s | +14.28% 0m01.87s | Algebra/ScalarMult | 0m01.76s || +0m00.11s | +6.25% 0m01.82s | Arithmetic/Saturated/CoreUnfolder | 0m01.76s || +0m00.06s | +3.40% 0m01.82s | Experiments/NewPipeline/StandaloneOCamlMain | 0m01.43s || +0m00.39s | +27.27% 0m01.82s | LegacyArithmetic/BaseSystemProofs | 0m01.98s || -0m00.15s | -8.08% 0m01.80s | Compilers/LinearizeInterp | 0m01.76s || +0m00.04s | +2.27% 0m01.80s | Experiments/NewPipeline/StandaloneHaskellMain | 0m01.47s || +0m00.33s | +22.44% 0m01.76s | Compilers/MultiSizeTest | 0m01.78s || -0m00.02s | -1.12% 0m01.76s | Compilers/Z/RewriteAddToAdcWf | 0m01.70s || +0m00.06s | +3.52% 0m01.76s | Experiments/NewPipeline/Language | 0m01.67s || +0m00.09s | +5.38% 0m01.72s | Experiments/NewPipeline/AbstractInterpretation | 0m01.72s || +0m00.00s | +0.00% 0m01.66s | Util/ZUtil/Stabilization | 0m01.55s || +0m00.10s | +7.09% 0m01.64s | Specific/Framework/IntegrationTestDisplayCommon | 0m01.75s || -0m00.11s | -6.28% 0m01.58s | Compilers/Named/InterpretToPHOASInterp | 0m01.59s || -0m00.01s | -0.62% 0m01.54s | Util/ZUtil/Modulo/PullPush | 0m01.26s || +0m00.28s | +22.22% 0m01.51s | Util/NumTheoryUtil | 0m01.33s || +0m00.17s | +13.53% 0m01.51s | Util/ZRange/CornersMonotoneBounds | 0m01.88s || -0m00.36s | -19.68% 0m01.45s | Arithmetic/Saturated/UniformWeight | 0m01.30s || +0m00.14s | +11.53% 0m01.42s | Specific/Framework/ArithmeticSynthesis/Karatsuba | 0m01.49s || -0m00.07s | -4.69% 0m01.37s | Compilers/Z/CommonSubexpressionElimination | 0m01.45s || -0m00.07s | -5.51% 0m01.36s | Compilers/MapCastByDeBruijnInterp | 0m01.32s || +0m00.04s | +3.03% 0m01.34s | Specific/X25519/C32/CurveParameters | 0m01.25s || +0m00.09s | +7.20% 0m01.32s | Compilers/Z/Syntax/Util | 0m01.12s || +0m00.19s | +17.85% 0m01.32s | Specific/Framework/ArithmeticSynthesis/Freeze | 0m00.90s || +0m00.42s | +46.66% 0m01.31s | Algebra/IntegralDomain | 0m01.31s || +0m00.00s | +0.00% 0m01.31s | Arithmetic/Saturated/MulSplitUnfolder | 0m01.32s || -0m00.01s | -0.75% 0m01.31s | Compilers/Named/CompileProperties | 0m01.30s || +0m00.01s | +0.76% 0m01.31s | Util/ZUtil/Testbit | 0m01.66s || -0m00.34s | -21.08% 0m01.30s | Compilers/Z/Bounds/Pipeline/ReflectiveTactics | 0m01.29s || +0m00.01s | +0.77% 0m01.30s | Experiments/NewPipeline/CLI | 0m01.28s || +0m00.02s | +1.56% 0m01.27s | bbv/NatLib | 0m01.06s || +0m00.20s | +19.81% 0m01.26s | Arithmetic/Saturated/FreezeUnfolder | 0m00.84s || +0m00.42s | +50.00% 0m01.24s | Specific/Framework/IntegrationTestTemporaryMiscCommon | 0m01.31s || -0m00.07s | -5.34% 0m01.22s | Util/ZUtil/EquivModulo | 0m01.16s || +0m00.06s | +5.17% 0m01.21s | Specific/Framework/MontgomeryReificationTypes | 0m01.19s || +0m00.02s | +1.68% 0m01.19s | Specific/Framework/ReificationTypesPackage | 0m00.85s || +0m00.34s | +40.00% 0m01.19s | Specific/Framework/SynthesisFramework | 0m01.04s || +0m00.14s | +14.42% 0m01.17s | Experiments/NewPipeline/MiscCompilerPasses | 0m01.25s || -0m00.08s | -6.40% 0m01.15s | Compilers/Named/AListContext | 0m01.08s || +0m00.06s | +6.48% 0m01.14s | Arithmetic/MontgomeryReduction/WordByWord/Definition | 0m01.18s || -0m00.04s | -3.38% 0m01.14s | Arithmetic/Saturated/Wrappers | 0m00.85s || +0m00.28s | +34.11% 0m01.14s | Specific/Framework/ArithmeticSynthesis/HelperTactics | 0m01.12s || +0m00.01s | +1.78% 0m01.14s | Util/PartiallyReifiedProp | 0m01.12s || +0m00.01s | +1.78% 0m01.14s | Util/ZRange/BasicLemmas | 0m01.26s || -0m00.12s | -9.52% 0m01.13s | Specific/Framework/ArithmeticSynthesis/DefaultsPackage | 0m00.86s || +0m00.26s | +31.39% 0m01.12s | Compilers/InlineConstAndOpInterp | 0m00.90s || +0m00.22s | +24.44% 0m01.12s | Compilers/WfInversion | 0m01.18s || -0m00.05s | -5.08% 0m01.12s | Specific/Framework/ArithmeticSynthesis/FreezePackage | 0m00.77s || +0m00.35s | +45.45% 0m01.11s | Specific/Framework/ArithmeticSynthesis/SquareFromMul | 0m01.13s || -0m00.01s | -1.76% 0m01.08s | Compilers/Named/FMapContext | 0m01.27s || -0m00.18s | -14.96% 0m01.08s | Curves/Montgomery/AffineInstances | 0m01.16s || -0m00.07s | -6.89% 0m01.08s | Util/ZUtil/Peano | 0m01.10s || -0m00.02s | -1.81% 0m01.08s | Util/ZUtil/ZSimplify/Simple | 0m00.88s || +0m00.20s | +22.72% 0m01.07s | Specific/Framework/ArithmeticSynthesis/BasePackage | 0m01.14s || -0m00.06s | -6.14% 0m01.06s | LegacyArithmetic/Double/Proofs/SelectConditional | 0m01.09s || -0m00.03s | -2.75% 0m01.04s | Compilers/InterpByIsoProofs | 0m01.16s || -0m00.11s | -10.34% 0m01.03s | Compilers/SmartMap | 0m01.04s || -0m00.01s | -0.96% 0m01.03s | Compilers/Z/Bounds/Pipeline | 0m00.85s || +0m00.18s | +21.17% 0m01.03s | Util/ZUtil/Morphisms | 0m01.23s || -0m00.19s | -16.26% 0m01.02s | Curves/Montgomery/XZ | 0m00.96s || +0m00.06s | +6.25% 0m01.01s | Arithmetic/Saturated/WrappersUnfolder | 0m01.59s || -0m00.58s | -36.47% 0m01.01s | Compilers/Named/InterpSideConditionsInterp | 0m01.12s || -0m00.11s | -9.82% 0m01.00s | Util/CPSUtil | 0m01.09s || -0m00.09s | -8.25% 0m00.99s | Compilers/CommonSubexpressionElimination | 0m00.78s || +0m00.20s | +26.92% 0m00.96s | Util/ZUtil/CC | 0m00.89s || +0m00.06s | +7.86% 0m00.95s | Compilers/MapBaseTypeWf | 0m00.78s || +0m00.16s | +21.79% 0m00.95s | Specific/Framework/ArithmeticSynthesis/LadderstepPackage | 0m01.10s || -0m00.15s | -13.63% 0m00.94s | Compilers/Z/Reify | 0m00.96s || -0m00.02s | -2.08% 0m00.93s | Compilers/Z/Bounds/Pipeline/Glue | 0m00.88s || +0m00.05s | +5.68% 0m00.92s | Arithmetic/Saturated/UniformWeightInstances | 0m01.10s || -0m00.18s | -16.36% 0m00.92s | Compilers/Z/Bounds/MapCastByDeBruijnInterp | 0m00.90s || +0m00.02s | +2.22% 0m00.89s | Compilers/Z/MapCastByDeBruijnInterp | 0m00.87s || +0m00.02s | +2.29% 0m00.89s | Curves/Weierstrass/Affine | 0m00.79s || +0m00.09s | +12.65% 0m00.89s | Specific/Framework/ArithmeticSynthesis/KaratsubaPackage | 0m00.76s || +0m00.13s | +17.10% 0m00.89s | Util/ZUtil/Tactics/RewriteModSmall | 0m01.13s || -0m00.23s | -21.23% 0m00.88s | Compilers/Named/WfInterp | 0m00.76s || +0m00.12s | +15.78% 0m00.88s | Compilers/Z/ArithmeticSimplifierUtil | 0m00.80s || +0m00.07s | +9.99% 0m00.88s | Util/Decidable | 0m00.81s || +0m00.06s | +8.64% 0m00.88s | Util/Factorize | 0m00.92s || -0m00.04s | -4.34% 0m00.88s | Util/ZUtil/Rshi | 0m01.11s || -0m00.23s | -20.72% 0m00.86s | Compilers/Z/Bounds/RoundUpLemmas | 0m00.90s || -0m00.04s | -4.44% 0m00.86s | LegacyArithmetic/Double/Core | 0m00.90s || -0m00.04s | -4.44% 0m00.85s | Arithmetic/ModularArithmeticPre | 0m00.82s || +0m00.03s | +3.65% N/A | Coqprime/Z/ZSum | 0m00.85s || -0m00.85s | -100.00% 0m00.85s | Specific/Framework/ArithmeticSynthesis/Ladderstep | 0m01.10s || -0m00.25s | -22.72% 0m00.84s | Compilers/Z/Bounds/InterpretationLemmas/Tactics | 0m00.88s || -0m00.04s | -4.54% 0m00.84s | Compilers/Z/Bounds/MapCastByDeBruijnWf | 0m00.85s || -0m00.01s | -1.17% 0m00.84s | LegacyArithmetic/ZBounded | 0m00.80s || +0m00.03s | +4.99% 0m00.84s | Spec/EdDSA | 0m00.55s || +0m00.28s | +52.72% 0m00.83s | Compilers/Z/Bounds/MapCastByDeBruijn | 0m00.87s || -0m00.04s | -4.59% 0m00.83s | LegacyArithmetic/BaseSystem | 0m00.78s || +0m00.04s | +6.41% 0m00.82s | Compilers/Z/MapCastByDeBruijnWf | 0m00.89s || -0m00.07s | -7.86% 0m00.82s | LegacyArithmetic/Double/Proofs/ShiftLeftRightTactic | 0m00.82s || +0m00.00s | +0.00% 0m00.82s | Specific/Framework/MontgomeryReificationTypesPackage | 0m00.92s || -0m00.10s | -10.86% 0m00.81s | Compilers/Z/CommonSubexpressionEliminationInterp | 0m00.80s || +0m00.01s | +1.25% 0m00.80s | Compilers/Z/FoldTypes | 0m00.76s || +0m00.04s | +5.26% 0m00.80s | Compilers/Z/MapCastByDeBruijn | 0m00.77s || +0m00.03s | +3.89% N/A | Coqprime/PrimalityTest/Root | 0m00.80s || -0m00.80s | -100.00% 0m00.79s | Arithmetic/MontgomeryReduction/Definition | 0m00.71s || +0m00.08s | +11.26% 0m00.79s | Compilers/GeneralizeVarInterp | 0m00.75s || +0m00.04s | +5.33% 0m00.79s | Compilers/MapCastByDeBruijnWf | 0m01.12s || -0m00.33s | -29.46% 0m00.79s | Compilers/Z/CommonSubexpressionEliminationWf | 0m00.79s || +0m00.00s | +0.00% 0m00.79s | Experiments/NewPipeline/CompilersTestCases | 0m01.62s || -0m00.83s | -51.23% 0m00.79s | Specific/Framework/ArithmeticSynthesis/MontgomeryPackage | 0m00.78s || +0m00.01s | +1.28% 0m00.78s | Compilers/Z/InlineConstAndOpInterp | 0m00.72s || +0m00.06s | +8.33% 0m00.78s | Compilers/Z/InlineConstAndOpWf | 0m00.80s || -0m00.02s | -2.50% 0m00.78s | Util/ZBounded | 0m00.81s || -0m00.03s | -3.70% 0m00.77s | Compilers/GeneralizeVarWf | 0m00.76s || +0m00.01s | +1.31% 0m00.77s | Compilers/Z/RewriteAddToAdc | 0m00.78s || -0m00.01s | -1.28% 0m00.77s | Util/NUtil | 0m00.84s || -0m00.06s | -8.33% 0m00.76s | Algebra/SubsetoidRing | 0m00.94s || -0m00.17s | -19.14% 0m00.76s | Compilers/Z/InlineConstAndOpByRewriteInterp | 0m00.75s || +0m00.01s | +1.33% N/A | Coqprime/PrimalityTest/Cyclic | 0m00.76s || -0m00.76s | -100.00% 0m00.76s | Util/HList | 0m00.80s || -0m00.04s | -5.00% 0m00.75s | Compilers/Z/Bounds/Interpretation | 0m00.70s || +0m00.05s | +7.14% 0m00.75s | Compilers/Z/InlineConstAndOpByRewriteWf | 0m00.73s || +0m00.02s | +2.73% 0m00.75s | Compilers/Z/InlineWf | 0m00.82s || -0m00.06s | -8.53% 0m00.75s | Compilers/Z/InterpSideConditions | 0m00.55s || +0m00.19s | +36.36% 0m00.75s | Compilers/ZExtended/MapBaseType | 0m00.68s || +0m00.06s | +10.29% 0m00.75s | Util/Loops | 0m00.90s || -0m00.15s | -16.66% 0m00.74s | Compilers/Named/DeadCodeEliminationInterp | 0m00.70s || +0m00.04s | +5.71% 0m00.74s | Compilers/Named/PositiveContext/DefaultsProperties | 0m00.74s || +0m00.00s | +0.00% 0m00.74s | LegacyArithmetic/Interface | 0m01.04s || -0m00.30s | -28.84% 0m00.73s | Compilers/Z/GeneralizeVarInterp | 0m00.70s || +0m00.03s | +4.28% 0m00.73s | Spec/CompleteEdwardsCurve | 0m00.90s || -0m00.17s | -18.88% 0m00.72s | Algebra/Nsatz | 0m00.75s || -0m00.03s | -4.00% 0m00.72s | Compilers/InterpRewriting | 0m00.66s || +0m00.05s | +9.09% 0m00.72s | Specific/Framework/IntegrationTestDisplayCommonTactics | 0m00.70s || +0m00.02s | +2.85% 0m00.71s | Compilers/InterpProofs | 0m00.71s || +0m00.00s | +0.00% 0m00.71s | Compilers/Z/InlineConstAndOp | 0m00.51s || +0m00.19s | +39.21% 0m00.71s | Compilers/Z/Named/RewriteAddToAdc | 0m00.98s || -0m00.27s | -27.55% 0m00.71s | Compilers/ZExtended/Syntax | 0m00.54s || +0m00.16s | +31.48% 0m00.71s | Specific/X25519/C64/CurveParameters | 0m00.50s || +0m00.20s | +41.99% 0m00.70s | Compilers/InterpWf | 0m00.72s || -0m00.02s | -2.77% 0m00.70s | LegacyArithmetic/ArchitectureToZLike | 0m00.84s || -0m00.14s | -16.66% 0m00.70s | Util/ZRange | 0m00.70s || +0m00.00s | +0.00% 0m00.69s | Compilers/InputSyntax | 0m00.74s || -0m00.05s | -6.75% 0m00.69s | Compilers/Z/InlineConstAndOpByRewrite | 0m00.86s || -0m00.17s | -19.76% 0m00.69s | Spec/ModularArithmetic | 0m00.66s || +0m00.02s | +4.54% 0m00.68s | Compilers/CommonSubexpressionEliminationInterp | 0m00.98s || -0m00.29s | -30.61% 0m00.68s | Compilers/InterpWfRel | 0m00.78s || -0m00.09s | -12.82% 0m00.68s | Util/ZUtil/CPS | 0m00.61s || +0m00.07s | +11.47% 0m00.67s | Compilers/Z/Syntax | 0m00.66s || +0m00.01s | +1.51% 0m00.67s | Experiments/NewPipeline/AbstractInterpretationProofs | 0m00.60s || +0m00.07s | +11.66% 0m00.66s | Compilers/Reify | 0m00.60s || +0m00.06s | +10.00% 0m00.66s | Specific/Framework/CurveParameters | 0m00.64s || +0m00.02s | +3.12% 0m00.66s | Util/ZRange/Operations | 0m00.64s || +0m00.02s | +3.12% 0m00.64s | Experiments/PartialEvaluationWithLetIn | 0m00.61s || +0m00.03s | +4.91% 0m00.62s | Algebra/Monoid | 0m00.57s || +0m00.05s | +8.77% 0m00.62s | Compilers/InlineConstAndOp | 0m00.61s || +0m00.01s | +1.63% 0m00.62s | Compilers/InlineConstAndOpByRewriteWf | 0m00.78s || -0m00.16s | -20.51% 0m00.62s | Compilers/Named/WeakListContext | 0m00.62s || +0m00.00s | +0.00% 0m00.62s | Compilers/WfReflectiveGen | 0m00.60s || +0m00.02s | +3.33% 0m00.62s | Compilers/Z/GeneralizeVarWf | 0m00.75s || -0m00.13s | -17.33% 0m00.62s | Specific/Framework/RawCurveParameters | 0m00.58s || +0m00.04s | +6.89% 0m00.61s | Compilers/CommonSubexpressionEliminationDenote | 0m00.41s || +0m00.20s | +48.78% 0m00.61s | Compilers/Named/RegisterAssign | 0m00.60s || +0m00.01s | +1.66% 0m00.61s | Compilers/Z/Inline | 0m00.56s || +0m00.04s | +8.92% 0m00.61s | Util/BoundedWord | 0m00.57s || +0m00.04s | +7.01% 0m00.60s | Compilers/InlineConstAndOpByRewriteInterp | 0m00.68s || -0m00.08s | -11.76% 0m00.60s | Compilers/MapCastByDeBruijn | 0m00.61s || -0m00.01s | -1.63% 0m00.60s | LegacyArithmetic/Pow2Base | 0m00.73s || -0m00.13s | -17.80% 0m00.59s | Compilers/Z/Named/DeadCodeElimination | 0m00.51s || +0m00.07s | +15.68% 0m00.58s | Compilers/Linearize | 0m00.56s || +0m00.01s | +3.57% 0m00.58s | Compilers/Named/MapCast | 0m00.56s || +0m00.01s | +3.57% 0m00.58s | Compilers/Z/Bounds/Pipeline/OutputType | 0m00.61s || -0m00.03s | -4.91% 0m00.58s | Compilers/ZExtended/InlineConstAndOpWf | 0m00.53s || +0m00.04s | +9.43% 0m00.58s | Util/FixedWordSizes | 0m00.53s || +0m00.04s | +9.43% 0m00.58s | Util/ZUtil/Tactics/SimplifyFractionsLe | 0m00.43s || +0m00.14s | +34.88% 0m00.57s | Compilers/GeneralizeVar | 0m00.56s || +0m00.00s | +1.78% 0m00.57s | Compilers/Z/Named/DeadCodeEliminationInterp | 0m00.69s || -0m00.12s | -17.39% N/A | Coqprime/PrimalityTest/Zp | 0m00.57s || -0m00.56s | -100.00% 0m00.57s | Util/ZUtil/MulSplit | 0m00.48s || +0m00.08s | +18.74% 0m00.56s | Compilers/Z/OpInversion | 0m00.56s || +0m00.00s | +0.00% 0m00.56s | Compilers/Z/TypeInversion | 0m00.39s || +0m00.17s | +43.58% 0m00.56s | Specific/NISTP256/AMD64/CurveParameters | 0m00.61s || -0m00.04s | -8.19% 0m00.56s | Util/Decidable/Decidable2Bool | 0m00.81s || -0m00.25s | -30.86% 0m00.55s | Compilers/FilterLive | 0m00.47s || +0m00.08s | +17.02% 0m00.55s | Compilers/Named/IdContext | 0m00.50s || +0m00.05s | +10.00% 0m00.55s | Compilers/ZExtended/InlineConstAndOpByRewrite | 0m00.50s || +0m00.05s | +10.00% 0m00.55s | Compilers/ZExtended/InlineConstAndOpByRewriteWf | 0m00.45s || +0m00.10s | +22.22% 0m00.55s | Compilers/ZExtended/Syntax/Util | 0m00.58s || -0m00.02s | -5.17% 0m00.55s | Specific/X2448/Karatsuba/C64/CurveParameters | 0m00.38s || +0m00.17s | +44.73% 0m00.54s | Compilers/Inline | 0m00.54s || +0m00.00s | +0.00% 0m00.54s | Compilers/Named/InterpSideConditions | 0m00.40s || +0m00.14s | +35.00% 0m00.54s | Compilers/Named/Wf | 0m00.49s || +0m00.05s | +10.20% 0m00.53s | Compilers/Named/ContextDefinitions | 0m00.55s || -0m00.02s | -3.63% 0m00.53s | Compilers/ZExtended/InlineConstAndOpByRewriteInterp | 0m00.51s || +0m00.02s | +3.92% 0m00.53s | Compilers/ZExtended/InlineConstAndOpInterp | 0m00.58s || -0m00.04s | -8.62% 0m00.53s | Specific/Framework/CurveParametersPackage | 0m00.44s || +0m00.09s | +20.45% 0m00.53s | Util/ZRange/Show | 0m00.56s || -0m00.03s | -5.35% 0m00.53s | Util/ZUtil/Tactics/ZeroBounds | 0m00.40s || +0m00.13s | +32.50% 0m00.52s | Compilers/Named/Context | 0m00.47s || +0m00.05s | +10.63% 0m00.52s | Compilers/Named/CountLets | 0m00.44s || +0m00.08s | +18.18% 0m00.52s | Compilers/Named/GetNames | 0m00.50s || +0m00.02s | +4.00% 0m00.52s | Compilers/Named/InterpretToPHOAS | 0m00.55s || -0m00.03s | -5.45% 0m00.52s | Compilers/Tuple | 0m00.53s || -0m00.01s | -1.88% 0m00.52s | Util/ZUtil/Sgn | 0m00.51s || +0m00.01s | +1.96% 0m00.52s | Util/ZUtil/Tactics/PullPush/Modulo | 0m00.48s || +0m00.04s | +8.33% 0m00.51s | Compilers/CountLets | 0m00.42s || +0m00.09s | +21.42% 0m00.51s | Compilers/Named/ContextOn | 0m00.49s || +0m00.02s | +4.08% 0m00.51s | Util/AdditionChainExponentiation | 0m00.62s || -0m00.10s | -17.74% 0m00.51s | Util/Strings/String | 0m00.58s || -0m00.06s | -12.06% 0m00.51s | Util/ZUtil/Tactics/Ztestbit | 0m00.43s || +0m00.08s | +18.60% 0m00.50s | Compilers/ExprInversion | 0m00.46s || +0m00.03s | +8.69% 0m00.50s | Compilers/FoldTypes | 0m00.51s || -0m00.01s | -1.96% 0m00.50s | Compilers/InlineConstAndOpByRewrite | 0m00.50s || +0m00.00s | +0.00% 0m00.50s | Compilers/Z/InlineInterp | 0m00.59s || -0m00.08s | -15.25% N/A | Coqprime/List/UList | 0m00.50s || -0m00.50s | -100.00% 0m00.49s | Util/ZUtil/Hints/PullPush | 0m00.41s || +0m00.08s | +19.51% 0m00.48s | Compilers/Named/ContextProperties/Tactics | 0m00.53s || -0m00.05s | -9.43% 0m00.48s | Compilers/Z/GeneralizeVar | 0m00.49s || -0m00.01s | -2.04% 0m00.48s | Compilers/ZExtended/InlineConstAndOp | 0m00.52s || -0m00.04s | -7.69% 0m00.48s | Util/ZUtil/Hints/Ztestbit | 0m00.50s || -0m00.02s | -4.00% 0m00.48s | Util/ZUtil/ZSimplify/Core | 0m00.44s || +0m00.03s | +9.09% 0m00.48s | Util/ZUtil/Zselect | 0m00.44s || +0m00.03s | +9.09% 0m00.47s | Compilers/InterpByIso | 0m00.47s || +0m00.00s | +0.00% 0m00.47s | Util/IdfunWithAlt | 0m00.59s || -0m00.12s | -20.33% 0m00.47s | Util/ZUtil/Hints/ZArith | 0m00.49s || -0m00.02s | -4.08% 0m00.46s | Compilers/Named/DeadCodeElimination | 0m00.58s || -0m00.11s | -20.68% N/A | Coqprime/List/Permutation | 0m00.46s || -0m00.46s | -100.00% 0m00.46s | Experiments/NewPipeline/UnderLets | 0m00.72s || -0m00.25s | -36.11% 0m00.46s | Util/Sum | 0m00.44s || +0m00.02s | +4.54% 0m00.45s | Compilers/Named/SmartMap | 0m00.54s || -0m00.09s | -16.66% 0m00.45s | Util/ZUtil/Z2Nat | 0m00.41s || +0m00.04s | +9.75% 0m00.44s | Compilers/MapBaseType | 0m00.46s || -0m00.02s | -4.34% 0m00.44s | Util/Strings/HexString | 0m00.44s || +0m00.00s | +0.00% 0m00.44s | Util/ZUtil/Div/Bootstrap | 0m00.50s || -0m00.06s | -12.00% 0m00.44s | Util/ZUtil/Hints/Core | 0m00.52s || -0m00.08s | -15.38% 0m00.43s | Compilers/Named/EstablishLiveness | 0m00.38s || +0m00.04s | +13.15% 0m00.43s | Compilers/Named/ExprInversion | 0m00.56s || -0m00.13s | -23.21% 0m00.43s | Compilers/StripExpr | 0m00.50s || -0m00.07s | -14.00% 0m00.43s | Util/ZUtil/Tactics/LtbToLt | 0m00.54s || -0m00.11s | -20.37% 0m00.42s | Arithmetic/MontgomeryReduction/WordByWord/Abstract/Dependent/Definition | 0m00.43s || -0m00.01s | -2.32% 0m00.42s | Util/ZUtil/Hints | 0m00.40s || +0m00.01s | +4.99% 0m00.42s | Util/ZUtil/Le | 0m00.43s || -0m00.01s | -2.32% 0m00.42s | Util/ZUtil/ZSimplify | 0m00.28s || +0m00.13s | +49.99% 0m00.42s | bbv/Nomega | 0m00.45s || -0m00.03s | -6.66% 0m00.41s | Util/ZUtil/Sorting | 0m00.47s || -0m00.06s | -12.76% 0m00.41s | Util/ZUtil/Tactics/PrimeBound | 0m00.36s || +0m00.04s | +13.88% 0m00.41s | bbv/HexNotationWord | 0m00.45s || -0m00.04s | -8.88% 0m00.40s | Compilers/Named/PositiveContext | 0m00.59s || -0m00.18s | -32.20% 0m00.40s | Compilers/Named/Syntax | 0m00.50s || -0m00.09s | -19.99% N/A | Coqprime/List/ListAux | 0m00.40s || -0m00.40s | -100.00% 0m00.40s | Util/SideConditions/RingPackage | 0m00.37s || +0m00.03s | +8.10% 0m00.40s | Util/ZUtil/Tactics/DivModToQuotRem | 0m00.38s || +0m00.02s | +5.26% 0m00.40s | Util/ZUtil/Tactics/LinearSubstitute | 0m00.42s || -0m00.01s | -4.76% 0m00.39s | Compilers/Equality | 0m00.38s || +0m00.01s | +2.63% 0m00.39s | Util/SideConditions/Autosolve | 0m00.28s || +0m00.10s | +39.28% 0m00.39s | Util/SideConditions/ModInvPackage | 0m00.41s || -0m00.01s | -4.87% 0m00.39s | bbv/HexNotation | 0m00.38s || +0m00.01s | +2.63% N/A | Coqprime/PrimalityTest/Lagrange | 0m00.38s || -0m00.38s | -100.00% 0m00.38s | Specific/NISTP256/AMD128/CurveParameters | 0m00.58s || -0m00.19s | -34.48% 0m00.38s | Util/ZUtil/AddModulo | 0m00.28s || +0m00.09s | +35.71% 0m00.38s | Util/ZUtil/Modulo/Bootstrap | 0m00.40s || -0m00.02s | -5.00% 0m00.38s | Util/ZUtil/Tactics/CompareToSgn | 0m00.43s || -0m00.04s | -11.62% 0m00.38s | Util/ZUtil/Tactics/DivideExistsMul | 0m00.38s || +0m00.00s | +0.00% 0m00.38s | bbv/WordScope | 0m00.40s || -0m00.02s | -5.00% 0m00.37s | Algebra/Hierarchy | 0m00.40s || -0m00.03s | -7.50% 0m00.37s | Compilers/Named/Compile | 0m00.50s || -0m00.13s | -26.00% N/A | Coqprime/List/ZProgression | 0m00.37s || -0m00.37s | -100.00% N/A | Coqprime/PrimalityTest/IGroup | 0m00.37s || -0m00.37s | -100.00% 0m00.37s | Util/ZUtil/Ge | 0m00.33s || +0m00.03s | +12.12% 0m00.37s | Util/ZUtil/Land | 0m00.43s || -0m00.06s | -13.95% 0m00.36s | Arithmetic/MontgomeryReduction/WordByWord/Abstract/Definition | 0m00.42s || -0m00.06s | -14.28% 0m00.36s | Compilers/Named/MapType | 0m00.33s || +0m00.02s | +9.09% 0m00.36s | Compilers/Named/PositiveContext/Defaults | 0m00.57s || -0m00.20s | -36.84% 0m00.36s | Util/Strings/OctalString | 0m00.33s || +0m00.02s | +9.09% 0m00.36s | Util/ZUtil/Definitions | 0m00.40s || -0m00.04s | -10.00% 0m00.36s | Util/ZUtil/Tactics/PullPush | 0m00.39s || -0m00.03s | -7.69% 0m00.36s | Util/ZUtil/Tactics/ReplaceNegWithPos | 0m00.33s || +0m00.02s | +9.09% 0m00.36s | bbv/BinNotation | 0m00.37s || -0m00.01s | -2.70% N/A | Coqprime/PrimalityTest/Euler | 0m00.35s || -0m00.35s | -100.00% 0m00.35s | Spec/MxDH | 0m00.39s || -0m00.04s | -10.25% 0m00.35s | Util/Decidable/Bool2Prop | 0m00.22s || +0m00.12s | +59.09% 0m00.35s | Util/ZUtil/Tactics | 0m00.48s || -0m00.13s | -27.08% 0m00.35s | Util/ZUtil/Tactics/PeelLe | 0m00.44s || -0m00.09s | -20.45% 0m00.35s | Util/ZUtil/Tactics/SplitMinMax | 0m00.35s || +0m00.00s | +0.00% 0m00.34s | Util/Option | 0m00.31s || +0m00.03s | +9.67% 0m00.34s | Util/ZUtil/ModInv | 0m00.38s || -0m00.03s | -10.52% 0m00.34s | bbv/BinNotationZ | 0m00.34s || +0m00.00s | +0.00% 0m00.34s | bbv/HexNotationZ | 0m00.37s || -0m00.02s | -8.10% 0m00.34s | bbv/NLib | 0m00.42s || -0m00.07s | -19.04% 0m00.33s | Util/Strings/Show | 0m00.45s || -0m00.12s | -26.66% N/A | Coqprime/List/Iterator | 0m00.31s || -0m00.31s | -100.00% 0m00.31s | Util/PointedProp | 0m00.30s || +0m00.01s | +3.33% 0m00.29s | Util/LetInMonad | 0m00.29s || +0m00.00s | +0.00% 0m00.28s | Compilers/EtaInterp | 0m00.34s || -0m00.06s | -17.64% 0m00.28s | Compilers/InSet/TypeifyInterp | 0m00.18s || +0m00.10s | +55.55% 0m00.28s | Util/Strings/BinaryString | 0m00.32s || -0m00.03s | -12.49% 0m00.28s | Util/Strings/Equality | 0m00.29s || -0m00.00s | -3.44% N/A | Coqprime/PrimalityTest/FGroup | 0m00.27s || -0m00.27s | -100.00% 0m00.27s | Util/Strings/Ascii | 0m00.33s || -0m00.06s | -18.18% 0m00.27s | Util/Strings/Decimal | 0m00.26s || +0m00.01s | +3.84% N/A | Coqprime/N/NatAux | 0m00.26s || -0m00.26s | -100.00% 0m00.26s | Util/ParseTaps | 0m00.29s || -0m00.02s | -10.34% 0m00.25s | Util/SideConditions/ReductionPackages | 0m00.24s || +0m00.01s | +4.16% 0m00.24s | Util/ZUtil/Notations | 0m00.29s || -0m00.04s | -17.24% 0m00.20s | Compilers/Conversion | 0m00.12s || +0m00.08s | +66.66% 0m00.20s | Util/ListUtil/FoldBool | 0m00.20s || +0m00.00s | +0.00% 0m00.19s | Compilers/Named/NameUtil | 0m00.18s || +0m00.01s | +5.55% 0m00.19s | Compilers/Wf | 0m00.20s || -0m00.01s | -5.00% 0m00.18s | Specific/Framework/Packages | 0m00.17s || +0m00.00s | +5.88% 0m00.18s | Util/PrimitiveProd | 0m00.19s || -0m00.01s | -5.26% 0m00.18s | Util/Relations | 0m00.14s || +0m00.03s | +28.57% 0m00.18s | bbv/DepEq | 0m00.22s || -0m00.04s | -18.18% 0m00.17s | Util/ListUtil/Forall | 0m00.18s || -0m00.00s | -5.55% 0m00.17s | Util/Sigma | 0m00.14s || +0m00.03s | +21.42% 0m00.16s | Compilers/RewriterWf | 0m00.16s || +0m00.00s | +0.00% 0m00.16s | Util/TagList | 0m00.20s || -0m00.04s | -20.00% 0m00.14s | Compilers/RewriterInterp | 0m00.12s || +0m00.02s | +16.66% 0m00.14s | Compilers/TypeInversion | 0m00.14s || +0m00.00s | +0.00% 0m00.12s | Compilers/InSet/Syntax | 0m00.09s || +0m00.03s | +33.33% 0m00.12s | Compilers/InterpSideConditions | 0m00.07s || +0m00.04s | +71.42% 0m00.12s | Util/AutoRewrite | 0m00.09s || +0m00.03s | +33.33% 0m00.12s | Util/Equality | 0m00.13s || -0m00.01s | -7.69% 0m00.12s | Util/PrimitiveHList | 0m00.14s || -0m00.02s | -14.28% 0m00.12s | Util/Prod | 0m00.18s || -0m00.06s | -33.33% 0m00.11s | Compilers/RenameBinders | 0m00.10s || +0m00.00s | +9.99% 0m00.11s | Compilers/Rewriter | 0m00.10s || +0m00.00s | +9.99% 0m00.11s | Compilers/TypeUtil | 0m00.08s || +0m00.03s | +37.50% 0m00.11s | Util/HProp | 0m00.10s || +0m00.00s | +9.99% 0m00.11s | Util/IffT | 0m00.05s || +0m00.06s | +120.00% 0m00.11s | Util/Tactics | 0m00.08s || +0m00.03s | +37.50% 0m00.10s | Compilers/Eta | 0m00.11s || -0m00.00s | -9.09% 0m00.10s | Compilers/Syntax | 0m00.13s || -0m00.03s | -23.07% 0m00.10s | Util/Bool | 0m00.08s || +0m00.02s | +25.00% 0m00.10s | Util/Isomorphism | 0m00.12s || -0m00.01s | -16.66% 0m00.10s | Util/LetIn | 0m00.09s || +0m00.01s | +11.11% 0m00.10s | Util/Sumbool | 0m00.09s || +0m00.01s | +11.11% 0m00.10s | Util/Tactics/MoveLetIn | 0m00.09s || +0m00.01s | +11.11% 0m00.10s | Util/Tactics/Revert | 0m00.07s || +0m00.03s | +42.85% 0m00.10s | Util/Tower | 0m00.10s || +0m00.00s | +0.00% 0m00.10s | bbv/DepEqNat | 0m00.06s || +0m00.04s | +66.66% 0m00.09s | Compilers/InSet/Typeify | 0m00.12s || -0m00.03s | -25.00% 0m00.09s | Util/Tactics/Contains | 0m00.04s || +0m00.05s | +124.99% 0m00.09s | Util/Tactics/ConvoyDestruct | 0m00.05s || +0m00.03s | +79.99% 0m00.09s | Util/Tactics/DestructHead | 0m00.10s || -0m00.01s | -10.00% 0m00.09s | Util/Tactics/ETransitivity | 0m00.08s || +0m00.00s | +12.49% 0m00.09s | Util/Tactics/SpecializeBy | 0m00.06s || +0m00.03s | +50.00% 0m00.08s | Compilers/Intros | 0m00.08s || +0m00.00s | +0.00% 0m00.08s | Compilers/Map | 0m00.10s || -0m00.02s | -20.00% 0m00.08s | Util/Bool/IsTrue | 0m00.06s || +0m00.02s | +33.33% 0m00.08s | Util/ErrorT | 0m00.07s || +0m00.00s | +14.28% 0m00.08s | Util/Logic | 0m00.08s || +0m00.00s | +0.00% 0m00.08s | Util/Pointed | 0m00.08s || +0m00.00s | +0.00% 0m00.08s | Util/Pos | 0m00.04s || +0m00.04s | +100.00% 0m00.08s | Util/SideConditions/AdmitPackage | 0m00.08s || +0m00.00s | +0.00% 0m00.08s | Util/Sigma/Lift | 0m00.06s || +0m00.02s | +33.33% 0m00.08s | Util/Tactics/CacheTerm | 0m00.08s || +0m00.00s | +0.00% 0m00.08s | Util/Tactics/DebugPrint | 0m00.10s || -0m00.02s | -20.00% 0m00.08s | Util/Tactics/DestructTrivial | 0m00.05s || +0m00.03s | +60.00% 0m00.08s | Util/Tactics/GetGoal | 0m00.06s || +0m00.02s | +33.33% 0m00.08s | Util/Tactics/Head | 0m00.07s || +0m00.00s | +14.28% 0m00.08s | Util/Tactics/RewriteHyp | 0m00.06s || +0m00.02s | +33.33% 0m00.08s | Util/Tactics/SubstEvars | 0m00.07s || +0m00.00s | +14.28% 0m00.08s | Util/Tactics/UnifyAbstractReflexivity | 0m00.06s || +0m00.02s | +33.33% 0m00.08s | Util/Tactics/VM | 0m00.08s || +0m00.00s | +0.00% 0m00.07s | LegacyArithmetic/VerdiTactics | 0m00.10s || -0m00.03s | -30.00% 0m00.07s | Util/Bool/Equality | 0m00.07s || +0m00.00s | +0.00% 0m00.07s | Util/CPSNotations | 0m00.09s || -0m00.01s | -22.22% 0m00.07s | Util/Logic/ImplAnd | 0m00.07s || +0m00.00s | +0.00% 0m00.07s | Util/Tactics/BreakMatch | 0m00.06s || +0m00.01s | +16.66% 0m00.07s | Util/Tactics/DestructHyps | 0m00.07s || +0m00.00s | +0.00% 0m00.07s | Util/Tactics/DoWithHyp | 0m00.09s || -0m00.01s | -22.22% 0m00.07s | Util/Tactics/ESpecialize | 0m00.08s || -0m00.00s | -12.49% 0m00.07s | Util/Tactics/HeadUnderBinders | 0m00.06s || +0m00.01s | +16.66% 0m00.07s | Util/Tactics/Not | 0m00.07s || +0m00.00s | +0.00% 0m00.07s | Util/Tactics/PoseTermWithName | 0m00.06s || +0m00.01s | +16.66% 0m00.07s | Util/Tactics/PrintContext | 0m00.06s || +0m00.01s | +16.66% 0m00.07s | Util/Tactics/SetEvars | 0m00.05s || +0m00.02s | +40.00% 0m00.07s | Util/Tactics/SpecializeAllWays | 0m00.08s || -0m00.00s | -12.49% 0m00.07s | Util/Tactics/SplitInContext | 0m00.07s || +0m00.00s | +0.00% 0m00.07s | Util/Tactics/TransparentAssert | 0m00.06s || +0m00.01s | +16.66% 0m00.07s | Util/Unit | 0m00.06s || +0m00.01s | +16.66% 0m00.06s | Util/Curry | 0m00.08s || -0m00.02s | -25.00% 0m00.06s | Util/DefaultedTypes | 0m00.07s || -0m00.01s | -14.28% 0m00.06s | Util/FixCoqMistakes | 0m00.09s || -0m00.03s | -33.33% 0m00.06s | Util/GlobalSettings | 0m00.12s || -0m00.06s | -50.00% 0m00.06s | Util/SideConditions/CorePackages | 0m00.07s || -0m00.01s | -14.28% 0m00.06s | Util/Sigma/Associativity | 0m00.08s || -0m00.02s | -25.00% 0m00.06s | Util/Sigma/MapProjections | 0m00.05s || +0m00.00s | +19.99% 0m00.06s | Util/Tactics/ClearDuplicates | 0m00.07s || -0m00.01s | -14.28% 0m00.06s | Util/Tactics/ClearbodyAll | 0m00.07s || -0m00.01s | -14.28% 0m00.06s | Util/Tactics/EvarExists | 0m00.06s || +0m00.00s | +0.00% 0m00.06s | Util/Tactics/Forward | 0m00.04s || +0m00.01s | +49.99% 0m00.06s | Util/Tactics/OnSubterms | 0m00.04s || +0m00.01s | +49.99% 0m00.06s | Util/Tactics/RunTacticAsConstr | 0m00.06s || +0m00.00s | +0.00% 0m00.06s | Util/Tactics/SideConditionsBeforeToAfter | 0m00.06s || +0m00.00s | +0.00% 0m00.06s | Util/Tactics/SimplifyProjections | 0m00.08s || -0m00.02s | -25.00% 0m00.06s | Util/Tactics/SubstLet | 0m00.06s || +0m00.00s | +0.00% 0m00.06s | Util/Tactics/Test | 0m00.07s || -0m00.01s | -14.28% 0m00.05s | Util/ChangeInAll | 0m00.06s || -0m00.00s | -16.66% 0m00.05s | Util/Notations | 0m00.08s || -0m00.03s | -37.50% 0m00.05s | Util/Tactics/SimplifyRepeatedIfs | 0m00.06s || -0m00.00s | -16.66% 0m00.05s | Util/Tactics/UnfoldArg | 0m00.08s || -0m00.03s | -37.50% 0m00.05s | Util/Tactics/UniquePose | 0m00.06s || -0m00.00s | -16.66% 0m00.04s | Util/OptionList | 0m00.09s || -0m00.05s | -55.55% 0m00.04s | Util/Tactics/ChangeInAll | 0m00.08s || -0m00.04s | -50.00% 0m00.04s | Util/Tactics/SetoidSubst | 0m00.05s || -0m00.01s | -20.00% 0m00.03s | Util/Tactics/ClearAll | 0m00.06s || -0m00.03s | -50.00% N/A | Coqprime/Tactic/Tactic | 0m00.02s || -0m00.02s | -100.00%
Diffstat (limited to 'src/Experiments/NewPipeline/fancy_rewrite_head.out')
-rw-r--r--src/Experiments/NewPipeline/fancy_rewrite_head.out38485
1 files changed, 33734 insertions, 4751 deletions
diff --git a/src/Experiments/NewPipeline/fancy_rewrite_head.out b/src/Experiments/NewPipeline/fancy_rewrite_head.out
index 2201473ab..b93038b7c 100644
--- a/src/Experiments/NewPipeline/fancy_rewrite_head.out
+++ b/src/Experiments/NewPipeline/fancy_rewrite_head.out
@@ -5,7 +5,8 @@ match idc in (ident t) return (Compile.value' true t) with
t as t0
return
(base.base_interp t0 ->
- UnderLets.UnderLets base.type ident var (expr (type.base t0)))
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base t0)))
with
| base.type.unit => fun v0 : unit => UnderLets.Base ##(v0)%expr
| base.type.Z => fun v0 : Z => UnderLets.Base ##(v0)%expr
@@ -13,42 +14,44 @@ match idc in (ident t) return (Compile.value' true t) with
| base.type.nat => fun v0 : nat => UnderLets.Base ##(v0)%expr
end v
| ident.Nat_succ =>
- fun x : expr (type.base base.type.nat) =>
+ fun x : defaults.expr (type.base base.type.nat) =>
UnderLets.Base (#(ident.Nat_succ)%expr @ x)%expr_pat
| ident.Nat_pred =>
- fun x : expr (type.base base.type.nat) =>
+ fun x : defaults.expr (type.base base.type.nat) =>
UnderLets.Base (#(ident.Nat_pred)%expr @ x)%expr_pat
| ident.Nat_max =>
- fun x x0 : expr (type.base base.type.nat) =>
+ fun x x0 : defaults.expr (type.base base.type.nat) =>
UnderLets.Base (#(ident.Nat_max)%expr @ x @ x0)%expr_pat
| ident.Nat_mul =>
- fun x x0 : expr (type.base base.type.nat) =>
+ fun x x0 : defaults.expr (type.base base.type.nat) =>
UnderLets.Base (#(ident.Nat_mul)%expr @ x @ x0)%expr_pat
| ident.Nat_add =>
- fun x x0 : expr (type.base base.type.nat) =>
+ fun x x0 : defaults.expr (type.base base.type.nat) =>
UnderLets.Base (#(ident.Nat_add)%expr @ x @ x0)%expr_pat
| ident.Nat_sub =>
- fun x x0 : expr (type.base base.type.nat) =>
+ fun x x0 : defaults.expr (type.base base.type.nat) =>
UnderLets.Base (#(ident.Nat_sub)%expr @ x @ x0)%expr_pat
| @ident.nil t => UnderLets.Base []%expr_pat
| @ident.cons t =>
- fun (x : expr (type.base t)) (x0 : expr (type.base (base.type.list t)))
- => UnderLets.Base (x :: x0)%expr_pat
+ fun (x : defaults.expr (type.base t))
+ (x0 : defaults.expr (type.base (base.type.list t))) =>
+ UnderLets.Base (x :: x0)%expr_pat
| @ident.pair A B =>
- fun (x : expr (type.base A)) (x0 : expr (type.base B)) =>
- UnderLets.Base (x, x0)%expr_pat
+ fun (x : defaults.expr (type.base A)) (x0 : defaults.expr (type.base B))
+ => UnderLets.Base (x, x0)%expr_pat
| @ident.fst A B =>
- fun x : expr (type.base (A * B)%etype) =>
+ fun x : defaults.expr (type.base (A * B)%etype) =>
UnderLets.Base (#(ident.fst)%expr @ x)%expr_pat
| @ident.snd A B =>
- fun x : expr (type.base (A * B)%etype) =>
+ fun x : defaults.expr (type.base (A * B)%etype) =>
UnderLets.Base (#(ident.snd)%expr @ x)%expr_pat
| @ident.prod_rect A B T =>
fun
- (x : expr (type.base A) ->
- expr (type.base B) ->
- UnderLets.UnderLets base.type ident var (expr (type.base T)))
- (x0 : expr (type.base (A * B)%etype)) =>
+ (x : defaults.expr (type.base A) ->
+ defaults.expr (type.base B) ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base T)))
+ (x0 : defaults.expr (type.base (A * B)%etype)) =>
UnderLets.Base
(#(ident.prod_rect)%expr @
(λ (x1 : var (type.base A))(x2 : var (type.base B)),
@@ -56,9 +59,10 @@ match idc in (ident t) return (Compile.value' true t) with
| @ident.bool_rect T =>
fun
(x
- x0 : expr (type.base base.type.unit) ->
- UnderLets.UnderLets base.type ident var (expr (type.base T)))
- (x1 : expr (type.base base.type.bool)) =>
+ x0 : defaults.expr (type.base base.type.unit) ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base T)))
+ (x1 : defaults.expr (type.base base.type.bool)) =>
UnderLets.Base
(#(ident.bool_rect)%expr @
(λ x2 : var (type.base base.type.unit),
@@ -67,27 +71,57 @@ match idc in (ident t) return (Compile.value' true t) with
UnderLets.to_expr (x0 ($x2)))%expr @ x1)%expr_pat
| @ident.nat_rect P =>
fun
- (x : expr (type.base base.type.unit) ->
- UnderLets.UnderLets base.type ident var (expr (type.base P)))
- (x0 : expr (type.base base.type.nat) ->
- expr (type.base P) ->
- UnderLets.UnderLets base.type ident var (expr (type.base P)))
- (x1 : expr (type.base base.type.nat)) =>
+ (x : defaults.expr (type.base base.type.unit) ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base P)))
+ (x0 : defaults.expr (type.base base.type.nat) ->
+ defaults.expr (type.base P) ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base P)))
+ (x1 : defaults.expr (type.base base.type.nat)) =>
UnderLets.Base
(#(ident.nat_rect)%expr @
(λ x2 : var (type.base base.type.unit),
UnderLets.to_expr (x ($x2)))%expr @
(λ (x2 : var (type.base base.type.nat))(x3 : var (type.base P)),
UnderLets.to_expr (x0 ($x2) ($x3)))%expr @ x1)%expr_pat
+| @ident.nat_rect_arrow P Q =>
+ fun
+ (x : defaults.expr (type.base P) ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base Q)))
+ (x0 : defaults.expr (type.base base.type.nat) ->
+ (defaults.expr (type.base P) ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base Q))) ->
+ defaults.expr (type.base P) ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base Q)))
+ (x1 : defaults.expr (type.base base.type.nat))
+ (x2 : defaults.expr (type.base P)) =>
+ UnderLets.Base
+ (#(ident.nat_rect_arrow)%expr @
+ (λ x3 : var (type.base P),
+ UnderLets.to_expr (x ($x3)))%expr @
+ (λ (x3 : var (type.base base.type.nat))(x4 : var
+ (type.base P ->
+ type.base Q)%ptype)
+ (x5 : var (type.base P)),
+ UnderLets.to_expr
+ (x0 ($x3)
+ (fun x6 : defaults.expr (type.base P) =>
+ UnderLets.Base ($x4 @ x6)%expr_pat) ($x5)))%expr @ x1 @ x2)%expr_pat
| @ident.list_rect A P =>
fun
- (x : expr (type.base base.type.unit) ->
- UnderLets.UnderLets base.type ident var (expr (type.base P)))
- (x0 : expr (type.base A) ->
- expr (type.base (base.type.list A)) ->
- expr (type.base P) ->
- UnderLets.UnderLets base.type ident var (expr (type.base P)))
- (x1 : expr (type.base (base.type.list A))) =>
+ (x : defaults.expr (type.base base.type.unit) ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base P)))
+ (x0 : defaults.expr (type.base A) ->
+ defaults.expr (type.base (base.type.list A)) ->
+ defaults.expr (type.base P) ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base P)))
+ (x1 : defaults.expr (type.base (base.type.list A))) =>
UnderLets.Base
(#(ident.list_rect)%expr @
(λ x2 : var (type.base base.type.unit),
@@ -97,12 +131,14 @@ match idc in (ident t) return (Compile.value' true t) with
UnderLets.to_expr (x0 ($x2) ($x3) ($x4)))%expr @ x1)%expr_pat
| @ident.list_case A P =>
fun
- (x : expr (type.base base.type.unit) ->
- UnderLets.UnderLets base.type ident var (expr (type.base P)))
- (x0 : expr (type.base A) ->
- expr (type.base (base.type.list A)) ->
- UnderLets.UnderLets base.type ident var (expr (type.base P)))
- (x1 : expr (type.base (base.type.list A))) =>
+ (x : defaults.expr (type.base base.type.unit) ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base P)))
+ (x0 : defaults.expr (type.base A) ->
+ defaults.expr (type.base (base.type.list A)) ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base P)))
+ (x1 : defaults.expr (type.base (base.type.list A))) =>
UnderLets.Base
(#(ident.list_case)%expr @
(λ x2 : var (type.base base.type.unit),
@@ -110,80 +146,95 @@ match idc in (ident t) return (Compile.value' true t) with
(λ (x2 : var (type.base A))(x3 : var (type.base (base.type.list A))),
UnderLets.to_expr (x0 ($x2) ($x3)))%expr @ x1)%expr_pat
| @ident.List_length T =>
- fun x : expr (type.base (base.type.list T)) =>
+ fun x : defaults.expr (type.base (base.type.list T)) =>
UnderLets.Base (#(ident.List_length)%expr @ x)%expr_pat
| ident.List_seq =>
- fun x x0 : expr (type.base base.type.nat) =>
+ fun x x0 : defaults.expr (type.base base.type.nat) =>
UnderLets.Base (#(ident.List_seq)%expr @ x @ x0)%expr_pat
+| @ident.List_firstn A =>
+ fun (x : defaults.expr (type.base base.type.nat))
+ (x0 : defaults.expr (type.base (base.type.list A))) =>
+ UnderLets.Base (#(ident.List_firstn)%expr @ x @ x0)%expr_pat
+| @ident.List_skipn A =>
+ fun (x : defaults.expr (type.base base.type.nat))
+ (x0 : defaults.expr (type.base (base.type.list A))) =>
+ UnderLets.Base (#(ident.List_skipn)%expr @ x @ x0)%expr_pat
| @ident.List_repeat A =>
- fun (x : expr (type.base A)) (x0 : expr (type.base base.type.nat)) =>
+ fun (x : defaults.expr (type.base A))
+ (x0 : defaults.expr (type.base base.type.nat)) =>
UnderLets.Base (#(ident.List_repeat)%expr @ x @ x0)%expr_pat
| @ident.List_combine A B =>
- fun (x : expr (type.base (base.type.list A)))
- (x0 : expr (type.base (base.type.list B))) =>
+ fun (x : defaults.expr (type.base (base.type.list A)))
+ (x0 : defaults.expr (type.base (base.type.list B))) =>
UnderLets.Base (#(ident.List_combine)%expr @ x @ x0)%expr_pat
| @ident.List_map A B =>
fun
- (x : expr (type.base A) ->
- UnderLets.UnderLets base.type ident var (expr (type.base B)))
- (x0 : expr (type.base (base.type.list A))) =>
+ (x : defaults.expr (type.base A) ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base B)))
+ (x0 : defaults.expr (type.base (base.type.list A))) =>
UnderLets.Base
(#(ident.List_map)%expr @
(λ x1 : var (type.base A),
UnderLets.to_expr (x ($x1)))%expr @ x0)%expr_pat
| @ident.List_app A =>
- fun x x0 : expr (type.base (base.type.list A)) =>
+ fun x x0 : defaults.expr (type.base (base.type.list A)) =>
UnderLets.Base (x ++ x0)%expr
| @ident.List_rev A =>
- fun x : expr (type.base (base.type.list A)) =>
+ fun x : defaults.expr (type.base (base.type.list A)) =>
UnderLets.Base (#(ident.List_rev)%expr @ x)%expr_pat
| @ident.List_flat_map A B =>
fun
- (x : expr (type.base A) ->
+ (x : defaults.expr (type.base A) ->
UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.list B))))
- (x0 : expr (type.base (base.type.list A))) =>
+ (defaults.expr (type.base (base.type.list B))))
+ (x0 : defaults.expr (type.base (base.type.list A))) =>
UnderLets.Base
(#(ident.List_flat_map)%expr @
(λ x1 : var (type.base A),
UnderLets.to_expr (x ($x1)))%expr @ x0)%expr_pat
| @ident.List_partition A =>
fun
- (x : expr (type.base A) ->
+ (x : defaults.expr (type.base A) ->
UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.bool)))
- (x0 : expr (type.base (base.type.list A))) =>
+ (defaults.expr (type.base base.type.bool)))
+ (x0 : defaults.expr (type.base (base.type.list A))) =>
UnderLets.Base
(#(ident.List_partition)%expr @
(λ x1 : var (type.base A),
UnderLets.to_expr (x ($x1)))%expr @ x0)%expr_pat
| @ident.List_fold_right A B =>
fun
- (x : expr (type.base B) ->
- expr (type.base A) ->
- UnderLets.UnderLets base.type ident var (expr (type.base A)))
- (x0 : expr (type.base A)) (x1 : expr (type.base (base.type.list B))) =>
+ (x : defaults.expr (type.base B) ->
+ defaults.expr (type.base A) ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base A)))
+ (x0 : defaults.expr (type.base A))
+ (x1 : defaults.expr (type.base (base.type.list B))) =>
UnderLets.Base
(#(ident.List_fold_right)%expr @
(λ (x2 : var (type.base B))(x3 : var (type.base A)),
UnderLets.to_expr (x ($x2) ($x3)))%expr @ x0 @ x1)%expr_pat
| @ident.List_update_nth T =>
- fun (x : expr (type.base base.type.nat))
- (x0 : expr (type.base T) ->
- UnderLets.UnderLets base.type ident var (expr (type.base T)))
- (x1 : expr (type.base (base.type.list T))) =>
+ fun (x : defaults.expr (type.base base.type.nat))
+ (x0 : defaults.expr (type.base T) ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base T)))
+ (x1 : defaults.expr (type.base (base.type.list T))) =>
UnderLets.Base
(#(ident.List_update_nth)%expr @ x @
(λ x2 : var (type.base T),
UnderLets.to_expr (x0 ($x2)))%expr @ x1)%expr_pat
| @ident.List_nth_default T =>
- fun (x : expr (type.base T)) (x0 : expr (type.base (base.type.list T)))
- (x1 : expr (type.base base.type.nat)) =>
+ fun (x : defaults.expr (type.base T))
+ (x0 : defaults.expr (type.base (base.type.list T)))
+ (x1 : defaults.expr (type.base base.type.nat)) =>
UnderLets.Base (#(ident.List_nth_default)%expr @ x @ x0 @ x1)%expr_pat
| ident.Z_add =>
- fun x x0 : expr (type.base base.type.Z) => UnderLets.Base (x + x0)%expr
+ fun x x0 : defaults.expr (type.base base.type.Z) =>
+ UnderLets.Base (x + x0)%expr
| ident.Z_mul =>
- fun x x0 : expr (type.base base.type.Z) =>
+ fun x x0 : defaults.expr (type.base base.type.Z) =>
match x with
| #(idc)%expr_pat =>
match
@@ -200,268 +251,3557 @@ match idc in (ident t) return (Compile.value' true t) with
with
| Some args =>
match x0 with
- | @expr.App _ _ _ s _ #(idc0)%expr_pat x1 =>
+ | @expr.App _ _ _ s _ (@expr.App _ _ _ s0 _ #(idc0)%expr_pat x2)
+ x1 =>
match
match idc0 with
- | ident.Z_land mask => Some mask
+ | ident.Z_land => Some tt
| _ => None
end
with
- | Some args0 =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.Z)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if args0 =? 2 ^ (2 * Z.log2_up args0 / 2) - 1
- then
+ | Some _ =>
+ match x1 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base base.type.Z)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if
+ args1 =?
+ 2 ^ (2 * Z.log2_up args1 / 2) - 1
+ then
+ match
+ invert_low (2 * Z.log2_up args1)
+ args
+ with
+ | Some x3 =>
+ UnderLets.Base
+ (#(ident.fancy_mulll
+ (2 * Z.log2_up args1))%expr @
+ (##(x3)%expr, x' v))%expr_pat
+ | None =>
+ match x2 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t4 v0 =>
+ match
+ t4 as t5
+ return
+ (base.base_interp
+ t5 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit =>
+ None
+ | base.type.Z =>
+ fun v1 : Z =>
+ Some v1
+ | base.type.bool =>
+ fun _ : bool =>
+ None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s as t4
+ return
+ (Compile.value' false
+ t4 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base
+ t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args2 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args2 / 2) -
+ 1
+ then
+ match
+ invert_low
+ (2 *
+ Z.log2_up
+ args2)
+ args
+ with
+ | Some x3 =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args2))%expr @
+ (##
+ (x3)%expr,
+ x'0 v0))%expr_pat
+ | None =>
+ match
+ s as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t5 =>
+ fun
+ v1 :
+ defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a1 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a1
+ with
+ | Some
+ x'1 =>
+ if
+ args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args2 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args2)
+ args
+ with
+ | Some
+ x3 =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args2))%expr @
+ (##
+ (x3)%expr,
+ x'1 v1))%expr_pat
+ | None =>
+ match
+ s0 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ args1 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args1 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args1)
+ args
+ with
+ | Some
+ x3 =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##
+ (x3)%expr,
+ x'2 v2))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 ->
+ d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ end
+ else
+ match
+ s0 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ args1 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args1 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args1)
+ args
+ with
+ | Some
+ x3 =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##
+ (x3)%expr,
+ x'2 v2))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 ->
+ d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 ->
+ d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x1)
+ end
+ else
+ match
+ s as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t5 =>
+ fun
+ v1 :
+ defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a1 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a1
+ with
+ | Some
+ x'1 =>
+ if
+ args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args2 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args2)
+ args
+ with
+ | Some
+ x3 =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args2))%expr @
+ (##
+ (x3)%expr,
+ x'1 v1))%expr_pat
+ | None =>
+ match
+ s0 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ args1 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args1 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args1)
+ args
+ with
+ | Some
+ x3 =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##
+ (x3)%expr,
+ x'2 v2))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 ->
+ d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ end
+ else
+ match
+ s0 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ args1 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args1 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args1)
+ args
+ with
+ | Some
+ x3 =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##
+ (x3)%expr,
+ x'2 v2))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 ->
+ d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x1)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x1)
+ | None =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false
+ t4 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base
+ t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args1 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args1 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args1)
+ args
+ with
+ | Some x3 =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##
+ (x3)%expr,
+ x'0 v0))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
+ end
+ | ($_)%expr =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v1 : defaults.expr
+ (type.base t4)
+ =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args1 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args1 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args1)
+ args
+ with
+ | Some x3 =>
+ UnderLets.Base
+ (#(ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##
+ (x3)%expr,
+ x'0 v1))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value'
+ false s1 ->
+ Compile.value' true
+ d1 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
+ | @expr.Abs _ _ _ _ _ _ =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args1 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args1 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args1)
+ args
+ with
+ | Some x3 =>
+ UnderLets.Base
+ (#(ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##
+ (x3)%expr,
+ x'0 v0))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value'
+ false s2 ->
+ Compile.value' true
+ d2 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
+ | (_ @ _)%expr_pat =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args1 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args1 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args1)
+ args
+ with
+ | Some x4 =>
+ UnderLets.Base
+ (#(ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##
+ (x4)%expr,
+ x'0 v0))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value'
+ false s2 ->
+ Compile.value' true
+ d2 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
+ | @expr.LetIn _ _ _ _ _ _ _ =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args1 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args1 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args1)
+ args
+ with
+ | Some x4 =>
+ UnderLets.Base
+ (#(ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##
+ (x4)%expr,
+ x'0 v0))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value'
+ false s1 ->
+ Compile.value' true
+ d1 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
+ end
+ end
+ else
+ match x2 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t4 v0 =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4)
+ =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args2 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args2 / 2) -
+ 1
+ then
+ match
+ invert_low
+ (2 *
+ Z.log2_up
+ args2)
+ args
+ with
+ | Some x3 =>
+ UnderLets.Base
+ (#(ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args2))%expr @
+ (##
+ (x3)%expr,
+ x'0 v0))%expr_pat
+ | None =>
+ match
+ s as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t5 =>
+ fun
+ v1 :
+ defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a1 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a1
+ with
+ | Some
+ x'1 =>
+ if
+ args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args2 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args2)
+ args
+ with
+ | Some
+ x3 =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args2))%expr @
+ (##
+ (x3)%expr,
+ x'1 v1))%expr_pat
+ | None =>
+ match
+ s0 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ args1 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args1 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args1)
+ args
+ with
+ | Some
+ x3 =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##
+ (x3)%expr,
+ x'2 v2))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 ->
+ d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ end
+ else
+ match
+ s0 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ args1 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args1 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args1)
+ args
+ with
+ | Some
+ x3 =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##
+ (x3)%expr,
+ x'2 v2))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 ->
+ d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x1)
+ end
+ else
+ match
+ s as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t5 =>
+ fun
+ v1 :
+ defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a1 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a1
+ with
+ | Some
+ x'1 =>
+ if
+ args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args2 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args2)
+ args
+ with
+ | Some
+ x3 =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args2))%expr @
+ (##
+ (x3)%expr,
+ x'1 v1))%expr_pat
+ | None =>
+ match
+ s0 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ args1 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args1 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args1)
+ args
+ with
+ | Some
+ x3 =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##
+ (x3)%expr,
+ x'2 v2))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 ->
+ d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ end
+ else
+ match
+ s0 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ args1 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args1 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args1)
+ args
+ with
+ | Some
+ x3 =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##
+ (x3)%expr,
+ x'2 v2))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 ->
+ d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x1)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value'
+ false s1 ->
+ Compile.value' true
+ d1 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x1)
+ | None =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4)
+ =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args1 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args1 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args1)
+ args
+ with
+ | Some x3 =>
+ UnderLets.Base
+ (#(ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##
+ (x3)%expr,
+ x'0 v0))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value'
+ false s1 ->
+ Compile.value' true
+ d1 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
+ end
+ | ($_)%expr =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v1 : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args1 =?
+ 2
+ ^ (2 *
+ Z.log2_up args1 /
+ 2) - 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up args1)
+ args
+ with
+ | Some x3 =>
+ UnderLets.Base
+ (#(ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##(x3)%expr,
+ x'0 v1))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | @expr.Abs _ _ _ _ _ _ =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args1 =?
+ 2
+ ^ (2 *
+ Z.log2_up args1 /
+ 2) - 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up args1)
+ args
+ with
+ | Some x3 =>
+ UnderLets.Base
+ (#(ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##(x3)%expr,
+ x'0 v0))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | (_ @ _)%expr_pat =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args1 =?
+ 2
+ ^ (2 *
+ Z.log2_up args1 /
+ 2) - 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up args1)
+ args
+ with
+ | Some x4 =>
+ UnderLets.Base
+ (#(ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##(x4)%expr,
+ x'0 v0))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | @expr.LetIn _ _ _ _ _ _ _ =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args1 =?
+ 2
+ ^ (2 *
+ Z.log2_up args1 /
+ 2) - 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up args1)
+ args
+ with
+ | Some x4 =>
+ UnderLets.Base
+ (#(ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##(x4)%expr,
+ x'0 v0))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ end
+ | None => UnderLets.Base (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ match x2 with
+ | #(idc2)%expr_pat =>
match
- invert_low (2 * Z.log2_up args0) args
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
with
- | Some x2 =>
- UnderLets.Base
- (#(ident.fancy_mulll
- (2 * Z.log2_up args0))%expr @
- (##(x2)%expr, x' v))%expr_pat
- | None =>
+ | Some args1 =>
match
s as t3
return
(Compile.value' false t3 ->
UnderLets.UnderLets base.type ident
- var (expr (type.base base.type.Z)))
+ var
+ (defaults.expr
+ (type.base base.type.Z)))
with
| type.base t3 =>
- fun v0 : expr (type.base t3) =>
+ fun v : defaults.expr (type.base t3)
+ =>
base.try_make_transport_cps
- (fun t1 : base.type =>
- expr (type.base t1)) t3
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
base.type.Z
(UnderLets.UnderLets base.type
ident var
- (expr (type.base base.type.Z)))
+ (defaults.expr
+ (type.base base.type.Z)))
(fun
- a0 : option
- (expr (type.base t3) ->
- expr
- (type.base base.type.Z))
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z))
=>
- match a0 with
- | Some x'0 =>
+ match a with
+ | Some x' =>
if
- args0 =?
- 2 ^ (2 * Z.log2_up args0 / 2) -
+ args1 =?
+ 2 ^ (2 * Z.log2_up args1 / 2) -
1
then
match
- invert_high
- (2 * Z.log2_up args0)
+ invert_low
+ (2 * Z.log2_up args1)
args
with
- | Some x2 =>
+ | Some x3 =>
UnderLets.Base
- (#(ident.fancy_mulhl
+ (#(ident.fancy_mulll
(2 *
- Z.log2_up args0))%expr @
- (##(x2)%expr, x'0 v0))%expr_pat
+ Z.log2_up args1))%expr @
+ (##(x3)%expr, x' v))%expr_pat
| None =>
- UnderLets.Base
- (x * x0)%expr
+ match
+ s as t4
+ return
+ (Compile.value' false
+ t4 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base
+ t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args1 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args1 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args1)
+ args
+ with
+ | Some x3 =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##
+ (x3)%expr,
+ x'0 v0))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x1)
end
else
- UnderLets.Base (x * x0)%expr
+ match
+ s as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4)
+ =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args1 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args1 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args1)
+ args
+ with
+ | Some x3 =>
+ UnderLets.Base
+ (#(ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##
+ (x3)%expr,
+ x'0 v0))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value'
+ false s1 ->
+ Compile.value' true
+ d1 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x1)
| None =>
UnderLets.Base (x * x0)%expr
end)
- | (s0 -> d0)%ptype =>
+ | (s1 -> d1)%ptype =>
fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
UnderLets.Base (x * x0)%expr
end (Compile.reflect x1)
+ | None => UnderLets.Base (x * x0)%expr
end
- else
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ end
+ | ($_)%expr =>
+ match x2 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t3 v0 =>
+ match
+ t3 as t4
+ return (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v1 : Z => Some v1
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args1 =>
match
s as t3
return
(Compile.value' false t3 ->
UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.Z)))
+ (defaults.expr (type.base base.type.Z)))
with
| type.base t3 =>
- fun v0 : expr (type.base t3) =>
+ fun v0 : defaults.expr (type.base t3) =>
base.try_make_transport_cps
- (fun t1 : base.type =>
- expr (type.base t1)) t3 base.type.Z
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
(UnderLets.UnderLets base.type ident
- var (expr (type.base base.type.Z)))
+ var
+ (defaults.expr
+ (type.base base.type.Z)))
(fun
- a0 : option
- (expr (type.base t3) ->
- expr (type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
+ a : option
+ (defaults.expr (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
if
- args0 =?
- 2 ^ (2 * Z.log2_up args0 / 2) - 1
+ args1 =?
+ 2 ^ (2 * Z.log2_up args1 / 2) - 1
then
match
- invert_high
- (2 * Z.log2_up args0) args
+ invert_low
+ (2 * Z.log2_up args1) args
with
- | Some x2 =>
+ | Some x3 =>
UnderLets.Base
- (#(ident.fancy_mulhl
- (2 * Z.log2_up args0))%expr @
- (##(x2)%expr, x'0 v0))%expr_pat
+ (#(ident.fancy_mulll
+ (2 * Z.log2_up args1))%expr @
+ (##(x3)%expr, x' v0))%expr_pat
+ | None =>
+ match
+ s as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v1 : defaults.expr
+ (type.base t4)
+ =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args1 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args1 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args1)
+ args
+ with
+ | Some x3 =>
+ UnderLets.Base
+ (#(ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##
+ (x3)%expr,
+ x'0 v1))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value'
+ false s1 ->
+ Compile.value' true
+ d1 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x1)
+ end
+ else
+ match
+ s as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v1 : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args1 =?
+ 2
+ ^ (2 *
+ Z.log2_up args1 /
+ 2) - 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up args1)
+ args
+ with
+ | Some x3 =>
+ UnderLets.Base
+ (#(ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##(x3)%expr,
+ x'0 v1))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x1)
+ | None => UnderLets.Base (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x1)
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | @expr.Abs _ _ _ _ _ _ =>
+ match x2 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base base.type.Z)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if
+ args1 =?
+ 2 ^ (2 * Z.log2_up args1 / 2) - 1
+ then
+ match
+ invert_low
+ (2 * Z.log2_up args1) args
+ with
+ | Some x3 =>
+ UnderLets.Base
+ (#(ident.fancy_mulll
+ (2 * Z.log2_up args1))%expr @
+ (##(x3)%expr, x' v))%expr_pat
| None =>
+ match
+ s as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args1 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args1 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args1)
+ args
+ with
+ | Some x3 =>
+ UnderLets.Base
+ (#(ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##
+ (x3)%expr,
+ x'0 v0))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value'
+ false s2 ->
+ Compile.value' true
+ d2 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x1)
+ end
+ else
+ match
+ s as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args1 =?
+ 2
+ ^ (2 *
+ Z.log2_up args1 /
+ 2) - 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up args1)
+ args
+ with
+ | Some x3 =>
+ UnderLets.Base
+ (#(ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##(x3)%expr,
+ x'0 v0))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2
+ =>
UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x1)
+ | None => UnderLets.Base (x * x0)%expr
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2 =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x1)
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | (_ @ _)%expr_pat =>
+ match x2 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base base.type.Z)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if
+ args1 =?
+ 2 ^ (2 * Z.log2_up args1 / 2) - 1
+ then
+ match
+ invert_low
+ (2 * Z.log2_up args1) args
+ with
+ | Some x4 =>
+ UnderLets.Base
+ (#(ident.fancy_mulll
+ (2 * Z.log2_up args1))%expr @
+ (##(x4)%expr, x' v))%expr_pat
+ | None =>
+ match
+ s as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args1 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args1 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args1)
+ args
+ with
+ | Some x4 =>
+ UnderLets.Base
+ (#(ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##
+ (x4)%expr,
+ x'0 v0))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value'
+ false s2 ->
+ Compile.value' true
+ d2 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x1)
end
- else UnderLets.Base (x * x0)%expr
+ else
+ match
+ s as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args1 =?
+ 2
+ ^ (2 *
+ Z.log2_up args1 /
+ 2) - 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up args1)
+ args
+ with
+ | Some x4 =>
+ UnderLets.Base
+ (#(ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##(x4)%expr,
+ x'0 v0))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x1)
| None => UnderLets.Base (x * x0)%expr
end)
- | (s0 -> d0)%ptype =>
+ | (s2 -> d2)%ptype =>
fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2 =>
UnderLets.Base (x * x0)%expr
end (Compile.reflect x1)
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | @expr.LetIn _ _ _ _ _ _ _ =>
+ match x2 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base base.type.Z)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if
+ args1 =?
+ 2 ^ (2 * Z.log2_up args1 / 2) - 1
+ then
+ match
+ invert_low
+ (2 * Z.log2_up args1) args
+ with
+ | Some x4 =>
+ UnderLets.Base
+ (#(ident.fancy_mulll
+ (2 * Z.log2_up args1))%expr @
+ (##(x4)%expr, x' v))%expr_pat
+ | None =>
+ match
+ s as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args1 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args1 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args1)
+ args
+ with
+ | Some x4 =>
+ UnderLets.Base
+ (#(ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##
+ (x4)%expr,
+ x'0 v0))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value'
+ false s1 ->
+ Compile.value' true
+ d1 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x1)
+ end
+ else
+ match
+ s as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args1 =?
+ 2
+ ^ (2 *
+ Z.log2_up args1 /
+ 2) - 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up args1)
+ args
+ with
+ | Some x4 =>
+ UnderLets.Base
+ (#(ident.fancy_mulhl
+ (2 *
+ Z.log2_up
+ args1))%expr @
+ (##(x4)%expr,
+ x'0 v0))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x1)
+ | None => UnderLets.Base (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x1)
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ end
| None =>
match
match idc0 with
- | ident.Z_shiftr offset => Some offset
+ | ident.Z_shiftr => Some tt
| _ => None
end
with
- | Some args0 =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.Z)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- match invert_low (2 * args0) args with
- | Some x2 =>
- UnderLets.Base
- (#(ident.fancy_mullh (2 * args0))%expr @
- (##(x2)%expr, x' v))%expr_pat
- | None =>
- match
- s as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type
- ident var
- (expr (type.base base.type.Z)))
- with
- | type.base t3 =>
- fun v0 : expr (type.base t3) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- expr (type.base t1)) t3
- base.type.Z
- (UnderLets.UnderLets base.type
- ident var
- (expr (type.base base.type.Z)))
- (fun
- a0 : option
- (expr (type.base t3) ->
- expr
- (type.base
- base.type.Z)) =>
- match a0 with
- | Some x'0 =>
- match
- invert_high (2 * args0)
- args
- with
- | Some x2 =>
- UnderLets.Base
- (#(ident.fancy_mulhh
- (2 * args0))%expr @
- (##(x2)%expr,
- x'0 v0))%expr_pat
- | None =>
- UnderLets.Base
- (x * x0)%expr
- end
- | None =>
- UnderLets.Base
- (x * x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
- end
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
+ | Some _ =>
+ match x1 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base base.type.Z)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ match
+ invert_low (2 * args1) args
+ with
+ | Some x3 =>
+ UnderLets.Base
+ (#(ident.fancy_mullh
+ (2 * args1))%expr @
+ (##(x3)%expr, x' v))%expr_pat
+ | None =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ match
+ invert_high
+ (2 * args1)
+ args
+ with
+ | Some x3 =>
+ UnderLets.Base
+ (#(ident.fancy_mulhh
+ (2 *
+ args1))%expr @
+ (##(x3)%expr,
+ x'0 v0))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false
+ s1 ->
+ Compile.value' true
+ d1 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
+ end
+ | None => UnderLets.Base (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
| None => UnderLets.Base (x * x0)%expr
end
end
- | @expr.App _ _ _ s _ ($_)%expr _ | @expr.App _ _ _ s _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _
- (_ @ _)%expr_pat _ | @expr.App _ _ _ s _
- (@expr.LetIn _ _ _ _ _ _ _) _ => UnderLets.Base (x * x0)%expr
+ | @expr.App _ _ _ s _ (@expr.App _ _ _ s0 _ ($_)%expr _) _ |
+ @expr.App _ _ _ s _
+ (@expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _) _ | @expr.App
+ _ _ _ s _ (@expr.App _ _ _ s0 _ (_ @ _)%expr_pat _) _ |
+ @expr.App _ _ _ s _
+ (@expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _) _ =>
+ UnderLets.Base (x * x0)%expr
+ | @expr.App _ _ _ s _ #(_)%expr_pat _ | @expr.App _ _ _ s _
+ ($_)%expr _ | @expr.App _ _ _ s _ (@expr.Abs _ _ _ _ _ _) _ |
+ @expr.App _ _ _ s _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
+ UnderLets.Base (x * x0)%expr
| _ => UnderLets.Base (x * x0)%expr
end
| None => UnderLets.Base (x * x0)%expr
end
- | @expr.App _ _ _ s _ #(idc)%expr_pat x1 =>
- match
- match idc with
- | ident.Z_land mask => Some mask
- | _ => None
- end
- with
- | Some args =>
- match x0 with
+ | @expr.App _ _ _ s _ (@expr.App _ _ _ s0 _ #(idc)%expr_pat x2) x1 =>
+ match match idc with
+ | ident.Z_land => Some tt
+ | _ => None
+ end with
+ | Some _ =>
+ match x2 with
| #(idc0)%expr_pat =>
match
match idc0 with
@@ -478,322 +3818,11179 @@ match idc in (ident t) return (Compile.value' true t) with
end
with
| Some args0 =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.Z)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if args =? 2 ^ (2 * Z.log2_up args / 2) - 1
- then
+ match x0 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base base.type.Z)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if
+ args0 =?
+ 2 ^ (2 * Z.log2_up args0 / 2) - 1
+ then
+ match
+ invert_low (2 * Z.log2_up args0)
+ args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#(ident.fancy_mulll
+ (2 * Z.log2_up args0))%expr @
+ (x' v, ##(y)%expr))%expr_pat
+ | None =>
+ match x1 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t4 v0 =>
+ match
+ t4 as t5
+ return
+ (base.base_interp
+ t5 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit =>
+ None
+ | base.type.Z =>
+ fun v1 : Z =>
+ Some v1
+ | base.type.bool =>
+ fun _ : bool =>
+ None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false
+ t4 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base
+ t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args2 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args2 / 2) -
+ 1
+ then
+ match
+ invert_low
+ (2 *
+ Z.log2_up
+ args2)
+ args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args2))%expr @
+ (
+ x'0 v0,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ match
+ s as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t5 =>
+ fun
+ v1 :
+ defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a1 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a1
+ with
+ | Some
+ x'1 =>
+ if
+ args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args0)
+ args1
+ with
+ | Some
+ y =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x'1 v1,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ match
+ s0 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args2 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args2)
+ args1
+ with
+ | Some
+ y =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args2))%expr @
+ (
+ x'2 v2,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 ->
+ d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ end
+ else
+ match
+ s0 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args2 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args2)
+ args1
+ with
+ | Some
+ y =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args2))%expr @
+ (
+ x'2 v2,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 ->
+ d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 ->
+ d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x1)
+ end
+ else
+ match
+ s as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t5 =>
+ fun
+ v1 :
+ defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a1 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a1
+ with
+ | Some
+ x'1 =>
+ if
+ args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args0)
+ args1
+ with
+ | Some
+ y =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x'1 v1,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ match
+ s0 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args2 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args2)
+ args1
+ with
+ | Some
+ y =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args2))%expr @
+ (
+ x'2 v2,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 ->
+ d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ end
+ else
+ match
+ s0 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args2 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args2)
+ args1
+ with
+ | Some
+ y =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args2))%expr @
+ (
+ x'2 v2,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 ->
+ d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x1)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ match
+ s as t4
+ return
+ (Compile.value' false
+ t4 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base
+ t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args0)
+ args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x'0 v0,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x1)
+ end
+ | ($_)%expr =>
+ match
+ s as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v1 : defaults.expr
+ (type.base t4)
+ =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args0)
+ args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#(ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (x'0 v1,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value'
+ false s1 ->
+ Compile.value' true
+ d1 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x1)
+ | @expr.LetIn _ _ _ _ _ _ _ =>
+ match
+ s as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args0)
+ args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#(ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (x'0 v0,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value'
+ false s1 ->
+ Compile.value' true
+ d1 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x1)
+ | _ =>
+ match
+ s as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args0)
+ args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#(ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (x'0 v0,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value'
+ false s2 ->
+ Compile.value' true
+ d2 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x1)
+ end
+ end
+ else
+ match x1 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t4 v0 =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4)
+ =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args2 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args2 / 2) -
+ 1
+ then
+ match
+ invert_low
+ (2 *
+ Z.log2_up
+ args2)
+ args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#(ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args2))%expr @
+ (x'0 v0,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ match
+ s as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t5 =>
+ fun
+ v1 :
+ defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a1 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a1
+ with
+ | Some
+ x'1 =>
+ if
+ args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args0)
+ args1
+ with
+ | Some
+ y =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x'1 v1,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ match
+ s0 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args2 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args2)
+ args1
+ with
+ | Some
+ y =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args2))%expr @
+ (
+ x'2 v2,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 ->
+ d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ end
+ else
+ match
+ s0 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args2 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args2)
+ args1
+ with
+ | Some
+ y =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args2))%expr @
+ (
+ x'2 v2,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 ->
+ d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x1)
+ end
+ else
+ match
+ s as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t5 =>
+ fun
+ v1 :
+ defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a1 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a1
+ with
+ | Some
+ x'1 =>
+ if
+ args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args0)
+ args1
+ with
+ | Some
+ y =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x'1 v1,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ match
+ s0 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args2 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args2)
+ args1
+ with
+ | Some
+ y =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args2))%expr @
+ (
+ x'2 v2,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 ->
+ d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ end
+ else
+ match
+ s0 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args2 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args2)
+ args1
+ with
+ | Some
+ y =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args2))%expr @
+ (
+ x'2 v2,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 ->
+ d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x1)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value'
+ false s1 ->
+ Compile.value' true
+ d1 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ match
+ s as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4)
+ =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args0)
+ args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#(ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (x'0 v0,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value'
+ false s1 ->
+ Compile.value' true
+ d1 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x1)
+ end
+ | ($_)%expr =>
+ match
+ s as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v1 : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up args0 /
+ 2) - 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up args0)
+ args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#(ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (x'0 v1,
+ ##(y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x1)
+ | @expr.LetIn _ _ _ _ _ _ _ =>
+ match
+ s as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up args0 /
+ 2) - 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up args0)
+ args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#(ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (x'0 v0,
+ ##(y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x1)
+ | _ =>
+ match
+ s as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up args0 /
+ 2) - 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up args0)
+ args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#(ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (x'0 v0,
+ ##(y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x1)
+ end
+ | None => UnderLets.Base (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x1)
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ | @expr.App _ _ _ s1 _
+ (@expr.App _ _ _ s2 _ #(idc1)%expr_pat x4) x3 =>
+ match
+ match idc1 with
+ | ident.Z_land => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc2)%expr_pat =>
match
- invert_low (2 * Z.log2_up args) args0
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
with
- | Some y =>
- UnderLets.Base
- (#(ident.fancy_mulll
- (2 * Z.log2_up args))%expr @
- (x' v, ##(y)%expr))%expr_pat
- | None =>
+ | Some args2 =>
match
s as t3
return
(Compile.value' false t3 ->
UnderLets.UnderLets base.type ident
- var (expr (type.base base.type.Z)))
+ var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun v : defaults.expr (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s1 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ (args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#(ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (x' v, x'0 v0))%expr_pat
+ else
+ match x1 with
+ | #(idc3)%expr_pat =>
+ match
+ match
+ idc3
+ with
+ | @ident.Literal
+ t6 v1 =>
+ match
+ t6 as t7
+ return
+ (base.base_interp
+ t7 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v2 : Z =>
+ Some v2
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v1
+ | _ => None
+ end
+ with
+ | Some
+ args3 =>
+ match
+ s0 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v1 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a1 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a1
+ with
+ | Some
+ x'1 =>
+ match
+ s1 as t7
+ return
+ (Compile.value'
+ false t7 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t7 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t7) =>
+ base.try_make_transport_cps
+ (fun
+ t8 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t8)) t7
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t7) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ (args3 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args3 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args3 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args3))%expr @
+ (
+ x'1 v1,
+ x'2 v2))%expr_pat
+ else
+ match
+ x3
+ with
+ | #
+ (idc4)%expr_pat =>
+ match
+ match
+ idc4
+ with
+ | @ident.Literal
+ t9 v3 =>
+ match
+ t9 as t10
+ return
+ (base.base_interp
+ t10 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v4 : Z =>
+ Some v4
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v3
+ | _ =>
+ None
+ end
+ with
+ | Some
+ args4 =>
+ match
+ s as t9
+ return
+ (Compile.value'
+ false t9 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t9 =>
+ fun
+ v3 :
+ defaults.expr
+ (type.base
+ t9) =>
+ base.try_make_transport_cps
+ (fun
+ t10 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t10)) t9
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a3 :
+ option
+ (defaults.expr
+ (type.base
+ t9) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a3
+ with
+ | Some
+ x'3 =>
+ match
+ s2 as t10
+ return
+ (Compile.value'
+ false t10 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t10 =>
+ fun
+ v4 :
+ defaults.expr
+ (type.base
+ t10) =>
+ base.try_make_transport_cps
+ (fun
+ t11 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t11)) t10
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a4 :
+ option
+ (defaults.expr
+ (type.base
+ t10) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a4
+ with
+ | Some
+ x'4 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args4 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x'3 v3,
+ x'4 v4))%expr_pat
+ else
+ match
+ s0 as t11
+ return
+ (Compile.value'
+ false t11 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t11 =>
+ fun
+ v5 :
+ defaults.expr
+ (type.base
+ t11) =>
+ base.try_make_transport_cps
+ (fun
+ t12 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t12)) t11
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a5 :
+ option
+ (defaults.expr
+ (type.base
+ t11) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a5
+ with
+ | Some
+ x'5 =>
+ match
+ s2 as t12
+ return
+ (Compile.value'
+ false t12 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t12 =>
+ fun
+ v6 :
+ defaults.expr
+ (type.base
+ t12) =>
+ base.try_make_transport_cps
+ (fun
+ t13 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t13)) t12
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a6 :
+ option
+ (defaults.expr
+ (type.base
+ t12) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a6
+ with
+ | Some
+ x'6 =>
+ if
+ (args3 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args3 / 2) -
+ 1) &&
+ (args4 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args3 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args3))%expr @
+ (
+ x'5 v5,
+ x'6 v6))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x1)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | _ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x3)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ | None =>
+ match
+ x3
+ with
+ | #
+ (idc4)%expr_pat =>
+ match
+ match
+ idc4
+ with
+ | @ident.Literal
+ t7 v1 =>
+ match
+ t7 as t8
+ return
+ (base.base_interp
+ t8 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v2 : Z =>
+ Some v2
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v1
+ | _ =>
+ None
+ end
+ with
+ | Some
+ args3 =>
+ match
+ s as t7
+ return
+ (Compile.value'
+ false t7 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t7 =>
+ fun
+ v1 :
+ defaults.expr
+ (type.base
+ t7) =>
+ base.try_make_transport_cps
+ (fun
+ t8 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t8)) t7
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a1 :
+ option
+ (defaults.expr
+ (type.base
+ t7) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a1
+ with
+ | Some
+ x'1 =>
+ match
+ s2 as t8
+ return
+ (Compile.value'
+ false t8 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t8 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t8) =>
+ base.try_make_transport_cps
+ (fun
+ t9 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t9)) t8
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t8) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args3 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x'1 v1,
+ x'2 v2))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x1)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | _ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ end
+ | ($_)%expr =>
+ match x3 with
+ | #(idc3)%expr_pat =>
+ match
+ match
+ idc3
+ with
+ | @ident.Literal
+ t7 v2 =>
+ match
+ t7 as t8
+ return
+ (base.base_interp
+ t8 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v3 : Z =>
+ Some v3
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v2
+ | _ =>
+ None
+ end
+ with
+ | Some
+ args3 =>
+ match
+ s as t7
+ return
+ (Compile.value'
+ false t7 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t7 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t7) =>
+ base.try_make_transport_cps
+ (fun
+ t8 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t8)) t7
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a1 :
+ option
+ (defaults.expr
+ (type.base
+ t7) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a1
+ with
+ | Some
+ x'1 =>
+ match
+ s2 as t8
+ return
+ (Compile.value'
+ false t8 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t8 =>
+ fun
+ v3 :
+ defaults.expr
+ (type.base
+ t8) =>
+ base.try_make_transport_cps
+ (fun
+ t9 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t9)) t8
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t8) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args3 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x'1 v2,
+ x'2 v3))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x1)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | _ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | @expr.LetIn _ _
+ _ _ _ _ _ =>
+ match x3 with
+ | #(idc3)%expr_pat =>
+ match
+ match
+ idc3
+ with
+ | @ident.Literal
+ t6 v1 =>
+ match
+ t6 as t7
+ return
+ (base.base_interp
+ t7 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v2 : Z =>
+ Some v2
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v1
+ | _ =>
+ None
+ end
+ with
+ | Some
+ args3 =>
+ match
+ s as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v1 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a1 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a1
+ with
+ | Some
+ x'1 =>
+ match
+ s2 as t7
+ return
+ (Compile.value'
+ false t7 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t7 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t7) =>
+ base.try_make_transport_cps
+ (fun
+ t8 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t8)) t7
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t7) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args3 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x'1 v1,
+ x'2 v2))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x1)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | _ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | _ =>
+ match x3 with
+ | #(idc3)%expr_pat =>
+ match
+ match
+ idc3
+ with
+ | @ident.Literal
+ t6 v1 =>
+ match
+ t6 as t7
+ return
+ (base.base_interp
+ t7 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v2 : Z =>
+ Some v2
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v1
+ | _ =>
+ None
+ end
+ with
+ | Some
+ args3 =>
+ match
+ s as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v1 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a1 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a1
+ with
+ | Some
+ x'1 =>
+ match
+ s2 as t7
+ return
+ (Compile.value'
+ false t7 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t7 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t7) =>
+ base.try_make_transport_cps
+ (fun
+ t8 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t8)) t7
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t7) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args3 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x'1 v1,
+ x'2 v2))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 ->
+ d4)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s4 ->
+ Compile.value'
+ true d4
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 ->
+ d4)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s4 ->
+ Compile.value'
+ true d4
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x1)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | _ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ end
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false
+ s3 ->
+ Compile.value' true
+ d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x3)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x1)
+ | None =>
+ match x3 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal t4 v =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t5 =>
+ fun
+ v0 : defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base t6))
+ t5 base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x' v,
+ x'0 v0))%expr_pat
+ else
+ match
+ x1
+ with
+ | #
+ (idc4)%expr_pat =>
+ match
+ match
+ idc4
+ with
+ | @ident.Literal
+ t7 v1 =>
+ match
+ t7 as t8
+ return
+ (base.base_interp
+ t8 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v2 : Z =>
+ Some v2
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v1
+ | _ =>
+ None
+ end
+ with
+ | Some
+ args3 =>
+ match
+ s0 as t7
+ return
+ (Compile.value'
+ false t7 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t7 =>
+ fun
+ v1 :
+ defaults.expr
+ (type.base
+ t7) =>
+ base.try_make_transport_cps
+ (fun
+ t8 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t8)) t7
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a1 :
+ option
+ (defaults.expr
+ (type.base
+ t7) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a1
+ with
+ | Some
+ x'1 =>
+ match
+ s2 as t8
+ return
+ (Compile.value'
+ false t8 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t8 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t8) =>
+ base.try_make_transport_cps
+ (fun
+ t9 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t9)) t8
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t8) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ (args3 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args3 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args3 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args3))%expr @
+ (
+ x'1 v1,
+ x'2 v2))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | _ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x1)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ end
+ | ($_)%expr =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t4 v0 =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z)) =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t5
+ return
+ (Compile.value' false
+ t5 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t5 =>
+ fun
+ v1 : defaults.expr
+ (type.base t5)
+ =>
+ base.try_make_transport_cps
+ (fun t6 : base.type
+ =>
+ defaults.expr
+ (type.base t6))
+ t5 base.type.Z
+ (UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ (args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#(ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (x' v0,
+ x'0 v1))%expr_pat
+ else
+ match x1 with
+ | #(idc3)%expr_pat =>
+ match
+ match
+ idc3
+ with
+ | @ident.Literal
+ t7 v2 =>
+ match
+ t7 as t8
+ return
+ (base.base_interp
+ t8 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v3 : Z =>
+ Some v3
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v2
+ | _ =>
+ None
+ end
+ with
+ | Some
+ args3 =>
+ match
+ s0 as t7
+ return
+ (Compile.value'
+ false t7 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t7 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t7) =>
+ base.try_make_transport_cps
+ (fun
+ t8 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t8)) t7
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a1 :
+ option
+ (defaults.expr
+ (type.base
+ t7) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a1
+ with
+ | Some
+ x'1 =>
+ match
+ s2 as t8
+ return
+ (Compile.value'
+ false t8 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t8 =>
+ fun
+ v3 :
+ defaults.expr
+ (type.base
+ t8) =>
+ base.try_make_transport_cps
+ (fun
+ t9 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t9)) t8
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t8) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ (args3 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args3 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args3 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args3))%expr @
+ (
+ x'1 v2,
+ x'2 v3))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | _ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x1)
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | @expr.LetIn _ _ _ _ _ _ _ =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4))
+ t3 base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z)) =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t4
+ return
+ (Compile.value' false
+ t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4)
+ =>
+ base.try_make_transport_cps
+ (fun t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ (args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#(ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (x' v,
+ x'0 v0))%expr_pat
+ else
+ match x1 with
+ | #(idc3)%expr_pat =>
+ match
+ match
+ idc3
+ with
+ | @ident.Literal
+ t6 v1 =>
+ match
+ t6 as t7
+ return
+ (base.base_interp
+ t7 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v2 : Z =>
+ Some v2
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v1
+ | _ =>
+ None
+ end
+ with
+ | Some
+ args3 =>
+ match
+ s0 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v1 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a1 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a1
+ with
+ | Some
+ x'1 =>
+ match
+ s2 as t7
+ return
+ (Compile.value'
+ false t7 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t7 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t7) =>
+ base.try_make_transport_cps
+ (fun
+ t8 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t8)) t7
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t7) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ (args3 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args3 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args3 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args3))%expr @
+ (
+ x'1 v1,
+ x'2 v2))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | _ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x1)
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | _ =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4))
+ t3 base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z)) =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t4
+ return
+ (Compile.value' false
+ t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4)
+ =>
+ base.try_make_transport_cps
+ (fun t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ (args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#(ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (x' v,
+ x'0 v0))%expr_pat
+ else
+ match x1 with
+ | #(idc3)%expr_pat =>
+ match
+ match
+ idc3
+ with
+ | @ident.Literal
+ t6 v1 =>
+ match
+ t6 as t7
+ return
+ (base.base_interp
+ t7 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v2 : Z =>
+ Some v2
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v1
+ | _ =>
+ None
+ end
+ with
+ | Some
+ args3 =>
+ match
+ s0 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v1 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a1 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a1
+ with
+ | Some
+ x'1 =>
+ match
+ s2 as t7
+ return
+ (Compile.value'
+ false t7 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t7 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t7) =>
+ base.try_make_transport_cps
+ (fun
+ t8 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t8)) t7
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t7) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ (args3 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args3 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args3 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args3))%expr @
+ (
+ x'1 v1,
+ x'2 v2))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 ->
+ d4)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s4 ->
+ Compile.value'
+ true d4
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 ->
+ d4)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s4 ->
+ Compile.value'
+ true d4
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | _ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value'
+ false s4 ->
+ Compile.value'
+ true d4 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4 =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x1)
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ end
+ | None =>
+ match
+ match idc1 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4))
+ t3 base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z)) =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t4
+ return
+ (Compile.value' false
+ t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4)
+ =>
+ base.try_make_transport_cps
+ (fun t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args0 =?
+ 2
+ ^ (2 * args2 /
+ 2) - 1
+ then
+ UnderLets.Base
+ (#(ident.fancy_mullh
+ (2 *
+ args2))%expr @
+ (x' v,
+ x'0 v0))%expr_pat
+ else
+ match x1 with
+ | #(idc3)%expr_pat =>
+ match
+ match
+ idc3
+ with
+ | @ident.Literal
+ t6 v1 =>
+ match
+ t6 as t7
+ return
+ (base.base_interp
+ t7 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v2 : Z =>
+ Some v2
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v1
+ | _ =>
+ None
+ end
+ with
+ | Some
+ args3 =>
+ match
+ s0 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v1 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a1 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a1
+ with
+ | Some
+ x'1 =>
+ match
+ s2 as t7
+ return
+ (Compile.value'
+ false t7 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t7 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t7) =>
+ base.try_make_transport_cps
+ (fun
+ t8 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t8)) t7
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t7) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ args3 =?
+ 2
+ ^
+ (2 *
+ args2 / 2) -
+ 1
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mullh
+ (2 *
+ args2))%expr @
+ (
+ x'1 v1,
+ x'2 v2))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | _ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x1)
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ end
+ | @expr.App _ _ _ s1 _ (@expr.App _ _ _ s2 _ ($_)%expr _)
+ _ | @expr.App _ _ _ s1 _
+ (@expr.App _ _ _ s2 _ (@expr.Abs _ _ _ _ _ _) _) _ |
+ @expr.App _ _ _ s1 _
+ (@expr.App _ _ _ s2 _ (_ @ _)%expr_pat _) _ | @expr.App
+ _ _ _ s1 _
+ (@expr.App _ _ _ s2 _ (@expr.LetIn _ _ _ _ _ _ _) _)
+ _ => UnderLets.Base (x * x0)%expr
+ | @expr.App _ _ _ s1 _ #(_)%expr_pat _ | @expr.App _ _ _
+ s1 _ ($_)%expr _ | @expr.App _ _ _ s1 _
+ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s1 _
+ (@expr.LetIn _ _ _ _ _ _ _) _ =>
+ UnderLets.Base (x * x0)%expr
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | None =>
+ match x1 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args0 =>
+ match x0 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base base.type.Z)))
with
| type.base t3 =>
- fun v0 : expr (type.base t3) =>
+ fun v : defaults.expr (type.base t3)
+ =>
base.try_make_transport_cps
- (fun t1 : base.type =>
- expr (type.base t1)) t3
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
base.type.Z
(UnderLets.UnderLets base.type
ident var
- (expr (type.base base.type.Z)))
+ (defaults.expr
+ (type.base base.type.Z)))
(fun
- a0 : option
- (expr (type.base t3) ->
- expr
- (type.base base.type.Z))
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z))
=>
- match a0 with
- | Some x'0 =>
+ match a with
+ | Some x' =>
if
- args =?
- 2 ^ (2 * Z.log2_up args / 2) -
+ args0 =?
+ 2 ^ (2 * Z.log2_up args0 / 2) -
1
then
match
- invert_high
- (2 * Z.log2_up args)
- args0
+ invert_low
+ (2 * Z.log2_up args0)
+ args1
with
| Some y =>
UnderLets.Base
- (#(ident.fancy_mullh
+ (#(ident.fancy_mulll
(2 *
- Z.log2_up args))%expr @
- (x'0 v0, ##(y)%expr))%expr_pat
+ Z.log2_up args0))%expr @
+ (x' v, ##(y)%expr))%expr_pat
| None =>
- UnderLets.Base
- (x * x0)%expr
+ match
+ s0 as t4
+ return
+ (Compile.value' false
+ t4 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base
+ t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args0)
+ args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#
+ (ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x'0 v0,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value'
+ false s1 ->
+ Compile.value'
+ true d1 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
end
else
- UnderLets.Base (x * x0)%expr
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4)
+ =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args0)
+ args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#(ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (x'0 v0,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value'
+ false s1 ->
+ Compile.value' true
+ d1 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
| None =>
UnderLets.Base (x * x0)%expr
end)
- | (s0 -> d0)%ptype =>
+ | (s1 -> d1)%ptype =>
fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
+ end (Compile.reflect x2)
+ | None => UnderLets.Base (x * x0)%expr
end
- else
+ | @expr.App _ _ _ s1 _
+ (@expr.App _ _ _ s2 _ #(idc2)%expr_pat x4)
+ x3 =>
match
- s as t3
+ match idc2 with
+ | ident.Z_land => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal t4 v =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s1 as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t5 =>
+ fun
+ v0 : defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base t6))
+ t5 base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x' v,
+ x'0 v0))%expr_pat
+ else
+ match
+ x3
+ with
+ | #
+ (idc4)%expr_pat =>
+ match
+ match
+ idc4
+ with
+ | @ident.Literal
+ t7 v1 =>
+ match
+ t7 as t8
+ return
+ (base.base_interp
+ t8 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v2 : Z =>
+ Some v2
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v1
+ | _ =>
+ None
+ end
+ with
+ | Some
+ args3 =>
+ match
+ s0 as t7
+ return
+ (Compile.value'
+ false t7 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t7 =>
+ fun
+ v1 :
+ defaults.expr
+ (type.base
+ t7) =>
+ base.try_make_transport_cps
+ (fun
+ t8 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t8)) t7
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a1 :
+ option
+ (defaults.expr
+ (type.base
+ t7) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a1
+ with
+ | Some
+ x'1 =>
+ match
+ s2 as t8
+ return
+ (Compile.value'
+ false t8 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t8 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t8) =>
+ base.try_make_transport_cps
+ (fun
+ t9 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t9)) t8
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t8) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args3 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x'1 v1,
+ x'2 v2))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | _ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect x3)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ match x3 with
+ | #(idc4)%expr_pat =>
+ match
+ match idc4 with
+ | @ident.Literal t5 v =>
+ match
+ t5 as t6
+ return
+ (base.base_interp
+ t6 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit =>
+ None
+ | base.type.Z =>
+ fun v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun _ : bool =>
+ None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t5
+ return
+ (Compile.value' false
+ t5 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t5 =>
+ fun
+ v : defaults.expr
+ (type.base t5)
+ =>
+ base.try_make_transport_cps
+ (fun t6 : base.type
+ =>
+ defaults.expr
+ (type.base t6))
+ t5 base.type.Z
+ (UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v0 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a0
+ with
+ | Some
+ x'0 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x' v,
+ x'0 v0))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | _ =>
+ UnderLets.Base (x * x0)%expr
+ end
+ end
+ | ($_)%expr =>
+ match x3 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal t5 v0 =>
+ match
+ t5 as t6
+ return
+ (base.base_interp t6 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t5
+ return
+ (Compile.value' false t5 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t5 =>
+ fun
+ v0 : defaults.expr
+ (type.base t5)
+ =>
+ base.try_make_transport_cps
+ (fun t6 : base.type =>
+ defaults.expr
+ (type.base t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t6 =>
+ fun
+ v1 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a0
+ with
+ | Some
+ x'0 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x' v0,
+ x'0 v1))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value' true
+ d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | @expr.LetIn _ _ _ _ _ _ _ =>
+ match x3 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal t4 v =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t5 =>
+ fun
+ v0 :
+ defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a0
+ with
+ | Some
+ x'0 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x' v,
+ x'0 v0))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value' true
+ d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | _ =>
+ match x3 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal t4 v =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t5 =>
+ fun
+ v0 :
+ defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a0
+ with
+ | Some
+ x'0 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x' v,
+ x'0 v0))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s4 ->
+ Compile.value'
+ true d4
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value'
+ false s4 ->
+ Compile.value' true
+ d4 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ end
+ | None =>
+ match
+ match idc2 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x3 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal t4 v =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t5 =>
+ fun
+ v0 :
+ defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a0
+ with
+ | Some
+ x'0 =>
+ if
+ args0 =?
+ 2
+ ^
+ (2 *
+ args2 / 2) -
+ 1
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mullh
+ (2 *
+ args2))%expr @
+ (
+ x' v,
+ x'0 v0))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value' true
+ d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ end
+ | @expr.App _ _ _ s1 _
+ (@expr.App _ _ _ s2 _ ($_)%expr _) _ |
+ @expr.App _ _ _ s1 _
+ (@expr.App _ _ _ s2 _ (@expr.Abs _ _ _ _ _ _)
+ _) _ | @expr.App _ _ _ s1 _
+ (@expr.App _ _ _ s2 _ (_ @ _)%expr_pat _) _ |
+ @expr.App _ _ _ s1 _
+ (@expr.App _ _ _ s2 _
+ (@expr.LetIn _ _ _ _ _ _ _) _) _ =>
+ UnderLets.Base (x * x0)%expr
+ | @expr.App _ _ _ s1 _ #(_)%expr_pat _ |
+ @expr.App _ _ _ s1 _ ($_)%expr _ | @expr.App _
+ _ _ s1 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App
+ _ _ _ s1 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
+ UnderLets.Base (x * x0)%expr
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ end
+ | ($_)%expr =>
+ match x1 with
+ | #(idc0)%expr_pat =>
+ match
+ match idc0 with
+ | @ident.Literal t2 v0 =>
+ match
+ t2 as t3 return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v1 : Z => Some v1
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args0 =>
+ match x0 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t3 v0 =>
+ match
+ t3 as t4
+ return (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v1 : Z => Some v1
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t3
return
(Compile.value' false t3 ->
UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.Z)))
+ (defaults.expr (type.base base.type.Z)))
with
| type.base t3 =>
- fun v0 : expr (type.base t3) =>
+ fun v0 : defaults.expr (type.base t3) =>
base.try_make_transport_cps
- (fun t1 : base.type =>
- expr (type.base t1)) t3 base.type.Z
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
(UnderLets.UnderLets base.type ident
- var (expr (type.base base.type.Z)))
+ var
+ (defaults.expr
+ (type.base base.type.Z)))
(fun
- a0 : option
- (expr (type.base t3) ->
- expr (type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
+ a : option
+ (defaults.expr (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
if
- args =?
- 2 ^ (2 * Z.log2_up args / 2) - 1
+ args0 =?
+ 2 ^ (2 * Z.log2_up args0 / 2) - 1
then
match
- invert_high
- (2 * Z.log2_up args) args0
+ invert_low
+ (2 * Z.log2_up args0) args1
with
| Some y =>
UnderLets.Base
- (#(ident.fancy_mullh
- (2 * Z.log2_up args))%expr @
- (x'0 v0, ##(y)%expr))%expr_pat
+ (#(ident.fancy_mulll
+ (2 * Z.log2_up args0))%expr @
+ (x' v0, ##(y)%expr))%expr_pat
| None =>
- UnderLets.Base (x * x0)%expr
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v1 : defaults.expr
+ (type.base t4)
+ =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args0)
+ args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#(ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (x'0 v1,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value'
+ false s1 ->
+ Compile.value' true
+ d1 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
end
- else UnderLets.Base (x * x0)%expr
+ else
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v1 : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up args0 /
+ 2) - 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up args0)
+ args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#(ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (x'0 v1,
+ ##(y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
| None => UnderLets.Base (x * x0)%expr
end)
- | (s0 -> d0)%ptype =>
+ | (s1 -> d1)%ptype =>
fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ | @expr.App _ _ _ s1 _
+ (@expr.App _ _ _ s2 _ #(idc1)%expr_pat x4) x3 =>
+ match
+ match idc1 with
+ | ident.Z_land => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t4 v0 =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z)) =>
+ match a with
+ | Some x' =>
+ match
+ s1 as t5
+ return
+ (Compile.value' false
+ t5 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t5 =>
+ fun
+ v1 : defaults.expr
+ (type.base t5)
+ =>
+ base.try_make_transport_cps
+ (fun t6 : base.type
+ =>
+ defaults.expr
+ (type.base t6))
+ t5 base.type.Z
+ (UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ (args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#(ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (x' v0,
+ x'0 v1))%expr_pat
+ else
+ match x3 with
+ | #(idc3)%expr_pat =>
+ match
+ match
+ idc3
+ with
+ | @ident.Literal
+ t7 v2 =>
+ match
+ t7 as t8
+ return
+ (base.base_interp
+ t8 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v3 : Z =>
+ Some v3
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v2
+ | _ =>
+ None
+ end
+ with
+ | Some
+ args3 =>
+ match
+ s0 as t7
+ return
+ (Compile.value'
+ false t7 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t7 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t7) =>
+ base.try_make_transport_cps
+ (fun
+ t8 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t8)) t7
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a1 :
+ option
+ (defaults.expr
+ (type.base
+ t7) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a1
+ with
+ | Some
+ x'1 =>
+ match
+ s2 as t8
+ return
+ (Compile.value'
+ false t8 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t8 =>
+ fun
+ v3 :
+ defaults.expr
+ (type.base
+ t8) =>
+ base.try_make_transport_cps
+ (fun
+ t9 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t9)) t8
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t8) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args3 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x'1 v2,
+ x'2 v3))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | _ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x3)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ match x3 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal t5 v0 =>
+ match
+ t5 as t6
+ return
+ (base.base_interp t6 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t5
+ return
+ (Compile.value' false t5 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t5 =>
+ fun
+ v0 : defaults.expr
+ (type.base t5)
+ =>
+ base.try_make_transport_cps
+ (fun t6 : base.type =>
+ defaults.expr
+ (type.base t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t6 =>
+ fun
+ v1 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a0
+ with
+ | Some
+ x'0 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x' v0,
+ x'0 v1))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value' true
+ d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ end
+ | ($_)%expr =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t5 v1 =>
+ match
+ t5 as t6
+ return
+ (base.base_interp t6 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v2 : Z => Some v2
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v1
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t5
+ return
+ (Compile.value' false t5 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t5 =>
+ fun
+ v1 : defaults.expr
+ (type.base t5) =>
+ base.try_make_transport_cps
+ (fun t6 : base.type =>
+ defaults.expr
+ (type.base t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t6 =>
+ fun
+ v2 : defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base t7))
+ t6 base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x' v1,
+ x'0 v2))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | @expr.LetIn _ _ _ _ _ _ _ =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t4 v0 =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t5 =>
+ fun
+ v1 : defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base t6))
+ t5 base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x' v0,
+ x'0 v1))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | _ =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t4 v0 =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t5 =>
+ fun
+ v1 : defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base t6))
+ t5 base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x' v0,
+ x'0 v1))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value'
+ false s4 ->
+ Compile.value'
+ true d4 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ end
+ | None =>
+ match
+ match idc1 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t4 v0 =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t5 =>
+ fun
+ v1 : defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base t6))
+ t5 base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args0 =?
+ 2
+ ^
+ (2 * args2 /
+ 2) - 1
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mullh
+ (2 *
+ args2))%expr @
+ (
+ x' v0,
+ x'0 v1))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ end
+ | @expr.App _ _ _ s1 _
+ (@expr.App _ _ _ s2 _ ($_)%expr _) _ | @expr.App _
+ _ _ s1 _
+ (@expr.App _ _ _ s2 _ (@expr.Abs _ _ _ _ _ _) _)
+ _ | @expr.App _ _ _ s1 _
+ (@expr.App _ _ _ s2 _ (_ @ _)%expr_pat _) _ |
+ @expr.App _ _ _ s1 _
+ (@expr.App _ _ _ s2 _ (@expr.LetIn _ _ _ _ _ _ _)
+ _) _ => UnderLets.Base (x * x0)%expr
+ | @expr.App _ _ _ s1 _ #(_)%expr_pat _ | @expr.App _
+ _ _ s1 _ ($_)%expr _ | @expr.App _ _ _ s1 _
+ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s1 _
+ (@expr.LetIn _ _ _ _ _ _ _) _ =>
+ UnderLets.Base (x * x0)%expr
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
end
- | @expr.App _ _ _ s0 _ #(idc0)%expr_pat x2 =>
- match
- match idc0 with
- | ident.Z_land mask => Some mask
- | _ => None
- end
- with
- | Some args0 =>
+ | @expr.Abs _ _ _ _ _ _ =>
+ match x1 with
+ | #(idc0)%expr_pat =>
match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.Z)))
+ match idc0 with
+ | @ident.Literal t1 v =>
+ match
+ t1 as t2 return (base.base_interp t2 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.Z)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- match
- s0 as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.Z)))
- with
- | type.base t3 =>
- fun v0 : expr (type.base t3) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- expr (type.base t1)) t3 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.Z)))
- (fun
- a0 : option
- (expr (type.base t3) ->
- expr (type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- if
- (args =?
- 2 ^ (2 * Z.log2_up args / 2) - 1) &&
- (args0 =?
- 2 ^ (2 * Z.log2_up args / 2) - 1)
- then
- UnderLets.Base
- (#(ident.fancy_mulll
- (2 * Z.log2_up args))%expr @
- (x' v, x'0 v0))%expr_pat
- else UnderLets.Base (x * x0)%expr
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x2)
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
- | None =>
+ | Some args0 =>
+ match x0 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base base.type.Z)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if
+ args0 =?
+ 2 ^ (2 * Z.log2_up args0 / 2) - 1
+ then
+ match
+ invert_low
+ (2 * Z.log2_up args0) args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#(ident.fancy_mulll
+ (2 * Z.log2_up args0))%expr @
+ (x' v, ##(y)%expr))%expr_pat
+ | None =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args0)
+ args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#(ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (x'0 v0,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value'
+ false s2 ->
+ Compile.value' true
+ d2 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
+ end
+ else
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up args0 /
+ 2) - 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up args0)
+ args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#(ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (x'0 v0,
+ ##(y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None => UnderLets.Base (x * x0)%expr
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2 =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ | @expr.App _ _ _ s2 _
+ (@expr.App _ _ _ s3 _ #(idc1)%expr_pat x4) x3 =>
+ match
+ match idc1 with
+ | ident.Z_land => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4))
+ t3 base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z)) =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t4
+ return
+ (Compile.value' false
+ t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4)
+ =>
+ base.try_make_transport_cps
+ (fun t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ (args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#(ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (x' v,
+ x'0 v0))%expr_pat
+ else
+ match x3 with
+ | #(idc3)%expr_pat =>
+ match
+ match
+ idc3
+ with
+ | @ident.Literal
+ t6 v1 =>
+ match
+ t6 as t7
+ return
+ (base.base_interp
+ t7 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v2 : Z =>
+ Some v2
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v1
+ | _ =>
+ None
+ end
+ with
+ | Some
+ args3 =>
+ match
+ s0 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v1 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a1 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a1
+ with
+ | Some
+ x'1 =>
+ match
+ s3 as t7
+ return
+ (Compile.value'
+ false t7 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t7 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t7) =>
+ base.try_make_transport_cps
+ (fun
+ t8 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t8)) t7
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t7) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args3 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x'1 v1,
+ x'2 v2))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 ->
+ d4)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s4 ->
+ Compile.value'
+ true d4
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 ->
+ d4)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s4 ->
+ Compile.value'
+ true d4
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | _ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value'
+ false s4 ->
+ Compile.value'
+ true d4 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x3)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4 =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ match x3 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal t4 v =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s3 as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t5 =>
+ fun
+ v0 :
+ defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a0
+ with
+ | Some
+ x'0 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x' v,
+ x'0 v0))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s4 ->
+ Compile.value'
+ true d4
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value'
+ false s4 ->
+ Compile.value' true
+ d4 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ end
+ | ($_)%expr =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t4 v0 =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s3 as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t5 =>
+ fun
+ v1 : defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base t6))
+ t5 base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x' v0,
+ x'0 v1))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value'
+ false s4 ->
+ Compile.value'
+ true d4 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | @expr.LetIn _ _ _ _ _ _ _ =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s3 as t4
+ return
+ (Compile.value'
+ false t4 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base
+ t4) =>
+ base.try_make_transport_cps
+ (fun
+ t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x' v,
+ x'0 v0))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value'
+ false s4 ->
+ Compile.value'
+ true d4 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | _ =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s3 as t4
+ return
+ (Compile.value'
+ false t4 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base
+ t4) =>
+ base.try_make_transport_cps
+ (fun
+ t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x' v,
+ x'0 v0))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s5 -> d5)%ptype =>
+ fun
+ _ : Compile.value'
+ false s5 ->
+ Compile.value'
+ true d5 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s5 -> d5)%ptype =>
+ fun
+ _ : Compile.value' false s5 ->
+ Compile.value' true d5
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ end
+ | None =>
+ match
+ match idc1 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s3 as t4
+ return
+ (Compile.value'
+ false t4 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base
+ t4) =>
+ base.try_make_transport_cps
+ (fun
+ t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args0 =?
+ 2
+ ^
+ (2 * args2 /
+ 2) - 1
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mullh
+ (2 *
+ args2))%expr @
+ (
+ x' v,
+ x'0 v0))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value'
+ false s4 ->
+ Compile.value'
+ true d4 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ end
+ | @expr.App _ _ _ s2 _
+ (@expr.App _ _ _ s3 _ ($_)%expr _) _ | @expr.App _
+ _ _ s2 _
+ (@expr.App _ _ _ s3 _ (@expr.Abs _ _ _ _ _ _) _)
+ _ | @expr.App _ _ _ s2 _
+ (@expr.App _ _ _ s3 _ (_ @ _)%expr_pat _) _ |
+ @expr.App _ _ _ s2 _
+ (@expr.App _ _ _ s3 _ (@expr.LetIn _ _ _ _ _ _ _)
+ _) _ => UnderLets.Base (x * x0)%expr
+ | @expr.App _ _ _ s2 _ #(_)%expr_pat _ | @expr.App _
+ _ _ s2 _ ($_)%expr _ | @expr.App _ _ _ s2 _
+ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s2 _
+ (@expr.LetIn _ _ _ _ _ _ _) _ =>
+ UnderLets.Base (x * x0)%expr
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | (_ @ _)%expr_pat =>
+ match x1 with
+ | #(idc0)%expr_pat =>
match
match idc0 with
- | ident.Z_shiftr offset => Some offset
+ | @ident.Literal t1 v =>
+ match
+ t1 as t2 return (base.base_interp t2 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
| _ => None
end
with
| Some args0 =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.Z)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- match
- s0 as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type ident
- var (expr (type.base base.type.Z)))
- with
- | type.base t3 =>
- fun v0 : expr (type.base t3) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- expr (type.base t1)) t3 base.type.Z
- (UnderLets.UnderLets base.type ident
- var
- (expr (type.base base.type.Z)))
- (fun
- a0 : option
- (expr (type.base t3) ->
- expr
- (type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- if
- args =?
- 2 ^ (2 * args0 / 2) - 1
- then
- UnderLets.Base
- (#(ident.fancy_mullh
- (2 * args0))%expr @
- (x' v, x'0 v0))%expr_pat
- else
- UnderLets.Base (x * x0)%expr
- | None =>
- UnderLets.Base (x * x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x2)
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
+ match x0 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base base.type.Z)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if
+ args0 =?
+ 2 ^ (2 * Z.log2_up args0 / 2) - 1
+ then
+ match
+ invert_low
+ (2 * Z.log2_up args0) args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#(ident.fancy_mulll
+ (2 * Z.log2_up args0))%expr @
+ (x' v, ##(y)%expr))%expr_pat
+ | None =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args0)
+ args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#(ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (x'0 v0,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value'
+ false s2 ->
+ Compile.value' true
+ d2 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
+ end
+ else
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up args0 /
+ 2) - 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up args0)
+ args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#(ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (x'0 v0,
+ ##(y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None => UnderLets.Base (x * x0)%expr
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2 =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ | @expr.App _ _ _ s2 _
+ (@expr.App _ _ _ s3 _ #(idc1)%expr_pat x5) x4 =>
+ match
+ match idc1 with
+ | ident.Z_land => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x5 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4))
+ t3 base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z)) =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t4
+ return
+ (Compile.value' false
+ t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4)
+ =>
+ base.try_make_transport_cps
+ (fun t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ (args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#(ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (x' v,
+ x'0 v0))%expr_pat
+ else
+ match x4 with
+ | #(idc3)%expr_pat =>
+ match
+ match
+ idc3
+ with
+ | @ident.Literal
+ t6 v1 =>
+ match
+ t6 as t7
+ return
+ (base.base_interp
+ t7 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v2 : Z =>
+ Some v2
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v1
+ | _ =>
+ None
+ end
+ with
+ | Some
+ args3 =>
+ match
+ s0 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v1 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a1 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a1
+ with
+ | Some
+ x'1 =>
+ match
+ s3 as t7
+ return
+ (Compile.value'
+ false t7 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t7 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t7) =>
+ base.try_make_transport_cps
+ (fun
+ t8 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t8)) t7
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t7) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args3 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x'1 v1,
+ x'2 v2))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 ->
+ d4)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s4 ->
+ Compile.value'
+ true d4
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x5)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 ->
+ d4)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s4 ->
+ Compile.value'
+ true d4
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | _ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value'
+ false s4 ->
+ Compile.value'
+ true d4 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4 =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ match x4 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal t4 v =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s3 as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t5 =>
+ fun
+ v0 :
+ defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a0
+ with
+ | Some
+ x'0 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x' v,
+ x'0 v0))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s4 ->
+ Compile.value'
+ true d4
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x5)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value'
+ false s4 ->
+ Compile.value' true
+ d4 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ end
+ | ($_)%expr =>
+ match x4 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t4 v0 =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s3 as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t5 =>
+ fun
+ v1 : defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base t6))
+ t5 base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x' v0,
+ x'0 v1))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value'
+ false s4 ->
+ Compile.value'
+ true d4 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect x5)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | @expr.LetIn _ _ _ _ _ _ _ =>
+ match x4 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s3 as t4
+ return
+ (Compile.value'
+ false t4 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base
+ t4) =>
+ base.try_make_transport_cps
+ (fun
+ t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x' v,
+ x'0 v0))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value'
+ false s4 ->
+ Compile.value'
+ true d4 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect x5)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | _ =>
+ match x4 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s3 as t4
+ return
+ (Compile.value'
+ false t4 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base
+ t4) =>
+ base.try_make_transport_cps
+ (fun
+ t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x' v,
+ x'0 v0))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s5 -> d5)%ptype =>
+ fun
+ _ : Compile.value'
+ false s5 ->
+ Compile.value'
+ true d5 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect x5)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s5 -> d5)%ptype =>
+ fun
+ _ : Compile.value' false s5 ->
+ Compile.value' true d5
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ end
+ | None =>
+ match
+ match idc1 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s3 as t4
+ return
+ (Compile.value'
+ false t4 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base
+ t4) =>
+ base.try_make_transport_cps
+ (fun
+ t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args0 =?
+ 2
+ ^
+ (2 * args2 /
+ 2) - 1
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mullh
+ (2 *
+ args2))%expr @
+ (
+ x' v,
+ x'0 v0))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value'
+ false s4 ->
+ Compile.value'
+ true d4 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect x5)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ end
+ | @expr.App _ _ _ s2 _
+ (@expr.App _ _ _ s3 _ ($_)%expr _) _ | @expr.App _
+ _ _ s2 _
+ (@expr.App _ _ _ s3 _ (@expr.Abs _ _ _ _ _ _) _)
+ _ | @expr.App _ _ _ s2 _
+ (@expr.App _ _ _ s3 _ (_ @ _)%expr_pat _) _ |
+ @expr.App _ _ _ s2 _
+ (@expr.App _ _ _ s3 _ (@expr.LetIn _ _ _ _ _ _ _)
+ _) _ => UnderLets.Base (x * x0)%expr
+ | @expr.App _ _ _ s2 _ #(_)%expr_pat _ | @expr.App _
+ _ _ s2 _ ($_)%expr _ | @expr.App _ _ _ s2 _
+ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s2 _
+ (@expr.LetIn _ _ _ _ _ _ _) _ =>
UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
+ | _ => UnderLets.Base (x * x0)%expr
+ end
| None => UnderLets.Base (x * x0)%expr
end
+ | _ => UnderLets.Base (x * x0)%expr
end
- | @expr.App _ _ _ s0 _ ($_)%expr _ | @expr.App _ _ _ s0 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s0 _
- (_ @ _)%expr_pat _ | @expr.App _ _ _ s0 _
- (@expr.LetIn _ _ _ _ _ _ _) _ => UnderLets.Base (x * x0)%expr
- | _ => UnderLets.Base (x * x0)%expr
- end
- | None =>
- match
- match idc with
- | ident.Z_shiftr offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match x0 with
+ | @expr.LetIn _ _ _ _ _ _ _ =>
+ match x1 with
| #(idc0)%expr_pat =>
match
match idc0 with
@@ -810,5092 +15007,19878 @@ match idc in (ident t) return (Compile.value' true t) with
end
with
| Some args0 =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.Z)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- match invert_low (2 * args) args0 with
- | Some y =>
- UnderLets.Base
- (#(ident.fancy_mulhl (2 * args))%expr @
- (x' v, ##(y)%expr))%expr_pat
- | None =>
- match
- s as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type
- ident var
- (expr (type.base base.type.Z)))
- with
- | type.base t3 =>
- fun v0 : expr (type.base t3) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- expr (type.base t1)) t3
- base.type.Z
- (UnderLets.UnderLets base.type
- ident var
- (expr (type.base base.type.Z)))
- (fun
- a0 : option
- (expr (type.base t3) ->
- expr
+ match x0 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base base.type.Z)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if
+ args0 =?
+ 2 ^ (2 * Z.log2_up args0 / 2) - 1
+ then
+ match
+ invert_low
+ (2 * Z.log2_up args0) args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#(ident.fancy_mulll
+ (2 * Z.log2_up args0))%expr @
+ (x' v, ##(y)%expr))%expr_pat
+ | None =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up
+ args0)
+ args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#(ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (x'0 v0,
+ ##
+ (y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value'
+ false s1 ->
+ Compile.value' true
+ d1 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
+ end
+ else
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up args0 /
+ 2) - 1
+ then
+ match
+ invert_high
+ (2 *
+ Z.log2_up args0)
+ args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#(ident.fancy_mullh
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (x'0 v0,
+ ##(y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None => UnderLets.Base (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ | @expr.App _ _ _ s1 _
+ (@expr.App _ _ _ s2 _ #(idc1)%expr_pat x5) x4 =>
+ match
+ match idc1 with
+ | ident.Z_land => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x5 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4))
+ t3 base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
(type.base
base.type.Z)) =>
- match a0 with
- | Some x'0 =>
+ match a with
+ | Some x' =>
+ match
+ s1 as t4
+ return
+ (Compile.value' false
+ t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4)
+ =>
+ base.try_make_transport_cps
+ (fun t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ (args0 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#(ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (x' v,
+ x'0 v0))%expr_pat
+ else
+ match x4 with
+ | #(idc3)%expr_pat =>
+ match
+ match
+ idc3
+ with
+ | @ident.Literal
+ t6 v1 =>
+ match
+ t6 as t7
+ return
+ (base.base_interp
+ t7 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v2 : Z =>
+ Some v2
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v1
+ | _ =>
+ None
+ end
+ with
+ | Some
+ args3 =>
+ match
+ s0 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v1 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a1 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a1
+ with
+ | Some
+ x'1 =>
+ match
+ s2 as t7
+ return
+ (Compile.value'
+ false t7 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t7 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t7) =>
+ base.try_make_transport_cps
+ (fun
+ t8 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t8)) t7
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t7) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args3 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x'1 v1,
+ x'2 v2))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x5)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | _ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ match x4 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal t4 v =>
match
- invert_high (2 * args)
- args0
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
with
- | Some y =>
- UnderLets.Base
- (#(ident.fancy_mulhh
- (2 * args))%expr @
- (x'0 v0, ##(y)%expr))%expr_pat
- | None =>
- UnderLets.Base
- (x * x0)%expr
- end
- | None =>
- UnderLets.Base
- (x * x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
- end
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s0 -> d0)%ptype =>
- fun
- _ : Compile.value' false s0 ->
- Compile.value' true d0 =>
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t5 =>
+ fun
+ v0 :
+ defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a0
+ with
+ | Some
+ x'0 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x' v,
+ x'0 v0))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x5)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value' true
+ d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ end
+ | ($_)%expr =>
+ match x4 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t4 v0 =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t5 =>
+ fun
+ v1 : defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base t6))
+ t5 base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x' v0,
+ x'0 v1))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect x5)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | @expr.LetIn _ _ _ _ _ _ _ =>
+ match x4 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t4
+ return
+ (Compile.value'
+ false t4 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base
+ t4) =>
+ base.try_make_transport_cps
+ (fun
+ t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x' v,
+ x'0 v0))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect x5)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | _ =>
+ match x4 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t4
+ return
+ (Compile.value'
+ false t4 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base
+ t4) =>
+ base.try_make_transport_cps
+ (fun
+ t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ (args0 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1) &&
+ (args2 =?
+ 2
+ ^
+ (2 *
+ Z.log2_up
+ args0 / 2) -
+ 1)
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulll
+ (2 *
+ Z.log2_up
+ args0))%expr @
+ (
+ x' v,
+ x'0 v0))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value'
+ false s4 ->
+ Compile.value'
+ true d4 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect x5)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ end
+ | None =>
+ match
+ match idc1 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t4
+ return
+ (Compile.value'
+ false t4 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base
+ t4) =>
+ base.try_make_transport_cps
+ (fun
+ t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args0 =?
+ 2
+ ^
+ (2 * args2 /
+ 2) - 1
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mullh
+ (2 *
+ args2))%expr @
+ (
+ x' v,
+ x'0 v0))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect x5)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ end
+ | @expr.App _ _ _ s1 _
+ (@expr.App _ _ _ s2 _ ($_)%expr _) _ | @expr.App _
+ _ _ s1 _
+ (@expr.App _ _ _ s2 _ (@expr.Abs _ _ _ _ _ _) _)
+ _ | @expr.App _ _ _ s1 _
+ (@expr.App _ _ _ s2 _ (_ @ _)%expr_pat _) _ |
+ @expr.App _ _ _ s1 _
+ (@expr.App _ _ _ s2 _ (@expr.LetIn _ _ _ _ _ _ _)
+ _) _ => UnderLets.Base (x * x0)%expr
+ | @expr.App _ _ _ s1 _ #(_)%expr_pat _ | @expr.App _
+ _ _ s1 _ ($_)%expr _ | @expr.App _ _ _ s1 _
+ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s1 _
+ (@expr.LetIn _ _ _ _ _ _ _) _ =>
UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
+ | _ => UnderLets.Base (x * x0)%expr
+ end
| None => UnderLets.Base (x * x0)%expr
end
- | @expr.App _ _ _ s0 _ #(idc0)%expr_pat x2 =>
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ end
+ | None =>
+ match
+ match idc with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x1 with
+ | #(idc0)%expr_pat =>
match
match idc0 with
- | ident.Z_land mask => Some mask
+ | @ident.Literal t1 v =>
+ match
+ t1 as t2 return (base.base_interp t2 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
| _ => None
end
with
| Some args0 =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.Z)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- match
- s0 as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type ident
- var (expr (type.base base.type.Z)))
- with
- | type.base t3 =>
- fun v0 : expr (type.base t3) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- expr (type.base t1)) t3 base.type.Z
- (UnderLets.UnderLets base.type ident
- var
- (expr (type.base base.type.Z)))
- (fun
- a0 : option
- (expr (type.base t3) ->
- expr
- (type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- if
- args0 =?
- 2 ^ (2 * args / 2) - 1
- then
+ match x0 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base base.type.Z)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ match
+ invert_low (2 * args0) args1
+ with
+ | Some y =>
UnderLets.Base
(#(ident.fancy_mulhl
- (2 * args))%expr @
- (x' v, x'0 v0))%expr_pat
- else
- UnderLets.Base (x * x0)%expr
- | None =>
- UnderLets.Base (x * x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x2)
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
- | None =>
- match
- match idc0 with
- | ident.Z_shiftr offset => Some offset
- | _ => None
- end
- with
- | Some args0 =>
+ (2 * args0))%expr @
+ (x' v, ##(y)%expr))%expr_pat
+ | None =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ match
+ invert_high
+ (2 * args0)
+ args1
+ with
+ | Some y =>
+ UnderLets.Base
+ (#(ident.fancy_mulhh
+ (2 *
+ args0))%expr @
+ (x'0 v0,
+ ##(y)%expr))%expr_pat
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false
+ s1 ->
+ Compile.value' true
+ d1 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
+ end
+ | None => UnderLets.Base (x * x0)%expr
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ | @expr.App _ _ _ s1 _
+ (@expr.App _ _ _ s2 _ #(idc1)%expr_pat x4) x3 =>
match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.Z)))
+ match idc1 with
+ | ident.Z_land => Some tt
+ | _ => None
+ end
with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.Z)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- match
- s0 as t3
- return
- (Compile.value' false t3 ->
- UnderLets.UnderLets base.type
- ident var
- (expr (type.base base.type.Z)))
- with
- | type.base t3 =>
- fun v0 : expr (type.base t3) =>
- base.try_make_transport_cps
- (fun t1 : base.type =>
- expr (type.base t1)) t3
- base.type.Z
- (UnderLets.UnderLets base.type
- ident var
- (expr (type.base base.type.Z)))
- (fun
- a0 : option
- (expr (type.base t3) ->
- expr
+ | Some _ =>
+ match x4 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4))
+ t3 base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
(type.base
base.type.Z)) =>
- match a0 with
- | Some x'0 =>
- if args =? args0
- then
- UnderLets.Base
- (#(ident.fancy_mulhh
- (2 * args))%expr @
- (x' v, x'0 v0))%expr_pat
- else
+ match a with
+ | Some x' =>
+ match
+ s1 as t4
+ return
+ (Compile.value' false
+ t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4)
+ =>
+ base.try_make_transport_cps
+ (fun t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args2 =?
+ 2
+ ^ (2 * args0 /
+ 2) - 1
+ then
+ UnderLets.Base
+ (#(ident.fancy_mulhl
+ (2 *
+ args0))%expr @
+ (x' v,
+ x'0 v0))%expr_pat
+ else
+ match x3 with
+ | #(idc3)%expr_pat =>
+ match
+ match
+ idc3
+ with
+ | @ident.Literal
+ t6 v1 =>
+ match
+ t6 as t7
+ return
+ (base.base_interp
+ t7 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v2 : Z =>
+ Some v2
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v1
+ | _ =>
+ None
+ end
+ with
+ | Some
+ args3 =>
+ match
+ s0 as t6
+ return
+ (Compile.value'
+ false t6 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t6 =>
+ fun
+ v1 :
+ defaults.expr
+ (type.base
+ t6) =>
+ base.try_make_transport_cps
+ (fun
+ t7 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t7)) t6
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a1 :
+ option
+ (defaults.expr
+ (type.base
+ t6) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a1
+ with
+ | Some
+ x'1 =>
+ match
+ s2 as t7
+ return
+ (Compile.value'
+ false t7 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base
+ t7 =>
+ fun
+ v2 :
+ defaults.expr
+ (type.base
+ t7) =>
+ base.try_make_transport_cps
+ (fun
+ t8 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t8)) t7
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a2 :
+ option
+ (defaults.expr
+ (type.base
+ t7) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a2
+ with
+ | Some
+ x'2 =>
+ if
+ args3 =?
+ 2
+ ^
+ (2 *
+ args0 / 2) -
+ 1
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulhl
+ (2 *
+ args0))%expr @
+ (
+ x'1 v1,
+ x'2 v2))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 ->
+ d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x2)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | _ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x3)
+ | None =>
UnderLets.Base
(x * x0)%expr
- | None =>
- UnderLets.Base
- (x * x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x2)
- | None => UnderLets.Base (x * x0)%expr
- end)
- | (s1 -> d1)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d1 =>
- UnderLets.Base (x * x0)%expr
- end (Compile.reflect x1)
- | None => UnderLets.Base (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ match x3 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal t4 v =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t5 =>
+ fun
+ v0 :
+ defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a0
+ with
+ | Some
+ x'0 =>
+ if
+ args2 =?
+ 2
+ ^
+ (2 *
+ args0 / 2) -
+ 1
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulhl
+ (2 *
+ args0))%expr @
+ (
+ x' v,
+ x'0 v0))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect
+ x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value' true
+ d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ end
+ | ($_)%expr =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t4 v0 =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t5 =>
+ fun
+ v1 : defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base t6))
+ t5 base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args2 =?
+ 2
+ ^
+ (2 * args0 /
+ 2) - 1
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulhl
+ (2 *
+ args0))%expr @
+ (
+ x' v0,
+ x'0 v1))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | @expr.LetIn _ _ _ _ _ _ _ =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t4
+ return
+ (Compile.value'
+ false t4 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base
+ t4) =>
+ base.try_make_transport_cps
+ (fun
+ t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args2 =?
+ 2
+ ^
+ (2 * args0 /
+ 2) - 1
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulhl
+ (2 *
+ args0))%expr @
+ (
+ x' v,
+ x'0 v0))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | _ =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t4
+ return
+ (Compile.value'
+ false t4 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base
+ t4) =>
+ base.try_make_transport_cps
+ (fun
+ t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args2 =?
+ 2
+ ^
+ (2 * args0 /
+ 2) - 1
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulhl
+ (2 *
+ args0))%expr @
+ (
+ x' v,
+ x'0 v0))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value'
+ false s4 ->
+ Compile.value'
+ true d4 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ end
+ | None =>
+ match
+ match idc1 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ match
+ s2 as t4
+ return
+ (Compile.value'
+ false t4 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base
+ t4) =>
+ base.try_make_transport_cps
+ (fun
+ t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args0 =?
+ args2
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_mulhh
+ (2 *
+ args0))%expr @
+ (
+ x' v,
+ x'0 v0))%expr_pat
+ else
+ UnderLets.Base
+ (x * x0)%expr
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3 =>
+ UnderLets.Base
+ (x * x0)%expr
+ end
+ (Compile.reflect x4)
+ | None =>
+ UnderLets.Base
+ (x * x0)%expr
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base (x * x0)%expr
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base (x * x0)%expr
+ end
+ | _ => UnderLets.Base (x * x0)%expr
+ end
+ | None => UnderLets.Base (x * x0)%expr
+ end
+ end
+ | @expr.App _ _ _ s1 _
+ (@expr.App _ _ _ s2 _ ($_)%expr _) _ | @expr.App _
+ _ _ s1 _
+ (@expr.App _ _ _ s2 _ (@expr.Abs _ _ _ _ _ _) _)
+ _ | @expr.App _ _ _ s1 _
+ (@expr.App _ _ _ s2 _ (_ @ _)%expr_pat _) _ |
+ @expr.App _ _ _ s1 _
+ (@expr.App _ _ _ s2 _ (@expr.LetIn _ _ _ _ _ _ _)
+ _) _ => UnderLets.Base (x * x0)%expr
+ | @expr.App _ _ _ s1 _ #(_)%expr_pat _ | @expr.App _
+ _ _ s1 _ ($_)%expr _ | @expr.App _ _ _ s1 _
+ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s1 _
+ (@expr.LetIn _ _ _ _ _ _ _) _ =>
+ UnderLets.Base (x * x0)%expr
+ | _ => UnderLets.Base (x * x0)%expr
end
+ | None => UnderLets.Base (x * x0)%expr
end
- | @expr.App _ _ _ s0 _ ($_)%expr _ | @expr.App _ _ _ s0 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s0 _
- (_ @ _)%expr_pat _ | @expr.App _ _ _ s0 _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- UnderLets.Base (x * x0)%expr
| _ => UnderLets.Base (x * x0)%expr
end
| None => UnderLets.Base (x * x0)%expr
end
end
- | @expr.App _ _ _ s _ ($_)%expr _ | @expr.App _ _ _ s _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _ (_ @ _)%expr_pat _ |
- @expr.App _ _ _ s _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
+ | @expr.App _ _ _ s _ (@expr.App _ _ _ s0 _ ($_)%expr _) _ | @expr.App _
+ _ _ s _ (@expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _) _ | @expr.App
+ _ _ _ s _ (@expr.App _ _ _ s0 _ (_ @ _)%expr_pat _) _ | @expr.App _ _ _
+ s _ (@expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _) _ =>
UnderLets.Base (x * x0)%expr
+ | @expr.App _ _ _ s _ #(_)%expr_pat _ | @expr.App _ _ _ s _ ($_)%expr _ |
+ @expr.App _ _ _ s _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _
+ (@expr.LetIn _ _ _ _ _ _ _) _ => UnderLets.Base (x * x0)%expr
| _ => UnderLets.Base (x * x0)%expr
end
| ident.Z_pow =>
- fun x x0 : expr (type.base base.type.Z) =>
+ fun x x0 : defaults.expr (type.base base.type.Z) =>
UnderLets.Base (#(ident.Z_pow)%expr @ x @ x0)%expr_pat
| ident.Z_sub =>
- fun x x0 : expr (type.base base.type.Z) => UnderLets.Base (x - x0)%expr
+ fun x x0 : defaults.expr (type.base base.type.Z) =>
+ UnderLets.Base (x - x0)%expr
| ident.Z_opp =>
- fun x : expr (type.base base.type.Z) => UnderLets.Base (- x)%expr
+ fun x : defaults.expr (type.base base.type.Z) =>
+ UnderLets.Base (- x)%expr
| ident.Z_div =>
- fun x x0 : expr (type.base base.type.Z) => UnderLets.Base (x / x0)%expr
+ fun x x0 : defaults.expr (type.base base.type.Z) =>
+ UnderLets.Base (x / x0)%expr
| ident.Z_modulo =>
- fun x x0 : expr (type.base base.type.Z) => UnderLets.Base (x mod x0)%expr
+ fun x x0 : defaults.expr (type.base base.type.Z) =>
+ UnderLets.Base (x mod x0)%expr
+| ident.Z_log2 =>
+ fun x : defaults.expr (type.base base.type.Z) =>
+ UnderLets.Base (#(ident.Z_log2)%expr @ x)%expr_pat
+| ident.Z_log2_up =>
+ fun x : defaults.expr (type.base base.type.Z) =>
+ UnderLets.Base (#(ident.Z_log2_up)%expr @ x)%expr_pat
| ident.Z_eqb =>
- fun x x0 : expr (type.base base.type.Z) =>
+ fun x x0 : defaults.expr (type.base base.type.Z) =>
UnderLets.Base (#(ident.Z_eqb)%expr @ x @ x0)%expr_pat
| ident.Z_leb =>
- fun x x0 : expr (type.base base.type.Z) =>
+ fun x x0 : defaults.expr (type.base base.type.Z) =>
UnderLets.Base (#(ident.Z_leb)%expr @ x @ x0)%expr_pat
+| ident.Z_geb =>
+ fun x x0 : defaults.expr (type.base base.type.Z) =>
+ UnderLets.Base (#(ident.Z_geb)%expr @ x @ x0)%expr_pat
| ident.Z_of_nat =>
- fun x : expr (type.base base.type.nat) =>
+ fun x : defaults.expr (type.base base.type.nat) =>
UnderLets.Base (#(ident.Z_of_nat)%expr @ x)%expr_pat
-| ident.Z_shiftr offset =>
- fun x : expr (type.base base.type.Z) => UnderLets.Base (x >> offset)%expr
-| ident.Z_shiftl offset =>
- fun x : expr (type.base base.type.Z) => UnderLets.Base (x << offset)%expr
-| ident.Z_land mask =>
- fun x : expr (type.base base.type.Z) =>
- UnderLets.Base (#(ident.Z_land mask)%expr @ x)%expr_pat
+| ident.Z_to_nat =>
+ fun x : defaults.expr (type.base base.type.Z) =>
+ UnderLets.Base (#(ident.Z_to_nat)%expr @ x)%expr_pat
+| ident.Z_shiftr =>
+ fun x x0 : defaults.expr (type.base base.type.Z) =>
+ UnderLets.Base (x >> x0)%expr
+| ident.Z_shiftl =>
+ fun x x0 : defaults.expr (type.base base.type.Z) =>
+ UnderLets.Base (x << x0)%expr
+| ident.Z_land =>
+ fun x x0 : defaults.expr (type.base base.type.Z) =>
+ UnderLets.Base (x &' x0)%expr
+| ident.Z_lor =>
+ fun x x0 : defaults.expr (type.base base.type.Z) =>
+ UnderLets.Base (x || x0)%expr
+| ident.Z_bneg =>
+ fun x : defaults.expr (type.base base.type.Z) =>
+ UnderLets.Base (#(ident.Z_bneg)%expr @ x)%expr_pat
+| ident.Z_lnot_modulo =>
+ fun x x0 : defaults.expr (type.base base.type.Z) =>
+ UnderLets.Base (#(ident.Z_lnot_modulo)%expr @ x @ x0)%expr_pat
| ident.Z_mul_split =>
- fun x x0 x1 : expr (type.base base.type.Z) =>
+ fun x x0 x1 : defaults.expr (type.base base.type.Z) =>
UnderLets.Base (#(ident.Z_mul_split)%expr @ x @ x0 @ x1)%expr_pat
-| ident.Z_mul_split_concrete s =>
- fun x x0 : expr (type.base base.type.Z) =>
- UnderLets.Base (#(ident.Z_mul_split_concrete s)%expr @ x @ x0)%expr_pat
| ident.Z_add_get_carry =>
- fun x x0 x1 : expr (type.base base.type.Z) =>
- UnderLets.Base (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
-| ident.Z_add_get_carry_concrete s =>
- fun x x0 : expr (type.base base.type.Z) =>
- match x0 with
- | #(_)%expr_pat =>
- match x with
- | @expr.App _ _ _ s0 _ #(idc0)%expr_pat x1 =>
- match
- match idc0 with
- | ident.Z_shiftl offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) args)%expr @
- (x0, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ fun x x0 x1 : defaults.expr (type.base base.type.Z) =>
+ match x with
+ | #(idc)%expr_pat =>
+ match
+ match idc with
+ | @ident.Literal t0 v =>
+ match t0 as t1 return (base.base_interp t1 -> option Z) with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args =>
+ match x1 with
+ | #(_)%expr_pat =>
+ match x0 with
+ | (@expr.App _ _ _ s0 _ #(idc1) x3 @ x2)%expr_pat =>
+ match
+ match idc1 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x2 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v : defaults.expr (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) args1)%expr @
+ (x1, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @
- x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @
- x0)%expr_pat
- end)
- | (s1 -> d0)%ptype =>
- fun _ : Compile.value' false s1 -> Compile.value' true d0
- =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x1)
- | None =>
- match
- match idc0 with
- | ident.Z_shiftr offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) (- args))%expr @
- (x0, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ | None =>
+ match
+ match idc1 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x2 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v : defaults.expr (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args1))%expr @
+ (x1, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end)
- | (s1 -> d0)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x1)
- | None =>
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s0 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s0 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
end
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ | @expr.App _ _ _ s0 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s0 _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- | _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end
- | ($_)%expr =>
- match x with
- | @expr.App _ _ _ s0 _ #(idc)%expr_pat x1 =>
- match
- match idc with
- | ident.Z_shiftl offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v0 : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) args)%expr @
- (x0, x' v0))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ | ($_)%expr =>
+ match x0 with
+ | (@expr.App _ _ _ s0 _ #(idc0) x3 @ x2)%expr_pat =>
+ match
+ match idc0 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x2 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t3 v0 =>
+ match
+ t3 as t4
+ return (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v1 : Z => Some v1
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v0 : defaults.expr (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) args1)%expr @
+ (x1, x' v0))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @
- x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @
- x0)%expr_pat
- end)
- | (s1 -> d0)%ptype =>
- fun _ : Compile.value' false s1 -> Compile.value' true d0
- =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x1)
- | None =>
- match
- match idc with
- | ident.Z_shiftr offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v0 : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) (- args))%expr @
- (x0, x' v0))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ | None =>
+ match
+ match idc0 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x2 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t3 v0 =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v0 : defaults.expr (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args1))%expr @
+ (x1, x' v0))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end)
- | (s1 -> d0)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x1)
- | None =>
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s0 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s0 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
end
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ | @expr.App _ _ _ s0 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s0 _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- | _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end
- | @expr.Abs _ _ _ _ _ _ =>
- match x with
- | @expr.App _ _ _ s1 _ #(idc)%expr_pat x1 =>
- match
- match idc with
- | ident.Z_shiftl offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s1 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) args)%expr @
- (x0, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ | @expr.Abs _ _ _ _ _ _ =>
+ match x0 with
+ | (@expr.App _ _ _ s1 _ #(idc0) x3 @ x2)%expr_pat =>
+ match
+ match idc0 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x2 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s1 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) args1)%expr @
+ (x1, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @
- x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @
- x0)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun _ : Compile.value' false s2 -> Compile.value' true d1
- =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x1)
- | None =>
- match
- match idc with
- | ident.Z_shiftr offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s1 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) (- args))%expr @
- (x0, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ | None =>
+ match
+ match idc0 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x2 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s1 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args1))%expr @
+ (x1, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x1)
- | None =>
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s1 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s1 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s1 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s1 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
end
- end
- | @expr.App _ _ _ s1 _ ($_)%expr _ | @expr.App _ _ _ s1 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s1 _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s1 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- | _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end
- | @expr.App _ _ _ s0 _ #(idc)%expr_pat x1 =>
- match
- match idc with
- | ident.Z_shiftl offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) args)%expr @
- (x, x' v))%expr_pat
- else
- match x with
- | @expr.App _ _ _ s1 _ #(idc0)%expr_pat x2 =>
+ | (#(_) @ _)%expr_pat =>
+ match x0 with
+ | (@expr.App _ _ _ s1 _ #(idc1) x4 @ x3)%expr_pat =>
+ match
+ match idc1 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x3 with
+ | #(idc2)%expr_pat =>
match
- match idc0 with
- | ident.Z_shiftl offset => Some offset
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
| _ => None
end
with
- | Some args0 =>
+ | Some args1 =>
match
s1 as t3
return
(Compile.value' false t3 ->
UnderLets.UnderLets base.type ident var
- (expr
+ (defaults.expr
(type.base
(base.type.Z * base.type.Z)%etype)))
with
| type.base t3 =>
- fun v0 : expr (type.base t3) =>
+ fun v : defaults.expr (type.base t3) =>
base.try_make_transport_cps
- (fun t1 : base.type =>
- expr (type.base t1)) t3 base.type.Z
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
(UnderLets.UnderLets base.type ident
var
- (expr
+ (defaults.expr
(type.base
(base.type.Z * base.type.Z)%etype)))
(fun
- a0 : option
- (expr (type.base t3) ->
- expr (type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- if s =? 2 ^ Z.log2 s
+ a : option
+ (defaults.expr (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s)
- args0)%expr @ (x0, x'0 v0))%expr_pat
+ (#(ident.fancy_add
+ (Z.log2 args) args1)%expr @
+ (x1, x' v))%expr_pat
else
- if s =? 2 ^ Z.log2 s
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s)
- 0)%expr @ (x, x0))%expr_pat
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete
- s)%expr @ x @ x0)%expr_pat
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
| None =>
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete
- s)%expr @ x @ x0)%expr_pat
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
end)
- | (s2 -> d1)%ptype =>
+ | (s2 -> d2)%ptype =>
fun
_ : Compile.value' false s2 ->
- Compile.value' true d1 =>
+ Compile.value' true d2 =>
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end (Compile.reflect x2)
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end (Compile.reflect x4)
| None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ | None =>
+ match
+ match idc1 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x3 with
+ | #(idc2)%expr_pat =>
match
- match idc0 with
- | ident.Z_shiftr offset => Some offset
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
| _ => None
end
with
- | Some args0 =>
+ | Some args1 =>
match
s1 as t3
return
(Compile.value' false t3 ->
UnderLets.UnderLets base.type ident
var
- (expr
+ (defaults.expr
(type.base
(base.type.Z * base.type.Z)%etype)))
with
| type.base t3 =>
- fun v0 : expr (type.base t3) =>
+ fun v : defaults.expr (type.base t3)
+ =>
base.try_make_transport_cps
- (fun t1 : base.type =>
- expr (type.base t1)) t3
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
base.type.Z
(UnderLets.UnderLets base.type
ident var
- (expr
+ (defaults.expr
(type.base
(base.type.Z * base.type.Z)%etype)))
(fun
- a0 : option
- (expr (type.base t3) ->
- expr
- (type.base base.type.Z))
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z))
=>
- match a0 with
- | Some x'0 =>
- if s =? 2 ^ Z.log2 s
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
(#(ident.fancy_add
- (Z.log2 s) (- args0))%expr @
- (x0, x'0 v0))%expr_pat
+ (Z.log2 args)
+ (- args1))%expr @
+ (x1, x' v))%expr_pat
else
- if s =? 2 ^ Z.log2 s
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
(#(ident.fancy_add
- (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete
- s)%expr @ x @ x0)%expr_pat
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
| None =>
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete
- s)%expr @ x @ x0)%expr_pat
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
end)
- | (s2 -> d1)%ptype =>
+ | (s2 -> d2)%ptype =>
fun
_ : Compile.value' false s2 ->
- Compile.value' true d1 =>
+ Compile.value' true d2 =>
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end (Compile.reflect x2)
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end (Compile.reflect x4)
| None =>
- if s =? 2 ^ Z.log2 s
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
end
- | @expr.App _ _ _ s1 _ ($_)%expr _ | @expr.App _ _ _
- s1 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s1
- _ (_ @ _)%expr_pat _ | @expr.App _ _ _ s1 _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @
- x0)%expr_pat
- | _ =>
- if s =? 2 ^ Z.log2 s
+ | None =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @
- x0)%expr_pat
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
end
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end)
- | (s1 -> d0)%ptype =>
- fun _ : Compile.value' false s1 -> Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x1)
- | None =>
- match
- match idc with
- | ident.Z_shiftr offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match x with
- | #(_)%expr_pat =>
+ end
+ | (@expr.App _ _ _ s1 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s1 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s1 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s1 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ | (($_)%expr @ _)%expr_pat =>
+ match x0 with
+ | (@expr.App _ _ _ s1 _ #(idc0) x4 @ x3)%expr_pat =>
match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
+ match idc0 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) (- args))%expr @
- (x, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ | Some _ =>
+ match x3 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t3 v0 =>
+ match
+ t3 as t4
+ return (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v1 : Z => Some v1
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s1 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v0 : defaults.expr (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) args1)%expr @
+ (x1, x' v0))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end)
- | (s1 -> d0)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x1)
- | ($_)%expr =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v0 : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) (- args))%expr @
- (x, x' v0))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ | None =>
+ match
+ match idc0 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x3 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t3 v0 =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s1 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v0 : defaults.expr (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args1))%expr @
+ (x1, x' v0))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end)
- | (s1 -> d0)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x1)
- | @expr.Abs _ _ _ _ _ _ =>
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s1 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s1 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s1 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s1 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ | (@expr.Abs _ _ _ _ _ _ @ _)%expr_pat =>
+ match x0 with
+ | (@expr.App _ _ _ s2 _ #(idc0) x4 @ x3)%expr_pat =>
match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
+ match idc0 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) (- args))%expr @
- (x, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ | Some _ =>
+ match x3 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s2 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) args1)%expr @
+ (x1, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x1)
- | @expr.App _ _ _ s1 _ #(idc0)%expr_pat x2 =>
- match
- match idc0 with
- | ident.Z_shiftl offset => Some offset
- | _ => None
- end
- with
- | Some args0 =>
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ | None =>
match
- s1 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
+ match idc0 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) args0)%expr @
- (x0, x' v))%expr_pat
- else
+ | Some _ =>
+ match x3 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
match
- s0 as t3
+ s2 as t2
return
- (Compile.value' false t3 ->
+ (Compile.value' false t2 ->
UnderLets.UnderLets base.type ident
var
- (expr
+ (defaults.expr
(type.base
(base.type.Z * base.type.Z)%etype)))
with
- | type.base t3 =>
- fun v0 : expr (type.base t3) =>
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
base.try_make_transport_cps
- (fun t1 : base.type =>
- expr (type.base t1)) t3
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
base.type.Z
(UnderLets.UnderLets base.type
ident var
- (expr
+ (defaults.expr
(type.base
(base.type.Z * base.type.Z)%etype)))
(fun
- a0 : option
- (expr (type.base t3) ->
- expr
- (type.base base.type.Z))
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
=>
- match a0 with
- | Some x'0 =>
- if s =? 2 ^ Z.log2 s
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
(#(ident.fancy_add
- (Z.log2 s) (- args))%expr @
- (x, x'0 v0))%expr_pat
+ (Z.log2 args)
+ (- args1))%expr @
+ (x1, x' v))%expr_pat
else
- if s =? 2 ^ Z.log2 s
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
(#(ident.fancy_add
- (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete
- s)%expr @ x @ x0)%expr_pat
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
| None =>
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete
- s)%expr @ x @ x0)%expr_pat
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
end)
- | (s2 -> d1)%ptype =>
+ | (s3 -> d3)%ptype =>
fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end (Compile.reflect x1)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @
- x0)%expr_pat
- end (Compile.reflect x2)
- | None =>
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s2 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ | (@expr.App _ _ _ s0 _ #(idc0) x3 @ x2)%expr_pat =>
+ match
+ match idc0 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x2 with
+ | #(idc1)%expr_pat =>
match
- match idc0 with
- | ident.Z_shiftr offset => Some offset
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
| _ => None
end
with
- | Some args0 =>
+ | Some args1 =>
match
s0 as t2
return
(Compile.value' false t2 ->
UnderLets.UnderLets base.type ident var
- (expr
+ (defaults.expr
(type.base
(base.type.Z * base.type.Z)%etype)))
with
| type.base t2 =>
- fun v : expr (type.base t2) =>
+ fun v : defaults.expr (type.base t2) =>
base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1))
- t2 base.type.Z
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
(UnderLets.UnderLets base.type ident var
- (expr
+ (defaults.expr
(type.base
(base.type.Z * base.type.Z)%etype)))
(fun
a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
match a with
| Some x' =>
- if s =? 2 ^ Z.log2 s
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s)
- (- args))%expr @ (x, x' v))%expr_pat
+ (#(ident.fancy_add (Z.log2 args)
+ args1)%expr @ (x0, x' v))%expr_pat
else
+ match x0 with
+ | (@expr.App _ _ _ s2 _ #(idc2) x5 @
+ x4)%expr_pat =>
+ match
+ match idc2 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal t5
+ v0 =>
+ match
+ t5 as t6
+ return
+ (base.base_interp
+ t6 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit =>
+ None
+ | base.type.Z =>
+ fun v1 : Z =>
+ Some v1
+ | base.type.bool =>
+ fun _ : bool =>
+ None
+ | base.type.nat =>
+ fun _ : nat =>
+ None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args3 =>
+ match
+ s2 as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t5 =>
+ fun
+ v0 : defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args =?
+ 2
+ ^
+ Z.log2
+ args
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_add
+ (Z.log2
+ args)
+ args3)%expr @
+ (x1,
+ x'0 v0))%expr_pat
+ else
+ if
+ args =?
+ 2
+ ^
+ Z.log2
+ args
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_add
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#
+ (ident.Z_add_get_carry)%expr @
+ x @ x0 @
+ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#
+ (ident.Z_add_get_carry)%expr @
+ x @ x0 @
+ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ (Compile.reflect x5)
+ | None =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if
+ args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | None =>
+ match
+ match idc2 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal t5
+ v0 =>
+ match
+ t5 as t6
+ return
+ (base.base_interp
+ t6 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun v1 : Z
+ =>
+ Some v1
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun _ : nat
+ => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args3 =>
+ match
+ s2 as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t5 =>
+ fun
+ v0 :
+ defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a0
+ with
+ | Some
+ x'0 =>
+ if
+ args =?
+ 2
+ ^
+ Z.log2
+ args
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_add
+ (Z.log2
+ args)
+ (- args3))%expr @
+ (x1,
+ x'0 v0))%expr_pat
+ else
+ if
+ args =?
+ 2
+ ^
+ Z.log2
+ args
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_add
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#
+ (ident.Z_add_get_carry)%expr @
+ x @ x0 @
+ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#
+ (ident.Z_add_get_carry)%expr @
+ x @ x0 @
+ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @
+ x1)%expr_pat
+ end
+ (Compile.reflect
+ x5)
+ | None =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | None =>
+ if
+ args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s2 _ ($_)%expr _ @
+ _)%expr_pat |
+ (@expr.App _ _ _ s2 _
+ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _
+ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ match x0 with
+ | (@expr.App _ _ _ s2 _ #(idc2) x5 @ x4)%expr_pat =>
+ match
+ match idc2 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc3)%expr_pat =>
match
- s1 as t3
+ match idc3 with
+ | @ident.Literal t4 v =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s2 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t4 =>
+ fun
+ v : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ args2)%expr @
+ (x1, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | None =>
+ match
+ match idc2 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal t4 v =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s2 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t4 =>
+ fun
+ v : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2
+ args)
+ (- args2))%expr @
+ (x1, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value' true
+ d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s2 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.Abs _ _ _ _ _ _)
+ _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _
+ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ end
+ | ($_)%expr =>
+ match x0 with
+ | (@expr.App _ _ _ s2 _ #(idc1) x5 @ x4)%expr_pat =>
+ match
+ match idc1 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t4 v0 =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s2 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ args2)%expr @
+ (x1, x' v0))%expr_pat
+ else
+ if
+ args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | None =>
+ match
+ match idc1 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t4 v0 =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s2 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args2))%expr @
+ (x1, x' v0))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s2 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.LetIn _ _ _ _ _ _ _)
+ _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ | @expr.Abs _ _ _ _ _ _ =>
+ match x0 with
+ | (@expr.App _ _ _ s3 _ #(idc1) x5 @ x4)%expr_pat =>
+ match
+ match idc1 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s3 as t3
return
(Compile.value' false t3 ->
UnderLets.UnderLets base.type
ident var
- (expr
+ (defaults.expr
(type.base
(base.type.Z *
base.type.Z)%etype)))
with
| type.base t3 =>
- fun v0 : expr (type.base t3) =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
base.try_make_transport_cps
- (fun t1 : base.type =>
- expr (type.base t1)) t3
- base.type.Z
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4))
+ t3 base.type.Z
(UnderLets.UnderLets base.type
ident var
- (expr
+ (defaults.expr
(type.base
(base.type.Z *
base.type.Z)%etype)))
(fun
- a0 : option
- (expr (type.base t3) ->
- expr
- (type.base
- base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- if s =? 2 ^ Z.log2 s
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
(#(ident.fancy_add
- (Z.log2 s)
- (- args0))%expr @
- (x0, x'0 v0))%expr_pat
+ (Z.log2 args)
+ args2)%expr @
+ (x1, x' v))%expr_pat
else
- if s =? 2 ^ Z.log2 s
+ if
+ args =? 2 ^ Z.log2 args
then
UnderLets.Base
(#(ident.fancy_add
- (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete
- s)%expr @ x @ x0)%expr_pat
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
| None =>
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete
- s)%expr @ x @ x0)%expr_pat
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
end)
- | (s2 -> d1)%ptype =>
+ | (s4 -> d4)%ptype =>
fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4 =>
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete
- s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x2)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end (Compile.reflect x1)
- | None =>
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | None =>
+ match
+ match idc1 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s3 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args2))%expr @
+ (x1, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s3 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s3 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s3 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s3 _ (@expr.LetIn _ _ _ _ _ _ _)
+ _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ | (_ @ _)%expr_pat =>
+ match x0 with
+ | (@expr.App _ _ _ s3 _ #(idc1) x6 @ x5)%expr_pat =>
match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
+ match idc1 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s)
- (- args))%expr @ (x, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ | Some _ =>
+ match x5 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s3 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4))
+ t3 base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ args2)%expr @
+ (x1, x' v))%expr_pat
+ else
+ if
+ args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete
- s)%expr @ x @ x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end (Compile.reflect x1)
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | None =>
+ match
+ match idc1 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x5 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s3 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args2))%expr @
+ (x1, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s3 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s3 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s3 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s3 _ (@expr.LetIn _ _ _ _ _ _ _)
+ _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ | @expr.LetIn _ _ _ _ _ _ _ =>
+ match x0 with
+ | (@expr.App _ _ _ s2 _ #(idc1) x6 @ x5)%expr_pat =>
+ match
+ match idc1 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x5 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s2 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4))
+ t3 base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ args2)%expr @
+ (x1, x' v))%expr_pat
+ else
+ if
+ args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | None =>
+ match
+ match idc1 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x5 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s2 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args2))%expr @
+ (x1, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s2 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.LetIn _ _ _ _ _ _ _)
+ _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
end
end
- | @expr.App _ _ _ s1 _ ($_)%expr _ =>
+ | None =>
match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
+ match idc0 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
with
- | type.base t2 =>
- fun v0 : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) (- args))%expr @
- (x, x' v0))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ | Some _ =>
+ match x0 with
+ | #(_)%expr_pat =>
+ match x2 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v : defaults.expr (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x1)
- | @expr.App _ _ _ s1 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App
- _ _ _ s1 _ (_ @ _)%expr_pat _ =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) (- args))%expr @
- (x, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | ($_)%expr =>
+ match x2 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t3 v0 =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v0 : defaults.expr (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x' v0))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end)
- | (s3 -> d2)%ptype =>
- fun
- _ : Compile.value' false s3 ->
- Compile.value' true d2 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x1)
- | @expr.App _ _ _ s1 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) (- args))%expr @
- (x, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | (#(_) @ _)%expr_pat =>
+ match x2 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v : defaults.expr (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x1)
- | @expr.LetIn _ _ _ _ _ _ _ =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) (- args))%expr @
- (x, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | (($_)%expr @ _)%expr_pat =>
+ match x2 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t3 v0 =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v0 : defaults.expr (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x' v0))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end)
- | (s1 -> d0)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x1)
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | (@expr.Abs _ _ _ _ _ _ @ _)%expr_pat =>
+ match x2 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | (@expr.App _ _ _ s2 _ #(idc1) x5 @ x4)%expr_pat =>
+ match
+ match idc1 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s2 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4))
+ t3 base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ args2)%expr @
+ (x1, x' v))%expr_pat
+ else
+ match x2 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal t5
+ v0 =>
+ match
+ t5 as t6
+ return
+ (base.base_interp
+ t6 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun v1 : Z
+ =>
+ Some v1
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun _ : nat
+ => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args3 =>
+ match
+ s0 as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t5 =>
+ fun
+ v0 :
+ defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a0
+ with
+ | Some
+ x'0 =>
+ if
+ args =?
+ 2
+ ^
+ Z.log2
+ args
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_add
+ (Z.log2
+ args)
+ (- args3))%expr @
+ (x0,
+ x'0 v0))%expr_pat
+ else
+ if
+ args =?
+ 2
+ ^
+ Z.log2
+ args
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_add
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#
+ (ident.Z_add_get_carry)%expr @
+ x @ x0 @
+ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#
+ (ident.Z_add_get_carry)%expr @
+ x @ x0 @
+ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @
+ x1)%expr_pat
+ end
+ (Compile.reflect
+ x3)
+ | None =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ match x2 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal t4 v =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t4 =>
+ fun
+ v : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2
+ args)
+ (- args2))%expr @
+ (x0, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value' true
+ d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ end
+ | ($_)%expr =>
+ match x2 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t4 v0 =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args2))%expr @
+ (x0, x' v0))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | @expr.LetIn _ _ _ _ _ _ _ =>
+ match x2 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args2))%expr @
+ (x0, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ match x2 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args2))%expr @
+ (x0, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ end
+ | None =>
+ match
+ match idc1 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x2 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args2))%expr @
+ (x0, x' v))%expr_pat
+ else
+ match x4 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal
+ t5 v0 =>
+ match
+ t5 as t6
+ return
+ (base.base_interp
+ t6 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v1 : Z =>
+ Some v1
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args3 =>
+ match
+ s2 as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base
+ t5 =>
+ fun
+ v0 :
+ defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a0
+ with
+ | Some
+ x'0 =>
+ if
+ args =?
+ 2
+ ^
+ Z.log2
+ args
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_add
+ (Z.log2
+ args)
+ (- args3))%expr @
+ (x1,
+ x'0 v0))%expr_pat
+ else
+ if
+ args =?
+ 2
+ ^
+ Z.log2
+ args
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_add
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#
+ (ident.Z_add_get_carry)%expr @
+ x @ x0 @
+ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#
+ (ident.Z_add_get_carry)%expr @
+ x @ x0 @
+ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (#
+ (ident.Z_add_get_carry)%expr @
+ x @ x0 @
+ x1)%expr_pat
+ end
+ (Compile.reflect
+ x5)
+ | None =>
+ if
+ args =?
+ 2
+ ^ Z.log2
+ args
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_add
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#
+ (ident.Z_add_get_carry)%expr @
+ x @ x0 @
+ x1)%expr_pat
+ end
+ | _ =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ match x4 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal t4 v =>
+ match
+ t4 as t5
+ return
+ (base.base_interp
+ t5 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit =>
+ None
+ | base.type.Z =>
+ fun v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun _ : bool =>
+ None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s2 as t4
+ return
+ (Compile.value' false
+ t4 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t4 =>
+ fun
+ v : defaults.expr
+ (type.base t4)
+ =>
+ base.try_make_transport_cps
+ (fun t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2
+ ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2
+ args)
+ (- args2))%expr @
+ (x1, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2
+ ^ Z.log2
+ args
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_add
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#
+ (ident.Z_add_get_carry)%expr @
+ x @ x0 @
+ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ if
+ args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ end
+ | ($_)%expr =>
+ match x4 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t4 v0 =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s2 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4)
+ =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2
+ args)
+ (- args2))%expr @
+ (x1, x' v0))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value' true
+ d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | @expr.LetIn _ _ _ _ _ _ _ =>
+ match x4 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s2 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base
+ t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2
+ args)
+ (- args2))%expr @
+ (x1, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value' true
+ d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ match x4 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s2 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base
+ t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2
+ args)
+ (- args2))%expr @
+ (x1, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value'
+ false s4 ->
+ Compile.value' true
+ d4 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ end
+ | None =>
+ match x2 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ end
+ end
+ | (@expr.App _ _ _ s2 _ ($_)%expr _ @ _)%expr_pat =>
+ match x2 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t3 v0 =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v0 : defaults.expr (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x' v0))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | (@expr.App _ _ _ s2 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (_ @ _) _ @ _)%expr_pat =>
+ match x2 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | (@expr.App _ _ _ s2 _ (@expr.LetIn _ _ _ _ _ _ _)
+ _ @ _)%expr_pat =>
+ match x2 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | @expr.LetIn _ _ _ _ _ _ _ =>
+ match x2 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | _ =>
+ match x2 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ end
+ | None =>
+ match x0 with
+ | (@expr.App _ _ _ s2 _ #(idc1) x5 @ x4)%expr_pat =>
+ match
+ match idc1 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s2 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4))
+ t3 base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ args1)%expr @
+ (x1, x' v))%expr_pat
+ else
+ if
+ args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | None =>
+ match
+ match idc1 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s2 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args1))%expr @
+ (x1, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s2 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.LetIn _ _ _ _ _ _ _)
+ _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ end
end
- | None =>
- match x with
- | @expr.App _ _ _ s1 _ #(idc0)%expr_pat x2 =>
+ | (@expr.App _ _ _ s0 _ ($_)%expr _ @ _)%expr_pat =>
+ match x0 with
+ | (@expr.App _ _ _ s2 _ #(idc0) x5 @ x4)%expr_pat =>
match
match idc0 with
- | ident.Z_shiftl offset => Some offset
+ | ident.Z_shiftl => Some tt
| _ => None
end
with
- | Some args =>
- match
- s1 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
+ | Some _ =>
+ match x4 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t3 v0 =>
+ match
+ t3 as t4
+ return (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v1 : Z => Some v1
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s2 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v0 : defaults.expr (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) args1)%expr @
+ (x1, x' v0))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) args)%expr @
- (x0, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @
- x0)%expr_pat
- end (Compile.reflect x2)
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
| None =>
match
match idc0 with
- | ident.Z_shiftr offset => Some offset
+ | ident.Z_shiftr => Some tt
| _ => None
end
with
- | Some args =>
- match
- s1 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
+ | Some _ =>
+ match x4 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t3 v0 =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s2 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v0 : defaults.expr (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args1))%expr @
+ (x1, x' v0))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s)
- (- args))%expr @ (x0, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete
- s)%expr @ x @ x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end (Compile.reflect x2)
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
| None =>
- if s =? 2 ^ Z.log2 s
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @
- x0)%expr_pat
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
end
end
- | @expr.App _ _ _ s1 _ ($_)%expr _ | @expr.App _ _ _ s1 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s1 _
- (_ @ _)%expr_pat _ | @expr.App _ _ _ s1 _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if s =? 2 ^ Z.log2 s
+ | (@expr.App _ _ _ s2 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
| _ =>
- if s =? 2 ^ Z.log2 s
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
end
- end
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ =>
- match x with
- | @expr.App _ _ _ s1 _ #(idc)%expr_pat x2 =>
- match
- match idc with
- | ident.Z_shiftl offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s1 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v0 : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) args)%expr @
- (x0, x' v0))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ | (@expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat =>
+ match x0 with
+ | (@expr.App _ _ _ s3 _ #(idc0) x5 @ x4)%expr_pat =>
+ match
+ match idc0 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s3 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) args1)%expr @
+ (x1, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @
- x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @
- x0)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun _ : Compile.value' false s2 -> Compile.value' true d1
- =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x2)
- | None =>
- match
- match idc with
- | ident.Z_shiftr offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s1 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v0 : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) (- args))%expr @
- (x0, x' v0))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ | None =>
+ match
+ match idc0 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s3 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args1))%expr @
+ (x1, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x2)
- | None =>
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s3 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s3 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s3 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s3 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
end
- end
- | @expr.App _ _ _ s1 _ ($_)%expr _ | @expr.App _ _ _ s1 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s1 _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s1 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- | _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end
- | @expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ =>
- match x with
- | @expr.App _ _ _ s2 _ #(idc)%expr_pat x2 =>
- match
- match idc with
- | ident.Z_shiftl offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s2 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) args)%expr @
- (x0, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ | (@expr.App _ _ _ s0 _ (_ @ _) _ @ _)%expr_pat =>
+ match x0 with
+ | (@expr.App _ _ _ s3 _ #(idc0) x6 @ x5)%expr_pat =>
+ match
+ match idc0 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x5 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s3 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) args1)%expr @
+ (x1, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @
- x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @
- x0)%expr_pat
- end)
- | (s3 -> d2)%ptype =>
- fun _ : Compile.value' false s3 -> Compile.value' true d2
- =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x2)
- | None =>
- match
- match idc with
- | ident.Z_shiftr offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s2 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) (- args))%expr @
- (x0, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ | None =>
+ match
+ match idc0 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x5 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s3 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args1))%expr @
+ (x1, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end)
- | (s3 -> d2)%ptype =>
- fun
- _ : Compile.value' false s3 ->
- Compile.value' true d2 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x2)
- | None =>
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s3 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s3 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s3 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s3 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
end
- end
- | @expr.App _ _ _ s2 _ ($_)%expr _ | @expr.App _ _ _ s2 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s2 _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s2 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- | _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end
- | @expr.App _ _ _ s0 _ (_ @ _)%expr_pat _ =>
- match x with
- | @expr.App _ _ _ s2 _ #(idc)%expr_pat x3 =>
- match
- match idc with
- | ident.Z_shiftl offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s2 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) args)%expr @
- (x0, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ | (@expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ match x0 with
+ | (@expr.App _ _ _ s2 _ #(idc0) x6 @ x5)%expr_pat =>
+ match
+ match idc0 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x5 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s2 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) args1)%expr @
+ (x1, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @
- x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @
- x0)%expr_pat
- end)
- | (s3 -> d2)%ptype =>
- fun _ : Compile.value' false s3 -> Compile.value' true d2
- =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x3)
- | None =>
- match
- match idc with
- | ident.Z_shiftr offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s2 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) (- args))%expr @
- (x0, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ | None =>
+ match
+ match idc0 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x5 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s2 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args1))%expr @
+ (x1, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end)
- | (s3 -> d2)%ptype =>
- fun
- _ : Compile.value' false s3 ->
- Compile.value' true d2 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x3)
- | None =>
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s2 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
end
- end
- | @expr.App _ _ _ s2 _ ($_)%expr _ | @expr.App _ _ _ s2 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s2 _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s2 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- | _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end
- | @expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- match x with
- | @expr.App _ _ _ s1 _ #(idc)%expr_pat x3 =>
- match
- match idc with
- | ident.Z_shiftl offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s1 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) args)%expr @
- (x0, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ | (@expr.LetIn _ _ _ _ _ _ _ @ _)%expr_pat =>
+ match x0 with
+ | (@expr.App _ _ _ s1 _ #(idc0) x5 @ x4)%expr_pat =>
+ match
+ match idc0 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s1 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) args1)%expr @
+ (x1, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @
- x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @
- x0)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun _ : Compile.value' false s2 -> Compile.value' true d1
- =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x3)
- | None =>
- match
- match idc with
- | ident.Z_shiftr offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s1 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) (- args))%expr @
- (x0, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ | None =>
+ match
+ match idc0 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s1 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args1))%expr @
+ (x1, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x3)
- | None =>
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s1 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s1 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s1 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s1 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
end
- end
- | @expr.App _ _ _ s1 _ ($_)%expr _ | @expr.App _ _ _ s1 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s1 _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s1 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- | _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end
- | @expr.LetIn _ _ _ _ _ _ _ =>
- match x with
- | @expr.App _ _ _ s0 _ #(idc)%expr_pat x2 =>
- match
- match idc with
- | ident.Z_shiftl offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) args)%expr @
- (x0, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ | @expr.LetIn _ _ _ _ _ _ _ =>
+ match x0 with
+ | (@expr.App _ _ _ s0 _ #(idc0) x4 @ x3)%expr_pat =>
+ match
+ match idc0 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x3 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) args1)%expr @
+ (x1, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @
- x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @
- x0)%expr_pat
- end)
- | (s1 -> d0)%ptype =>
- fun _ : Compile.value' false s1 -> Compile.value' true d0
- =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x2)
- | None =>
- match
- match idc with
- | ident.Z_shiftr offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) (- args))%expr @
- (x0, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ | None =>
+ match
+ match idc0 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x3 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args)
+ (- args1))%expr @
+ (x1, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @
+ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @
- x @ x0)%expr_pat
- end)
- | (s1 -> d0)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x2)
- | None =>
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s0 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s0 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
+ (#(ident.fancy_add (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
end
end
- | @expr.App _ _ _ s0 _ ($_)%expr _ | @expr.App _ _ _ s0 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s0 _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
- | _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_add (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_get_carry_concrete s)%expr @ x @ x0)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
end
+ | _ =>
+ UnderLets.Base (#(ident.Z_add_get_carry)%expr @ x @ x0 @ x1)%expr_pat
end
| ident.Z_add_with_carry =>
- fun x x0 x1 : expr (type.base base.type.Z) =>
+ fun x x0 x1 : defaults.expr (type.base base.type.Z) =>
UnderLets.Base (#(ident.Z_add_with_carry)%expr @ x @ x0 @ x1)%expr_pat
| ident.Z_add_with_get_carry =>
- fun x x0 x1 x2 : expr (type.base base.type.Z) =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
-| ident.Z_add_with_get_carry_concrete s =>
- fun x x0 x1 : expr (type.base base.type.Z) =>
- match x1 with
- | #(_)%expr_pat =>
- match x0 with
- | @expr.App _ _ _ s0 _ #(idc0)%expr_pat x2 =>
- match
- match idc0 with
- | ident.Z_shiftl offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) args)%expr @
- (x, x1, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ fun x x0 x1 x2 : defaults.expr (type.base base.type.Z) =>
+ match x with
+ | #(idc)%expr_pat =>
+ match
+ match idc with
+ | @ident.Literal t0 v =>
+ match t0 as t1 return (base.base_interp t1 -> option Z) with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args =>
+ match x2 with
+ | #(_)%expr_pat =>
+ match x1 with
+ | (@expr.App _ _ _ s0 _ #(idc1) x4 @ x3)%expr_pat =>
+ match
+ match idc1 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v : defaults.expr (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) args1)%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s1 -> d0)%ptype =>
- fun _ : Compile.value' false s1 -> Compile.value' true d0
- =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @
- x1)%expr_pat
- end (Compile.reflect x2)
- | None =>
- match
- match idc0 with
- | ident.Z_shiftr offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) (- args))%expr @
- (x, x1, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ | None =>
+ match
+ match idc1 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v : defaults.expr (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s1 -> d0)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
- end (Compile.reflect x2)
- | None =>
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s0 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s0 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
end
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ | @expr.App _ _ _ s0 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s0 _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @ x1)%expr_pat
- | _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @ x1)%expr_pat
- end
- | ($_)%expr =>
- match x0 with
- | @expr.App _ _ _ s0 _ #(idc)%expr_pat x2 =>
- match
- match idc with
- | ident.Z_shiftl offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v0 : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) args)%expr @
- (x, x1, x' v0))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ | ($_)%expr =>
+ match x1 with
+ | (@expr.App _ _ _ s0 _ #(idc0) x4 @ x3)%expr_pat =>
+ match
+ match idc0 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x3 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t3 v0 =>
+ match
+ t3 as t4
+ return (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v1 : Z => Some v1
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v0 : defaults.expr (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) args1)%expr @
+ (x0, x2, x' v0))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s1 -> d0)%ptype =>
- fun _ : Compile.value' false s1 -> Compile.value' true d0
- =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @
- x1)%expr_pat
- end (Compile.reflect x2)
- | None =>
- match
- match idc with
- | ident.Z_shiftr offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v0 : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) (- args))%expr @
- (x, x1, x' v0))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ | None =>
+ match
+ match idc0 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x3 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t3 v0 =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v0 : defaults.expr (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x2, x' v0))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s1 -> d0)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
- end (Compile.reflect x2)
- | None =>
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s0 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s0 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
end
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ | @expr.App _ _ _ s0 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s0 _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @ x1)%expr_pat
- | _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @ x1)%expr_pat
- end
- | @expr.Abs _ _ _ _ _ _ =>
- match x0 with
- | @expr.App _ _ _ s1 _ #(idc)%expr_pat x2 =>
- match
- match idc with
- | ident.Z_shiftl offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s1 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) args)%expr @
- (x, x1, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ | @expr.Abs _ _ _ _ _ _ =>
+ match x1 with
+ | (@expr.App _ _ _ s1 _ #(idc0) x4 @ x3)%expr_pat =>
+ match
+ match idc0 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x3 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s1 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) args1)%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun _ : Compile.value' false s2 -> Compile.value' true d1
- =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @
- x1)%expr_pat
- end (Compile.reflect x2)
- | None =>
- match
- match idc with
- | ident.Z_shiftr offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s1 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) (- args))%expr @
- (x, x1, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ | None =>
+ match
+ match idc0 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x3 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s1 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
- end (Compile.reflect x2)
- | None =>
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s1 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s1 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s1 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s1 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
end
- end
- | @expr.App _ _ _ s1 _ ($_)%expr _ | @expr.App _ _ _ s1 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s1 _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s1 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @ x1)%expr_pat
- | _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @ x1)%expr_pat
- end
- | @expr.App _ _ _ s0 _ #(idc)%expr_pat x2 =>
- match
- match idc with
- | ident.Z_shiftl offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) args)%expr @
- (x, x0, x' v))%expr_pat
- else
- match x0 with
- | @expr.App _ _ _ s1 _ #(idc0)%expr_pat x3 =>
+ | (#(_) @ _)%expr_pat =>
+ match x1 with
+ | (@expr.App _ _ _ s1 _ #(idc1) x5 @ x4)%expr_pat =>
+ match
+ match idc1 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc2)%expr_pat =>
match
- match idc0 with
- | ident.Z_shiftl offset => Some offset
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
| _ => None
end
with
- | Some args0 =>
+ | Some args1 =>
match
s1 as t3
return
(Compile.value' false t3 ->
UnderLets.UnderLets base.type ident var
- (expr
+ (defaults.expr
(type.base
(base.type.Z * base.type.Z)%etype)))
with
| type.base t3 =>
- fun v0 : expr (type.base t3) =>
+ fun v : defaults.expr (type.base t3) =>
base.try_make_transport_cps
- (fun t1 : base.type =>
- expr (type.base t1)) t3 base.type.Z
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
(UnderLets.UnderLets base.type ident
var
- (expr
+ (defaults.expr
(type.base
(base.type.Z * base.type.Z)%etype)))
(fun
- a0 : option
- (expr (type.base t3) ->
- expr (type.base base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- if s =? 2 ^ Z.log2 s
+ a : option
+ (defaults.expr (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s)
- args0)%expr @
- (x, x1, x'0 v0))%expr_pat
+ (#(ident.fancy_addc
+ (Z.log2 args) args1)%expr @
+ (x0, x2, x' v))%expr_pat
else
- if s =? 2 ^ Z.log2 s
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s)
- 0)%expr @ (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete
- s)%expr @ x @ x0 @ x1)%expr_pat
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
| None =>
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete
- s)%expr @ x @ x0 @ x1)%expr_pat
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
end)
- | (s2 -> d1)%ptype =>
+ | (s2 -> d2)%ptype =>
fun
_ : Compile.value' false s2 ->
- Compile.value' true d1 =>
+ Compile.value' true d2 =>
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete
- s)%expr @ x @ x0 @ x1)%expr_pat
- end (Compile.reflect x3)
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x5)
| None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ | None =>
+ match
+ match idc1 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc2)%expr_pat =>
match
- match idc0 with
- | ident.Z_shiftr offset => Some offset
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
| _ => None
end
with
- | Some args0 =>
+ | Some args1 =>
match
s1 as t3
return
(Compile.value' false t3 ->
UnderLets.UnderLets base.type ident
var
- (expr
+ (defaults.expr
(type.base
(base.type.Z * base.type.Z)%etype)))
with
| type.base t3 =>
- fun v0 : expr (type.base t3) =>
+ fun v : defaults.expr (type.base t3)
+ =>
base.try_make_transport_cps
- (fun t1 : base.type =>
- expr (type.base t1)) t3
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
base.type.Z
(UnderLets.UnderLets base.type
ident var
- (expr
+ (defaults.expr
(type.base
(base.type.Z * base.type.Z)%etype)))
(fun
- a0 : option
- (expr (type.base t3) ->
- expr
- (type.base base.type.Z))
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z))
=>
- match a0 with
- | Some x'0 =>
- if s =? 2 ^ Z.log2 s
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
(#(ident.fancy_addc
- (Z.log2 s) (- args0))%expr @
- (x, x1, x'0 v0))%expr_pat
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x2, x' v))%expr_pat
else
- if s =? 2 ^ Z.log2 s
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
(#(ident.fancy_addc
- (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete
- s)%expr @ x @ x0 @ x1)%expr_pat
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
| None =>
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete
- s)%expr @ x @ x0 @ x1)%expr_pat
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
end)
- | (s2 -> d1)%ptype =>
+ | (s2 -> d2)%ptype =>
fun
_ : Compile.value' false s2 ->
- Compile.value' true d1 =>
+ Compile.value' true d2 =>
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete
- s)%expr @ x @ x0 @ x1)%expr_pat
- end (Compile.reflect x3)
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x5)
| None =>
- if s =? 2 ^ Z.log2 s
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete
- s)%expr @ x @ x0 @ x1)%expr_pat
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
end
- | @expr.App _ _ _ s1 _ ($_)%expr _ | @expr.App _ _ _
- s1 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s1
- _ (_ @ _)%expr_pat _ | @expr.App _ _ _ s1 _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | _ =>
- if s =? 2 ^ Z.log2 s
+ | None =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
end
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
- end)
- | (s1 -> d0)%ptype =>
- fun _ : Compile.value' false s1 -> Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @
- x1)%expr_pat
- end (Compile.reflect x2)
- | None =>
- match
- match idc with
- | ident.Z_shiftr offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match x0 with
- | #(_)%expr_pat =>
+ end
+ | (@expr.App _ _ _ s1 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s1 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s1 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s1 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | (($_)%expr @ _)%expr_pat =>
+ match x1 with
+ | (@expr.App _ _ _ s1 _ #(idc0) x5 @ x4)%expr_pat =>
match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
+ match idc0 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) (- args))%expr @
- (x, x0, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ | Some _ =>
+ match x4 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t3 v0 =>
+ match
+ t3 as t4
+ return (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v1 : Z => Some v1
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s1 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v0 : defaults.expr (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) args1)%expr @
+ (x0, x2, x' v0))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s1 -> d0)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
- end (Compile.reflect x2)
- | ($_)%expr =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v0 : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) (- args))%expr @
- (x, x0, x' v0))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ | None =>
+ match
+ match idc0 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t3 v0 =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s1 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v0 : defaults.expr (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x2, x' v0))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s1 -> d0)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
- end (Compile.reflect x2)
- | @expr.Abs _ _ _ _ _ _ =>
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s1 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s1 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s1 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s1 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | (@expr.Abs _ _ _ _ _ _ @ _)%expr_pat =>
+ match x1 with
+ | (@expr.App _ _ _ s2 _ #(idc0) x5 @ x4)%expr_pat =>
match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
+ match idc0 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) (- args))%expr @
- (x, x0, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ | Some _ =>
+ match x4 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s2 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) args1)%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
- end (Compile.reflect x2)
- | @expr.App _ _ _ s1 _ #(idc0)%expr_pat x3 =>
- match
- match idc0 with
- | ident.Z_shiftl offset => Some offset
- | _ => None
- end
- with
- | Some args0 =>
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ | None =>
match
- s1 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
+ match idc0 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) args0)%expr @
- (x, x1, x' v))%expr_pat
- else
+ | Some _ =>
+ match x4 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
match
- s0 as t3
+ s2 as t2
return
- (Compile.value' false t3 ->
+ (Compile.value' false t2 ->
UnderLets.UnderLets base.type ident
var
- (expr
+ (defaults.expr
(type.base
(base.type.Z * base.type.Z)%etype)))
with
- | type.base t3 =>
- fun v0 : expr (type.base t3) =>
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
base.try_make_transport_cps
- (fun t1 : base.type =>
- expr (type.base t1)) t3
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
base.type.Z
(UnderLets.UnderLets base.type
ident var
- (expr
+ (defaults.expr
(type.base
(base.type.Z * base.type.Z)%etype)))
(fun
- a0 : option
- (expr (type.base t3) ->
- expr
- (type.base base.type.Z))
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
=>
- match a0 with
- | Some x'0 =>
- if s =? 2 ^ Z.log2 s
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
(#(ident.fancy_addc
- (Z.log2 s) (- args))%expr @
- (x, x0, x'0 v0))%expr_pat
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x2, x' v))%expr_pat
else
- if s =? 2 ^ Z.log2 s
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
(#(ident.fancy_addc
- (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete
- s)%expr @ x @ x0 @ x1)%expr_pat
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
| None =>
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete
- s)%expr @ x @ x0 @ x1)%expr_pat
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
end)
- | (s2 -> d1)%ptype =>
+ | (s3 -> d3)%ptype =>
fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete
- s)%expr @ x @ x0 @ x1)%expr_pat
- end (Compile.reflect x2)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end (Compile.reflect x3)
- | None =>
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s2 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | (@expr.App _ _ _ s0 _ #(idc0) x4 @ x3)%expr_pat =>
+ match
+ match idc0 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x3 with
+ | #(idc1)%expr_pat =>
match
- match idc0 with
- | ident.Z_shiftr offset => Some offset
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
| _ => None
end
with
- | Some args0 =>
+ | Some args1 =>
match
s0 as t2
return
(Compile.value' false t2 ->
UnderLets.UnderLets base.type ident var
- (expr
+ (defaults.expr
(type.base
(base.type.Z * base.type.Z)%etype)))
with
| type.base t2 =>
- fun v : expr (type.base t2) =>
+ fun v : defaults.expr (type.base t2) =>
base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1))
- t2 base.type.Z
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
(UnderLets.UnderLets base.type ident var
- (expr
+ (defaults.expr
(type.base
(base.type.Z * base.type.Z)%etype)))
(fun
a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
match a with
| Some x' =>
- if s =? 2 ^ Z.log2 s
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s)
- (- args))%expr @ (x, x0, x' v))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args)
+ args1)%expr @ (x0, x1, x' v))%expr_pat
else
+ match x1 with
+ | (@expr.App _ _ _ s2 _ #(idc2) x6 @
+ x5)%expr_pat =>
+ match
+ match idc2 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x5 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal t5
+ v0 =>
+ match
+ t5 as t6
+ return
+ (base.base_interp
+ t6 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit =>
+ None
+ | base.type.Z =>
+ fun v1 : Z =>
+ Some v1
+ | base.type.bool =>
+ fun _ : bool =>
+ None
+ | base.type.nat =>
+ fun _ : nat =>
+ None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args3 =>
+ match
+ s2 as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t5 =>
+ fun
+ v0 : defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if
+ args =?
+ 2
+ ^
+ Z.log2
+ args
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_addc
+ (Z.log2
+ args)
+ args3)%expr @
+ (x0, x2,
+ x'0 v0))%expr_pat
+ else
+ if
+ args =?
+ 2
+ ^
+ Z.log2
+ args
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_addc
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1,
+ x2))%expr_pat
+ else
+ UnderLets.Base
+ (#
+ (ident.Z_add_with_get_carry)%expr @
+ x @ x0 @
+ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#
+ (ident.Z_add_with_get_carry)%expr @
+ x @ x0 @
+ x1 @ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @
+ x2)%expr_pat
+ end
+ (Compile.reflect x6)
+ | None =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if
+ args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ match
+ match idc2 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x5 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal t5
+ v0 =>
+ match
+ t5 as t6
+ return
+ (base.base_interp
+ t6 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun v1 : Z
+ =>
+ Some v1
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun _ : nat
+ => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args3 =>
+ match
+ s2 as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t5 =>
+ fun
+ v0 :
+ defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a0
+ with
+ | Some
+ x'0 =>
+ if
+ args =?
+ 2
+ ^
+ Z.log2
+ args
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_addc
+ (Z.log2
+ args)
+ (- args3))%expr @
+ (x0, x2,
+ x'0 v0))%expr_pat
+ else
+ if
+ args =?
+ 2
+ ^
+ Z.log2
+ args
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_addc
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1,
+ x2))%expr_pat
+ else
+ UnderLets.Base
+ (#
+ (ident.Z_add_with_get_carry)%expr @
+ x @ x0 @
+ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#
+ (ident.Z_add_with_get_carry)%expr @
+ x @ x0 @
+ x1 @ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ (Compile.reflect
+ x6)
+ | None =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @
+ x2)%expr_pat
+ end
+ | _ =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ if
+ args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s2 _ ($_)%expr _ @
+ _)%expr_pat |
+ (@expr.App _ _ _ s2 _
+ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _
+ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ match x1 with
+ | (@expr.App _ _ _ s2 _ #(idc2) x6 @ x5)%expr_pat =>
+ match
+ match idc2 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x5 with
+ | #(idc3)%expr_pat =>
match
- s1 as t3
+ match idc3 with
+ | @ident.Literal t4 v =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s2 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t4 =>
+ fun
+ v : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ args2)%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args)
+ 0)%expr @ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ match
+ match idc2 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x5 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal t4 v =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s2 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t4 =>
+ fun
+ v : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2
+ args)
+ (- args2))%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @
+ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @
+ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value' true
+ d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args)
+ 0)%expr @ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s2 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.Abs _ _ _ _ _ _)
+ _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _
+ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ end
+ | ($_)%expr =>
+ match x1 with
+ | (@expr.App _ _ _ s2 _ #(idc1) x6 @ x5)%expr_pat =>
+ match
+ match idc1 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x5 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t4 v0 =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s2 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ args2)%expr @
+ (x0, x2, x' v0))%expr_pat
+ else
+ if
+ args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args)
+ 0)%expr @ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ match
+ match idc1 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x5 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t4 v0 =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s2 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args2))%expr @
+ (x0, x2, x' v0))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args)
+ 0)%expr @ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s2 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.LetIn _ _ _ _ _ _ _)
+ _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ | @expr.Abs _ _ _ _ _ _ =>
+ match x1 with
+ | (@expr.App _ _ _ s3 _ #(idc1) x6 @ x5)%expr_pat =>
+ match
+ match idc1 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x5 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s3 as t3
return
(Compile.value' false t3 ->
UnderLets.UnderLets base.type
ident var
- (expr
+ (defaults.expr
(type.base
(base.type.Z *
base.type.Z)%etype)))
with
| type.base t3 =>
- fun v0 : expr (type.base t3) =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
base.try_make_transport_cps
- (fun t1 : base.type =>
- expr (type.base t1)) t3
- base.type.Z
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4))
+ t3 base.type.Z
(UnderLets.UnderLets base.type
ident var
- (expr
+ (defaults.expr
(type.base
(base.type.Z *
base.type.Z)%etype)))
(fun
- a0 : option
- (expr (type.base t3) ->
- expr
- (type.base
- base.type.Z))
- =>
- match a0 with
- | Some x'0 =>
- if s =? 2 ^ Z.log2 s
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
(#(ident.fancy_addc
- (Z.log2 s)
- (- args0))%expr @
- (x, x1, x'0 v0))%expr_pat
+ (Z.log2 args)
+ args2)%expr @
+ (x0, x2, x' v))%expr_pat
else
- if s =? 2 ^ Z.log2 s
+ if
+ args =? 2 ^ Z.log2 args
then
UnderLets.Base
(#(ident.fancy_addc
- (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete
- s)%expr @ x @ x0 @
- x1)%expr_pat
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
| None =>
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete
- s)%expr @ x @ x0 @
- x1)%expr_pat
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
end)
- | (s2 -> d1)%ptype =>
+ | (s4 -> d4)%ptype =>
fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4 =>
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete
- s)%expr @ x @ x0 @ x1)%expr_pat
- end (Compile.reflect x3)
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete
- s)%expr @ x @ x0 @ x1)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end (Compile.reflect x2)
- | None =>
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args)
+ 0)%expr @ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ match
+ match idc1 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x5 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s3 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args2))%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args)
+ 0)%expr @ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s3 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s3 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s3 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s3 _ (@expr.LetIn _ _ _ _ _ _ _)
+ _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ | (_ @ _)%expr_pat =>
+ match x1 with
+ | (@expr.App _ _ _ s3 _ #(idc1) x7 @ x6)%expr_pat =>
match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
+ match idc1 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s)
- (- args))%expr @ (x, x0, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ | Some _ =>
+ match x6 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s3 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4))
+ t3 base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ args2)%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if
+ args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x7)
+ | None =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args)
+ 0)%expr @ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete
- s)%expr @ x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete
- s)%expr @ x @ x0 @ x1)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end (Compile.reflect x2)
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ match
+ match idc1 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x6 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s3 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args2))%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x7)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args)
+ 0)%expr @ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s3 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s3 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s3 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s3 _ (@expr.LetIn _ _ _ _ _ _ _)
+ _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ | @expr.LetIn _ _ _ _ _ _ _ =>
+ match x1 with
+ | (@expr.App _ _ _ s2 _ #(idc1) x7 @ x6)%expr_pat =>
+ match
+ match idc1 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x6 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s2 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4))
+ t3 base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ args2)%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if
+ args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x7)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args)
+ 0)%expr @ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ match
+ match idc1 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x6 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s2 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args2))%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x7)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args)
+ 0)%expr @ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s2 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.LetIn _ _ _ _ _ _ _)
+ _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
end
end
- | @expr.App _ _ _ s1 _ ($_)%expr _ =>
+ | None =>
match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
+ match idc0 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
with
- | type.base t2 =>
- fun v0 : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) (- args))%expr @
- (x, x0, x' v0))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ | Some _ =>
+ match x1 with
+ | #(_)%expr_pat =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v : defaults.expr (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x1, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
- end (Compile.reflect x2)
- | @expr.App _ _ _ s1 _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App
- _ _ _ s1 _ (_ @ _)%expr_pat _ =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) (- args))%expr @
- (x, x0, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | ($_)%expr =>
+ match x3 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t3 v0 =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v0 : defaults.expr (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x1, x' v0))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s3 -> d2)%ptype =>
- fun
- _ : Compile.value' false s3 ->
- Compile.value' true d2 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
- end (Compile.reflect x2)
- | @expr.App _ _ _ s1 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) (- args))%expr @
- (x, x0, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | (#(_) @ _)%expr_pat =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v : defaults.expr (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x1, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
- end (Compile.reflect x2)
- | @expr.LetIn _ _ _ _ _ _ _ =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) (- args))%expr @
- (x, x0, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | (($_)%expr @ _)%expr_pat =>
+ match x3 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t3 v0 =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v0 : defaults.expr (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x1, x' v0))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s1 -> d0)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
- end (Compile.reflect x2)
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | (@expr.Abs _ _ _ _ _ _ @ _)%expr_pat =>
+ match x3 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x1, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | (@expr.App _ _ _ s2 _ #(idc1) x6 @ x5)%expr_pat =>
+ match
+ match idc1 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x5 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s2 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4))
+ t3 base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ args2)%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ match x3 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal t5
+ v0 =>
+ match
+ t5 as t6
+ return
+ (base.base_interp
+ t6 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun v1 : Z
+ =>
+ Some v1
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun _ : nat
+ => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args3 =>
+ match
+ s0 as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t5 =>
+ fun
+ v0 :
+ defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a0
+ with
+ | Some
+ x'0 =>
+ if
+ args =?
+ 2
+ ^
+ Z.log2
+ args
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_addc
+ (Z.log2
+ args)
+ (- args3))%expr @
+ (x0, x1,
+ x'0 v0))%expr_pat
+ else
+ if
+ args =?
+ 2
+ ^
+ Z.log2
+ args
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_addc
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1,
+ x2))%expr_pat
+ else
+ UnderLets.Base
+ (#
+ (ident.Z_add_with_get_carry)%expr @
+ x @ x0 @
+ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#
+ (ident.Z_add_with_get_carry)%expr @
+ x @ x0 @
+ x1 @ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ (Compile.reflect
+ x4)
+ | None =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @
+ x2)%expr_pat
+ end
+ | _ =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ match x3 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal t4 v =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t4 =>
+ fun
+ v : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2
+ args)
+ (- args2))%expr @
+ (x0, x1, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @
+ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @
+ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value' true
+ d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ end
+ | ($_)%expr =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t4 v0 =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4) =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args2))%expr @
+ (x0, x1, x' v0))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args)
+ 0)%expr @ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | @expr.LetIn _ _ _ _ _ _ _ =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args2))%expr @
+ (x0, x1, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args)
+ 0)%expr @ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args2))%expr @
+ (x0, x1, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args)
+ 0)%expr @ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ end
+ | None =>
+ match
+ match idc1 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args2))%expr @
+ (x0, x1, x' v))%expr_pat
+ else
+ match x5 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal
+ t5 v0 =>
+ match
+ t5 as t6
+ return
+ (base.base_interp
+ t6 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun
+ _ : unit
+ => None
+ | base.type.Z =>
+ fun
+ v1 : Z =>
+ Some v1
+ | base.type.bool =>
+ fun
+ _ : bool
+ => None
+ | base.type.nat =>
+ fun
+ _ : nat
+ => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args3 =>
+ match
+ s2 as t5
+ return
+ (Compile.value'
+ false t5 ->
+ UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base
+ t5 =>
+ fun
+ v0 :
+ defaults.expr
+ (type.base
+ t5) =>
+ base.try_make_transport_cps
+ (fun
+ t6 : base.type
+ =>
+ defaults.expr
+ (type.base
+ t6)) t5
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a0 :
+ option
+ (defaults.expr
+ (type.base
+ t5) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match
+ a0
+ with
+ | Some
+ x'0 =>
+ if
+ args =?
+ 2
+ ^
+ Z.log2
+ args
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_addc
+ (Z.log2
+ args)
+ (- args3))%expr @
+ (x0, x2,
+ x'0 v0))%expr_pat
+ else
+ if
+ args =?
+ 2
+ ^
+ Z.log2
+ args
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_addc
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1,
+ x2))%expr_pat
+ else
+ UnderLets.Base
+ (#
+ (ident.Z_add_with_get_carry)%expr @
+ x @ x0 @
+ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#
+ (ident.Z_add_with_get_carry)%expr @
+ x @ x0 @
+ x1 @ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ :
+ Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3
+ =>
+ UnderLets.Base
+ (#
+ (ident.Z_add_with_get_carry)%expr @
+ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ (Compile.reflect
+ x6)
+ | None =>
+ if
+ args =?
+ 2
+ ^ Z.log2
+ args
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_addc
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1,
+ x2))%expr_pat
+ else
+ UnderLets.Base
+ (#
+ (ident.Z_add_with_get_carry)%expr @
+ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @
+ x2)%expr_pat
+ end
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ match x5 with
+ | #(idc3)%expr_pat =>
+ match
+ match idc3 with
+ | @ident.Literal t4 v =>
+ match
+ t4 as t5
+ return
+ (base.base_interp
+ t5 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit =>
+ None
+ | base.type.Z =>
+ fun v0 : Z =>
+ Some v0
+ | base.type.bool =>
+ fun _ : bool =>
+ None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s2 as t4
+ return
+ (Compile.value' false
+ t4 ->
+ UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t4 =>
+ fun
+ v : defaults.expr
+ (type.base t4)
+ =>
+ base.try_make_transport_cps
+ (fun t5 : base.type
+ =>
+ defaults.expr
+ (type.base t5))
+ t4 base.type.Z
+ (UnderLets.UnderLets
+ base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2
+ ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2
+ args)
+ (- args2))%expr @
+ (x0, x2,
+ x' v))%expr_pat
+ else
+ if
+ args =?
+ 2
+ ^ Z.log2
+ args
+ then
+ UnderLets.Base
+ (#
+ (ident.fancy_addc
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1,
+ x2))%expr_pat
+ else
+ UnderLets.Base
+ (#
+ (ident.Z_add_with_get_carry)%expr @
+ x @ x0 @
+ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @
+ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value'
+ true d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if
+ args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ end
+ | ($_)%expr =>
+ match x5 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t4 v0 =>
+ match
+ t4 as t5
+ return
+ (base.base_interp t5 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s2 as t4
+ return
+ (Compile.value' false t4 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t4 =>
+ fun
+ v0 : defaults.expr
+ (type.base t4)
+ =>
+ base.try_make_transport_cps
+ (fun t5 : base.type =>
+ defaults.expr
+ (type.base t5)) t4
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base
+ t4) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2
+ args)
+ (- args2))%expr @
+ (x0, x2,
+ x' v0))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @
+ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @
+ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value' true
+ d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | @expr.LetIn _ _ _ _ _ _ _ =>
+ match x5 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s2 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base
+ t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2
+ args)
+ (- args2))%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @
+ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @
+ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value'
+ false s3 ->
+ Compile.value' true
+ d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ match x5 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args2 =>
+ match
+ s2 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base
+ t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2
+ args)
+ (- args2))%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2
+ args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @
+ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @
+ x2)%expr_pat
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value'
+ false s4 ->
+ Compile.value' true
+ d4 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ end
+ | None =>
+ match x3 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x1, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args)
+ 0)%expr @ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ end
+ end
+ | (@expr.App _ _ _ s2 _ ($_)%expr _ @ _)%expr_pat =>
+ match x3 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t3 v0 =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v0 : defaults.expr (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x1, x' v0))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | (@expr.App _ _ _ s2 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (_ @ _) _ @ _)%expr_pat =>
+ match x3 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x1, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | (@expr.App _ _ _ s2 _ (@expr.LetIn _ _ _ _ _ _ _)
+ _ @ _)%expr_pat =>
+ match x3 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x1, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | @expr.LetIn _ _ _ _ _ _ _ =>
+ match x3 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x1, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ match x3 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x1, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ end
+ | None =>
+ match x1 with
+ | (@expr.App _ _ _ s2 _ #(idc1) x6 @ x5)%expr_pat =>
+ match
+ match idc1 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x5 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s2 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4))
+ t3 base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ args1)%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if
+ args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args)
+ 0)%expr @ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ match
+ match idc1 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x5 with
+ | #(idc2)%expr_pat =>
+ match
+ match idc2 with
+ | @ident.Literal t3 v =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s2 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun
+ v : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z *
+ base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if
+ args =?
+ 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3
+ =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args)
+ 0)%expr @ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s2 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.LetIn _ _ _ _ _ _ _)
+ _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ end
end
- | None =>
- match x0 with
- | @expr.App _ _ _ s1 _ #(idc0)%expr_pat x3 =>
+ | (@expr.App _ _ _ s0 _ ($_)%expr _ @ _)%expr_pat =>
+ match x1 with
+ | (@expr.App _ _ _ s2 _ #(idc0) x6 @ x5)%expr_pat =>
match
match idc0 with
- | ident.Z_shiftl offset => Some offset
+ | ident.Z_shiftl => Some tt
| _ => None
end
with
- | Some args =>
- match
- s1 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
+ | Some _ =>
+ match x5 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t3 v0 =>
+ match
+ t3 as t4
+ return (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v1 : Z => Some v1
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s2 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v0 : defaults.expr (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) args1)%expr @
+ (x0, x2, x' v0))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) args)%expr @
- (x, x1, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete
- s)%expr @ x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end (Compile.reflect x3)
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
| None =>
match
match idc0 with
- | ident.Z_shiftr offset => Some offset
+ | ident.Z_shiftr => Some tt
| _ => None
end
with
- | Some args =>
- match
- s1 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1))
- t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base
- (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
+ | Some _ =>
+ match x5 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t3 v0 =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s2 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t3 =>
+ fun v0 : defaults.expr (type.base t3)
+ =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x2, x' v0))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s)
- (- args))%expr @ (x, x1, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete
- s)%expr @ x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete
- s)%expr @ x @ x0 @ x1)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end (Compile.reflect x3)
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
| None =>
- if s =? 2 ^ Z.log2 s
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
end
end
- | @expr.App _ _ _ s1 _ ($_)%expr _ | @expr.App _ _ _ s1 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s1 _
- (_ @ _)%expr_pat _ | @expr.App _ _ _ s1 _
- (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if s =? 2 ^ Z.log2 s
+ | (@expr.App _ _ _ s2 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
| _ =>
- if s =? 2 ^ Z.log2 s
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
end
- end
- end
- | @expr.App _ _ _ s0 _ ($_)%expr _ =>
- match x0 with
- | @expr.App _ _ _ s1 _ #(idc)%expr_pat x3 =>
- match
- match idc with
- | ident.Z_shiftl offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s1 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v0 : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) args)%expr @
- (x, x1, x' v0))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ | (@expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat =>
+ match x1 with
+ | (@expr.App _ _ _ s3 _ #(idc0) x6 @ x5)%expr_pat =>
+ match
+ match idc0 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x5 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s3 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) args1)%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun _ : Compile.value' false s2 -> Compile.value' true d1
- =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @
- x1)%expr_pat
- end (Compile.reflect x3)
- | None =>
- match
- match idc with
- | ident.Z_shiftr offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s1 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v0 : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t1 : base.type => expr (type.base t1)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) (- args))%expr @
- (x, x1, x' v0))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ | None =>
+ match
+ match idc0 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x5 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s3 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
- end (Compile.reflect x3)
- | None =>
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s3 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s3 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s3 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s3 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
end
- end
- | @expr.App _ _ _ s1 _ ($_)%expr _ | @expr.App _ _ _ s1 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s1 _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s1 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @ x1)%expr_pat
- | _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @ x1)%expr_pat
- end
- | @expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ =>
- match x0 with
- | @expr.App _ _ _ s2 _ #(idc)%expr_pat x3 =>
- match
- match idc with
- | ident.Z_shiftl offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s2 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) args)%expr @
- (x, x1, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ | (@expr.App _ _ _ s0 _ (_ @ _) _ @ _)%expr_pat =>
+ match x1 with
+ | (@expr.App _ _ _ s3 _ #(idc0) x7 @ x6)%expr_pat =>
+ match
+ match idc0 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x6 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s3 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) args1)%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x7)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s3 -> d2)%ptype =>
- fun _ : Compile.value' false s3 -> Compile.value' true d2
- =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @
- x1)%expr_pat
- end (Compile.reflect x3)
- | None =>
- match
- match idc with
- | ident.Z_shiftr offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s2 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) (- args))%expr @
- (x, x1, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ | None =>
+ match
+ match idc0 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x6 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s3 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s4 -> d4)%ptype =>
+ fun
+ _ : Compile.value' false s4 ->
+ Compile.value' true d4 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x7)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s3 -> d2)%ptype =>
- fun
- _ : Compile.value' false s3 ->
- Compile.value' true d2 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
- end (Compile.reflect x3)
- | None =>
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s3 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s3 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s3 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s3 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
end
- end
- | @expr.App _ _ _ s2 _ ($_)%expr _ | @expr.App _ _ _ s2 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s2 _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s2 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @ x1)%expr_pat
- | _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @ x1)%expr_pat
- end
- | @expr.App _ _ _ s0 _ (_ @ _)%expr_pat _ =>
- match x0 with
- | @expr.App _ _ _ s2 _ #(idc)%expr_pat x4 =>
- match
- match idc with
- | ident.Z_shiftl offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s2 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) args)%expr @
- (x, x1, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ | (@expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ match x1 with
+ | (@expr.App _ _ _ s2 _ #(idc0) x7 @ x6)%expr_pat =>
+ match
+ match idc0 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x6 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s2 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) args1)%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x7)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s3 -> d2)%ptype =>
- fun _ : Compile.value' false s3 -> Compile.value' true d2
- =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @
- x1)%expr_pat
- end (Compile.reflect x4)
- | None =>
- match
- match idc with
- | ident.Z_shiftr offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s2 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) (- args))%expr @
- (x, x1, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ | None =>
+ match
+ match idc0 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x6 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s2 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s3 -> d3)%ptype =>
+ fun
+ _ : Compile.value' false s3 ->
+ Compile.value' true d3 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x7)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s3 -> d2)%ptype =>
- fun
- _ : Compile.value' false s3 ->
- Compile.value' true d2 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
- end (Compile.reflect x4)
- | None =>
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s2 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s2 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
end
- end
- | @expr.App _ _ _ s2 _ ($_)%expr _ | @expr.App _ _ _ s2 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s2 _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s2 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @ x1)%expr_pat
- | _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @ x1)%expr_pat
- end
- | @expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- match x0 with
- | @expr.App _ _ _ s1 _ #(idc)%expr_pat x4 =>
- match
- match idc with
- | ident.Z_shiftl offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s1 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) args)%expr @
- (x, x1, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ | (@expr.LetIn _ _ _ _ _ _ _ @ _)%expr_pat =>
+ match x1 with
+ | (@expr.App _ _ _ s1 _ #(idc0) x6 @ x5)%expr_pat =>
+ match
+ match idc0 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x5 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s1 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) args1)%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun _ : Compile.value' false s2 -> Compile.value' true d1
- =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @
- x1)%expr_pat
- end (Compile.reflect x4)
- | None =>
- match
- match idc with
- | ident.Z_shiftr offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s1 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) (- args))%expr @
- (x, x1, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ | None =>
+ match
+ match idc0 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x5 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s1 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x6)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s2 -> d1)%ptype =>
- fun
- _ : Compile.value' false s2 ->
- Compile.value' true d1 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
- end (Compile.reflect x4)
- | None =>
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s1 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s1 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s1 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s1 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
end
- end
- | @expr.App _ _ _ s1 _ ($_)%expr _ | @expr.App _ _ _ s1 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s1 _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s1 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @ x1)%expr_pat
- | _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @ x1)%expr_pat
- end
- | @expr.LetIn _ _ _ _ _ _ _ =>
- match x0 with
- | @expr.App _ _ _ s0 _ #(idc)%expr_pat x3 =>
- match
- match idc with
- | ident.Z_shiftl offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) args)%expr @
- (x, x1, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ | @expr.LetIn _ _ _ _ _ _ _ =>
+ match x1 with
+ | (@expr.App _ _ _ s0 _ #(idc0) x5 @ x4)%expr_pat =>
+ match
+ match idc0 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) args1)%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s1 -> d0)%ptype =>
- fun _ : Compile.value' false s1 -> Compile.value' true d0
- =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @
- x1)%expr_pat
- end (Compile.reflect x3)
- | None =>
- match
- match idc with
- | ident.Z_shiftr offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr
- (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) (- args))%expr @
- (x, x1, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ | None =>
+ match
+ match idc0 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x4 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return
+ (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2)
+ =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type
+ ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr
+ (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args)
+ (- args1))%expr @
+ (x0, x2, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x5)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s1 -> d0)%ptype =>
- fun
- _ : Compile.value' false s1 ->
- Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
- end (Compile.reflect x3)
- | None =>
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_add_with_get_carry)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s0 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s0 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_addc (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
end
end
- | @expr.App _ _ _ s0 _ ($_)%expr _ | @expr.App _ _ _ s0 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s0 _ (_ @ _)%expr_pat
- _ | @expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @ x1)%expr_pat
- | _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_addc (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_add_with_get_carry_concrete s)%expr @ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
end
+ | _ =>
+ UnderLets.Base
+ (#(ident.Z_add_with_get_carry)%expr @ x @ x0 @ x1 @ x2)%expr_pat
end
| ident.Z_sub_get_borrow =>
- fun x x0 x1 : expr (type.base base.type.Z) =>
- UnderLets.Base (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @ x1)%expr_pat
-| ident.Z_sub_get_borrow_concrete s =>
- fun x x0 : expr (type.base base.type.Z) =>
- match x0 with
- | @expr.App _ _ _ s0 _ #(idc)%expr_pat x1 =>
+ fun x x0 x1 : defaults.expr (type.base base.type.Z) =>
+ match x with
+ | #(idc)%expr_pat =>
match
match idc with
- | ident.Z_shiftl offset => Some offset
+ | @ident.Literal t0 v =>
+ match t0 as t1 return (base.base_interp t1 -> option Z) with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
| _ => None
end
with
| Some args =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_sub (Z.log2 s) args)%expr @
- (x, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ match x1 with
+ | (@expr.App _ _ _ s0 _ #(idc0) x3 @ x2)%expr_pat =>
+ match
+ match idc0 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x2 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_sub (Z.log2 args)
+ args1)%expr @ (x0, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_sub (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_sub_get_borrow)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_sub_get_borrow)%expr @ x @
+ x0 @ x1)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @
+ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_sub (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_sub (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
+ (#(ident.fancy_sub (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_sub_get_borrow_concrete s)%expr @ x @
- x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_sub_get_borrow_concrete s)%expr @ x @ x0)%expr_pat
- end)
- | (s1 -> d0)%ptype =>
- fun _ : Compile.value' false s1 -> Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_sub_get_borrow_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x1)
- | None =>
- match
- match idc with
- | ident.Z_shiftr offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_sub (Z.log2 s) (- args))%expr @
- (x, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ | None =>
+ match
+ match idc0 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x2 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_sub
+ (Z.log2 args) (- args1))%expr @
+ (x0, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_sub
+ (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_sub_get_borrow)%expr @
+ x @ x0 @ x1)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_sub_get_borrow)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_sub_get_borrow)%expr @ x @
+ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_sub (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @
+ x1)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_sub (Z.log2 s) 0)%expr @
- (x, x0))%expr_pat
+ (#(ident.fancy_sub (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_sub_get_borrow_concrete s)%expr @ x @
- x0)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_sub_get_borrow_concrete s)%expr @ x @
- x0)%expr_pat
- end)
- | (s1 -> d0)%ptype =>
- fun _ : Compile.value' false s1 -> Compile.value' true d0
- =>
- UnderLets.Base
- (#(ident.Z_sub_get_borrow_concrete s)%expr @ x @ x0)%expr_pat
- end (Compile.reflect x1)
- | None =>
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_sub (Z.log2 args) 0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @ x1)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s0 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s0 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_sub (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
+ (#(ident.fancy_sub (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
else
UnderLets.Base
- (#(ident.Z_sub_get_borrow_concrete s)%expr @ x @ x0)%expr_pat
+ (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @ x1)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_sub (Z.log2 args) 0)%expr @ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @ x1)%expr_pat
end
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @ x1)%expr_pat
end
- | @expr.App _ _ _ s0 _ ($_)%expr _ | @expr.App _ _ _ s0 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s0 _ (_ @ _)%expr_pat _ |
- @expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_sub (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_sub_get_borrow_concrete s)%expr @ x @ x0)%expr_pat
| _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_sub (Z.log2 s) 0)%expr @ (x, x0))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_sub_get_borrow_concrete s)%expr @ x @ x0)%expr_pat
+ UnderLets.Base
+ (#(ident.Z_sub_get_borrow)%expr @ x @ x0 @ x1)%expr_pat
end
| ident.Z_sub_with_get_borrow =>
- fun x x0 x1 x2 : expr (type.base base.type.Z) =>
- UnderLets.Base
- (#(ident.Z_sub_with_get_borrow)%expr @ x @ x0 @ x1 @ x2)%expr_pat
-| ident.Z_sub_with_get_borrow_concrete s =>
- fun x x0 x1 : expr (type.base base.type.Z) =>
- match x1 with
- | @expr.App _ _ _ s0 _ #(idc)%expr_pat x2 =>
+ fun x x0 x1 x2 : defaults.expr (type.base base.type.Z) =>
+ match x with
+ | #(idc)%expr_pat =>
match
match idc with
- | ident.Z_shiftl offset => Some offset
+ | @ident.Literal t0 v =>
+ match t0 as t1 return (base.base_interp t1 -> option Z) with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
| _ => None
end
with
| Some args =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_subb (Z.log2 s) args)%expr @
- (x, x0, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ match x2 with
+ | (@expr.App _ _ _ s0 _ #(idc0) x4 @ x3)%expr_pat =>
+ match
+ match idc0 with
+ | ident.Z_shiftl => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x3 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_subb (Z.log2 args)
+ args1)%expr @ (x0, x1, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_subb (Z.log2 args)
+ 0)%expr @ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_sub_with_get_borrow)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_sub_with_get_borrow)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_sub_with_get_borrow)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_subb (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_sub_with_get_borrow)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_subb (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_subb (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_sub_with_get_borrow_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_sub_with_get_borrow_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
- end)
- | (s1 -> d0)%ptype =>
- fun _ : Compile.value' false s1 -> Compile.value' true d0 =>
- UnderLets.Base
- (#(ident.Z_sub_with_get_borrow_concrete s)%expr @ x @ x0 @
- x1)%expr_pat
- end (Compile.reflect x2)
- | None =>
- match
- match idc with
- | ident.Z_shiftr offset => Some offset
- | _ => None
- end
- with
- | Some args =>
- match
- s0 as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base (base.type.Z * base.type.Z)%etype)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_subb (Z.log2 s) (- args))%expr @
- (x, x0, x' v))%expr_pat
- else
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_sub_with_get_borrow)%expr @ x @ x0 @ x1 @
+ x2)%expr_pat
+ end
+ | None =>
+ match
+ match idc0 with
+ | ident.Z_shiftr => Some tt
+ | _ => None
+ end
+ with
+ | Some _ =>
+ match x3 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base
+ (base.type.Z * base.type.Z)%etype)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_subb
+ (Z.log2 args) (- args1))%expr @
+ (x0, x1, x' v))%expr_pat
+ else
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_subb
+ (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_sub_with_get_borrow)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_sub_with_get_borrow)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_sub_with_get_borrow)%expr @
+ x @ x0 @ x1 @ x2)%expr_pat
+ end (Compile.reflect x4)
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_subb (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_sub_with_get_borrow)%expr @ x @
+ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_subb (Z.log2 s) 0)%expr @
- (x, x0, x1))%expr_pat
+ (#(ident.fancy_subb (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_sub_with_get_borrow_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_sub_with_get_borrow_concrete s)%expr @
- x @ x0 @ x1)%expr_pat
- end)
- | (s1 -> d0)%ptype =>
- fun _ : Compile.value' false s1 -> Compile.value' true d0
- =>
- UnderLets.Base
- (#(ident.Z_sub_with_get_borrow_concrete s)%expr @ x @
- x0 @ x1)%expr_pat
- end (Compile.reflect x2)
- | None =>
- if s =? 2 ^ Z.log2 s
+ (#(ident.Z_sub_with_get_borrow)%expr @ x @ x0 @
+ x1 @ x2)%expr_pat
+ end
+ | None =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_subb (Z.log2 args) 0)%expr @
+ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_sub_with_get_borrow)%expr @ x @ x0 @ x1 @
+ x2)%expr_pat
+ end
+ end
+ | (@expr.App _ _ _ s0 _ ($_)%expr _ @ _)%expr_pat |
+ (@expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s0 _ (_ @ _) _ @ _)%expr_pat |
+ (@expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ @ _)%expr_pat =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_subb (Z.log2 args) 0)%expr @ (x0, x1, x2))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_sub_with_get_borrow)%expr @ x @ x0 @ x1 @ x2)%expr_pat
+ | _ =>
+ if args =? 2 ^ Z.log2 args
then
UnderLets.Base
- (#(ident.fancy_subb (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
+ (#(ident.fancy_subb (Z.log2 args) 0)%expr @ (x0, x1, x2))%expr_pat
else
UnderLets.Base
- (#(ident.Z_sub_with_get_borrow_concrete s)%expr @ x @ x0 @
- x1)%expr_pat
+ (#(ident.Z_sub_with_get_borrow)%expr @ x @ x0 @ x1 @ x2)%expr_pat
end
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_sub_with_get_borrow)%expr @ x @ x0 @ x1 @ x2)%expr_pat
end
- | @expr.App _ _ _ s0 _ ($_)%expr _ | @expr.App _ _ _ s0 _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s0 _ (_ @ _)%expr_pat _ |
- @expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_subb (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_sub_with_get_borrow_concrete s)%expr @ x @ x0 @ x1)%expr_pat
| _ =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_subb (Z.log2 s) 0)%expr @ (x, x0, x1))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_sub_with_get_borrow_concrete s)%expr @ x @ x0 @ x1)%expr_pat
+ UnderLets.Base
+ (#(ident.Z_sub_with_get_borrow)%expr @ x @ x0 @ x1 @ x2)%expr_pat
end
| ident.Z_zselect =>
- fun x x0 x1 : expr (type.base base.type.Z) =>
+ fun x x0 x1 : defaults.expr (type.base base.type.Z) =>
match x with
- | @expr.App _ _ _ s _ #(idc)%expr_pat x2 =>
- match
- match idc with
- | ident.Z_cc_m_concrete s0 => Some s0
- | _ => None
- end
- with
- | Some args =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2 base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.Z)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if args =? 2 ^ Z.log2 args
- then
- UnderLets.Base
- (#(ident.fancy_selm (Z.log2 args))%expr @
- (x' v, x0, x1))%expr_pat
- else
+ | @expr.App _ _ _ s _ (@expr.App _ _ _ s0 _ #(idc)%expr_pat x3) x2 =>
+ match match idc with
+ | ident.Z_cc_m => Some tt
+ | _ => None
+ end with
+ | Some _ =>
+ match x3 with
+ | #(idc0)%expr_pat =>
+ match
+ match idc0 with
+ | @ident.Literal t1 v =>
+ match
+ t1 as t2 return (base.base_interp t2 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args0 =>
+ match
+ s as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base base.type.Z)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t1 : base.type => defaults.expr (type.base t1))
+ t2 base.type.Z
+ (UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args0 =? 2 ^ Z.log2 args0
+ then
+ UnderLets.Base
+ (#(ident.fancy_selm (Z.log2 args0))%expr @
+ (x' v, x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.fancy_selc)%expr @ (x, x0, x1))%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_zselect)%expr @ x @ x0 @ x1)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
UnderLets.Base
- (#(ident.fancy_selc)%expr @ (x, x0, x1))%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_zselect)%expr @ x @ x0 @ x1)%expr_pat
- end)
- | (s0 -> d0)%ptype =>
- fun _ : Compile.value' false s0 -> Compile.value' true d0 =>
+ (#(ident.Z_zselect)%expr @ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x2)
+ | None =>
+ UnderLets.Base
+ (#(ident.fancy_selc)%expr @ (x, x0, x1))%expr_pat
+ end
+ | _ =>
UnderLets.Base
- (#(ident.Z_zselect)%expr @ x @ x0 @ x1)%expr_pat
- end (Compile.reflect x2)
+ (#(ident.fancy_selc)%expr @ (x, x0, x1))%expr_pat
+ end
| None =>
match
match idc with
- | ident.Z_land mask => Some mask
+ | ident.Z_land => Some tt
| _ => None
end
with
- | Some args =>
- match
- s as t2
- return
- (Compile.value' false t2 ->
- UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.Z)))
- with
- | type.base t2 =>
- fun v : expr (type.base t2) =>
- base.try_make_transport_cps
- (fun t0 : base.type => expr (type.base t0)) t2
- base.type.Z
- (UnderLets.UnderLets base.type ident var
- (expr (type.base base.type.Z)))
- (fun
- a : option
- (expr (type.base t2) ->
- expr (type.base base.type.Z)) =>
- match a with
- | Some x' =>
- if args =? 1
- then
+ | Some _ =>
+ match x3 with
+ | #(idc0)%expr_pat =>
+ match
+ match idc0 with
+ | @ident.Literal t1 v =>
+ match
+ t1 as t2 return (base.base_interp t2 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args0 =>
+ match
+ s as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base base.type.Z)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t1 : base.type =>
+ defaults.expr (type.base t1)) t2 base.type.Z
+ (UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr (type.base base.type.Z))
+ =>
+ match a with
+ | Some x' =>
+ if args0 =? 1
+ then
+ UnderLets.Base
+ (#(ident.fancy_sell)%expr @
+ (x' v, x0, x1))%expr_pat
+ else
+ match x2 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t3 v0 =>
+ match
+ t3 as t4
+ return
+ (base.base_interp t4 ->
+ option Z)
+ with
+ | base.type.unit =>
+ fun _ : unit => None
+ | base.type.Z =>
+ fun v1 : Z => Some v1
+ | base.type.bool =>
+ fun _ : bool => None
+ | base.type.nat =>
+ fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args1 =>
+ match
+ s0 as t3
+ return
+ (Compile.value' false t3 ->
+ UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base base.type.Z)))
+ with
+ | type.base t3 =>
+ fun
+ v0 : defaults.expr
+ (type.base t3) =>
+ base.try_make_transport_cps
+ (fun t4 : base.type =>
+ defaults.expr
+ (type.base t4)) t3
+ base.type.Z
+ (UnderLets.UnderLets
+ base.type ident var
+ (defaults.expr
+ (type.base
+ base.type.Z)))
+ (fun
+ a0 : option
+ (defaults.expr
+ (type.base t3) ->
+ defaults.expr
+ (type.base
+ base.type.Z))
+ =>
+ match a0 with
+ | Some x'0 =>
+ if args1 =? 1
+ then
+ UnderLets.Base
+ (#(ident.fancy_sell)%expr @
+ (x'0 v0, x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.fancy_selc)%expr @
+ (x, x0, x1))%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_zselect)%expr @
+ x @ x0 @ x1)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1
+ =>
+ UnderLets.Base
+ (#(ident.Z_zselect)%expr @
+ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ UnderLets.Base
+ (#(ident.fancy_selc)%expr @
+ (x, x0, x1))%expr_pat
+ end
+ | _ =>
+ UnderLets.Base
+ (#(ident.fancy_selc)%expr @
+ (x, x0, x1))%expr_pat
+ end
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_zselect)%expr @ x @ x0 @ x1)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_zselect)%expr @ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x2)
+ | None =>
+ match x2 with
+ | #(idc1)%expr_pat =>
+ match
+ match idc1 with
+ | @ident.Literal t2 v =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args0 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base base.type.Z)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident
+ var
+ (defaults.expr
+ (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args0 =? 1
+ then
+ UnderLets.Base
+ (#(ident.fancy_sell)%expr @
+ (x' v, x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.fancy_selc)%expr @
+ (x, x0, x1))%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_zselect)%expr @ x @
+ x0 @ x1)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_zselect)%expr @ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ UnderLets.Base
+ (#(ident.fancy_selc)%expr @ (x, x0, x1))%expr_pat
+ end
+ | _ =>
UnderLets.Base
- (#(ident.fancy_sell)%expr @ (x' v, x0, x1))%expr_pat
- else
+ (#(ident.fancy_selc)%expr @ (x, x0, x1))%expr_pat
+ end
+ end
+ | ($_)%expr =>
+ match x2 with
+ | #(idc0)%expr_pat =>
+ match
+ match idc0 with
+ | @ident.Literal t2 v0 =>
+ match
+ t2 as t3
+ return (base.base_interp t3 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v1 : Z => Some v1
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v0
+ | _ => None
+ end
+ with
+ | Some args0 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base base.type.Z)))
+ with
+ | type.base t2 =>
+ fun v0 : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t3 : base.type =>
+ defaults.expr (type.base t3)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args0 =? 1
+ then
+ UnderLets.Base
+ (#(ident.fancy_sell)%expr @
+ (x' v0, x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.fancy_selc)%expr @
+ (x, x0, x1))%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_zselect)%expr @ x @ x0 @
+ x1)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_zselect)%expr @ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
UnderLets.Base
(#(ident.fancy_selc)%expr @ (x, x0, x1))%expr_pat
- | None =>
- UnderLets.Base
- (#(ident.Z_zselect)%expr @ x @ x0 @ x1)%expr_pat
- end)
- | (s0 -> d0)%ptype =>
- fun _ : Compile.value' false s0 -> Compile.value' true d0
- =>
- UnderLets.Base
- (#(ident.Z_zselect)%expr @ x @ x0 @ x1)%expr_pat
- end (Compile.reflect x2)
+ end
+ | _ =>
+ UnderLets.Base
+ (#(ident.fancy_selc)%expr @ (x, x0, x1))%expr_pat
+ end
+ | @expr.LetIn _ _ _ _ _ _ _ =>
+ match x2 with
+ | #(idc0)%expr_pat =>
+ match
+ match idc0 with
+ | @ident.Literal t1 v =>
+ match
+ t1 as t2
+ return (base.base_interp t2 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args0 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base base.type.Z)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t1 : base.type =>
+ defaults.expr (type.base t1)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args0 =? 1
+ then
+ UnderLets.Base
+ (#(ident.fancy_sell)%expr @
+ (x' v, x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.fancy_selc)%expr @
+ (x, x0, x1))%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_zselect)%expr @ x @ x0 @
+ x1)%expr_pat
+ end)
+ | (s1 -> d1)%ptype =>
+ fun
+ _ : Compile.value' false s1 ->
+ Compile.value' true d1 =>
+ UnderLets.Base
+ (#(ident.Z_zselect)%expr @ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ UnderLets.Base
+ (#(ident.fancy_selc)%expr @ (x, x0, x1))%expr_pat
+ end
+ | _ =>
+ UnderLets.Base
+ (#(ident.fancy_selc)%expr @ (x, x0, x1))%expr_pat
+ end
+ | _ =>
+ match x2 with
+ | #(idc0)%expr_pat =>
+ match
+ match idc0 with
+ | @ident.Literal t1 v =>
+ match
+ t1 as t2
+ return (base.base_interp t2 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args0 =>
+ match
+ s0 as t2
+ return
+ (Compile.value' false t2 ->
+ UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base base.type.Z)))
+ with
+ | type.base t2 =>
+ fun v : defaults.expr (type.base t2) =>
+ base.try_make_transport_cps
+ (fun t1 : base.type =>
+ defaults.expr (type.base t1)) t2
+ base.type.Z
+ (UnderLets.UnderLets base.type ident var
+ (defaults.expr (type.base base.type.Z)))
+ (fun
+ a : option
+ (defaults.expr (type.base t2) ->
+ defaults.expr
+ (type.base base.type.Z)) =>
+ match a with
+ | Some x' =>
+ if args0 =? 1
+ then
+ UnderLets.Base
+ (#(ident.fancy_sell)%expr @
+ (x' v, x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.fancy_selc)%expr @
+ (x, x0, x1))%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_zselect)%expr @ x @ x0 @
+ x1)%expr_pat
+ end)
+ | (s2 -> d2)%ptype =>
+ fun
+ _ : Compile.value' false s2 ->
+ Compile.value' true d2 =>
+ UnderLets.Base
+ (#(ident.Z_zselect)%expr @ x @ x0 @ x1)%expr_pat
+ end (Compile.reflect x3)
+ | None =>
+ UnderLets.Base
+ (#(ident.fancy_selc)%expr @ (x, x0, x1))%expr_pat
+ end
+ | _ =>
+ UnderLets.Base
+ (#(ident.fancy_selc)%expr @ (x, x0, x1))%expr_pat
+ end
+ end
| None =>
UnderLets.Base
(#(ident.fancy_selc)%expr @ (x, x0, x1))%expr_pat
end
end
- | @expr.App _ _ _ s _ ($_)%expr _ | @expr.App _ _ _ s _
- (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _ (_ @ _)%expr_pat _ |
- @expr.App _ _ _ s _ (@expr.LetIn _ _ _ _ _ _ _) _ =>
+ | @expr.App _ _ _ s _ (@expr.App _ _ _ s0 _ ($_)%expr _) _ | @expr.App _
+ _ _ s _ (@expr.App _ _ _ s0 _ (@expr.Abs _ _ _ _ _ _) _) _ | @expr.App
+ _ _ _ s _ (@expr.App _ _ _ s0 _ (_ @ _)%expr_pat _) _ | @expr.App _ _ _
+ s _ (@expr.App _ _ _ s0 _ (@expr.LetIn _ _ _ _ _ _ _) _) _ =>
+ UnderLets.Base (#(ident.fancy_selc)%expr @ (x, x0, x1))%expr_pat
+ | @expr.App _ _ _ s _ #(_)%expr_pat _ | @expr.App _ _ _ s _ ($_)%expr _ |
+ @expr.App _ _ _ s _ (@expr.Abs _ _ _ _ _ _) _ | @expr.App _ _ _ s _
+ (@expr.LetIn _ _ _ _ _ _ _) _ =>
UnderLets.Base (#(ident.fancy_selc)%expr @ (x, x0, x1))%expr_pat
| _ => UnderLets.Base (#(ident.fancy_selc)%expr @ (x, x0, x1))%expr_pat
end
| ident.Z_add_modulo =>
- fun x x0 x1 : expr (type.base base.type.Z) =>
+ fun x x0 x1 : defaults.expr (type.base base.type.Z) =>
UnderLets.Base (#(ident.fancy_addm)%expr @ (x, x0, x1))%expr_pat
| ident.Z_rshi =>
- fun x x0 x1 x2 : expr (type.base base.type.Z) =>
- UnderLets.Base (#(ident.Z_rshi)%expr @ x @ x0 @ x1 @ x2)%expr_pat
-| ident.Z_rshi_concrete s offset =>
- fun x x0 : expr (type.base base.type.Z) =>
- if s =? 2 ^ Z.log2 s
- then
- UnderLets.Base
- (#(ident.fancy_rshi (Z.log2 s) offset)%expr @ (x, x0))%expr_pat
- else
- UnderLets.Base
- (#(ident.Z_rshi_concrete s offset)%expr @ x @ x0)%expr_pat
+ fun x x0 x1 x2 : defaults.expr (type.base base.type.Z) =>
+ match x with
+ | #(idc)%expr_pat =>
+ match
+ match idc with
+ | @ident.Literal t0 v =>
+ match t0 as t1 return (base.base_interp t1 -> option Z) with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args =>
+ match x2 with
+ | #(idc0)%expr_pat =>
+ match
+ match idc0 with
+ | @ident.Literal t1 v =>
+ match
+ t1 as t2 return (base.base_interp t2 -> option Z)
+ with
+ | base.type.unit => fun _ : unit => None
+ | base.type.Z => fun v0 : Z => Some v0
+ | base.type.bool => fun _ : bool => None
+ | base.type.nat => fun _ : nat => None
+ end v
+ | _ => None
+ end
+ with
+ | Some args0 =>
+ if args =? 2 ^ Z.log2 args
+ then
+ UnderLets.Base
+ (#(ident.fancy_rshi (Z.log2 args) args0)%expr @
+ (x0, x1))%expr_pat
+ else
+ UnderLets.Base
+ (#(ident.Z_rshi)%expr @ x @ x0 @ x1 @ x2)%expr_pat
+ | None =>
+ UnderLets.Base
+ (#(ident.Z_rshi)%expr @ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ =>
+ UnderLets.Base
+ (#(ident.Z_rshi)%expr @ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | None =>
+ UnderLets.Base (#(ident.Z_rshi)%expr @ x @ x0 @ x1 @ x2)%expr_pat
+ end
+ | _ => UnderLets.Base (#(ident.Z_rshi)%expr @ x @ x0 @ x1 @ x2)%expr_pat
+ end
| ident.Z_cc_m =>
- fun x x0 : expr (type.base base.type.Z) =>
+ fun x x0 : defaults.expr (type.base base.type.Z) =>
UnderLets.Base (#(ident.Z_cc_m)%expr @ x @ x0)%expr_pat
-| ident.Z_cc_m_concrete s =>
- fun x : expr (type.base base.type.Z) =>
- UnderLets.Base (#(ident.Z_cc_m_concrete s)%expr @ x)%expr_pat
-| ident.Z_neg_snd =>
- fun x : expr (type.base (base.type.Z * base.type.Z)%etype) =>
- UnderLets.Base (#(ident.Z_neg_snd)%expr @ x)%expr_pat
| ident.Z_cast range =>
- fun x : expr (type.base base.type.Z) =>
+ fun x : defaults.expr (type.base base.type.Z) =>
UnderLets.Base (#(ident.Z_cast range)%expr @ x)%expr_pat
| ident.Z_cast2 range =>
- fun x : expr (type.base (base.type.Z * base.type.Z)%etype) =>
+ fun x : defaults.expr (type.base (base.type.Z * base.type.Z)%etype) =>
UnderLets.Base (#(ident.Z_cast2 range)%expr @ x)%expr_pat
| ident.fancy_add log2wordmax imm =>
- fun x : expr (type.base (base.type.Z * base.type.Z)%etype) =>
+ fun x : defaults.expr (type.base (base.type.Z * base.type.Z)%etype) =>
UnderLets.Base (#(ident.fancy_add log2wordmax imm)%expr @ x)%expr_pat
| ident.fancy_addc log2wordmax imm =>
- fun x : expr (type.base (base.type.Z * base.type.Z * base.type.Z)%etype)
- => UnderLets.Base (#(ident.fancy_addc log2wordmax imm)%expr @ x)%expr_pat
+ fun
+ x : defaults.expr
+ (type.base (base.type.Z * base.type.Z * base.type.Z)%etype) =>
+ UnderLets.Base (#(ident.fancy_addc log2wordmax imm)%expr @ x)%expr_pat
| ident.fancy_sub log2wordmax imm =>
- fun x : expr (type.base (base.type.Z * base.type.Z)%etype) =>
+ fun x : defaults.expr (type.base (base.type.Z * base.type.Z)%etype) =>
UnderLets.Base (#(ident.fancy_sub log2wordmax imm)%expr @ x)%expr_pat
| ident.fancy_subb log2wordmax imm =>
- fun x : expr (type.base (base.type.Z * base.type.Z * base.type.Z)%etype)
- => UnderLets.Base (#(ident.fancy_subb log2wordmax imm)%expr @ x)%expr_pat
+ fun
+ x : defaults.expr
+ (type.base (base.type.Z * base.type.Z * base.type.Z)%etype) =>
+ UnderLets.Base (#(ident.fancy_subb log2wordmax imm)%expr @ x)%expr_pat
| ident.fancy_mulll log2wordmax =>
- fun x : expr (type.base (base.type.Z * base.type.Z)%etype) =>
+ fun x : defaults.expr (type.base (base.type.Z * base.type.Z)%etype) =>
UnderLets.Base (#(ident.fancy_mulll log2wordmax)%expr @ x)%expr_pat
| ident.fancy_mullh log2wordmax =>
- fun x : expr (type.base (base.type.Z * base.type.Z)%etype) =>
+ fun x : defaults.expr (type.base (base.type.Z * base.type.Z)%etype) =>
UnderLets.Base (#(ident.fancy_mullh log2wordmax)%expr @ x)%expr_pat
| ident.fancy_mulhl log2wordmax =>
- fun x : expr (type.base (base.type.Z * base.type.Z)%etype) =>
+ fun x : defaults.expr (type.base (base.type.Z * base.type.Z)%etype) =>
UnderLets.Base (#(ident.fancy_mulhl log2wordmax)%expr @ x)%expr_pat
| ident.fancy_mulhh log2wordmax =>
- fun x : expr (type.base (base.type.Z * base.type.Z)%etype) =>
+ fun x : defaults.expr (type.base (base.type.Z * base.type.Z)%etype) =>
UnderLets.Base (#(ident.fancy_mulhh log2wordmax)%expr @ x)%expr_pat
| ident.fancy_rshi log2wordmax x =>
- fun x0 : expr (type.base (base.type.Z * base.type.Z)%etype) =>
+ fun x0 : defaults.expr (type.base (base.type.Z * base.type.Z)%etype) =>
UnderLets.Base (#(ident.fancy_rshi log2wordmax x)%expr @ x0)%expr_pat
| ident.fancy_selc =>
- fun x : expr (type.base (base.type.Z * base.type.Z * base.type.Z)%etype)
- => UnderLets.Base (#(ident.fancy_selc)%expr @ x)%expr_pat
+ fun
+ x : defaults.expr
+ (type.base (base.type.Z * base.type.Z * base.type.Z)%etype) =>
+ UnderLets.Base (#(ident.fancy_selc)%expr @ x)%expr_pat
| ident.fancy_selm log2wordmax =>
- fun x : expr (type.base (base.type.Z * base.type.Z * base.type.Z)%etype)
- => UnderLets.Base (#(ident.fancy_selm log2wordmax)%expr @ x)%expr_pat
+ fun
+ x : defaults.expr
+ (type.base (base.type.Z * base.type.Z * base.type.Z)%etype) =>
+ UnderLets.Base (#(ident.fancy_selm log2wordmax)%expr @ x)%expr_pat
| ident.fancy_sell =>
- fun x : expr (type.base (base.type.Z * base.type.Z * base.type.Z)%etype)
- => UnderLets.Base (#(ident.fancy_sell)%expr @ x)%expr_pat
+ fun
+ x : defaults.expr
+ (type.base (base.type.Z * base.type.Z * base.type.Z)%etype) =>
+ UnderLets.Base (#(ident.fancy_sell)%expr @ x)%expr_pat
| ident.fancy_addm =>
- fun x : expr (type.base (base.type.Z * base.type.Z * base.type.Z)%etype)
- => UnderLets.Base (#(ident.fancy_addm)%expr @ x)%expr_pat
+ fun
+ x : defaults.expr
+ (type.base (base.type.Z * base.type.Z * base.type.Z)%etype) =>
+ UnderLets.Base (#(ident.fancy_addm)%expr @ x)%expr_pat
end
: Compile.value' true t