From c3a8e118f5e87cf4ff2219e2644c3dfaad3068dd Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Fri, 3 Jun 2022 21:34:02 +0800 Subject: [PATCH] :zap: add u32 and() xor() or() nand() not() --- lib.nas | 35 +++++++++----- nasal_builtin.h | 124 ++++++++++++++++++++++++++---------------------- stl/lib.nas | 25 +++++++--- test/md5.nas | 39 ++------------- test/qrcode.nas | 4 +- 5 files changed, 115 insertions(+), 112 deletions(-) diff --git a/lib.nas b/lib.nas index dfc1201..809f067 100644 --- a/lib.nas +++ b/lib.nas @@ -338,16 +338,27 @@ var fstat=func(filename){ # carefully use it, all the calculations are based on integer. var bits= { - # xor - bitxor: func(a,b){return __builtin_xor(a,b); }, - # and - bitand: func(a,b){return __builtin_and(a,b); }, - # or - bitor: func(a,b){return __builtin_or(a,b); }, - # nand - bitnand: func(a,b){return __builtin_nand(a,b);}, - # not - bitnot: func(a) {return __builtin_not(a); }, + # i32 xor + i32_xor: func(a,b){return __builtin_i32xor(a,b); }, + # i32 and + i32_and: func(a,b){return __builtin_i32and(a,b); }, + # i32 or + i32_or: func(a,b){return __builtin_i32or(a,b); }, + # i32 nand + i32_nand:func(a,b){return __builtin_i32nand(a,b);}, + # i32 not + i32_not: func(a) {return __builtin_i32not(a); }, + # u32 xor + u32_xor: func(a,b){return __builtin_u32xor(a,b); }, + # u32 and + u32_and: func(a,b){return __builtin_u32and(a,b); }, + # u32 or + u32_or: func(a,b){return __builtin_u32or(a,b); }, + # u32 nand + u32_nand:func(a,b){return __builtin_u32nand(a,b);}, + # u32 not + u32_not: func(a) {return __builtin_u32not(a); }, + # get bit data from a special string. for example: # bits.fld(s,0,3); # if s stores 10100010(162) @@ -399,8 +410,8 @@ var unix= dup2: func(fd0,fd1){die("not supported yet");}, exec: func(filename,argv,envp){die("not supported yet");}, waitpid: func(pid,nohang=0){return __builtin_waitpid;}, - isdir: func(path){return bits.bitand(io.stat(path)[2],0x4000);}, # S_IFDIR 0x4000 - isfile: func(path){return bits.bitand(io.stat(path)[2],0x8000);}, # S_IFREG 0x8000 + isdir: func(path){return bits.u32_and(io.stat(path)[2],0x4000);}, # S_IFDIR 0x4000 + isfile: func(path){return bits.u32_and(io.stat(path)[2],0x8000);}, # S_IFREG 0x8000 opendir: func(path){return __builtin_opendir;}, readdir: func(handle){return __builtin_readdir;}, closedir: func(handle){return __builtin_closedir;}, diff --git a/nasal_builtin.h b/nasal_builtin.h index 3445f1a..091b37f 100644 --- a/nasal_builtin.h +++ b/nasal_builtin.h @@ -26,11 +26,16 @@ nas_native(builtin_num); nas_native(builtin_pop); nas_native(builtin_str); nas_native(builtin_size); -nas_native(builtin_xor); -nas_native(builtin_and); -nas_native(builtin_or); -nas_native(builtin_nand); -nas_native(builtin_not); +nas_native(builtin_i32xor); +nas_native(builtin_i32and); +nas_native(builtin_i32or); +nas_native(builtin_i32nand); +nas_native(builtin_i32not); +nas_native(builtin_u32xor); +nas_native(builtin_u32and); +nas_native(builtin_u32or); +nas_native(builtin_u32nand); +nas_native(builtin_u32not); nas_native(builtin_pow); nas_native(builtin_sin); nas_native(builtin_cos); @@ -125,11 +130,16 @@ struct {"__builtin_pop", builtin_pop }, {"__builtin_str", builtin_str }, {"__builtin_size", builtin_size }, - {"__builtin_xor", builtin_xor }, - {"__builtin_and", builtin_and }, - {"__builtin_or", builtin_or }, - {"__builtin_nand", builtin_nand }, - {"__builtin_not", builtin_not }, + {"__builtin_i32xor", builtin_i32xor }, + {"__builtin_i32and", builtin_i32and }, + {"__builtin_i32or", builtin_i32or }, + {"__builtin_i32nand", builtin_i32nand }, + {"__builtin_i32not", builtin_i32not }, + {"__builtin_u32xor", builtin_u32xor }, + {"__builtin_u32and", builtin_u32and }, + {"__builtin_u32or", builtin_u32or }, + {"__builtin_u32nand", builtin_u32nand }, + {"__builtin_u32not", builtin_u32not }, {"__builtin_pow", builtin_pow }, {"__builtin_sin", builtin_sin }, {"__builtin_cos", builtin_cos }, @@ -447,61 +457,63 @@ nasal_ref builtin_size(nasal_ref* local,nasal_gc& gc) } return {vm_num,num}; } -nasal_ref builtin_xor(nasal_ref* local,nasal_gc& gc) +nasal_ref builtin_i32xor(nasal_ref* local,nasal_gc& gc) { - nasal_ref a=local[1]; - nasal_ref b=local[2]; - if(a.type!=vm_num) - return builtin_err("xor","\"a\" must be number"); - if(b.type!=vm_num) - return builtin_err("xor","\"b\" must be number"); - int number_a=(int)a.num(); - int number_b=(int)b.num(); - return {vm_num,(double)(number_a^number_b)}; + int a=(int)local[1].num(); + int b=(int)local[2].num(); + return {vm_num,(double)(a^b)}; } -nasal_ref builtin_and(nasal_ref* local,nasal_gc& gc) +nasal_ref builtin_i32and(nasal_ref* local,nasal_gc& gc) { - nasal_ref a=local[1]; - nasal_ref b=local[2]; - if(a.type!=vm_num) - return builtin_err("and","\"a\" must be number"); - if(b.type!=vm_num) - return builtin_err("and","\"b\" must be number"); - int number_a=(int)a.num(); - int number_b=(int)b.num(); - return {vm_num,(double)(number_a&number_b)}; + int a=(int)local[1].num(); + int b=(int)local[2].num(); + return {vm_num,(double)(a&b)}; } -nasal_ref builtin_or(nasal_ref* local,nasal_gc& gc) +nasal_ref builtin_i32or(nasal_ref* local,nasal_gc& gc) { - nasal_ref a=local[1]; - nasal_ref b=local[2]; - if(a.type!=vm_num) - return builtin_err("or","\"a\" must be number"); - if(b.type!=vm_num) - return builtin_err("or","\"b\" must be number"); - int number_a=(int)a.num(); - int number_b=(int)b.num(); - return {vm_num,(double)(number_a|number_b)}; + int a=(int)local[1].num(); + int b=(int)local[2].num(); + return {vm_num,(double)(a|b)}; } -nasal_ref builtin_nand(nasal_ref* local,nasal_gc& gc) +nasal_ref builtin_i32nand(nasal_ref* local,nasal_gc& gc) { - nasal_ref a=local[1]; - nasal_ref b=local[2]; - if(a.type!=vm_num) - return builtin_err("nand","\"a\" must be number"); - if(b.type!=vm_num) - return builtin_err("nand","\"b\" must be number"); - int number_a=(int)a.num(); - int number_b=(int)b.num(); - return {vm_num,(double)(~(number_a&number_b))}; + int a=(int)local[1].num(); + int b=(int)local[2].num(); + return {vm_num,(double)(~(a&b))}; } -nasal_ref builtin_not(nasal_ref* local,nasal_gc& gc) +nasal_ref builtin_i32not(nasal_ref* local,nasal_gc& gc) { - nasal_ref a=local[1]; - if(a.type!=vm_num) - return builtin_err("not","\"a\" must be number"); - int number=(int)a.num(); - return {vm_num,(double)(~number)}; + int n=(int)local[1].num(); + return {vm_num,(double)(~n)}; +} +nasal_ref builtin_u32xor(nasal_ref* local,nasal_gc& gc) +{ + uint32_t a=(uint32_t)local[1].num(); + uint32_t b=(uint32_t)local[2].num(); + return {vm_num,(double)(a^b)}; +} +nasal_ref builtin_u32and(nasal_ref* local,nasal_gc& gc) +{ + uint32_t a=(uint32_t)local[1].num(); + uint32_t b=(uint32_t)local[2].num(); + return {vm_num,(double)(a&b)}; +} +nasal_ref builtin_u32or(nasal_ref* local,nasal_gc& gc) +{ + uint32_t a=(uint32_t)local[1].num(); + uint32_t b=(uint32_t)local[2].num(); + return {vm_num,(double)(a|b)}; +} +nasal_ref builtin_u32nand(nasal_ref* local,nasal_gc& gc) +{ + uint32_t a=(uint32_t)local[1].num(); + uint32_t b=(uint32_t)local[2].num(); + return {vm_num,(double)(~(a&b))}; +} +nasal_ref builtin_u32not(nasal_ref* local,nasal_gc& gc) +{ + uint32_t n=(uint32_t)local[1].num(); + return {vm_num,(double)(~n)}; } nasal_ref builtin_pow(nasal_ref* local,nasal_gc& gc) { diff --git a/stl/lib.nas b/stl/lib.nas index dfc1201..3c7308d 100644 --- a/stl/lib.nas +++ b/stl/lib.nas @@ -339,15 +339,26 @@ var fstat=func(filename){ var bits= { # xor - bitxor: func(a,b){return __builtin_xor(a,b); }, + bitxor: func(a,b){return __builtin_i32xor(a,b); }, # and - bitand: func(a,b){return __builtin_and(a,b); }, + bitand: func(a,b){return __builtin_i32and(a,b); }, # or - bitor: func(a,b){return __builtin_or(a,b); }, + bitor: func(a,b){return __builtin_i32or(a,b); }, # nand - bitnand: func(a,b){return __builtin_nand(a,b);}, + bitnand: func(a,b){return __builtin_i32nand(a,b);}, # not - bitnot: func(a) {return __builtin_not(a); }, + bitnot: func(a) {return __builtin_i32not(a); }, + # u32 xor + u32_xor: func(a,b){return __builtin_u32xor(a,b); }, + # u32 and + u32_and: func(a,b){return __builtin_u32and(a,b); }, + # u32 or + u32_or: func(a,b){return __builtin_u32or(a,b); }, + # u32 nand + u32_nand:func(a,b){return __builtin_u32nand(a,b);}, + # u32 not + u32_not: func(a) {return __builtin_u32not(a); }, + # get bit data from a special string. for example: # bits.fld(s,0,3); # if s stores 10100010(162) @@ -399,8 +410,8 @@ var unix= dup2: func(fd0,fd1){die("not supported yet");}, exec: func(filename,argv,envp){die("not supported yet");}, waitpid: func(pid,nohang=0){return __builtin_waitpid;}, - isdir: func(path){return bits.bitand(io.stat(path)[2],0x4000);}, # S_IFDIR 0x4000 - isfile: func(path){return bits.bitand(io.stat(path)[2],0x8000);}, # S_IFREG 0x8000 + isdir: func(path){return bits.u32_and(io.stat(path)[2],0x4000);}, # S_IFDIR 0x4000 + isfile: func(path){return bits.u32_and(io.stat(path)[2],0x8000);}, # S_IFREG 0x8000 opendir: func(path){return __builtin_opendir;}, readdir: func(handle){return __builtin_readdir;}, closedir: func(handle){return __builtin_closedir;}, diff --git a/test/md5.nas b/test/md5.nas index 9d3973c..1496546 100644 --- a/test/md5.nas +++ b/test/md5.nas @@ -4,47 +4,16 @@ var check=func(x){ return x-floor(x/0x100000000)*0x100000000; } var u32_bits_and=func(x,y){ - (x,y)=(check(x),check(y)); - var (res,op)=(0,1); - for(var i=0;i<32;i+=1){ - var (tmpx,tmpy)=(x-floor(x/2)*2,y-floor(y/2)*2); - res+=op*(tmpx==1 and tmpy==1); - (x,y)=(floor(x/2),floor(y/2)); - op*=2; - } - return res; + return bits.u32_and(check(x),check(y)); } var u32_bits_or=func(x,y){ - (x,y)=(check(x),check(y)); - var (res,op)=(0,1); - for(var i=0;i<32;i+=1){ - var (tmpx,tmpy)=(x-floor(x/2)*2,y-floor(y/2)*2); - res+=op*(tmpx==1 or tmpy==1); - (x,y)=(floor(x/2),floor(y/2)); - op*=2; - } - return res; + return bits.u32_or(check(x),check(y)); } var u32_bits_xor=func(x,y){ - (x,y)=(check(x),check(y)); - var (res,op)=(0,1); - for(var i=0;i<32;i+=1){ - var (tmpx,tmpy)=(x-floor(x/2)*2,y-floor(y/2)*2); - res+=op*(tmpx!=tmpy); - (x,y)=(floor(x/2),floor(y/2)); - op*=2; - } - return res; + return bits.u32_xor(check(x),check(y)); } var u32_bits_not=func(x){ - x=check(x); - var (res,op)=(0,1); - for(var i=0;i<32;i+=1){ - res+=op*((x-floor(x/2)*2)==1?0:1); - x=floor(x/2); - op*=2; - } - return res; + return bits.u32_not(check(x)); } var hex32str=func(){ diff --git a/test/qrcode.nas b/test/qrcode.nas index ec6e023..10530b9 100644 --- a/test/qrcode.nas +++ b/test/qrcode.nas @@ -38,7 +38,7 @@ var transfer=func(s){ var len=size(s); var vec=[0,0,0,0,0,0,0,0,0]; for(var i=8;i>=0;i-=1){ - vec[i]=bits.bitand(1,len); + vec[i]=bits.u32_and(1,len); len=int(len/2); } println(vec); @@ -48,7 +48,7 @@ var transfer=func(s){ var tmp=[0,0,0,0,0,0,0,0]; var c=s[i]; for(var j=7;j>=0;j-=1){ - tmp[j]=bits.bitand(1,c); + tmp[j]=bits.u32_and(1,c); c=int(c/2); } foreach(var j;tmp)