daifpu_hwsw.h 2.86 KB
#ifndef _DAIFPU_HWSW_SOFTFLOAT_WRAPPER_HEADER_FILE_
#define _DAIFPU_HWSW_SOFTFLOAT_WRAPPER_HEADER_FILE_

/*
 * Bitmaps correspond with selection of soft-/hard-float operations in LLVM
 * 
 * defaultly all macros (SOFT_FOPS_HALF, SOFT_FOPS_SINGLE, SOFT_FOPS_DOUBLE, ...)
 * are zero. It means all operations are in the hardware
 *
 */

  /* masks for SOFT_FOPS_xxx macros */
  #define DAIFPU_SOFT_FPOP_ADD   (0x00000001)    /* FPOP_ADD */
  #define DAIFPU_SOFT_FPOP_SUB   (0x00000002)    /* FPOP_SUB */
  #define DAIFPU_SOFT_FPOP_MUL   (0x00000004)    /* FPOP_MUL */
  #define DAIFPU_SOFT_FPOP_DIV   (0x00000008)    /* FPOP_DIV */
  #define DAIFPU_SOFT_FPOP_MULEX (0x00000010)    /* FPOP_MULEX */
  #define DAIFPU_SOFT_FPOP_SQRT  (0x00000020)    /* FPOP_SQRT */
  #define DAIFPU_SOFT_FPOP_CMP   (0x00000040)    /* FPOP_CMP */
  #define DAIFPU_SOFT_FPOP_CI2F  (0x00000080)    /* FPOP_CI2F */
  #define DAIFPU_SOFT_FPOP_CF2I  (0x00000100)    /* FPOP_CF2I */
  #define DAIFPU_SOFT_FPOP_CFUP  (0x00000200)    /* FPOP_CFUP */
  #define DAIFPU_SOFT_FPOP_CFDN  (0x00000400)    /* FPOP_CFDN */
  #define DAIFPU_SOFT_FPOP_ABS   (0x00000800)    /* FPOP_ABS */
  #define DAIFPU_SOFT_FPOP_PACK  (0x00001000)    /* FPOP_PACK */
  #define DAIFPU_SOFT_FPOP_MOV   (0x00002000)    /* FPOP_MOV */
  #define DAIFPU_SOFT_FPOP_NEG   (0x00004000)    /* FPOP_NEG */

  #define DAIFPU_SOFT_MASK       (0x00007FFF)    /* mask of all operations */

  #ifndef SOFT_FOPS_HALF
    #if SOFT_FLOAT
      #define SOFT_FOPS_HALF    (0xFFFFFFFF)
    #else
      #define SOFT_FOPS_HALF    (0)
    #endif /* SOFT_FLOAT */
  #endif /* SOFT_FOPS_HALF */

  #ifndef SOFT_FOPS_SINGLE
    #if SOFT_FLOAT
      #define SOFT_FOPS_SINGLE    (0xFFFFFFFF)
    #else
      #define SOFT_FOPS_SINGLE    (0)
    #endif /* SOFT_FLOAT */
  #endif /* SOFT_FOPS_SINGLE */

  #ifndef SOFT_FOPS_DOUBLE
    #if SOFT_FLOAT
      #define SOFT_FOPS_DOUBLE    (0xFFFFFFFF)
    #else
      #define SOFT_FOPS_DOUBLE    (0)
    #endif /* SOFT_FLOAT */
  #endif /* SOFT_FOPS_DOUBLE */

  #ifndef FP_PACKEDHALF_ENABLED
    #if !(SOFT_FLOAT) && (~SOFT_FOPS_HALF & DAIFPU_SOFT_MASK) // not in soft-float and at least one half operation in hardware
      #define FP_PACKEDHALF_ENABLED    (1)
    #else
      #define FP_PACKEDHALF_ENABLED    (0)
    #endif /* SOFT_FLOAT */
  #endif /* FP_PACKEDHALF_ENABLED */

  #ifndef FP_PACKEDSINGLE_ENABLED
    #if !(SOFT_FLOAT) && (~SOFT_FOPS_SINGLE & DAIFPU_SOFT_MASK) // not in soft-float and at least one single operation in hardware
      #define FP_PACKEDSINGLE_ENABLED  (1)
    #else
      #define FP_PACKEDSINGLE_ENABLED  (0)
    #endif /* SOFT_FLOAT */
  #endif /* FP_PACKEDSINGLE_ENABLED */


/* check consistency with SOFT_FLOAT */
  #if SOFT_FLOAT && (~SOFT_FOPS_SINGLE || ~SOFT_FOPS_DOUBLE || ~SOFT_FOPS_HALF)
    #warning Inconsistency in soft-float and soft-fp-XXXX options
  #endif

#endif /* _DAIFPU_HWSW_SOFTFLOAT_WRAPPER_HEADER_FILE_ */