func (em *emitter) comparisonWithZeroInteger(cond *ast.BinaryOperator) ast.Expression {
	var expr, constant ast.Expression
	if ti2 := em.ti(cond.Expr2); ti2 != nil && ti2.IsConstant() {
		constant = cond.Expr2
		expr = cond.Expr1
	} else if ti1 := em.ti(cond.Expr1); ti1 != nil && ti1.IsConstant() {
		constant = cond.Expr1
		expr = cond.Expr2
	}
	if expr == nil {
		return nil
	}
	exprTi := em.ti(expr)
	if exprTi == nil {
		return nil
	}
	if exprTi.Type == nil {
		return nil
	}
	if k := exprTi.Type.Kind(); k < reflect.Int || k > reflect.Uintptr {
		return nil
	}
	if ti := em.ti(constant); ti != nil && ti.HasValue() {
		if i64, ok := ti.value.(int64); ok && i64 != 0 {
			return nil
		}
	}
	return expr
}
comparisonWithZeroInteger returns the non-constant integer expression if
cond is a binary operator expression with one of the following forms:

expr == 0
0    == expr
expr != 0
0    != expr

If the previous condition does not apply, nil is returned.
package compiler
import (
	"fmt"
	"reflect"
	"github.com/open2b/scriggo/ast"
	"github.com/open2b/scriggo/internal/runtime"
)
func (em *emitter) changeRegister(k bool, src, dst int8, srcType reflect.Type, dstType reflect.Type) {
	em._changeRegister(k, src, dst, srcType, dstType, false)
}
func (em *emitter) changeRegisterConvertFormat(k bool, src, dst int8, srcType reflect.Type, dstType reflect.Type) {
	em._changeRegister(k, src, dst, srcType, dstType, true)
}
func (em *emitter) _changeRegister(k bool, src, dst int8, srcType reflect.Type, dstType reflect.Type, mdToHTML bool) {
	if dst < 0 {
		if st, ok := srcType.(runtime.ScriggoType); ok {
			srcType = st.GoType()
		}
		em.fb.emitTypify(k, srcType, src, dst)
		return
	}
	srcKind := srcType.Kind()
	dstKind := dstType.Kind()
	if dstKind == reflect.Interface && srcKind == reflect.Interface {
		em.fb.emitMove(k, src, dst, srcKind)
		return
	}
	if dstKind == reflect.Interface {
		em.fb.emitTypify(k, srcType, src, dst)
		return
	}
	if dstKind != srcKind || mdToHTML {
		if k {
			em.fb.enterScope()
			tmp := em.fb.newRegister(srcKind)
			em.fb.emitMove(true, src, tmp, srcKind)
			em.fb.emitConvert(tmp, dstType, dst, srcKind)
			em.fb.exitScope()
		} else {
			em.fb.emitConvert(src, dstType, dst, srcKind)
		}
		return
	}
	if k || src != dst {
		em.fb.emitMove(k, src, dst, srcKind)
	}
}