fragment type U8; size U8 1; atom suffix U8 _u8;
fragment type U16; size U16 2; atom suffix U16 _u16;
fragment type U32; size U32 4; atom suffix U32 _u32;
fragment type U64; size U64 8; atom suffix U64 _u64;
fragment type I8; size I8 1; atom suffix I8 _i8;
fragment type I16; size I16 2; atom suffix I16 _i16;
fragment type I32; size I32 4; atom suffix I32 _i32;
fragment type I64; size I64 8; atom suffix I64 _i64;
fragment type ASCII; size ASCII 1; atom suffix ASCII _c;
fragment type String; size String 8; atom suffix String _s;
fragment : DontChain [] := λ(: l LocalVariable+Array<x+Sized<1>,?>)(: r LocalVariable+U64). (: (
(.program (
\t 'mov \s (.expression l) \[ '%rbp \] , \s '%r15 \n
\t 'mov \s (.expression r) \[ '%rbp \] , \s '%r14 \n
\t 'add \s '%r14 , \s '%r15 \n
\t 'mov \s '0 \[ '%r15 \] , \s '%r15b \n
))
(.expression( 'r15b ))
) x+Reg8);
fragment : DontChain [] := λ(: l LocalVariable+Array<x+Sized<8>,?>)(: r LocalVariable+U64). (: (
(.program (
\t 'mov \s (.expression l) \[ '%rbp \] , \s '%r15 \n
\t 'mov \s (.expression r) \[ '%rbp \] , \s '%r14 \n
\t 'shl \s '$3, '%r14 \n
\t 'add \s '%r14 , \s '%r15 \n
\t 'mov \s '0 \[ '%r15 \] , \s '%r15 \n
))
(.expression( 'r15 ))
) x+Reg64);
fragment : DontChain [] := λ(: l LocalVariable+Field<x+Sized<8>,?>)(: r LocalVariable+U64). (: (
(.program (
\t 'mov \s '%rbp , \s '%r15 \n
\t 'add \s '$ (.expression l) , \s '%r15 \n
\t 'mov \s (.expression r) \[ '%rbp \] , \s '%r14 \n
\t 'shl \s '$3, '%r14 \n
\t 'add \s '%r14 , \s '%r15 \n
\t 'mov \s '0 \[ '%r15 \] , \s '%r15 \n
))
(.expression( 'r15 ))
) x+Reg64);
fragment : DontChain [] := λ(: l LocalVariable+Array<x,?>)(: r GlobalVariable+U64). (: (
(.program (
\t 'mov \s '$ (.expression l) , \s '%r15 \n
\t 'mov \s '$ (.expression r) , \s '%r14 \n
\t 'mov \s '0 \[ '%r14 \] , \s '%r14 \n
\t 'shl \s '$3 , \s '%r14 \n
\t 'add \s '%r14 , \s '%r15 \n
\t 'mov \s '0 \[ '%r15 \] , \s '%r15 \n
))
(.expression( 'r15 ))
) x+Reg64);
fragment : DontChain set[] := λ(: l LocalVariable+Array<Field<Sized<8>,?>,?>)(: i Literal+Constant+U64)(: v Reg64). (: (
(.program (
\t 'mov \s (.expression l) \[ '%rbp \] , \s '%r15 \n
\t 'mov \s '% (.expression v) , \s (*( '8 (.expression i) )) \[ '%r15 \] \n
))
) Nil);
fragment : DontChain [] := λ(: l GlobalVariable+Array<x,?>)(: r GlobalVariable+U64). (: (
(.program (
\t 'mov \s '$ (.expression l) , \s '%r15 \n
\t 'mov \s '$ (.expression r) , \s '%r14 \n
\t 'mov \s '0 \[ '%r14 \] , \s '%r14 \n
\t 'shl \s '$3 , \s '%r14 \n
\t 'add \s '%r14 , \s '%r15 \n
\t 'mov \s '0 \[ '%r15 \] , \s '%r15 \n
))
(.expression( 'r15 ))
) x+Reg64);
fragment : DontChain [] := λ(: l GlobalVariable+Array<x,?>)(: r LocalVariable+U64). (: (
(.program (
\t 'mov \s '$ (.expression l) , \s '%r15 \n
\t 'mov \s (.expression r) \[ '%rbp \] , \s '%r14 \n
\t 'shl \s '$3 , \s '%r14 \n
\t 'add \s '%r14 , \s '%r15 \n
\t 'mov \s '0 \[ '%r15 \] , \s '%r15 \n
))
(.expression( 'r15 ))
) x+Reg64);
fragment : DontChain [] := λ(: l GlobalVariable+Array<x,?>)(: r Constant+U64). (: (
(.program (
\t 'mov \s '$ (.expression l) , \s '%r15 \n
\t 'mov \s '$ (.expression r) , \s '%r14 \n
\t 'shl \s '$3 , \s '%r14 \n
\t 'add \s '%r14 , \s '%r15 \n
\t 'mov \s '0 \[ '%r15 \] , \s '%r15 \n
))
(.expression( 'r15 ))
) x+Reg64);
fragment : DontChain > := λ(: l GlobalVariable+U64)(: r Constant+U64). (: (
(.program (
\t 'mov \s '$ (.expression l) , \s '%r15 \n
\t 'mov \s '0 \[ '%r15 \] , \s '%r15 \n
\t 'cmp \s '$ (.expression r) , '%r15 \n
))
(.expression( 'ja ))
) BranchConditional);
fragment : DontChain > := λ(: l LocalVariable+U64)(: r Constant+U64). (: (
(.program (
\t 'mov \s (.expression l) \[ '%rbp \] , \s '%r15 \n
\t 'cmp \s '$ (.expression r) , '%r15 \n
))
(.expression( 'ja ))
) BranchConditional);
fragment : DontChain > := λ(: l LocalVariable+U64)(: r LocalVariable+U64). (: (
(.program (
\t 'mov \s (.expression l) \[ '%rbp \] , \s '%r15 \n
\t 'mov \s (.expression r) \[ '%rbp \] , \s '%r14 \n
\t 'cmp \s '%r14 , '%r15 \n
))
(.expression( 'ja ))
) BranchConditional);
fragment : DontChain > := λ(: l LocalVariable+I64)(: r LocalVariable+I64). (: (
(.program (
\t 'mov \s (.expression l) \[ '%rbp \] , \s '%r15 \n
\t 'mov \s (.expression r) \[ '%rbp \] , \s '%r14 \n
\t 'cmp \s '%r14 , '%r15 \n
))
(.expression( 'jg ))
) BranchConditional);
fragment : DontChain > := λ(: l GlobalVariable+I64)(: r Constant+I64). (: (
(.program (
\t 'mov \s '$ (.expression l) , \s '%r15 \n
\t 'mov \s '0 \[ '%r15 \] , \s '%r15 \n
\t 'cmp \s '$ (.expression r) , '%r15 \n
))
(.expression( 'jg ))
) BranchConditional);
fragment : DontChain > := λ(: l LocalVariable+I64)(: r Constant+I64). (: (
(.program (
\t 'mov \s (.expression l) \[ '%rbp \] , \s '%r15 \n
\t 'cmp \s '$ (.expression r) , '%r15 \n
))
(.expression( 'jg ))
) BranchConditional);
< := λ(: l U64)(: r U64). (: (tail(
(gensym-label end)
(mov( 1_u64 RAX ))
(mov( l R8 ))
(mov( r R9 ))
(cmp( R9 R8 ))
(jb end)
(mov( 0_u64 RAX ))
(label end)
(as RAX U64)
)) U64);
< := λ(: l I64)(: r I64). (: (tail(
(gensym-label end)
(mov( 1_u64 RAX ))
(mov( l R8 ))
(mov( r R9 ))
(cmp( R9 R8 ))
(jl end)
(mov( 0_u64 RAX ))
(label end)
(as RAX U64)
)) U64);
<= := λ(: l U64)(: r U64). (: (tail(
(gensym-label end)
(mov( 1_u64 RAX ))
(mov( l R8 ))
(mov( r R9 ))
(cmp( R9 R8 ))
(jbe end)
(mov( 0_u64 RAX ))
(label end)
(as RAX U64)
)) U64);
<= := λ(: l I64)(: r I64). (: (tail(
(gensym-label end)
(mov( 1_u64 RAX ))
(mov( l R8 ))
(mov( r R9 ))
(cmp( R9 R8 ))
(jle end)
(mov( 0_u64 RAX ))
(label end)
(as RAX U64)
)) U64);
> := λ(: l U64)(: r U64). (: (tail(
(gensym-label end)
(mov( 1_u64 RAX ))
(mov( l R8 ))
(mov( r R9 ))
(cmp( R9 R8 ))
(ja end)
(mov( 0_u64 RAX ))
(label end)
(as RAX U64)
)) U64);
> := λ(: l I64)(: r I64). (: (tail(
(gensym-label end)
(mov( 1_u64 RAX ))
(mov( l R8 ))
(mov( r R9 ))
(cmp( R9 R8 ))
(jg end)
(mov( 0_u64 RAX ))
(label end)
(as RAX U64)
)) U64);
>= := λ(: l U64)(: r U64). (: (tail(
(gensym-label end)
(mov( 1_u64 RAX ))
(mov( l R8 ))
(mov( r R9 ))
(cmp( R9 R8 ))
(jae end)
(mov( 0_u64 RAX ))
(label end)
(as RAX U64)
)) U64);
>= := λ(: l I64)(: r I64). (: (tail(
(gensym-label end)
(mov( 1_u64 RAX ))
(mov( l R8 ))
(mov( r R9 ))
(cmp( R9 R8 ))
(jge end)
(mov( 0_u64 RAX ))
(label end)
(as RAX U64)
)) U64);
== := λ(: l U64)(: r U64). (: (tail(
(gensym-label end)
(mov( 1_u64 RAX ))
(mov( l R8 ))
(mov( r R9 ))
(cmp( R9 R8 ))
(je end)
(mov( 0_u64 RAX ))
(label end)
(as RAX U64)
)) U64);
== := λ(: l I64)(: r I64). (: (tail(
(gensym-label end)
(mov( 1_u64 RAX ))
(mov( l R8 ))
(mov( r R9 ))
(cmp( R9 R8 ))
(je end)
(mov( 0_u64 RAX ))
(label end)
(as RAX U64)
)) U64);
!= := λ(: l U64)(: r U64). (: (tail(
(gensym-label end)
(mov( 1_u64 RAX ))
(mov( l R8 ))
(mov( r R9 ))
(cmp( R9 R8 ))
(jne end)
(mov( 0_u64 RAX ))
(label end)
(as RAX U64)
)) U64);
&& := λ(: l U64)(: r U64). (: (tail(
(gensym-label end)
(mov( 0_u64 RAX ))
(mov( l R8 ))
(cmp( 0_u64 R8 ))
(je end)
(mov( r R8 ))
(cmp( 0_u64 R8 ))
(je end)
(mov( 1_u64 RAX ))
(label end)
(as RAX U64)
)) U64);
!= := λ(: l I64)(: r I64). (: (tail(
(gensym-label end)
(mov( 1_u64 RAX ))
(mov( l R8 ))
(mov( r R9 ))
(cmp( R9 R8 ))
(jne end)
(mov( 0_u64 RAX ))
(label end)
(as RAX U64)
)) U64);
+ := λ(: l U64)(: r U64). (: (tail(
(mov( l R8 ))
(mov( r RAX ))
(add( R8 RAX ))
(as RAX U64)
)) U64);
+ := λ(: l I64)(: r I64). (: (tail(
(mov( l R8 ))
(mov( r RAX ))
(add( R8 RAX ))
(as RAX I64)
)) I64);
- := λ(: l U64)(: r U64). (: (tail(
(mov( r R8 ))
(mov( l RAX ))
(sub( R8 RAX ))
(as RAX U64)
)) U64);
- := λ(: l I64)(: r I64). (: (tail(
(mov( r R8 ))
(mov( l RAX ))
(sub( R8 RAX ))
(as RAX I64)
)) I64);
fragment : DontChain << := λ(: l U64+LocalVariable)(: r U64+Constant+Literal). (: (
(.program(
\t 'mov \s (.expression l) \[ '%rbp \] , '%rax \n
\t 'shl \s '$ (.expression r) , '%rax \n
))
(.expression 'rax)
) U64+Reg64);
fragment : DontChain >> := λ(: l U64+LocalVariable)(: r U64+Constant+Literal). (: (
(.program(
\t 'mov \s (.expression l) \[ '%rbp \] , '%rax \n
\t 'shr \s '$ (.expression r) , '%rax \n
))
(.expression 'rax)
) U64+Reg64);
^ := λ(: l U64)(: r U64). (: (tail(
(mov( r R8 ))
(mov( l RAX ))
(xor( R8 RAX ))
(as RAX U64)
)) U64);
% := λ(: l U64)(: r U64). (: (tail(
(mov( 0_u64 RDX ))
(mov( l RAX ))
(mov( r R8 ))
(div( R8 ))
(as RDX U64)
)) U64);
% := λ(: l I64)(: r I64). (: (tail(
(mov( 0_u64 RDX ))
(mov( l RAX ))
(mov( r R8 ))
(idiv( R8 ))
(as RDX I64)
)) I64);
/ := λ(: l U64)(: r U64). (: (tail(
(mov( 0_u64 RDX ))
(mov( l RAX ))
(mov( r R8 ))
(div( R8 ))
(as RAX U64)
)) U64);
/ := λ(: l I64)(: r I64). (: (tail(
(mov( 0_u64 RDX ))
(mov( l RAX ))
(mov( r R8 ))
(idiv( R8 ))
(as RAX I64)
)) I64);
* := λ(: l U64)(: r U64). (: (tail(
(mov( r RAX ))
(mov( l R8 ))
(mul( R8 ))
(as RAX U64)
)) U64);
* := λ(: l I64)(: r I64). (: (tail(
(mov( r RAX ))
(mov( l R8 ))
(imul( R8 ))
(as RAX I64)
)) I64);
fragment : DontChain branchtrue := λ(: _ Nil). (: (
(.expression( 'jmp ))
) BranchConditional);
fragment : DontChain branchfalse := λ(: _ Nil). (: (
(.program( \t 'cmp \s '%rsp, \s '%rsp \n ))
(.expression( 'jne ))
) BranchConditional);
!= := λ(: l U8)(: r U8). (: (tail(
(push R14)
(push R15)
(gensym-label end-true)
(gensym-label end-false)
(gensym-label end)
(mov( l R14B ))
(mov( r R15B ))
(cmp( R14B R15B ))
(je end-false)
(jmp end-true)
(label end-true)
(mov( 1_u64 RAX ))
(jmp end)
(label end-false)
(mov( 0_u64 RAX ))
(jmp end)
(label end)
(pop R15)
(pop R14)
(as RAX U64)
)) U64);
== := λ(: l U8)(: r U8). (: (tail(
(push R14)
(push R15)
(gensym-label end-true)
(gensym-label end-false)
(gensym-label end)
(mov( l R14B ))
(mov( r R15B ))
(cmp( R14B R15B ))
(je end-true)
(jmp end-false)
(label end-true)
(mov( 1_u64 RAX ))
(jmp end)
(label end-false)
(mov( 0_u64 RAX ))
(jmp end)
(label end)
(pop R15)
(pop R14)
(as RAX U64)
)) U64);
== := λ(: l U16)(: r U16). (: (tail(
(push R14)
(push R15)
(gensym-label end-true)
(gensym-label end-false)
(gensym-label end)
(mov( l R14W ))
(mov( r R15W ))
(cmp( R14W R15W ))
(je end-true)
(jmp end-false)
(label end-true)
(mov( 1_u64 RAX ))
(jmp end)
(label end-false)
(mov( 0_u64 RAX ))
(jmp end)
(label end)
(pop R15)
(pop R14)
(as RAX U64)
)) U64);
== := λ(: l U32)(: r U32). (: (tail(
(push R14)
(push R15)
(gensym-label end-true)
(gensym-label end-false)
(gensym-label end)
(mov( l R14D ))
(mov( r R15D ))
(cmp( R14D R15D ))
(je end-true)
(jmp end-false)
(label end-true)
(mov( 1_u64 RAX ))
(jmp end)
(label end-false)
(mov( 0_u64 RAX ))
(jmp end)
(label end)
(pop R15)
(pop R14)
(as RAX U64)
)) U64);
not := λ(: x U64). (: (tail(
(let r 0_u64)
(if (==( x 0_u64 )) (
(set r 1_u64)
) ())
r
)) U64);
== := λ(: l I8)(: r I8). (: (tail(
(push R14)
(push R15)
(gensym-label end-true)
(gensym-label end-false)
(gensym-label end)
(mov( l R14B ))
(mov( r R15B ))
(cmp( R14B R15B ))
(je end-true)
(jmp end-false)
(label end-true)
(mov( 1_u64 RAX ))
(jmp end)
(label end-false)
(mov( 0_u64 RAX ))
(jmp end)
(label end)
(pop R15)
(pop R14)
(as RAX U64)
)) U64);
== := λ(: l I16)(: r I16). (: (tail(
(push R14)
(push R15)
(gensym-label end-true)
(gensym-label end-false)
(gensym-label end)
(mov( l R14W ))
(mov( r R15W ))
(cmp( R14W R15W ))
(je end-true)
(jmp end-false)
(label end-true)
(mov( 1_u64 RAX ))
(jmp end)
(label end-false)
(mov( 0_u64 RAX ))
(jmp end)
(label end)
(pop R15)
(pop R14)
(as RAX U64)
)) U64);
== := λ(: l I32)(: r I32). (: (tail(
(push R14)
(push R15)
(gensym-label end-true)
(gensym-label end-false)
(gensym-label end)
(mov( l R14D ))
(mov( r R15D ))
(cmp( R14D R15D ))
(je end-true)
(jmp end-false)
(label end-true)
(mov( 1_u64 RAX ))
(jmp end)
(label end-false)
(mov( 0_u64 RAX ))
(jmp end)
(label end)
(pop R15)
(pop R14)
(as RAX U64)
)) U64);
fragment : DontChain non-zero := λ(: l Reg64+U64). (: (
(.program (
\t 'cmp \s '$0 , \s '% (.expression l) \n
))
(.expression( 'jne ))
) BranchConditional);
fragment : DontChain non-zero := λ(: l Reg32+U32). (: (
(.program (
\t 'cmp \s '$0 , \s '% (.expression l) \n
))
(.expression( 'jne ))
) BranchConditional);
fragment : DontChain non-zero := λ(: l Reg16+U16). (: (
(.program (
\t 'cmp \s '$0 , \s '% (.expression l) \n
))
(.expression( 'jne ))
) BranchConditional);
fragment : DontChain non-zero := λ(: l Reg8+U8). (: (
(.program (
\t 'cmp \s '$0 , \s '% (.expression l) \n
))
(.expression( 'jne ))
) BranchConditional);
fragment : DontChain non-zero := λ(: l BranchConditional). (: (
(.expression( (.expression l) ))
) BranchConditional);