item = build (code, type, node1, node2);
switch (ffe_is_emulate_complex () ? code : NOP_EXPR) { tree a, b, c, d, realtype;  case CONJ_EXPR: assert ("no CONJ_EXPR support yet" == NULL); return error_mark_node;  case COMPLEX_EXPR: item = build_tree_list (TYPE_FIELDS (type), node1); TREE_CHAIN (item) = build_tree_list (TREE_CHAIN (TYPE_FIELDS (type)), node2); item = build (CONSTRUCTOR, type, NULL_TREE, item); break;  case PLUS_EXPR: if (TREE_CODE (type) != RECORD_TYPE) { item = build (code, type, node1, node2); break; } node1 = ffecom_stabilize_aggregate_ (node1); node2 = ffecom_stabilize_aggregate_ (node2); realtype = TREE_TYPE (TYPE_FIELDS (type)); item = ffecom_2 (COMPLEX_EXPR, type, ffecom_2 (PLUS_EXPR, realtype, ffecom_1 (REALPART_EXPR, realtype, node1), ffecom_1 (REALPART_EXPR, realtype, node2)), ffecom_2 (PLUS_EXPR, realtype, ffecom_1 (IMAGPART_EXPR, realtype, node1), ffecom_1 (IMAGPART_EXPR, realtype, node2))); break;  case MINUS_EXPR: if (TREE_CODE (type) != RECORD_TYPE) { item = build (code, type, node1, node2); break; } node1 = ffecom_stabilize_aggregate_ (node1); node2 = ffecom_stabilize_aggregate_ (node2); realtype = TREE_TYPE (TYPE_FIELDS (type)); item = ffecom_2 (COMPLEX_EXPR, type, ffecom_2 (MINUS_EXPR, realtype, ffecom_1 (REALPART_EXPR, realtype, node1), ffecom_1 (REALPART_EXPR, realtype, node2)), ffecom_2 (MINUS_EXPR, realtype, ffecom_1 (IMAGPART_EXPR, realtype, node1), ffecom_1 (IMAGPART_EXPR, realtype, node2))); break;  case MULT_EXPR: if (TREE_CODE (type) != RECORD_TYPE) { item = build (code, type, node1, node2); break; } node1 = ffecom_stabilize_aggregate_ (node1); node2 = ffecom_stabilize_aggregate_ (node2); realtype = TREE_TYPE (TYPE_FIELDS (type)); a = save_expr (ffecom_1 (REALPART_EXPR, realtype, node1)); b = save_expr (ffecom_1 (IMAGPART_EXPR, realtype, node1)); c = save_expr (ffecom_1 (REALPART_EXPR, realtype, node2)); d = save_expr (ffecom_1 (IMAGPART_EXPR, realtype, node2)); item = ffecom_2 (COMPLEX_EXPR, type, ffecom_2 (MINUS_EXPR, realtype, ffecom_2 (MULT_EXPR, realtype, a, c), ffecom_2 (MULT_EXPR, realtype, b, d)), ffecom_2 (PLUS_EXPR, realtype, ffecom_2 (MULT_EXPR, realtype, a, d), ffecom_2 (MULT_EXPR, realtype, c, b))); break;  case EQ_EXPR: if ((TREE_CODE (node1) != RECORD_TYPE) && (TREE_CODE (node2) != RECORD_TYPE)) { item = build (code, type, node1, node2); break; } assert (TREE_CODE (node1) == RECORD_TYPE); assert (TREE_CODE (node2) == RECORD_TYPE); node1 = ffecom_stabilize_aggregate_ (node1); node2 = ffecom_stabilize_aggregate_ (node2); realtype = TREE_TYPE (TYPE_FIELDS (type)); item = ffecom_2 (TRUTH_ANDIF_EXPR, type, ffecom_2 (code, type, ffecom_1 (REALPART_EXPR, realtype, node1), ffecom_1 (REALPART_EXPR, realtype, node2)), ffecom_2 (code, type, ffecom_1 (IMAGPART_EXPR, realtype, node1), ffecom_1 (IMAGPART_EXPR, realtype, node2))); break;  case NE_EXPR: if ((TREE_CODE (node1) != RECORD_TYPE) && (TREE_CODE (node2) != RECORD_TYPE)) { item = build (code, type, node1, node2); break; } assert (TREE_CODE (node1) == RECORD_TYPE); assert (TREE_CODE (node2) == RECORD_TYPE); node1 = ffecom_stabilize_aggregate_ (node1); node2 = ffecom_stabilize_aggregate_ (node2); realtype = TREE_TYPE (TYPE_FIELDS (type)); item = ffecom_2 (TRUTH_ORIF_EXPR, type, ffecom_2 (code, type, ffecom_1 (REALPART_EXPR, realtype, node1), ffecom_1 (REALPART_EXPR, realtype, node2)), ffecom_2 (code, type, ffecom_1 (IMAGPART_EXPR, realtype, node1), ffecom_1 (IMAGPART_EXPR, realtype, node2))); break;  default: item = build (code, type, node1, node2); break; }
ffecom_2 (enum tree_code code, tree type, tree node1,	  tree node2){  tree item;  if ((node1 == error_mark_node)      || (node2 == error_mark_node)      || (type == error_mark_node))    return error_mark_node;  item = build (code, type, node1, node2);  if (TREE_SIDE_EFFECTS (node1) || TREE_SIDE_EFFECTS (node2))    TREE_SIDE_EFFECTS (item) = 1;  return fold (item);}