anchor.diff:         *)
   
         // Integer store
  -      (prim "!IStore" [ Int "dest" ] [ Int "src" ]
  +      (mkPrim "!IStore" [ Int "dest" ] [ Int "src" ]
               [ Assign (Int "dest", Int (IVar "src")) ] )
   
         // Boolean store
  -      (prim "!BStore" [ Bool "dest" ] [ Bool "src" ]
  +      (mkPrim "!BStore" [ Bool "dest" ] [ Bool "src" ]
               [ Assign (Bool "dest", Bool (BVar "src")) ] )
   
         (*
  
positive.code:        * Atomic load
         *)
        // Integer load
        (prim "!ILoad"  [ Int "dest" ] [ Int "src" ]
              [ Assign (Int "dest", Int (IVar "src")) ] )
  
        // Integer load-and-increment
        (prim "!ILoad++"  [ Int "dest"; Int "srcA" ] [ Int "srcB" ]
              [ Assign (Int "dest", Int (IVar "srcB"))
                Assign (Int "srcA", Int (mkAdd2 (IVar "srcB") (IInt 1L))) ] )
  
        // Integer load-and-decrement
        (prim "!ILoad--"  [ Int "dest"; Int "srcA" ] [ Int "srcB" ]
              [ Assign (Int "dest", Int (IVar "srcB"))
                Assign (Int "srcA", Int (mkSub2 (IVar "srcB") (IInt 1L))) ] )
  
        // Integer increment
        (prim "!I++"  [ Int "srcA" ] [ Int "srcB" ]
              [ Assign (Int "srcA", Int (mkAdd2 (IVar "srcB") (IInt 1L))) ] )
  
        // Integer decrement
        (prim "!I--"  [ Int "srcA" ] [ Int "srcB" ]
              [ Assign (Int "srcA", Int (mkSub2 (IVar "srcB") (IInt 1L))) ] )
  
        // Boolean load
        (prim "!BLoad"  [ Bool "dest" ] [ Bool "src" ]
              [ Assign (Bool "dest", Bool (BVar "src")) ] )
  
        (*
  
negative.code: (*
   * Starling imperative language semantics
   *)
  
  /// Creates a prim from a name, results list, and arguments list.
  let mkPrim (name : string) (results : TypedVar list) (args : TypedVar list)
    (body : Microcode<TypedVar, Var> list)
    : PrimSemantics =
      { Name = name; Results = results; Args = args; Body = body }
  