if (tleft instanceof NodeSetDTMType && tright instanceof BooleanType) {
if (tleft instanceof NodeSetType && tright instanceof BooleanType) {
    public void translate(ClassGenerator classGen, MethodGenerator methodGen) {	final ConstantPoolGen cpg = classGen.getConstantPool();	final InstructionList il = methodGen.getInstructionList();	final Type tleft = _left.getType();	Type tright = _right.getType();	if (tleft instanceof BooleanType || tleft instanceof NumberType) {	    translateDesynthesized(classGen, methodGen);	    synthesize(classGen, methodGen);	    return;	}	if (tleft instanceof StringType) {	    final int equals = cpg.addMethodref(STRING_CLASS,						"equals",						"(" + OBJECT_SIG +")Z");	    _left.translate(classGen, methodGen);	    _right.translate(classGen, methodGen);	    il.append(new INVOKEVIRTUAL(equals));	    if (_op == Operators.NE) {		il.append(ICONST_1);		il.append(IXOR);			// not x <-> x xor 1	    }	    return;	}	BranchHandle truec, falsec;		if (tleft instanceof ResultTreeType) {	    if (tright instanceof BooleanType) {		_right.translate(classGen, methodGen);		if (_op == Operators.NE) {		    il.append(ICONST_1);		    il.append(IXOR); // not x <-> x xor 1		}		return;	    }	    if (tright instanceof RealType) {		_left.translate(classGen, methodGen);		tleft.translateTo(classGen, methodGen, Type.Real);		_right.translate(classGen, methodGen);		il.append(DCMPG);		falsec = il.append(_op == Operators.EQ ? 				   (BranchInstruction) new IFNE(null) : 				   (BranchInstruction) new IFEQ(null));		il.append(ICONST_1);		truec = il.append(new GOTO(null));		falsec.setTarget(il.append(ICONST_0));		truec.setTarget(il.append(NOP));		return;	    }	    // Next, result-tree/string and result-tree/result-tree comparisons	    _left.translate(classGen, methodGen);	    tleft.translateTo(classGen, methodGen, Type.String);	    _right.translate(classGen, methodGen);	    if (tright instanceof ResultTreeType) {		tright.translateTo(classGen, methodGen, Type.String);	    }	    final int equals = cpg.addMethodref(STRING_CLASS,						"equals",						"(" +OBJECT_SIG+ ")Z");	    il.append(new INVOKEVIRTUAL(equals));	    if (_op == Operators.NE) {		il.append(ICONST_1);		il.append(IXOR);			// not x <-> x xor 1	    }	    return;	}	if (tleft instanceof NodeSetDTMType && tright instanceof BooleanType) {	    _left.translate(classGen, methodGen);	    _left.startResetIterator(classGen, methodGen);	    Type.NodeSetDTM.translateTo(classGen, methodGen, Type.Boolean);	    _right.translate(classGen, methodGen);	    il.append(IXOR); // x != y <-> x xor y	    if (_op == EQ) {		il.append(ICONST_1);		il.append(IXOR); // not x <-> x xor 1	    }	    return;	}	if (tleft instanceof NodeSetDTMType && tright instanceof StringType) {	    _left.translate(classGen, methodGen);	    _left.startResetIterator(classGen, methodGen); // needed ?	    _right.translate(classGen, methodGen);	    il.append(new PUSH(cpg, _op));	    il.append(methodGen.loadDOM());	    final int cmp = cpg.addMethodref(BASIS_LIBRARY_CLASS,					     "compare",					     "("					     + tleft.toSignature() 					     + tright.toSignature()					     + "I"					     + DOM_INTF_SIG					     + ")Z");	    il.append(new INVOKESTATIC(cmp));	    return;	}	// Next, node-set/t for t in {real, string, node-set, result-tree}	_left.translate(classGen, methodGen);	_left.startResetIterator(classGen, methodGen);	_right.translate(classGen, methodGen);	_right.startResetIterator(classGen, methodGen);	// Cast a result tree to a string to use an existing compare	if (tright instanceof ResultTreeType) {	    tright.translateTo(classGen, methodGen, Type.String);		    tright = Type.String;	}	// Call the appropriate compare() from the BasisLibrary	il.append(new PUSH(cpg, _op));	il.append(methodGen.loadContextNode());	il.append(methodGen.loadDOM());	final int compare = cpg.addMethodref(BASIS_LIBRARY_CLASS,					     "compare",					     "("					     + tleft.toSignature() 					     + tright.toSignature()					     + "I"					     + NODE_SIG					     + DOM_INTF_SIG					     + ")Z");	il.append(new INVOKESTATIC(compare));    }