code wiki / (root) / nx_fbx_compose_scratch_gate_t181.nx

nx_fbx_compose_scratch_gate_t181.nx source

↩ module page · 23 lines · 4349 B

1import "nx_fbx_bind.nx" 2func fp(s:*u8)->i64{var n:i64=0;while s[n]!=(0 as u8){n=n+1};sys_write(1,s,n);return 0} 3func fill(a:*i64,v:i64)->i64{var i:i64=0;while i<16{a[i]=v;i=i+1};return 0} 4func ident(a:*i64)->i64{fill(a,0);a[0]=FBB_Q;a[5]=FBB_Q;a[10]=FBB_Q;a[15]=FBB_Q;return 0} 5func same(a:*i64,b:*i64)->i64{var i:i64=0;while i<16{if a[i]!=b[i]{return 0};i=i+1};return 1} 6func untouched(a:*i64)->i64{var i:i64=0;while i<16{if a[i]!=777{return 0};i=i+1};return 1} 7func main()->i64{let a:*i64=sys_mmap(128) as *i64;let b:*i64=sys_mmap(128) as *i64;let out:*i64=sys_mmap(128) as *i64;let tmp:*i64=sys_mmap(128) as *i64;let expected:*i64=sys_mmap(128) as *i64;var fails:i64=0;var rc:i64=0; 8a[0]=1048576;a[1]=0;a[2]=0;a[3]=0;a[4]=0;a[5]=1048576;a[6]=0;a[7]=0;a[8]=0;a[9]=0;a[10]=1048576;a[11]=0;a[12]=0;a[13]=0;a[14]=0;a[15]=1048576;b[0]=1048576;b[1]=0;b[2]=0;b[3]=0;b[4]=0;b[5]=1048576;b[6]=0;b[7]=0;b[8]=0;b[9]=0;b[10]=1048576;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1048576;expected[0]=1048576;expected[1]=0;expected[2]=0;expected[3]=0;expected[4]=0;expected[5]=1048576;expected[6]=0;expected[7]=0;expected[8]=0;expected[9]=0;expected[10]=1048576;expected[11]=0;expected[12]=0;expected[13]=0;expected[14]=0;expected[15]=1048576;rc=fbb_compose_into(a,b,out,tmp,16);if rc!=0||same(out,expected)!=1{fails=fails+1;fp("FAIL matrix0\n")} 9a[0]=0;a[1]=1048576;a[2]=0;a[3]=0;a[4]=-2097152;a[5]=0;a[6]=0;a[7]=0;a[8]=0;a[9]=0;a[10]=1048576;a[11]=0;a[12]=3145728;a[13]=-7340032;a[14]=0;a[15]=1048576;b[0]=2097152;b[1]=0;b[2]=0;b[3]=0;b[4]=0;b[5]=524288;b[6]=0;b[7]=0;b[8]=0;b[9]=0;b[10]=3145728;b[11]=0;b[12]=-8388608;b[13]=0;b[14]=4194304;b[15]=1048576;expected[0]=0;expected[1]=2097152;expected[2]=0;expected[3]=0;expected[4]=-1048576;expected[5]=0;expected[6]=0;expected[7]=0;expected[8]=0;expected[9]=0;expected[10]=3145728;expected[11]=0;expected[12]=3145728;expected[13]=-15728640;expected[14]=4194304;expected[15]=1048576;rc=fbb_compose_into(a,b,out,tmp,16);if rc!=0||same(out,expected)!=1{fails=fails+1;fp("FAIL matrix1\n")} 10a[0]=2097152;a[1]=0;a[2]=0;a[3]=0;a[4]=0;a[5]=524288;a[6]=0;a[7]=0;a[8]=0;a[9]=0;a[10]=3145728;a[11]=0;a[12]=-8388608;a[13]=0;a[14]=4194304;a[15]=1048576;b[0]=0;b[1]=1048576;b[2]=0;b[3]=0;b[4]=-2097152;b[5]=0;b[6]=0;b[7]=0;b[8]=0;b[9]=0;b[10]=1048576;b[11]=0;b[12]=3145728;b[13]=-7340032;b[14]=0;b[15]=1048576;expected[0]=0;expected[1]=524288;expected[2]=0;expected[3]=0;expected[4]=-4194304;expected[5]=0;expected[6]=0;expected[7]=0;expected[8]=0;expected[9]=0;expected[10]=3145728;expected[11]=0;expected[12]=-2097152;expected[13]=-3670016;expected[14]=4194304;expected[15]=1048576;rc=fbb_compose_into(a,b,out,tmp,16);if rc!=0||same(out,expected)!=1{fails=fails+1;fp("FAIL matrix2\n")} 11rc=fbb_compose_into(a,b,a,tmp,16);if rc!=0||same(a,expected)!=1{fails=fails+1;fp("FAIL alias-a\n")} 12ident(a);var copyi:i64=0;while copyi<16{expected[copyi]=b[copyi];copyi=copyi+1};rc=fbb_compose_into(a,b,b,tmp,16);if rc!=0||same(b,expected)!=1{fails=fails+1;fp("FAIL alias-b\n")} 13ident(a);ident(b);rc=fbb_compose(a,b,out);if rc!=0||same(out,a)!=1{fails=fails+1;fp("FAIL wrapper\n")} 14fill(out,777);rc=fbb_compose_into(a,b,out,tmp,15);if rc>=0||untouched(out)!=1{fails=fails+1;fp("FAIL boundary0\n")} 15fill(out,777);rc=fbb_compose_into(a,b,out,a,16);if rc>=0||untouched(out)!=1{fails=fails+1;fp("FAIL boundary1\n")} 16fill(out,777);rc=fbb_compose_into(a,b,out,b,16);if rc>=0||untouched(out)!=1{fails=fails+1;fp("FAIL boundary2\n")} 17fill(out,777);rc=fbb_compose_into(a,b,out,out,16);if rc>=0||untouched(out)!=1{fails=fails+1;fp("FAIL boundary3\n")} 18fill(out,777);rc=fbb_compose_into(a,b,out,(a as i64+8) as *i64,16);if rc>=0||untouched(out)!=1{fails=fails+1;fp("FAIL boundary4\n")} 19fill(out,777);rc=fbb_compose_into(0 as *i64,b,out,tmp,16);if rc>=0||untouched(out)!=1{fails=fails+1;fp("FAIL boundary5\n")} 20fill(out,777);rc=fbb_compose_into(a,b,out,(0-12) as *i64,16);if rc>=0||untouched(out)!=1{fails=fails+1;fp("FAIL boundary6\n")} 21ident(a);ident(b);a[15]=FBB_I64_MAX;b[15]=2;fill(out,777);rc=fbb_compose_into(a,b,out,tmp,16);if rc!=FBB_RANGE||untouched(out)!=1{fails=fails+1;fp("FAIL late-overflow\n")} 22fill(a,FBB_Q);fill(b,FBB_I64_MAX/FBB_Q);fill(out,777);rc=fbb_compose_into(a,b,out,tmp,16);if rc!=0{fails=fails+1;fp("FAIL safe-large\n")} 23if fails==0{fp("PASS fbb-compose-scratch cases=15\n")}else{fp("FAIL fbb-compose-scratch\n")};return fails}