lib/C/iec_std_functions.h
changeset 1067 ce81fa6d9024
parent 1063 b5b48b6f7606
child 1068 222879991f44
equal deleted inserted replaced
1066:29735e347716 1067:ce81fa6d9024
    85 #ifdef DISABLE_EN_ENO_PARAMETERS
    85 #ifdef DISABLE_EN_ENO_PARAMETERS
    86 
    86 
    87   /* Do _not_ generate the EN and ENO parameters! */
    87   /* Do _not_ generate the EN and ENO parameters! */
    88   #define EN_ENO_PARAMS
    88   #define EN_ENO_PARAMS
    89   #define EN_ENO
    89   #define EN_ENO
       
    90   #define EN_PFX _NO_EN
    90 
    91 
    91   #define TEST_EN(TYPENAME)
    92   #define TEST_EN(TYPENAME)
    92   #define TEST_EN_COND(TYPENAME, COND)
    93   #define TEST_EN_COND(TYPENAME, COND)
    93 
    94 
    94 #else
    95 #else
    95     
    96     
    96   /* _Do_ generate the EN and ENO parameters! */
    97   /* _Do_ generate the EN and ENO parameters! */
    97   #define EN_ENO_PARAMS BOOL EN, BOOL *ENO,
    98   #define EN_ENO_PARAMS BOOL EN, BOOL *ENO,
    98   #define EN_ENO EN, ENO,
    99   #define EN_ENO EN, ENO,
       
   100   #define EN_PFX _EN
    99 
   101 
   100   #define TEST_EN(TYPENAME)\
   102   #define TEST_EN(TYPENAME)\
   101     if (!EN) {\
   103     if (!EN) {\
   102       if (ENO != NULL)\
   104       if (ENO != NULL)\
   103         *ENO = __BOOL_LITERAL(FALSE);\
   105         *ENO = __BOOL_LITERAL(FALSE);\
   489 
   491 
   490 /*****************************************************/
   492 /*****************************************************/
   491 /***   Table 24 - Standard arithmetic functions    ***/
   493 /***   Table 24 - Standard arithmetic functions    ***/
   492 /*****************************************************/
   494 /*****************************************************/
   493 
   495 
   494 #define __arith_expand(fname,TYPENAME, OP)\
   496 #define __arith_expand(fname, TYPENAME, OP)				\
   495 static inline TYPENAME fname(EN_ENO_PARAMS UINT param_count, TYPENAME op1, ...){\
   497 									\
   496   va_list ap;\
   498 	static inline TYPENAME fname##1(EN_ENO_PARAMS			\
   497   UINT i;\
   499 					TYPENAME op1) {			\
   498   TEST_EN(TYPENAME)\
   500 		TEST_EN(TYPENAME);					\
   499   \
   501 		return op1;						\
   500   va_start (ap, op1);         /* Initialize the argument list.  */\
   502 	}								\
   501   \
   503 									\
   502   for (i = 0; i < param_count - 1; i++){\
   504 	static inline TYPENAME fname##2(EN_ENO_PARAMS			\
   503     op1 = op1 OP va_arg (ap, VA_ARGS_##TYPENAME);\
   505 					TYPENAME op1,			\
   504   }\
   506 					TYPENAME op2) {			\
   505   \
   507 		TEST_EN(TYPENAME);					\
   506   va_end (ap);                  /* Clean up.  */\
   508 		op1 = op1 OP op2;					\
   507   return op1;\
   509 		return op1;						\
   508 }
   510 	}								\
       
   511 									\
       
   512 	static inline TYPENAME fname##3(EN_ENO_PARAMS			\
       
   513 					TYPENAME op1,			\
       
   514 					TYPENAME op2,			\
       
   515 					TYPENAME op3){			\
       
   516 		TEST_EN(TYPENAME);					\
       
   517 		op1 = op1 OP op2 OP op3;				\
       
   518 		return op1;						\
       
   519 	}								\
       
   520 									\
       
   521 	static inline TYPENAME fname##4(EN_ENO_PARAMS			\
       
   522 					TYPENAME op1,			\
       
   523 					TYPENAME op2,			\
       
   524 					TYPENAME op3,			\
       
   525 					TYPENAME op4){			\
       
   526 		TEST_EN(TYPENAME);					\
       
   527 		op1 = op1 OP op2 OP op3 OP op4;				\
       
   528 		return op1;						\
       
   529 	}								\
       
   530 									\
       
   531 	static inline TYPENAME fname##5(EN_ENO_PARAMS			\
       
   532 					TYPENAME op1,			\
       
   533 					TYPENAME op2,			\
       
   534 					TYPENAME op3,			\
       
   535 					TYPENAME op4,			\
       
   536 					TYPENAME op5){			\
       
   537 		TEST_EN(TYPENAME);					\
       
   538 		op1 = op1 OP op2 OP op3 OP op4 OP op5;			\
       
   539 		return op1;						\
       
   540 	}								\
       
   541 									\
       
   542 	static inline TYPENAME fname##6(EN_ENO_PARAMS			\
       
   543 					TYPENAME op1,			\
       
   544 					TYPENAME op2,			\
       
   545 					TYPENAME op3,			\
       
   546 					TYPENAME op4,			\
       
   547 					TYPENAME op5,			\
       
   548 					TYPENAME op6){			\
       
   549 		TEST_EN(TYPENAME);					\
       
   550 		op1 = op1 OP op2 OP op3 OP op4 OP op5 OP op6;		\
       
   551 		return op1;						\
       
   552 	}								\
       
   553 									\
       
   554 	static inline TYPENAME fname##7(EN_ENO_PARAMS			\
       
   555 					TYPENAME op1,			\
       
   556 					TYPENAME op2,			\
       
   557 					TYPENAME op3,			\
       
   558 					TYPENAME op4,			\
       
   559 					TYPENAME op5,			\
       
   560 					TYPENAME op6,			\
       
   561 					TYPENAME op7){			\
       
   562 		TEST_EN(TYPENAME);					\
       
   563 		op1 = op1 OP op2 OP op3 OP op4 OP op5 OP op6 OP op7;	\
       
   564 		return op1;						\
       
   565 	}								\
       
   566 									\
       
   567 	static inline TYPENAME fname##8(EN_ENO_PARAMS			\
       
   568 					TYPENAME op1,			\
       
   569 					TYPENAME op2,			\
       
   570 					TYPENAME op3,			\
       
   571 					TYPENAME op4,			\
       
   572 					TYPENAME op5,			\
       
   573 					TYPENAME op6,			\
       
   574 					TYPENAME op7,			\
       
   575 					TYPENAME op8){			\
       
   576 		TEST_EN(TYPENAME);					\
       
   577 		op1 =   op1 OP op2 OP op3 OP op4 OP			\
       
   578 			op5 OP op6 OP op7 OP op8;			\
       
   579 		return op1;						\
       
   580 	}								\
       
   581 									\
       
   582 	static inline TYPENAME fname##_VAR(EN_ENO_PARAMS		\
       
   583 					UINT param_count,		\
       
   584 					TYPENAME op1, ...){		\
       
   585 		va_list ap;						\
       
   586 		UINT i;							\
       
   587 		TEST_EN(TYPENAME)					\
       
   588 									\
       
   589 			va_start (ap, op1);         /* Initialize the argument list.  */ \
       
   590 									\
       
   591 		for (i = 0; i < param_count - 1; i++){			\
       
   592 			op1 = op1 OP va_arg (ap, VA_ARGS_##TYPENAME);	\
       
   593 		}							\
       
   594 									\
       
   595 		va_end (ap);                  /* Clean up.  */		\
       
   596 		return op1;						\
       
   597 	}								\
       
   598 									\
       
   599 
       
   600 /* macros needed for #if-like behaviour inside of macro */
       
   601 #define ARITH_OPERATION_COND_IGNORE(...)
       
   602 #define ARITH_OPERATION_COND_IDENT(...) __VA_ARGS__
       
   603 #define ARITH_OPERATION_COND_SKIP_
       
   604 #define ARITH_OPERATION_COND_CLAUSE1(...) __VA_ARGS__ ARITH_OPERATION_COND_IGNORE
       
   605 #define ARITH_OPERATION_COND_CLAUSE2(...) ARITH_OPERATION_COND_IDENT
       
   606 
       
   607 #define ARITH_OPERATION_COND_(A,B,C,...) C
       
   608 #define ARITH_OPERATION_COND(EXP)			\
       
   609 	ARITH_OPERATION_COND_(				\
       
   610 		EXP,					\
       
   611 		ARITH_OPERATION_COND_CLAUSE1,		\
       
   612 		ARITH_OPERATION_COND_CLAUSE2, ~)
       
   613 
       
   614 #define ARITH_OPERATION_LE_(X, Y) ARITH_OPERATION_COND_ ## X ## _LE_ ## Y
       
   615 #define ARITH_OPERATION_LE( X, Y) ARITH_OPERATION_LE_(X, Y)
       
   616 
       
   617 /*
       
   618  * Macro to remove typecast in argument number placed by code generator:
       
   619  * (UINT)3 -> 3
       
   620  */
       
   621 #define CLEAR_TYPECAST(X)
       
   622 #define MAX_INLINE_PARAM_COUNT 8
       
   623 #ifdef DISABLE_EN_ENO_PARAMETERS
       
   624 
       
   625 #define ARITH_OPERATION_CALL__(FNAME, PARAM_COUNT, ...)			\
       
   626 	ARITH_OPERATION_COND(ARITH_OPERATION_LE(PARAM_COUNT, MAX_INLINE_PARAM_COUNT)) \
       
   627 	(FNAME##_VAR(PARAM_COUNT, __VA_ARGS__))				\
       
   628 	(FNAME##PARAM_COUNT(      __VA_ARGS__))
       
   629 
       
   630 #define ARITH_OPERATION_CALL_( FNAME, PARAM_COUNT, ...)    ARITH_OPERATION_CALL__(FNAME, PARAM_COUNT, __VA_ARGS__)
       
   631 #define ARITH_OPERATION_CALL(  FNAME, PARAM_COUNT, ...)    ARITH_OPERATION_CALL_( FNAME, CLEAR_TYPECAST PARAM_COUNT, __VA_ARGS__)
       
   632 
       
   633 #else
       
   634 
       
   635 #define ARITH_OPERATION_CALL__(EN, ENO, FNAME, PARAM_COUNT, ...)	\
       
   636 	ARITH_OPERATION_COND(ARITH_OPERATION_LE(PARAM_COUNT, MAX_INLINE_PARAM_COUNT)) \
       
   637 	(FNAME##_VAR(       (EN), (ENO), PARAM_COUNT, __VA_ARGS__))	\
       
   638 	(FNAME##PARAM_COUNT((EN), (ENO), __VA_ARGS__))
       
   639 
       
   640 
       
   641 #define ARITH_OPERATION_CALL_( EN, ENO, FNAME, PARAM_COUNT, ...)    ARITH_OPERATION_CALL__(EN, ENO, FNAME, PARAM_COUNT, __VA_ARGS__)
       
   642 #define ARITH_OPERATION_CALL(  EN, ENO, FNAME, PARAM_COUNT, ...)    ARITH_OPERATION_CALL_(EN, ENO, FNAME, CLEAR_TYPECAST PARAM_COUNT, __VA_ARGS__)
       
   643 
       
   644 #endif
       
   645 
       
   646 #ifdef DISABLE_EN_ENO_PARAMETERS
       
   647 #define ARITH_OPERATION__TYPE__TYPE_NO_EN(FNAME, PARAM_COUNT, ...)             ARITH_OPERATION_CALL(FNAME, PARAM_COUNT, __VA_ARGS__)
       
   648 #else
       
   649 #define ARITH_OPERATION__TYPE__TYPE_EN(FNAME, EN, ENO, PARAM_COUNT, ...)       ARITH_OPERATION_CALL(EN, ENO, FNAME, PARAM_COUNT, __VA_ARGS__)
       
   650 #endif
       
   651 
       
   652 #define ARITH_OPERATION__TYPE__TYPE_(PFX, ...)               ARITH_OPERATION__TYPE__TYPE##PFX(__VA_ARGS__)
       
   653 #define ARITH_OPERATION__TYPE__TYPE( PFX, ...)               ARITH_OPERATION__TYPE__TYPE_(PFX, __VA_ARGS__)
       
   654 
       
   655 
   509 
   656 
   510 #define __arith_static(fname,TYPENAME, OP)\
   657 #define __arith_static(fname,TYPENAME, OP)\
   511 /* explicitly typed function */\
   658 /* explicitly typed function */\
   512 static inline TYPENAME fname##TYPENAME(EN_ENO_PARAMS TYPENAME op1, TYPENAME op2){\
   659 static inline TYPENAME fname##TYPENAME(EN_ENO_PARAMS TYPENAME op1, TYPENAME op2){\
   513   TEST_EN(TYPENAME)\
   660   TEST_EN(TYPENAME)\
   524 #define __add(TYPENAME) \
   671 #define __add(TYPENAME) \
   525 __arith_expand(ADD_##TYPENAME, TYPENAME, +) 			 /* explicitly typed function */\
   672 __arith_expand(ADD_##TYPENAME, TYPENAME, +) 			 /* explicitly typed function */\
   526 __arith_expand(ADD__##TYPENAME##__##TYPENAME, TYPENAME, +)	 /* overloaded function */
   673 __arith_expand(ADD__##TYPENAME##__##TYPENAME, TYPENAME, +)	 /* overloaded function */
   527 __ANY_NUM(__add)
   674 __ANY_NUM(__add)
   528 
   675 
       
   676 #define ADD_SINT(...)          ARITH_OPERATION__TYPE__TYPE(EN_PFX, ADD_SINT,            __VA_ARGS__)
       
   677 #define ADD__SINT__SINT(...)   ARITH_OPERATION__TYPE__TYPE(EN_PFX, ADD__SINT__SINT,     __VA_ARGS__)
       
   678 
       
   679 #define ADD_INT(...)           ARITH_OPERATION__TYPE__TYPE(EN_PFX, ADD_INT,             __VA_ARGS__)
       
   680 #define ADD__INT__INT(...)     ARITH_OPERATION__TYPE__TYPE(EN_PFX, ADD__INT__INT,       __VA_ARGS__)
       
   681 
       
   682 #define ADD_DINT(...)          ARITH_OPERATION__TYPE__TYPE(EN_PFX, ADD_DINT,            __VA_ARGS__)
       
   683 #define ADD__DINT__DINT(...)   ARITH_OPERATION__TYPE__TYPE(EN_PFX, ADD__DINT__DINT,     __VA_ARGS__)
       
   684 
       
   685 #define ADD_LINT(...)          ARITH_OPERATION__TYPE__TYPE(EN_PFX, ADD_LINT,            __VA_ARGS__)
       
   686 #define ADD__LINT__LINT(...)   ARITH_OPERATION__TYPE__TYPE(EN_PFX, ADD__LINT__LINT,     __VA_ARGS__)
       
   687 
       
   688 #define ADD_USINT(...)         ARITH_OPERATION__TYPE__TYPE(EN_PFX, ADD_USINT,           __VA_ARGS__)
       
   689 #define ADD__USINT__USINT(...) ARITH_OPERATION__TYPE__TYPE(EN_PFX, ADD__USINT__USINT,   __VA_ARGS__)
       
   690 
       
   691 #define ADD_UINT(...)          ARITH_OPERATION__TYPE__TYPE(EN_PFX, ADD_UINT,            __VA_ARGS__)
       
   692 #define ADD__UINT__UINT(...)   ARITH_OPERATION__TYPE__TYPE(EN_PFX, ADD__UINT__UINT,     __VA_ARGS__)
       
   693 
       
   694 #define ADD_UDINT(...)         ARITH_OPERATION__TYPE__TYPE(EN_PFX, ADD_UDINT,           __VA_ARGS__)
       
   695 #define ADD__UDINT__UDINT(...) ARITH_OPERATION__TYPE__TYPE(EN_PFX, ADD__UDINT__UDINT,   __VA_ARGS__)
       
   696 
       
   697 #define ADD_ULINT(...)         ARITH_OPERATION__TYPE__TYPE(EN_PFX, ADD_ULINT,           __VA_ARGS__)
       
   698 #define ADD__ULINT__ULINT(...) ARITH_OPERATION__TYPE__TYPE(EN_PFX, ADD__ULINT__ULINT,   __VA_ARGS__)
       
   699 
       
   700 #define ADD_REAL(...)          ARITH_OPERATION__TYPE__TYPE(EN_PFX, ADD_REAL,            __VA_ARGS__)
       
   701 #define ADD__REAL__REAL(...)   ARITH_OPERATION__TYPE__TYPE(EN_PFX, ADD__REAL__REAL,     __VA_ARGS__)
       
   702 
       
   703 #define ADD_LREAL(...)         ARITH_OPERATION__TYPE__TYPE(EN_PFX, ADD_LREAL,           __VA_ARGS__)
       
   704 #define ADD__LREAL__LREAL(...) ARITH_OPERATION__TYPE__TYPE(EN_PFX, ADD__LREAL__LREAL,   __VA_ARGS__)
       
   705 
   529 
   706 
   530   /**************/
   707   /**************/
   531   /*     MUL    */
   708   /*     MUL    */
   532   /**************/
   709   /**************/
   533 #define __mul(TYPENAME) \
   710 #define __mul(TYPENAME) \
   534 __arith_expand(MUL_##TYPENAME, TYPENAME, *) 			 /* explicitly typed function */\
   711 __arith_expand(MUL_##TYPENAME, TYPENAME, *) 			 /* explicitly typed function */\
   535 __arith_expand(MUL__##TYPENAME##__##TYPENAME, TYPENAME, *)	 /* overloaded function */
   712 __arith_expand(MUL__##TYPENAME##__##TYPENAME, TYPENAME, *)	 /* overloaded function */
   536 __ANY_NUM(__mul)
   713 __ANY_NUM(__mul)
       
   714 
       
   715 #define MUL_SINT(...)          ARITH_OPERATION__TYPE__TYPE(EN_PFX, MUL_SINT,            __VA_ARGS__)
       
   716 #define MUL__SINT__SINT(...)   ARITH_OPERATION__TYPE__TYPE(EN_PFX, MUL__SINT__SINT,     __VA_ARGS__)
       
   717 
       
   718 #define MUL_INT(...)           ARITH_OPERATION__TYPE__TYPE(EN_PFX, MUL_INT,             __VA_ARGS__)
       
   719 #define MUL__INT__INT(...)     ARITH_OPERATION__TYPE__TYPE(EN_PFX, MUL__INT__INT,       __VA_ARGS__)
       
   720 
       
   721 #define MUL_DINT(...)          ARITH_OPERATION__TYPE__TYPE(EN_PFX, MUL_DINT,            __VA_ARGS__)
       
   722 #define MUL__DINT__DINT(...)   ARITH_OPERATION__TYPE__TYPE(EN_PFX, MUL__DINT__DINT,     __VA_ARGS__)
       
   723 
       
   724 #define MUL_LINT(...)          ARITH_OPERATION__TYPE__TYPE(EN_PFX, MUL_LINT,            __VA_ARGS__)
       
   725 #define MUL__LINT__LINT(...)   ARITH_OPERATION__TYPE__TYPE(EN_PFX, MUL__LINT__LINT,     __VA_ARGS__)
       
   726 
       
   727 #define MUL_USINT(...)         ARITH_OPERATION__TYPE__TYPE(EN_PFX, MUL_USINT,           __VA_ARGS__)
       
   728 #define MUL__USINT__USINT(...) ARITH_OPERATION__TYPE__TYPE(EN_PFX, MUL__USINT__USINT,   __VA_ARGS__)
       
   729 
       
   730 #define MUL_UINT(...)          ARITH_OPERATION__TYPE__TYPE(EN_PFX, MUL_UINT,            __VA_ARGS__)
       
   731 #define MUL__UINT__UINT(...)   ARITH_OPERATION__TYPE__TYPE(EN_PFX, MUL__UINT__UINT,     __VA_ARGS__)
       
   732 
       
   733 #define MUL_UDINT(...)         ARITH_OPERATION__TYPE__TYPE(EN_PFX, MUL_UDINT,           __VA_ARGS__)
       
   734 #define MUL__UDINT__UDINT(...) ARITH_OPERATION__TYPE__TYPE(EN_PFX, MUL__UDINT__UDINT,   __VA_ARGS__)
       
   735 
       
   736 #define MUL_ULINT(...)         ARITH_OPERATION__TYPE__TYPE(EN_PFX, MUL_ULINT,           __VA_ARGS__)
       
   737 #define MUL__ULINT__ULINT(...) ARITH_OPERATION__TYPE__TYPE(EN_PFX, MUL__ULINT__ULINT,   __VA_ARGS__)
       
   738 
       
   739 #define MUL_REAL(...)          ARITH_OPERATION__TYPE__TYPE(EN_PFX, MUL_REAL,            __VA_ARGS__)
       
   740 #define MUL__REAL__REAL(...)   ARITH_OPERATION__TYPE__TYPE(EN_PFX, MUL__REAL__REAL,     __VA_ARGS__)
       
   741 
       
   742 #define MUL_LREAL(...)         ARITH_OPERATION__TYPE__TYPE(EN_PFX, MUL_LREAL,           __VA_ARGS__)
       
   743 #define MUL__LREAL__LREAL(...) ARITH_OPERATION__TYPE__TYPE(EN_PFX, MUL__LREAL__LREAL,   __VA_ARGS__)
   537 
   744 
   538 
   745 
   539   /**************/
   746   /**************/
   540   /*     SUB    */
   747   /*     SUB    */
   541   /**************/
   748   /**************/
   730   /**************/
   937   /**************/
   731   /*     AND    */
   938   /*     AND    */
   732   /**************/
   939   /**************/
   733 __arith_expand(AND_BOOL, BOOL, && )         /* The explicitly typed standard functions */
   940 __arith_expand(AND_BOOL, BOOL, && )         /* The explicitly typed standard functions */
   734 __arith_expand(AND__BOOL__BOOL, BOOL, && )  /* Overloaded function */
   941 __arith_expand(AND__BOOL__BOOL, BOOL, && )  /* Overloaded function */
       
   942 #define AND_BOOL(...)        ARITH_OPERATION__TYPE__TYPE(EN_PFX, AND_BOOL,        __VA_ARGS__)
       
   943 #define AND__BOOL__BOOL(...) ARITH_OPERATION__TYPE__TYPE(EN_PFX, AND__BOOL__BOOL, __VA_ARGS__)
   735 
   944 
   736 #define __iec_(TYPENAME) \
   945 #define __iec_(TYPENAME) \
   737 __arith_expand(AND_##TYPENAME, TYPENAME, &)  /* The explicitly typed standard functions */\
   946 __arith_expand(AND_##TYPENAME, TYPENAME, &)  /* The explicitly typed standard functions */\
   738 __arith_expand(AND__##TYPENAME##__##TYPENAME, TYPENAME, &)  /* Overloaded function */
   947 __arith_expand(AND__##TYPENAME##__##TYPENAME, TYPENAME, &)  /* Overloaded function */
   739 __ANY_NBIT(__iec_)
   948 __ANY_NBIT(__iec_)
   740 #undef __iec_
   949 #undef __iec_
       
   950 
       
   951 #define AND_BYTE(...)          ARITH_OPERATION__TYPE__TYPE(EN_PFX, AND_BYTE,             __VA_ARGS__)
       
   952 #define AND__BYTE__BYTE(...)   ARITH_OPERATION__TYPE__TYPE(EN_PFX, AND__BYTE__BYTE,      __VA_ARGS__)
       
   953 
       
   954 #define AND_WORD(...)          ARITH_OPERATION__TYPE__TYPE(EN_PFX, AND_WORD,             __VA_ARGS__)
       
   955 #define AND__WORD__WORD(...)   ARITH_OPERATION__TYPE__TYPE(EN_PFX, AND__WORD__WORD,      __VA_ARGS__)
       
   956 
       
   957 #define AND_DWORD(...)         ARITH_OPERATION__TYPE__TYPE(EN_PFX, AND_DWORD,            __VA_ARGS__)
       
   958 #define AND__DWORD__DWORD(...) ARITH_OPERATION__TYPE__TYPE(EN_PFX, AND__DWORD__DWORD,    __VA_ARGS__)
       
   959 
       
   960 #define AND_LWORD(...)         ARITH_OPERATION__TYPE__TYPE(EN_PFX, AND_LWORD,            __VA_ARGS__)
       
   961 #define AND__LWORD__LWORD(...) ARITH_OPERATION__TYPE__TYPE(EN_PFX, AND__LWORD__LWORD,    __VA_ARGS__)
       
   962 
   741 
   963 
   742   /*************/
   964   /*************/
   743   /*     OR    */
   965   /*     OR    */
   744   /*************/
   966   /*************/
   745 __arith_expand(OR_BOOL, BOOL, || )         /* The explicitly typed standard functions */
   967 __arith_expand(OR_BOOL, BOOL, || )         /* The explicitly typed standard functions */
   746 __arith_expand(OR__BOOL__BOOL, BOOL, || )  /* Overloaded function */
   968 __arith_expand(OR__BOOL__BOOL, BOOL, || )  /* Overloaded function */
       
   969 #define OR_BOOL(...)        ARITH_OPERATION__TYPE__TYPE(EN_PFX, OR_BOOL,        __VA_ARGS__)
       
   970 #define OR__BOOL__BOOL(...) ARITH_OPERATION__TYPE__TYPE(EN_PFX, OR__BOOL__BOOL, __VA_ARGS__)
   747 
   971 
   748 #define __iec_(TYPENAME) \
   972 #define __iec_(TYPENAME) \
   749 __arith_expand(OR_##TYPENAME, TYPENAME, |)  /* The explicitly typed standard functions */\
   973 __arith_expand(OR_##TYPENAME, TYPENAME, |)  /* The explicitly typed standard functions */\
   750 __arith_expand(OR__##TYPENAME##__##TYPENAME, TYPENAME, |)  /* Overloaded function */
   974 __arith_expand(OR__##TYPENAME##__##TYPENAME, TYPENAME, |)  /* Overloaded function */
   751 __ANY_NBIT(__iec_)
   975 __ANY_NBIT(__iec_)
   752 #undef __iec_
   976 #undef __iec_
       
   977 
       
   978 #define OR_BYTE(...)          ARITH_OPERATION__TYPE__TYPE(EN_PFX, OR_BYTE,             __VA_ARGS__)
       
   979 #define OR__BYTE__BYTE(...)   ARITH_OPERATION__TYPE__TYPE(EN_PFX, OR__BYTE__BYTE,      __VA_ARGS__)
       
   980 
       
   981 #define OR_WORD(...)          ARITH_OPERATION__TYPE__TYPE(EN_PFX, OR_WORD,             __VA_ARGS__)
       
   982 #define OR__WORD__WORD(...)   ARITH_OPERATION__TYPE__TYPE(EN_PFX, OR__WORD__WORD,      __VA_ARGS__)
       
   983 
       
   984 #define OR_DWORD(...)         ARITH_OPERATION__TYPE__TYPE(EN_PFX, OR_DWORD,            __VA_ARGS__)
       
   985 #define OR__DWORD__DWORD(...) ARITH_OPERATION__TYPE__TYPE(EN_PFX, OR__DWORD__DWORD,    __VA_ARGS__)
       
   986 
       
   987 #define OR_LWORD(...)         ARITH_OPERATION__TYPE__TYPE(EN_PFX, OR_LWORD,            __VA_ARGS__)
       
   988 #define OR__LWORD__LWORD(...) ARITH_OPERATION__TYPE__TYPE(EN_PFX, OR__LWORD__LWORD,    __VA_ARGS__)
       
   989 
   753 
   990 
   754   /**************/
   991   /**************/
   755   /*     XOR    */
   992   /*     XOR    */
   756   /**************/
   993   /**************/
   757 #define __xorbool_expand(fname) \
   994 #define __xorbool_expand(fname) \
   777 #define __iec_(TYPENAME) \
  1014 #define __iec_(TYPENAME) \
   778 __arith_expand(XOR_##TYPENAME, TYPENAME, ^) /* The explicitly typed standard functions */\
  1015 __arith_expand(XOR_##TYPENAME, TYPENAME, ^) /* The explicitly typed standard functions */\
   779 __arith_expand(XOR__##TYPENAME##__##TYPENAME, TYPENAME, ^) /* Overloaded function */
  1016 __arith_expand(XOR__##TYPENAME##__##TYPENAME, TYPENAME, ^) /* Overloaded function */
   780 __ANY_NBIT(__iec_)
  1017 __ANY_NBIT(__iec_)
   781 #undef __iec_
  1018 #undef __iec_
       
  1019 
       
  1020 #define XOR_BYTE(...)          ARITH_OPERATION__TYPE__TYPE(EN_PFX, XOR_BYTE,             __VA_ARGS__)
       
  1021 #define XOR__BYTE__BYTE(...)   ARITH_OPERATION__TYPE__TYPE(EN_PFX, XOR__BYTE__BYTE,      __VA_ARGS__)
       
  1022 
       
  1023 #define XOR_WORD(...)          ARITH_OPERATION__TYPE__TYPE(EN_PFX, XOR_WORD,             __VA_ARGS__)
       
  1024 #define XOR__WORD__WORD(...)   ARITH_OPERATION__TYPE__TYPE(EN_PFX, XOR__WORD__WORD,      __VA_ARGS__)
       
  1025 
       
  1026 #define XOR_DWORD(...)         ARITH_OPERATION__TYPE__TYPE(EN_PFX, XOR_DWORD,            __VA_ARGS__)
       
  1027 #define XOR__DWORD__DWORD(...) ARITH_OPERATION__TYPE__TYPE(EN_PFX, XOR__DWORD__DWORD,    __VA_ARGS__)
       
  1028 
       
  1029 #define XOR_LWORD(...)         ARITH_OPERATION__TYPE__TYPE(EN_PFX, XOR_LWORD,            __VA_ARGS__)
       
  1030 #define XOR__LWORD__LWORD(...) ARITH_OPERATION__TYPE__TYPE(EN_PFX, XOR__LWORD__LWORD,    __VA_ARGS__)
   782 
  1031 
   783 
  1032 
   784   /**************/
  1033   /**************/
   785   /*     NOT    */
  1034   /*     NOT    */
   786   /**************/
  1035   /**************/
  1580 /* Do we support this? */
  1829 /* Do we support this? */
  1581 
  1830 
  1582 
  1831 
  1583 
  1832 
  1584 
  1833 
  1585 
  1834 /*************************************/
  1586 
  1835 /*
       
  1836   These defines are needed to have #if-like
       
  1837   behaviour inside of macro. See macro
       
  1838   ARITH_OPERATION_COND above.
       
  1839 
       
  1840   emacs commands to generate defines below.
       
  1841   Select commands and eval-region
       
  1842 
       
  1843   (next-line)
       
  1844   (next-line)
       
  1845   (dotimes (i 200)
       
  1846     (insert
       
  1847      (format "\n#define ARITH_OPERATION_COND_%d_LE_8 %s" i (if (> i 8) "," "1"))))
       
  1848 */
       
  1849 
       
  1850 #define ARITH_OPERATION_COND_0_LE_8 1
       
  1851 #define ARITH_OPERATION_COND_1_LE_8 1
       
  1852 #define ARITH_OPERATION_COND_2_LE_8 1
       
  1853 #define ARITH_OPERATION_COND_3_LE_8 1
       
  1854 #define ARITH_OPERATION_COND_4_LE_8 1
       
  1855 #define ARITH_OPERATION_COND_5_LE_8 1
       
  1856 #define ARITH_OPERATION_COND_6_LE_8 1
       
  1857 #define ARITH_OPERATION_COND_7_LE_8 1
       
  1858 #define ARITH_OPERATION_COND_8_LE_8 1
       
  1859 #define ARITH_OPERATION_COND_9_LE_8 ,
       
  1860 #define ARITH_OPERATION_COND_10_LE_8 ,
       
  1861 #define ARITH_OPERATION_COND_11_LE_8 ,
       
  1862 #define ARITH_OPERATION_COND_12_LE_8 ,
       
  1863 #define ARITH_OPERATION_COND_13_LE_8 ,
       
  1864 #define ARITH_OPERATION_COND_14_LE_8 ,
       
  1865 #define ARITH_OPERATION_COND_15_LE_8 ,
       
  1866 #define ARITH_OPERATION_COND_16_LE_8 ,
       
  1867 #define ARITH_OPERATION_COND_17_LE_8 ,
       
  1868 #define ARITH_OPERATION_COND_18_LE_8 ,
       
  1869 #define ARITH_OPERATION_COND_19_LE_8 ,
       
  1870 #define ARITH_OPERATION_COND_20_LE_8 ,
       
  1871 #define ARITH_OPERATION_COND_21_LE_8 ,
       
  1872 #define ARITH_OPERATION_COND_22_LE_8 ,
       
  1873 #define ARITH_OPERATION_COND_23_LE_8 ,
       
  1874 #define ARITH_OPERATION_COND_24_LE_8 ,
       
  1875 #define ARITH_OPERATION_COND_25_LE_8 ,
       
  1876 #define ARITH_OPERATION_COND_26_LE_8 ,
       
  1877 #define ARITH_OPERATION_COND_27_LE_8 ,
       
  1878 #define ARITH_OPERATION_COND_28_LE_8 ,
       
  1879 #define ARITH_OPERATION_COND_29_LE_8 ,
       
  1880 #define ARITH_OPERATION_COND_30_LE_8 ,
       
  1881 #define ARITH_OPERATION_COND_31_LE_8 ,
       
  1882 #define ARITH_OPERATION_COND_32_LE_8 ,
       
  1883 #define ARITH_OPERATION_COND_33_LE_8 ,
       
  1884 #define ARITH_OPERATION_COND_34_LE_8 ,
       
  1885 #define ARITH_OPERATION_COND_35_LE_8 ,
       
  1886 #define ARITH_OPERATION_COND_36_LE_8 ,
       
  1887 #define ARITH_OPERATION_COND_37_LE_8 ,
       
  1888 #define ARITH_OPERATION_COND_38_LE_8 ,
       
  1889 #define ARITH_OPERATION_COND_39_LE_8 ,
       
  1890 #define ARITH_OPERATION_COND_40_LE_8 ,
       
  1891 #define ARITH_OPERATION_COND_41_LE_8 ,
       
  1892 #define ARITH_OPERATION_COND_42_LE_8 ,
       
  1893 #define ARITH_OPERATION_COND_43_LE_8 ,
       
  1894 #define ARITH_OPERATION_COND_44_LE_8 ,
       
  1895 #define ARITH_OPERATION_COND_45_LE_8 ,
       
  1896 #define ARITH_OPERATION_COND_46_LE_8 ,
       
  1897 #define ARITH_OPERATION_COND_47_LE_8 ,
       
  1898 #define ARITH_OPERATION_COND_48_LE_8 ,
       
  1899 #define ARITH_OPERATION_COND_49_LE_8 ,
       
  1900 #define ARITH_OPERATION_COND_50_LE_8 ,
       
  1901 #define ARITH_OPERATION_COND_51_LE_8 ,
       
  1902 #define ARITH_OPERATION_COND_52_LE_8 ,
       
  1903 #define ARITH_OPERATION_COND_53_LE_8 ,
       
  1904 #define ARITH_OPERATION_COND_54_LE_8 ,
       
  1905 #define ARITH_OPERATION_COND_55_LE_8 ,
       
  1906 #define ARITH_OPERATION_COND_56_LE_8 ,
       
  1907 #define ARITH_OPERATION_COND_57_LE_8 ,
       
  1908 #define ARITH_OPERATION_COND_58_LE_8 ,
       
  1909 #define ARITH_OPERATION_COND_59_LE_8 ,
       
  1910 #define ARITH_OPERATION_COND_60_LE_8 ,
       
  1911 #define ARITH_OPERATION_COND_61_LE_8 ,
       
  1912 #define ARITH_OPERATION_COND_62_LE_8 ,
       
  1913 #define ARITH_OPERATION_COND_63_LE_8 ,
       
  1914 #define ARITH_OPERATION_COND_64_LE_8 ,
       
  1915 #define ARITH_OPERATION_COND_65_LE_8 ,
       
  1916 #define ARITH_OPERATION_COND_66_LE_8 ,
       
  1917 #define ARITH_OPERATION_COND_67_LE_8 ,
       
  1918 #define ARITH_OPERATION_COND_68_LE_8 ,
       
  1919 #define ARITH_OPERATION_COND_69_LE_8 ,
       
  1920 #define ARITH_OPERATION_COND_70_LE_8 ,
       
  1921 #define ARITH_OPERATION_COND_71_LE_8 ,
       
  1922 #define ARITH_OPERATION_COND_72_LE_8 ,
       
  1923 #define ARITH_OPERATION_COND_73_LE_8 ,
       
  1924 #define ARITH_OPERATION_COND_74_LE_8 ,
       
  1925 #define ARITH_OPERATION_COND_75_LE_8 ,
       
  1926 #define ARITH_OPERATION_COND_76_LE_8 ,
       
  1927 #define ARITH_OPERATION_COND_77_LE_8 ,
       
  1928 #define ARITH_OPERATION_COND_78_LE_8 ,
       
  1929 #define ARITH_OPERATION_COND_79_LE_8 ,
       
  1930 #define ARITH_OPERATION_COND_80_LE_8 ,
       
  1931 #define ARITH_OPERATION_COND_81_LE_8 ,
       
  1932 #define ARITH_OPERATION_COND_82_LE_8 ,
       
  1933 #define ARITH_OPERATION_COND_83_LE_8 ,
       
  1934 #define ARITH_OPERATION_COND_84_LE_8 ,
       
  1935 #define ARITH_OPERATION_COND_85_LE_8 ,
       
  1936 #define ARITH_OPERATION_COND_86_LE_8 ,
       
  1937 #define ARITH_OPERATION_COND_87_LE_8 ,
       
  1938 #define ARITH_OPERATION_COND_88_LE_8 ,
       
  1939 #define ARITH_OPERATION_COND_89_LE_8 ,
       
  1940 #define ARITH_OPERATION_COND_90_LE_8 ,
       
  1941 #define ARITH_OPERATION_COND_91_LE_8 ,
       
  1942 #define ARITH_OPERATION_COND_92_LE_8 ,
       
  1943 #define ARITH_OPERATION_COND_93_LE_8 ,
       
  1944 #define ARITH_OPERATION_COND_94_LE_8 ,
       
  1945 #define ARITH_OPERATION_COND_95_LE_8 ,
       
  1946 #define ARITH_OPERATION_COND_96_LE_8 ,
       
  1947 #define ARITH_OPERATION_COND_97_LE_8 ,
       
  1948 #define ARITH_OPERATION_COND_98_LE_8 ,
       
  1949 #define ARITH_OPERATION_COND_99_LE_8 ,
       
  1950 #define ARITH_OPERATION_COND_100_LE_8 ,
       
  1951 #define ARITH_OPERATION_COND_101_LE_8 ,
       
  1952 #define ARITH_OPERATION_COND_102_LE_8 ,
       
  1953 #define ARITH_OPERATION_COND_103_LE_8 ,
       
  1954 #define ARITH_OPERATION_COND_104_LE_8 ,
       
  1955 #define ARITH_OPERATION_COND_105_LE_8 ,
       
  1956 #define ARITH_OPERATION_COND_106_LE_8 ,
       
  1957 #define ARITH_OPERATION_COND_107_LE_8 ,
       
  1958 #define ARITH_OPERATION_COND_108_LE_8 ,
       
  1959 #define ARITH_OPERATION_COND_109_LE_8 ,
       
  1960 #define ARITH_OPERATION_COND_110_LE_8 ,
       
  1961 #define ARITH_OPERATION_COND_111_LE_8 ,
       
  1962 #define ARITH_OPERATION_COND_112_LE_8 ,
       
  1963 #define ARITH_OPERATION_COND_113_LE_8 ,
       
  1964 #define ARITH_OPERATION_COND_114_LE_8 ,
       
  1965 #define ARITH_OPERATION_COND_115_LE_8 ,
       
  1966 #define ARITH_OPERATION_COND_116_LE_8 ,
       
  1967 #define ARITH_OPERATION_COND_117_LE_8 ,
       
  1968 #define ARITH_OPERATION_COND_118_LE_8 ,
       
  1969 #define ARITH_OPERATION_COND_119_LE_8 ,
       
  1970 #define ARITH_OPERATION_COND_120_LE_8 ,
       
  1971 #define ARITH_OPERATION_COND_121_LE_8 ,
       
  1972 #define ARITH_OPERATION_COND_122_LE_8 ,
       
  1973 #define ARITH_OPERATION_COND_123_LE_8 ,
       
  1974 #define ARITH_OPERATION_COND_124_LE_8 ,
       
  1975 #define ARITH_OPERATION_COND_125_LE_8 ,
       
  1976 #define ARITH_OPERATION_COND_126_LE_8 ,
       
  1977 #define ARITH_OPERATION_COND_127_LE_8 ,
       
  1978 #define ARITH_OPERATION_COND_128_LE_8 ,
       
  1979 #define ARITH_OPERATION_COND_129_LE_8 ,
       
  1980 #define ARITH_OPERATION_COND_130_LE_8 ,
       
  1981 #define ARITH_OPERATION_COND_131_LE_8 ,
       
  1982 #define ARITH_OPERATION_COND_132_LE_8 ,
       
  1983 #define ARITH_OPERATION_COND_133_LE_8 ,
       
  1984 #define ARITH_OPERATION_COND_134_LE_8 ,
       
  1985 #define ARITH_OPERATION_COND_135_LE_8 ,
       
  1986 #define ARITH_OPERATION_COND_136_LE_8 ,
       
  1987 #define ARITH_OPERATION_COND_137_LE_8 ,
       
  1988 #define ARITH_OPERATION_COND_138_LE_8 ,
       
  1989 #define ARITH_OPERATION_COND_139_LE_8 ,
       
  1990 #define ARITH_OPERATION_COND_140_LE_8 ,
       
  1991 #define ARITH_OPERATION_COND_141_LE_8 ,
       
  1992 #define ARITH_OPERATION_COND_142_LE_8 ,
       
  1993 #define ARITH_OPERATION_COND_143_LE_8 ,
       
  1994 #define ARITH_OPERATION_COND_144_LE_8 ,
       
  1995 #define ARITH_OPERATION_COND_145_LE_8 ,
       
  1996 #define ARITH_OPERATION_COND_146_LE_8 ,
       
  1997 #define ARITH_OPERATION_COND_147_LE_8 ,
       
  1998 #define ARITH_OPERATION_COND_148_LE_8 ,
       
  1999 #define ARITH_OPERATION_COND_149_LE_8 ,
       
  2000 #define ARITH_OPERATION_COND_150_LE_8 ,
       
  2001 #define ARITH_OPERATION_COND_151_LE_8 ,
       
  2002 #define ARITH_OPERATION_COND_152_LE_8 ,
       
  2003 #define ARITH_OPERATION_COND_153_LE_8 ,
       
  2004 #define ARITH_OPERATION_COND_154_LE_8 ,
       
  2005 #define ARITH_OPERATION_COND_155_LE_8 ,
       
  2006 #define ARITH_OPERATION_COND_156_LE_8 ,
       
  2007 #define ARITH_OPERATION_COND_157_LE_8 ,
       
  2008 #define ARITH_OPERATION_COND_158_LE_8 ,
       
  2009 #define ARITH_OPERATION_COND_159_LE_8 ,
       
  2010 #define ARITH_OPERATION_COND_160_LE_8 ,
       
  2011 #define ARITH_OPERATION_COND_161_LE_8 ,
       
  2012 #define ARITH_OPERATION_COND_162_LE_8 ,
       
  2013 #define ARITH_OPERATION_COND_163_LE_8 ,
       
  2014 #define ARITH_OPERATION_COND_164_LE_8 ,
       
  2015 #define ARITH_OPERATION_COND_165_LE_8 ,
       
  2016 #define ARITH_OPERATION_COND_166_LE_8 ,
       
  2017 #define ARITH_OPERATION_COND_167_LE_8 ,
       
  2018 #define ARITH_OPERATION_COND_168_LE_8 ,
       
  2019 #define ARITH_OPERATION_COND_169_LE_8 ,
       
  2020 #define ARITH_OPERATION_COND_170_LE_8 ,
       
  2021 #define ARITH_OPERATION_COND_171_LE_8 ,
       
  2022 #define ARITH_OPERATION_COND_172_LE_8 ,
       
  2023 #define ARITH_OPERATION_COND_173_LE_8 ,
       
  2024 #define ARITH_OPERATION_COND_174_LE_8 ,
       
  2025 #define ARITH_OPERATION_COND_175_LE_8 ,
       
  2026 #define ARITH_OPERATION_COND_176_LE_8 ,
       
  2027 #define ARITH_OPERATION_COND_177_LE_8 ,
       
  2028 #define ARITH_OPERATION_COND_178_LE_8 ,
       
  2029 #define ARITH_OPERATION_COND_179_LE_8 ,
       
  2030 #define ARITH_OPERATION_COND_180_LE_8 ,
       
  2031 #define ARITH_OPERATION_COND_181_LE_8 ,
       
  2032 #define ARITH_OPERATION_COND_182_LE_8 ,
       
  2033 #define ARITH_OPERATION_COND_183_LE_8 ,
       
  2034 #define ARITH_OPERATION_COND_184_LE_8 ,
       
  2035 #define ARITH_OPERATION_COND_185_LE_8 ,
       
  2036 #define ARITH_OPERATION_COND_186_LE_8 ,
       
  2037 #define ARITH_OPERATION_COND_187_LE_8 ,
       
  2038 #define ARITH_OPERATION_COND_188_LE_8 ,
       
  2039 #define ARITH_OPERATION_COND_189_LE_8 ,
       
  2040 #define ARITH_OPERATION_COND_190_LE_8 ,
       
  2041 #define ARITH_OPERATION_COND_191_LE_8 ,
       
  2042 #define ARITH_OPERATION_COND_192_LE_8 ,
       
  2043 #define ARITH_OPERATION_COND_193_LE_8 ,
       
  2044 #define ARITH_OPERATION_COND_194_LE_8 ,
       
  2045 #define ARITH_OPERATION_COND_195_LE_8 ,
       
  2046 #define ARITH_OPERATION_COND_196_LE_8 ,
       
  2047 #define ARITH_OPERATION_COND_197_LE_8 ,
       
  2048 #define ARITH_OPERATION_COND_198_LE_8 ,
       
  2049 #define ARITH_OPERATION_COND_199_LE_8 ,
  1587 
  2050 
  1588 
  2051 
  1589 #endif /* _IEC_STD_FUNCTIONS_H */
  2052 #endif /* _IEC_STD_FUNCTIONS_H */