@@ -972,3 +972,43 @@ func TestPush(t *testing.T) {
972972 }
973973 }
974974}
975+
976+ func TestOpCLZ (t * testing.T ) {
977+ evm := NewEVM (BlockContext {}, nil , params .TestChainConfig , Config {})
978+
979+ tests := []struct {
980+ inputHex string
981+ want uint64 // expected CLZ result
982+ }{
983+ {"0x0" , 256 },
984+ {"0x1" , 255 },
985+ {"0x6ff" , 245 }, // 0x6ff = 0b11011111111 (11 bits), so 256-11 = 245
986+ {"0xffffffffff" , 216 }, // 40 bits, so 256-40 = 216
987+ {"0x4000000000000000000000000000000000000000000000000000000000000000" , 1 },
988+ {"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" , 1 },
989+ {"0x8000000000000000000000000000000000000000000000000000000000000000" , 0 },
990+ {"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" , 0 },
991+ }
992+ for _ , tc := range tests {
993+ // prepare a fresh stack and PC
994+ stack := newstack ()
995+ pc := uint64 (0 )
996+
997+ // parse input
998+ val := new (uint256.Int )
999+ if err := val .SetFromHex (tc .inputHex ); err != nil {
1000+ t .Fatal ("invalid hex uint256:" , tc .inputHex )
1001+ }
1002+
1003+ stack .push (val )
1004+ opCLZ (& pc , evm .interpreter , & ScopeContext {Stack : stack })
1005+
1006+ if gotLen := stack .len (); gotLen != 1 {
1007+ t .Fatalf ("stack length = %d; want 1" , gotLen )
1008+ }
1009+ result := stack .pop ()
1010+ if got := result .Uint64 (); got != tc .want {
1011+ t .Fatalf ("clz(%q) = %d; want %d" , tc .inputHex , got , tc .want )
1012+ }
1013+ }
1014+ }
0 commit comments