/*
 * Copyright (c) 2004-2008 The Trustees of Indiana University and Indiana
 *                         University Research and Technology
 *                         Corporation.  All rights reserved.
 * Copyright (c) 2004-2005 The University of Tennessee and The University
 *                         of Tennessee Research Foundation.  All rights
 *                         reserved.
 * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, 
 *                         University of Stuttgart.  All rights reserved.
 * Copyright (c) 2004-2005 The Regents of the University of California.
 *                         All rights reserved.
 * Copyright (c) 2008-2009 Cisco Systems, Inc.  All rights reserved.
 * $COPYRIGHT$
 * 
 * Additional copyrights may follow
 * 
 * $HEADER$
 */

#ifndef MCA_OP_X86_EXPORT_H
#define MCA_OP_X86_EXPORT_H

#include "ompi_config.h"

#include "opal/mca/mca.h"
#include "opal/class/opal_object.h"

#include "ompi/mca/op/op.h"

BEGIN_C_DECLS

/**
 * Flags for each hardware type
 */
typedef enum {
    OP_X86_HW_FLAGS_MMX = 1,
    OP_X86_HW_FLAGS_MMX2 = 2,
    OP_X86_HW_FLAGS_SSE = 4,
    OP_X86_HW_FLAGS_SSE2 = 8,
    OP_X86_HW_FLAGS_SSE3 = 16
} op_x86_hw_flags_t;

/**
 * Derive a struct from the base op component struct, allowing us to
 * cache some component-specific information on our well-known
 * component struct.
 */
typedef struct {
    /** The base op component struct */
    ompi_op_base_component_1_0_0_t super;

    /* What hardware do we have? */
    op_x86_hw_flags_t oxc_hw_flags;
} ompi_op_x86_component_t;

/**
 * Derive a struct from the base op module struct, allowing us to
 * cache some module-specific information for SUM. 
 */
typedef struct {
    ompi_op_base_module_1_0_0_t super;

    /* JMS need anything here? */
} ompi_op_x86_module_sum_t;

OBJ_CLASS_DECLARATION(ompi_op_x86_module_sum_t);

/**
 * Well-known component instance
 */
OMPI_DECLSPEC extern ompi_op_x86_component_t mca_op_x86_component;

/**
 * Setup for MPI_MAX and return a module.
 */
OMPI_DECLSPEC ompi_op_base_module_t *ompi_op_x86_setup_sum(ompi_op_t *op);

END_C_DECLS

#endif /* MCA_OP_X86_EXPORT_H */