937 #define VA_ARGS_TOD TOD |
937 #define VA_ARGS_TOD TOD |
938 #define VA_ARGS_DT DT |
938 #define VA_ARGS_DT DT |
939 |
939 |
940 |
940 |
941 #define __numeric(fname,TYPENAME, FUNC) \ |
941 #define __numeric(fname,TYPENAME, FUNC) \ |
|
942 /* explicitly typed function */\ |
942 static inline TYPENAME fname##TYPENAME(EN_ENO_PARAMS, TYPENAME op){\ |
943 static inline TYPENAME fname##TYPENAME(EN_ENO_PARAMS, TYPENAME op){\ |
943 TEST_EN(TYPENAME)\ |
944 TEST_EN(TYPENAME)\ |
944 return FUNC(op);\ |
945 return FUNC(op);\ |
|
946 }\ |
|
947 /* overloaded function */\ |
|
948 static inline TYPENAME fname##_##TYPENAME##__##TYPENAME(EN_ENO_PARAMS, TYPENAME op) {\ |
|
949 return fname##TYPENAME(EN_ENO, op);\ |
945 } |
950 } |
946 |
951 |
947 /******************************************************************/ |
952 /******************************************************************/ |
948 /*** Table 23 - Standard functions of one numeric variable ***/ |
953 /*** Table 23 - Standard functions of one numeric variable ***/ |
949 /******************************************************************/ |
954 /******************************************************************/ |
950 |
955 |
951 /**************/ |
956 /**************/ |
952 /* ABS */ |
957 /* ABS */ |
953 /**************/ |
958 /**************/ |
954 /* explicitly typed function */ |
959 #define __abs_signed(TYPENAME) \ |
955 #define __iec_(TYPENAME) \ |
960 /* explicitly typed function */\ |
956 static inline TYPENAME ABS_##TYPENAME(EN_ENO_PARAMS, TYPENAME op){\ |
961 static inline TYPENAME ABS_##TYPENAME(EN_ENO_PARAMS, TYPENAME op){\ |
957 TEST_EN(TYPENAME)\ |
962 TEST_EN(TYPENAME)\ |
958 if (op < 0)\ |
963 if (op < 0)\ |
959 return -op;\ |
964 return -op;\ |
960 return op;\ |
965 return op;\ |
961 } |
966 }\ |
962 __ANY_REAL(__iec_) |
967 /* overloaded function */\ |
963 __ANY_SINT(__iec_) |
968 static inline TYPENAME ABS__##TYPENAME##__##TYPENAME(EN_ENO_PARAMS, TYPENAME op) {\ |
964 #undef __iec_ |
969 return ABS_##TYPENAME(EN_ENO, op);\ |
965 |
970 } |
966 #define __iec_(TYPENAME) \ |
971 |
|
972 #define __abs_unsigned(TYPENAME) \ |
|
973 /* explicitly typed function */\ |
967 static inline TYPENAME ABS_##TYPENAME(EN_ENO_PARAMS, TYPENAME op){\ |
974 static inline TYPENAME ABS_##TYPENAME(EN_ENO_PARAMS, TYPENAME op){\ |
968 TEST_EN(TYPENAME)\ |
975 TEST_EN(TYPENAME)\ |
969 return op;\ |
976 return op;\ |
970 } |
977 }\ |
971 __ANY_UINT(__iec_) |
978 /* overloaded function */\ |
972 #undef __iec_ |
979 static inline TYPENAME ABS__##TYPENAME##__##TYPENAME(EN_ENO_PARAMS, TYPENAME op) {\ |
973 |
980 return ABS_##TYPENAME(EN_ENO, op);\ |
974 /* overloaded function */ |
981 } |
975 #define __iec_(TYPENAME) \ |
982 |
976 static inline TYPENAME ABS__##TYPENAME##__##TYPENAME(EN_ENO_PARAMS, TYPENAME op){\ |
983 __ANY_REAL(__abs_signed) |
977 TEST_EN(TYPENAME)\ |
984 __ANY_SINT(__abs_signed) |
978 if (op < 0)\ |
985 __ANY_UINT(__abs_unsigned) |
979 return -op;\ |
|
980 return op;\ |
|
981 } |
|
982 __ANY_REAL(__iec_) |
|
983 __ANY_SINT(__iec_) |
|
984 #undef __iec_ |
|
985 |
|
986 #define __iec_(TYPENAME) \ |
|
987 static inline TYPENAME ABS__##TYPENAME##__##TYPENAME(EN_ENO_PARAMS, TYPENAME op){\ |
|
988 TEST_EN(TYPENAME)\ |
|
989 return op;\ |
|
990 } |
|
991 __ANY_UINT(__iec_) |
|
992 #undef __iec_ |
|
993 |
986 |
994 |
987 |
995 /**************/ |
988 /**************/ |
996 /* SQRT */ |
989 /* SQRT */ |
997 /**************/ |
990 /**************/ |
998 /* explicitly typed function */ |
991 #define __sqrt(TYPENAME) __numeric(SQRT_, TYPENAME, sqrt) |
999 #define __iec_(TYPENAME) \ |
992 __ANY_REAL(__sqrt) |
1000 __numeric(SQRT_, TYPENAME, sqrt) /* explicitly typed function */\ |
993 |
1001 __numeric(SQRT__##TYPENAME##__, TYPENAME, sqrt) /* overloaded function */ |
994 |
1002 __ANY_REAL(__iec_) |
995 /**************/ |
1003 #undef __iec_ |
|
1004 |
|
1005 /**************/ |
|
1006 /* LN */ |
996 /* LN */ |
1007 /**************/ |
997 /**************/ |
1008 #define __iec_(TYPENAME) \ |
998 #define __ln(TYPENAME) __numeric(LN_, TYPENAME, log) |
1009 __numeric(LN_, TYPENAME, log) /* explicitly typed function */\ |
999 __ANY_REAL(__ln) |
1010 __numeric(LN__##TYPENAME##__, TYPENAME, log) /* overloaded function */ |
|
1011 __ANY_REAL(__iec_) |
|
1012 #undef __iec_ |
|
1013 |
1000 |
1014 |
1001 |
1015 /**************/ |
1002 /**************/ |
1016 /* LOG */ |
1003 /* LOG */ |
1017 /**************/ |
1004 /**************/ |
1018 #define __iec_(TYPENAME) \ |
1005 #define __log(TYPENAME) __numeric(LOG_, TYPENAME, log10) |
1019 __numeric(LOG_, TYPENAME, log10) /* explicitly typed function */\ |
1006 __ANY_REAL(__log) |
1020 __numeric(LOG__##TYPENAME##__, TYPENAME, log10) /* overloaded function */ |
1007 |
1021 __ANY_REAL(__iec_) |
|
1022 #undef __iec_ |
|
1023 |
1008 |
1024 /**************/ |
1009 /**************/ |
1025 /* EXP */ |
1010 /* EXP */ |
1026 /**************/ |
1011 /**************/ |
1027 #define __iec_(TYPENAME) \ |
1012 #define __exp(TYPENAME) __numeric(EXP_, TYPENAME, exp) |
1028 __numeric(EXP_, TYPENAME, exp) /* explicitly typed function */\ |
1013 __ANY_REAL(__exp) |
1029 __numeric(EXP__##TYPENAME##__, TYPENAME, exp) /* overloaded function */ |
|
1030 __ANY_REAL(__iec_) |
|
1031 #undef __iec_ |
|
1032 |
1014 |
1033 |
1015 |
1034 /**************/ |
1016 /**************/ |
1035 /* SIN */ |
1017 /* SIN */ |
1036 /**************/ |
1018 /**************/ |
1037 #define __iec_(TYPENAME) \ |
1019 #define __sin(TYPENAME) __numeric(SIN_, TYPENAME, sin) |
1038 __numeric(SIN_, TYPENAME, sin) /* explicitly typed function */\ |
1020 __ANY_REAL(__sin) |
1039 __numeric(SIN__##TYPENAME##__, TYPENAME, sin) /* overloaded function */ |
|
1040 __ANY_REAL(__iec_) |
|
1041 #undef __iec_ |
|
1042 |
1021 |
1043 |
1022 |
1044 /**************/ |
1023 /**************/ |
1045 /* COS */ |
1024 /* COS */ |
1046 /**************/ |
1025 /**************/ |
1047 #define __iec_(TYPENAME) \ |
1026 #define __cos(TYPENAME) __numeric(COS_, TYPENAME, cos) |
1048 __numeric(COS_, TYPENAME, cos) /* explicitly typed function */\ |
1027 __ANY_REAL(__cos) |
1049 __numeric(COS__##TYPENAME##__, TYPENAME, cos) /* overloaded function */ |
|
1050 __ANY_REAL(__iec_) |
|
1051 #undef __iec_ |
|
1052 |
1028 |
1053 /**************/ |
1029 /**************/ |
1054 /* TAN */ |
1030 /* TAN */ |
1055 /**************/ |
1031 /**************/ |
1056 #define __iec_(TYPENAME) \ |
1032 #define __tan(TYPENAME) __numeric(TAN_, TYPENAME, tan) |
1057 __numeric(TAN_, TYPENAME, tan) /* explicitly typed function */\ |
1033 __ANY_REAL(__tan) |
1058 __numeric(TAN__##TYPENAME##__, TYPENAME, tan) /* overloaded function */ |
|
1059 __ANY_REAL(__iec_) |
|
1060 #undef __iec_ |
|
1061 |
1034 |
1062 |
1035 |
1063 /**************/ |
1036 /**************/ |
1064 /* ASIN */ |
1037 /* ASIN */ |
1065 /**************/ |
1038 /**************/ |
1066 #define __iec_(TYPENAME) \ |
1039 #define __asin(TYPENAME) __numeric(ASIN_, TYPENAME, asin) |
1067 __numeric(ASIN_, TYPENAME, asin) /* explicitly typed function */\ |
1040 __ANY_REAL(__asin) |
1068 __numeric(ASIN__##TYPENAME##__, TYPENAME, asin) /* overloaded function */ |
|
1069 __ANY_REAL(__iec_) |
|
1070 #undef __iec_ |
|
1071 |
1041 |
1072 /**************/ |
1042 /**************/ |
1073 /* ACOS */ |
1043 /* ACOS */ |
1074 /**************/ |
1044 /**************/ |
1075 #define __iec_(TYPENAME) \ |
1045 #define __acos(TYPENAME) __numeric(ACOS_, TYPENAME, acos) |
1076 __numeric(ACOS_, TYPENAME, acos) /* explicitly typed function */\ |
1046 __ANY_REAL(__acos) |
1077 __numeric(ACOS__##TYPENAME##__, TYPENAME, acos) /* overloaded function */ |
|
1078 __ANY_REAL(__iec_) |
|
1079 #undef __iec_ |
|
1080 |
1047 |
1081 /**************/ |
1048 /**************/ |
1082 /* ATAN */ |
1049 /* ATAN */ |
1083 /**************/ |
1050 /**************/ |
1084 #define __iec_(TYPENAME) \ |
1051 #define __atan(TYPENAME) __numeric(ATAN_, TYPENAME, atan) |
1085 __numeric(ATAN_, TYPENAME, atan) /* explicitly typed function */\ |
1052 __ANY_REAL(__atan) |
1086 __numeric(ATAN__##TYPENAME##__, TYPENAME, atan) /* overloaded function */ |
|
1087 __ANY_REAL(__iec_) |
|
1088 #undef __iec_ |
|
1089 |
1053 |
1090 |
1054 |
1091 |
1055 |
1092 /*****************************************************/ |
1056 /*****************************************************/ |
1093 /*** Table 24 - Standard arithmetic functions ***/ |
1057 /*** Table 24 - Standard arithmetic functions ***/ |
1094 /*****************************************************/ |
1058 /*****************************************************/ |
1095 /* |
1059 |
1096 Unfortunately, the following does not work!! |
1060 #define __arith_expand(fname,TYPENAME, OP)\ |
1097 |
|
1098 #define NUMARGS(...) (sizeof((int[]){__VA_ARGS__})/sizeof(int)) |
|
1099 |
|
1100 #define __arith_expand(fname,TYPENAME, OP) \ |
|
1101 #define fname(EN, ENO, ...) fname__(EN, ENO, NUMARGS(__VA_ARGS__), __VA_ARGS__)\ |
|
1102 static inline TYPENAME fname__(EN_ENO_PARAMS, UINT param_count, TYPENAME op1, ...){\ |
|
1103 va_list ap;\ |
|
1104 UINT i;\ |
|
1105 TEST_EN(TYPENAME)\ |
|
1106 \ |
|
1107 va_start (ap, op1); \ |
|
1108 \ |
|
1109 for (i = 0; i < param_count - 1; i++){\ |
|
1110 op1 = op1 OP va_arg (ap, VA_ARGS_##TYPENAME);\ |
|
1111 }\ |
|
1112 \ |
|
1113 va_end (ap); \ |
|
1114 return op1;\ |
|
1115 } |
|
1116 */ |
|
1117 |
|
1118 |
|
1119 #define __arith_expand(fname,TYPENAME, OP) \ |
|
1120 static inline TYPENAME fname(EN_ENO_PARAMS, UINT param_count, TYPENAME op1, ...){\ |
1061 static inline TYPENAME fname(EN_ENO_PARAMS, UINT param_count, TYPENAME op1, ...){\ |
1121 va_list ap;\ |
1062 va_list ap;\ |
1122 UINT i;\ |
1063 UINT i;\ |
1123 TEST_EN(TYPENAME)\ |
1064 TEST_EN(TYPENAME)\ |
1124 \ |
1065 \ |
1130 \ |
1071 \ |
1131 va_end (ap); /* Clean up. */\ |
1072 va_end (ap); /* Clean up. */\ |
1132 return op1;\ |
1073 return op1;\ |
1133 } |
1074 } |
1134 |
1075 |
1135 #define __arith_static(fname,TYPENAME, OP) \ |
1076 #define __arith_static(fname,TYPENAME, OP)\ |
1136 static inline TYPENAME fname(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\ |
1077 /* explicitly typed function */\ |
|
1078 static inline TYPENAME fname##TYPENAME(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\ |
1137 TEST_EN(TYPENAME)\ |
1079 TEST_EN(TYPENAME)\ |
1138 return op1 OP op2;\ |
1080 return op1 OP op2;\ |
|
1081 }\ |
|
1082 /* overloaded function */\ |
|
1083 static inline TYPENAME fname##_##TYPENAME##__##TYPENAME##__##TYPENAME(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\ |
|
1084 return fname##TYPENAME(EN_ENO, op1, op2);\ |
1139 } |
1085 } |
1140 |
1086 |
1141 /**************/ |
1087 /**************/ |
1142 /* ADD */ |
1088 /* ADD */ |
1143 /**************/ |
1089 /**************/ |
1144 #define __iec_(TYPENAME) \ |
1090 #define __add(TYPENAME) \ |
1145 __arith_expand(ADD_##TYPENAME, TYPENAME, +) /* explicitly typed function */\ |
1091 __arith_expand(ADD_##TYPENAME, TYPENAME, +) /* explicitly typed function */\ |
1146 __arith_expand(ADD__##TYPENAME##__##TYPENAME, TYPENAME, +) /* overloaded function */ |
1092 __arith_expand(ADD__##TYPENAME##__##TYPENAME, TYPENAME, +) /* overloaded function */ |
1147 __ANY_NUM(__iec_) |
1093 __ANY_NUM(__add) |
1148 #undef __iec_ |
1094 |
1149 |
1095 |
1150 /**************/ |
1096 /**************/ |
1151 /* MUL */ |
1097 /* MUL */ |
1152 /**************/ |
1098 /**************/ |
1153 #define __iec_(TYPENAME) \ |
1099 #define __mul(TYPENAME) \ |
1154 __arith_expand(MUL_##TYPENAME, TYPENAME, *) /* explicitly typed function */\ |
1100 __arith_expand(MUL_##TYPENAME, TYPENAME, *) /* explicitly typed function */\ |
1155 __arith_expand(MUL__##TYPENAME##__##TYPENAME, TYPENAME, *) /* overloaded function */ |
1101 __arith_expand(MUL__##TYPENAME##__##TYPENAME, TYPENAME, *) /* overloaded function */ |
1156 __ANY_NUM(__iec_) |
1102 __ANY_NUM(__mul) |
1157 #undef __iec_ |
1103 |
1158 |
1104 |
1159 /**************/ |
1105 /**************/ |
1160 /* SUB */ |
1106 /* SUB */ |
1161 /**************/ |
1107 /**************/ |
1162 #define __iec_(TYPENAME) \ |
1108 #define __sub(TYPENAME) __arith_static(SUB_, TYPENAME, -) |
1163 __arith_expand(SUB_##TYPENAME, TYPENAME, -) /* explicitly typed function */\ |
1109 __ANY_NUM(__sub) |
1164 __arith_expand(SUB__##TYPENAME##__##TYPENAME##__##TYPENAME, TYPENAME, -) /* overloaded function */ |
1110 |
1165 __ANY_NUM(__iec_) |
|
1166 #undef __iec_ |
|
1167 |
1111 |
1168 /**************/ |
1112 /**************/ |
1169 /* DIV */ |
1113 /* DIV */ |
1170 /**************/ |
1114 /**************/ |
1171 /* The explicitly typed standard functions */ |
1115 #define __div(TYPENAME)\ |
1172 #define __iec_(TYPENAME)\ |
1116 /* The explicitly typed standard functions */\ |
1173 static inline TYPENAME DIV_##TYPENAME(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\ |
1117 static inline TYPENAME DIV_##TYPENAME(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\ |
1174 TEST_EN_COND(TYPENAME, op2 == 0)\ |
1118 TEST_EN_COND(TYPENAME, op2 == 0)\ |
1175 return op1 / op2;\ |
1119 return op1 / op2;\ |
1176 } |
1120 }\ |
1177 __ANY_NUM(__iec_) |
1121 /* The overloaded standard functions */\ |
1178 #undef __iec_ |
|
1179 |
|
1180 /* The overloaded standard functions */ |
|
1181 #define __iec_(TYPENAME)\ |
|
1182 static inline TYPENAME DIV__##TYPENAME##__##TYPENAME##__##TYPENAME(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\ |
1122 static inline TYPENAME DIV__##TYPENAME##__##TYPENAME##__##TYPENAME(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\ |
|
1123 return DIV_##TYPENAME(EN_ENO, op1, op2);\ |
|
1124 } |
|
1125 __ANY_NUM(__div) |
|
1126 |
|
1127 |
|
1128 /**************/ |
|
1129 /* MOD */ |
|
1130 /**************/ |
|
1131 #define __mod(TYPENAME)\ |
|
1132 /* The explicitly typed standard functions */\ |
|
1133 static inline TYPENAME MOD_##TYPENAME(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\ |
1183 TEST_EN_COND(TYPENAME, op2 == 0)\ |
1134 TEST_EN_COND(TYPENAME, op2 == 0)\ |
1184 return op1 / op2;\ |
1135 return op1 % op2;\ |
1185 } |
1136 }\ |
1186 __ANY_NUM(__iec_) |
1137 /* The overloaded standard functions */\ |
1187 #undef __iec_ |
1138 static inline TYPENAME MOD__##TYPENAME##__##TYPENAME##__##TYPENAME(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\ |
1188 |
1139 return DIV_##TYPENAME(EN_ENO, op1, op2);\ |
1189 /**************/ |
1140 } |
1190 /* MOD */ |
1141 __ANY_INT(__mod) |
1191 /**************/ |
|
1192 /* The explicitly typed standard functions */ |
|
1193 #define __iec_(TYPENAME)\ |
|
1194 __arith_expand(MOD_##TYPENAME, TYPENAME, %) /* explicitly typed function */\ |
|
1195 __arith_expand(MOD__##TYPENAME##__##TYPENAME##__##TYPENAME, TYPENAME, %) /* overloaded function */ |
|
1196 __ANY_INT(__iec_) |
|
1197 #undef __iec_ |
|
1198 |
1142 |
1199 /**************/ |
1143 /**************/ |
1200 /* EXPT */ |
1144 /* EXPT */ |
1201 /**************/ |
1145 /**************/ |
1202 /* overloaded function */ |
1146 /* overloaded function */ |