+ if (isa(p, "t") && isa(p1, "t")) {
+ if (p != p1) {
+ error("Set types of operands of %s must be identical", opname);
+ return (NIL);
+ }
+ gen(TSET, r[0], width(p), 0);
+ return (p);
+ }
+# endif OBJ
+# ifdef PC
+ /*
+ * the second pass can't do
+ * long op double or double op long
+ * so we have to know the type of both operands
+ * also, it gets tricky for sets, which are done
+ * by function calls.
+ */
+ codeoff();
+ p1 = rvalue( r[ 3 ] , contype , RREQ );
+ codeon();
+ if ( isa( p1 , "id" ) ) {
+ p = rvalue( r[ 2 ] , contype , RREQ );
+ if ( ( p == NIL ) || ( p1 == NIL ) ) {
+ return NIL;
+ }
+ if ( isa( p , "i" ) && isa( p1 , "d" ) ) {
+ putop( P2SCONV , P2DOUBLE );
+ }
+ p1 = rvalue( r[ 3 ] , contype , RREQ );
+ if ( isa( p , "d" ) && isa( p1 , "i" ) ) {
+ putop( P2SCONV , P2DOUBLE );
+ }
+ if ( isa( p , "id" ) ) {
+ if ( isa( p , "d" ) || isa( p1 , "d" ) ) {
+ ctype = P2DOUBLE;
+ rettype = nl + TDOUBLE;
+ } else {
+ ctype = P2INT;
+ rettype = nl + T4INT;
+ }
+ putop( mathop[ r[0] - T_MULT ] , ctype );
+ return rettype;
+ }
+ }
+ if ( isa( p1 , "t" ) ) {
+ putleaf( P2ICON , 0 , 0
+ , ADDTYPE( ADDTYPE( P2PTR | P2STRTY , P2FTN )
+ , P2PTR )
+ , setop[ r[0] - T_MULT ] );
+ if ( contype == NIL ) {
+ contype = p1;
+ if ( contype == lookup( intset ) -> type ) {
+ codeoff();
+ contype = rvalue( r[2] , NIL , LREQ );
+ codeon();
+ }
+ }
+ if ( contype == NIL ) {
+ return NIL;
+ }
+ /*
+ * allocate a temporary and use it
+ */
+ sizes[ cbn ].om_off -= lwidth( contype );
+ tempoff = sizes[ cbn ].om_off;
+ putlbracket( ftnno , -tempoff );
+ if ( tempoff < sizes[ cbn ].om_max ) {
+ sizes[ cbn ].om_max = tempoff;
+ }
+ putLV( 0 , cbn , tempoff , P2PTR|P2STRTY );
+ p = rvalue( r[2] , contype , LREQ );
+ if ( isa( p , "t" ) ) {
+ putop( P2LISTOP , P2INT );
+ if ( p == NIL || p1 == NIL ) {
+ return NIL;
+ }
+ p1 = rvalue( r[3] , p , LREQ );
+ if ( p != p1 ) {