1package types 2 3// ================================================================ 4// Bitwise NOT 5 6func bitwise_not_i_i(input1 *Mlrval) *Mlrval { 7 return MlrvalPointerFromInt(^input1.intval) 8} 9 10var bitwise_not_dispositions = [MT_DIM]UnaryFunc{ 11 /*ERROR */ _erro1, 12 /*ABSENT */ _absn1, 13 /*VOID */ _void1, 14 /*STRING */ _erro1, 15 /*INT */ bitwise_not_i_i, 16 /*FLOAT */ _erro1, 17 /*BOOL */ _erro1, 18 /*ARRAY */ _absn1, 19 /*MAP */ _absn1, 20} 21 22func MlrvalBitwiseNOT(input1 *Mlrval) *Mlrval { 23 return bitwise_not_dispositions[input1.mvtype](input1) 24} 25 26// ================================================================ 27// Bit-count 28// https://en.wikipedia.org/wiki/Hamming_weight 29 30const _m01 uint64 = 0x5555555555555555 31const _m02 uint64 = 0x3333333333333333 32const _m04 uint64 = 0x0f0f0f0f0f0f0f0f 33const _m08 uint64 = 0x00ff00ff00ff00ff 34const _m16 uint64 = 0x0000ffff0000ffff 35const _m32 uint64 = 0x00000000ffffffff 36 37func bitcount_i_i(input1 *Mlrval) *Mlrval { 38 a := uint64(input1.intval) 39 a = (a & _m01) + ((a >> 1) & _m01) 40 a = (a & _m02) + ((a >> 2) & _m02) 41 a = (a & _m04) + ((a >> 4) & _m04) 42 a = (a & _m08) + ((a >> 8) & _m08) 43 a = (a & _m16) + ((a >> 16) & _m16) 44 a = (a & _m32) + ((a >> 32) & _m32) 45 return MlrvalPointerFromInt(int(a)) 46} 47 48var bitcount_dispositions = [MT_DIM]UnaryFunc{ 49 /*ERROR */ _erro1, 50 /*ABSENT */ _absn1, 51 /*VOID */ _void1, 52 /*STRING */ _erro1, 53 /*INT */ bitcount_i_i, 54 /*FLOAT */ _erro1, 55 /*BOOL */ _erro1, 56 /*ARRAY */ _absn1, 57 /*MAP */ _absn1, 58} 59 60func MlrvalBitCount(input1 *Mlrval) *Mlrval { 61 return bitcount_dispositions[input1.mvtype](input1) 62} 63 64// ================================================================ 65// Bitwise AND 66 67func bitwise_and_i_ii(input1, input2 *Mlrval) *Mlrval { 68 return MlrvalPointerFromInt(input1.intval & input2.intval) 69} 70 71var bitwise_and_dispositions = [MT_DIM][MT_DIM]BinaryFunc{ 72 // ERROR ABSENT VOID STRING INT FLOAT BOOL ARRAY MAP 73 /*ERROR */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn}, 74 /*ABSENT */ {_erro, _absn, _absn, _erro, _2___, _erro, _erro, _absn, _absn}, 75 /*VOID */ {_erro, _absn, _void, _erro, _void, _void, _erro, _absn, _absn}, 76 /*STRING */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn}, 77 /*INT */ {_erro, _1___, _void, _erro, bitwise_and_i_ii, _erro, _erro, _absn, _absn}, 78 /*FLOAT */ {_erro, _erro, _void, _erro, _erro, _erro, _erro, _absn, _absn}, 79 /*BOOL */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn}, 80 /*ARRAY */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn}, 81 /*MAP */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn}, 82} 83 84func MlrvalBitwiseAND(input1, input2 *Mlrval) *Mlrval { 85 return bitwise_and_dispositions[input1.mvtype][input2.mvtype](input1, input2) 86} 87 88// ---------------------------------------------------------------- 89// Bitwise OR 90 91func bitwise_or_i_ii(input1, input2 *Mlrval) *Mlrval { 92 return MlrvalPointerFromInt(input1.intval | input2.intval) 93} 94 95var bitwise_or_dispositions = [MT_DIM][MT_DIM]BinaryFunc{ 96 // ERROR ABSENT VOID STRING INT FLOAT BOOL ARRAY MAP 97 /*ERROR */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn}, 98 /*ABSENT */ {_erro, _absn, _absn, _erro, _2___, _erro, _erro, _absn, _absn}, 99 /*VOID */ {_erro, _absn, _void, _erro, _void, _void, _erro, _absn, _absn}, 100 /*STRING */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn}, 101 /*INT */ {_erro, _1___, _void, _erro, bitwise_or_i_ii, _erro, _erro, _absn, _absn}, 102 /*FLOAT */ {_erro, _erro, _void, _erro, _erro, _erro, _erro, _absn, _absn}, 103 /*BOOL */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn}, 104 /*ARRAY */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn}, 105 /*MAP */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn}, 106} 107 108func MlrvalBitwiseOR(input1, input2 *Mlrval) *Mlrval { 109 return bitwise_or_dispositions[input1.mvtype][input2.mvtype](input1, input2) 110} 111 112// ---------------------------------------------------------------- 113// Bitwise XOR 114 115func bitwise_xor_i_ii(input1, input2 *Mlrval) *Mlrval { 116 return MlrvalPointerFromInt(input1.intval ^ input2.intval) 117} 118 119var bitwise_xor_dispositions = [MT_DIM][MT_DIM]BinaryFunc{ 120 // ERROR ABSENT VOID STRING INT FLOAT BOOL ARRAY MAP 121 /*ERROR */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn}, 122 /*ABSENT */ {_erro, _absn, _absn, _erro, _2___, _erro, _erro, _absn, _absn}, 123 /*VOID */ {_erro, _absn, _void, _erro, _void, _void, _erro, _absn, _absn}, 124 /*STRING */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn}, 125 /*INT */ {_erro, _1___, _void, _erro, bitwise_xor_i_ii, _erro, _erro, _absn, _absn}, 126 /*FLOAT */ {_erro, _erro, _void, _erro, _erro, _erro, _erro, _absn, _absn}, 127 /*BOOL */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn}, 128 /*ARRAY */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn}, 129 /*MAP */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn}, 130} 131 132func MlrvalBitwiseXOR(input1, input2 *Mlrval) *Mlrval { 133 return bitwise_xor_dispositions[input1.mvtype][input2.mvtype](input1, input2) 134} 135 136// ---------------------------------------------------------------- 137// Left shift 138 139func lsh_i_ii(input1, input2 *Mlrval) *Mlrval { 140 return MlrvalPointerFromInt(input1.intval << uint64(input2.intval)) 141} 142 143var left_shift_dispositions = [MT_DIM][MT_DIM]BinaryFunc{ 144 // ERROR ABSENT VOID STRING INT FLOAT BOOL ARRAY MAP 145 /*ERROR */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn}, 146 /*ABSENT */ {_erro, _absn, _absn, _erro, _2___, _erro, _erro, _absn, _absn}, 147 /*VOID */ {_erro, _absn, _void, _erro, _void, _void, _erro, _absn, _absn}, 148 /*STRING */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn}, 149 /*INT */ {_erro, _1___, _void, _erro, lsh_i_ii, _erro, _erro, _absn, _absn}, 150 /*FLOAT */ {_erro, _erro, _void, _erro, _erro, _erro, _erro, _absn, _absn}, 151 /*BOOL */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn}, 152 /*ARRAY */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn}, 153 /*MAP */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn}, 154} 155 156func MlrvalLeftShift(input1, input2 *Mlrval) *Mlrval { 157 return left_shift_dispositions[input1.mvtype][input2.mvtype](input1, input2) 158} 159 160// ---------------------------------------------------------------- 161// Signed right shift 162 163func srsh_i_ii(input1, input2 *Mlrval) *Mlrval { 164 return MlrvalPointerFromInt(input1.intval >> uint64(input2.intval)) 165} 166 167var signed_right_shift_dispositions = [MT_DIM][MT_DIM]BinaryFunc{ 168 // ERROR ABSENT VOID STRING INT FLOAT BOOL ARRAY MAP 169 /*ERROR */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn}, 170 /*ABSENT */ {_erro, _absn, _absn, _erro, _2___, _erro, _erro, _absn, _absn}, 171 /*VOID */ {_erro, _absn, _void, _erro, _void, _void, _erro, _absn, _absn}, 172 /*STRING */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn}, 173 /*INT */ {_erro, _1___, _void, _erro, srsh_i_ii, _erro, _erro, _absn, _absn}, 174 /*FLOAT */ {_erro, _erro, _void, _erro, _erro, _erro, _erro, _absn, _absn}, 175 /*BOOL */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn}, 176 /*ARRAY */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn}, 177 /*MAP */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn}, 178} 179 180func MlrvalSignedRightShift(input1, input2 *Mlrval) *Mlrval { 181 return signed_right_shift_dispositions[input1.mvtype][input2.mvtype](input1, input2) 182} 183 184// ---------------------------------------------------------------- 185// Unsigned right shift 186 187func ursh_i_ii(input1, input2 *Mlrval) *Mlrval { 188 var ua uint64 = uint64(input1.intval) 189 var ub uint64 = uint64(input2.intval) 190 var uc = ua >> ub 191 return MlrvalPointerFromInt(int(uc)) 192} 193 194var unsigned_right_shift_dispositions = [MT_DIM][MT_DIM]BinaryFunc{ 195 // ERROR ABSENT VOID STRING INT FLOAT BOOL ARRAY MAP 196 /*ERROR */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn}, 197 /*ABSENT */ {_erro, _absn, _absn, _erro, _2___, _erro, _erro, _absn, _absn}, 198 /*VOID */ {_erro, _absn, _void, _erro, _void, _void, _erro, _absn, _absn}, 199 /*STRING */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn}, 200 /*INT */ {_erro, _1___, _void, _erro, ursh_i_ii, _erro, _erro, _absn, _absn}, 201 /*FLOAT */ {_erro, _erro, _void, _erro, _erro, _erro, _erro, _absn, _absn}, 202 /*BOOL */ {_erro, _erro, _erro, _erro, _erro, _erro, _erro, _absn, _absn}, 203 /*ARRAY */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn}, 204 /*MAP */ {_absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn, _absn}, 205} 206 207func MlrvalUnsignedRightShift(input1, input2 *Mlrval) *Mlrval { 208 return unsigned_right_shift_dispositions[input1.mvtype][input2.mvtype](input1, input2) 209} 210