The result of a * b must fit into a signed 32-bit integer.
generally speaking result of all arithmetic operations can overflow that is why the result is always a 64-bit integer. the only rule is that the value that is popped to be evaluated as an integer can not be bigger than 32-bit.
you should also add some explanation about your OP_MUL, it is not easy to figure out.