aboutsummaryrefslogtreecommitdiff
path: root/src/Assembly/Pseudize.v
blob: b5d1a2b955640734ee7c26cadddfc48ac2d572ff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Require Export Bedrock.Word Bedrock.Nomega.
Require Import NArith List.
Require Import Pseudo State Wordize.

Module Conversion.
  Import Pseudo ListNotations StateCommon.

  Definition run {n m w s} (prog: @Pseudo w s n m) (inList: list (word w)) : list (word w) :=  
    match (pseudoEval prog (inList, TripleM.empty N, None)) with
    | Some (outList, _, _) => outList
    | _ => []
    end.

  Lemma pseudo_plus: forall {w s n} (p0 p1: @Pseudo w s n 1) x out0 out1 b,
      (b <= Npow2 w)%N
    -> ((&out0)%w < b)%N
    -> ((&out1)%w < (Npow2 w - b))%N
    -> run p0 x = [out0]
    -> run p1 x = [out1]
    -> run (p0 :+: p1)%p x = [out0 ^+ out1].
  Proof.
    intros; unfold run in *; simpl.
    destruct (pseudoEval p0 _) as [r0|], (pseudoEval p1 _) as [r1|].
    destruct r0 as [r0 rc0], r1 as [r1 rc1].
    destruct r0 as [r0 rm0], r1 as [r1 rm1].

    - subst; simpl.
      destruct ((& out0)%w + (& out1)%w ?= Npow2 w)%N; simpl;
        rewrite (wordize_plus out0 out1 b); try assumption;
        rewrite NToWord_wordToN; intuition.

    - inversion H3.

    - inversion H2.

    - inversion H2.
  Qed.

  Program Definition ex0: Program Unary32 := ($0 :-: $0)%p.

  Eval vm_compute in (run ex0 [natToWord _ 7]).

End Conversion.