PageRenderTime 23ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/libsrc/veclib/vectbl.c

https://gitlab.com/oytunistrator/QuIP
C | 507 lines | 356 code | 76 blank | 75 comment | 17 complexity | 69d9ba10e5a79e9c02485074190f6328 MD5 | raw file
  1. #include "quip_config.h"
  2. /* this table defines all of the functions.
  3. * It gives their name, a mask that tells the supported precisions,
  4. * and an entry point...
  5. */
  6. #include <stdlib.h> /* qsort */
  7. #include "quip_prot.h"
  8. #include "nvf.h"
  9. #include "rn.h" /* set_random_seed */
  10. static Item_Type *vec_func_itp=NO_ITEM_TYPE;
  11. static ITEM_INIT_PROT(Vector_Function, vec_func)
  12. static ITEM_INIT_FUNC(Vector_Function, vec_func)
  13. ITEM_LIST_FUNC(Vector_Function, vec_func)
  14. ITEM_PICK_FUNC(Vector_Function, vec_func)
  15. /* This used to be an initialized table,
  16. * but in Objective C we have to do it differently...
  17. *
  18. * This table contains information about the functions, but isn't
  19. * specific to a particular platform. The elements are the name,
  20. * the code, a code indicating the argument types, a mask indicating
  21. * what precisions (and combinations) are allowed, and a mask
  22. * indicating what types (real/complex/quaternion/mixed/etc)
  23. * are allowed.
  24. */
  25. BEGIN_VFUNC_DECLS
  26. CREAT_VEC_FUNC( vset, FVSET, S_UNARY, M_ALL, RCQ_MASK )
  27. CREAT_VEC_FUNC( vmov, FVMOV, V_UNARY, M_ALL, RCQ_MASK )
  28. CREAT_VEC_FUNC( vadd, FVADD, VV_BINARY, M_ALLMM,RCMQP_MASK )
  29. CREAT_VEC_FUNC( vsub, FVSUB, VV_BINARY, M_ALL, RCMQP_MASK )
  30. CREAT_VEC_FUNC( vmul, FVMUL, VV_BINARY, M_ALL, RCMQP_MASK )
  31. CREAT_VEC_FUNC( vdiv, FVDIV, VV_BINARY, M_ALL, RCMQP_MASK )
  32. CREAT_VEC_FUNC( vneg, FVNEG, V_UNARY, M_ALL, RCQ_MASK )
  33. CREAT_VEC_FUNC( vsqr, FVSQR, V_UNARY, M_ALL, RCQ_MASK )
  34. CREAT_VEC_FUNC( vramp1d, FVRAMP1D, SS_RAMP, M_ALL, REAL_ARG_MASK )
  35. CREAT_VEC_FUNC( vramp2d, FVRAMP2D, SSS_RAMP, M_ALL, REAL_ARG_MASK )
  36. CREAT_VEC_FUNC( vsadd, FVSADD, VS_BINARY, M_ALL, RCMQP_MASK )
  37. CREAT_VEC_FUNC( vssub, FVSSUB, VS_BINARY, M_ALL, RCMQP_MASK )
  38. CREAT_VEC_FUNC( vsmul, FVSMUL, VS_BINARY, M_ALL, RCMQP_MASK )
  39. CREAT_VEC_FUNC( vsdiv, FVSDIV, VS_BINARY, M_ALL, RCMQP_MASK )
  40. CREAT_VEC_FUNC( vsdiv2, FVSDIV2, VS_BINARY, M_ALL, RCMQP_MASK )
  41. CREAT_VEC_FUNC( vabs, FVABS, V_UNARY, M_ALL, REAL_ARG_MASK )
  42. CREAT_VEC_FUNC( vsign, FVSIGN, V_UNARY, M_ALL, REAL_ARG_MASK )
  43. CREAT_VEC_FUNC( vsqrt, FVSQRT, V_UNARY, M_BP, REAL_ARG_MASK )
  44. CREAT_VEC_FUNC( vsin, FVSIN, V_UNARY, M_BP, REAL_ARG_MASK )
  45. CREAT_VEC_FUNC( vcos, FVCOS, V_UNARY, M_BP, REAL_ARG_MASK )
  46. CREAT_VEC_FUNC( vatan, FVATAN, V_UNARY, M_BP, REAL_ARG_MASK )
  47. CREAT_VEC_FUNC( vtan, FVTAN, V_UNARY, M_BP, REAL_ARG_MASK )
  48. CREAT_VEC_FUNC( vatan2, FVATAN2, VV_BINARY, M_BP, REAL_ARG_MASK )
  49. CREAT_VEC_FUNC( vsatan2, FVSATAN2, VS_BINARY, M_BP, REAL_ARG_MASK )
  50. CREAT_VEC_FUNC( vsatan22, FVSATAN22, VS_BINARY, M_BP, REAL_ARG_MASK )
  51. CREAT_VEC_FUNC( vlog, FVLOG, V_UNARY, M_BP, REAL_ARG_MASK )
  52. CREAT_VEC_FUNC( vlog10, FVLOG10, V_UNARY, M_BP, REAL_ARG_MASK )
  53. //CREAT_VEC_FUNC( vexp, FVEXP, V_UNARY, M_BP, REAL_ARG_MASK )
  54. CREAT_VEC_FUNC( vexp, FVEXP, V_UNARY, M_BP, RC_MASK )
  55. CREAT_VEC_FUNC( verf, FVERF, V_UNARY, M_BP, REAL_ARG_MASK )
  56. CREAT_VEC_FUNC( verfinv, FVERFINV, V_UNARY, M_BP, REAL_ARG_MASK )
  57. CREAT_VEC_FUNC( vpow, FVPOW, VV_BINARY, M_BP, RC_MASK )
  58. CREAT_VEC_FUNC( vspow, FVSPOW, VS_BINARY, M_BP, REAL_ARG_MASK )
  59. CREAT_VEC_FUNC( vspow2, FVSPOW2, VS_BINARY, M_BP, REAL_ARG_MASK )
  60. CREAT_VEC_FUNC( vmin, FVMIN, VV_BINARY, M_ALL, REAL_ARG_MASK )
  61. CREAT_VEC_FUNC( vmax, FVMAX, VV_BINARY, M_ALL, REAL_ARG_MASK )
  62. CREAT_VEC_FUNC( vminm, FVMINM, VV_BINARY, M_ALL, REAL_ARG_MASK )
  63. CREAT_VEC_FUNC( vmaxm, FVMAXM, VV_BINARY, M_ALL, REAL_ARG_MASK )
  64. CREAT_VEC_FUNC( vsmin, FVSMIN, VS_BINARY, M_ALL, REAL_ARG_MASK )
  65. CREAT_VEC_FUNC( vsmax, FVSMAX, VS_BINARY, M_ALL, REAL_ARG_MASK )
  66. CREAT_VEC_FUNC( vsmnm, FVSMNM, VS_BINARY, M_ALL, REAL_ARG_MASK )
  67. CREAT_VEC_FUNC( vsmxm, FVSMXM, VS_BINARY, M_ALL, REAL_ARG_MASK )
  68. CREAT_VEC_FUNC( vminv, FVMINV, V_PROJECTION, M_ALL, REAL_ARG_MASK )
  69. CREAT_VEC_FUNC( vmaxv, FVMAXV, V_PROJECTION, M_ALL, REAL_ARG_MASK )
  70. CREAT_VEC_FUNC( vmnmv, FVMNMV, V_PROJECTION, M_ALL, REAL_ARG_MASK )
  71. CREAT_VEC_FUNC( vmxmv, FVMXMV, V_PROJECTION, M_ALL, REAL_ARG_MASK )
  72. CREAT_VEC_FUNC( vmini, FVMINI, V_INT_PROJECTION, M_ALL, REAL_ARG_MASK )
  73. CREAT_VEC_FUNC( vmaxi, FVMAXI, V_INT_PROJECTION, M_ALL, REAL_ARG_MASK )
  74. CREAT_VEC_FUNC( vmnmi, FVMNMI, V_INT_PROJECTION, M_ALL, REAL_ARG_MASK )
  75. CREAT_VEC_FUNC( vmxmi, FVMXMI, V_INT_PROJECTION, M_ALL, REAL_ARG_MASK )
  76. CREAT_VEC_FUNC( vming, FVMING, V_SCALRET2, M_ALL, REAL_ARG_MASK )
  77. CREAT_VEC_FUNC( vmaxg, FVMAXG, V_SCALRET2, M_ALL, REAL_ARG_MASK )
  78. CREAT_VEC_FUNC( vmnmg, FVMNMG, V_SCALRET2, M_ALL, REAL_ARG_MASK )
  79. CREAT_VEC_FUNC( vmxmg, FVMXMG, V_SCALRET2, M_ALL, REAL_ARG_MASK )
  80. CREAT_VEC_FUNC( vfloor, FVFLOOR, V_UNARY, M_BP, REAL_ARG_MASK )
  81. CREAT_VEC_FUNC( vtrunc, FVTRUNC, V_UNARY, M_BP, REAL_ARG_MASK )
  82. CREAT_VEC_FUNC( vround, FVROUND, V_UNARY, M_BP, REAL_ARG_MASK )
  83. CREAT_VEC_FUNC( vceil, FVCEIL, V_UNARY, M_BP, REAL_ARG_MASK )
  84. CREAT_VEC_FUNC( vrint, FVRINT, V_UNARY, M_BP, REAL_ARG_MASK )
  85. CREAT_CPU_VEC_FUNC( vj0, FVJ0, V_UNARY, M_BP, REAL_ARG_MASK )
  86. CREAT_CPU_VEC_FUNC( vj1, FVJ1, V_UNARY, M_BP, REAL_ARG_MASK )
  87. CREAT_VEC_FUNC( vacos, FVACOS, V_UNARY, M_BP, REAL_ARG_MASK )
  88. CREAT_VEC_FUNC( vasin, FVASIN, V_UNARY, M_BP, REAL_ARG_MASK )
  89. CREAT_VEC_FUNC( vatn2, FVATN2, V_UNARY_C, M_BP, RC_MASK )
  90. CREAT_VEC_FUNC( vuni, FVUNI, V_NO_ARGS, M_BP, REAL_ARG_MASK )
  91. CREAT_VEC_FUNC( vand, FVAND, VV_BINARY, M_AI, REAL_ARG_MASK )
  92. CREAT_VEC_FUNC( vnand, FVNAND, VV_BINARY, M_AI, REAL_ARG_MASK )
  93. CREAT_VEC_FUNC( vor, FVOR, VV_BINARY, M_AI, REAL_ARG_MASK )
  94. CREAT_VEC_FUNC( vxor, FVXOR, VV_BINARY, M_AI, REAL_ARG_MASK )
  95. CREAT_VEC_FUNC( vnot, FVNOT, V_UNARY, M_AI, REAL_ARG_MASK )
  96. CREAT_VEC_FUNC( vmod, FVMOD, VV_BINARY, M_AI, REAL_ARG_MASK )
  97. CREAT_VEC_FUNC( vsmod, FVSMOD, VS_BINARY, M_AI, REAL_ARG_MASK )
  98. CREAT_VEC_FUNC( vsmod2, FVSMOD2, VS_BINARY, M_AI, REAL_ARG_MASK )
  99. CREAT_VEC_FUNC( vsand, FVSAND, VS_BINARY, M_AI, REAL_ARG_MASK )
  100. CREAT_VEC_FUNC( vsor, FVSOR, VS_BINARY, M_AI, REAL_ARG_MASK )
  101. CREAT_VEC_FUNC( vsxor, FVSXOR, VS_BINARY, M_AI, REAL_ARG_MASK )
  102. CREAT_VEC_FUNC( vshr, FVSHR, VV_BINARY, M_AI, REAL_ARG_MASK )
  103. CREAT_VEC_FUNC( vsshr, FVSSHR, VS_BINARY, M_AI, REAL_ARG_MASK )
  104. CREAT_VEC_FUNC( vsshr2, FVSSHR2, VS_BINARY, M_AI, REAL_ARG_MASK )
  105. CREAT_VEC_FUNC( vshl, FVSHL, VV_BINARY, M_AI, REAL_ARG_MASK )
  106. CREAT_VEC_FUNC( vsshl, FVSSHL, VS_BINARY, M_AI, REAL_ARG_MASK )
  107. CREAT_VEC_FUNC( vsshl2, FVSSHL2, VS_BINARY, M_AI, REAL_ARG_MASK )
  108. CREAT_VEC_FUNC( vconv2by, FVCONV2BY, V_UNARY, M_ALL, REAL_ARG_MASK )
  109. CREAT_VEC_FUNC( vconv2in, FVCONV2IN, V_UNARY, M_ALL, REAL_ARG_MASK )
  110. CREAT_VEC_FUNC( vconv2di, FVCONV2DI, V_UNARY, M_ALL, REAL_ARG_MASK )
  111. CREAT_VEC_FUNC( vconv2li, FVCONV2LI, V_UNARY, M_ALL, REAL_ARG_MASK )
  112. CREAT_VEC_FUNC( vconv2uby, FVCONV2UBY, V_UNARY, M_ALL, REAL_ARG_MASK )
  113. CREAT_VEC_FUNC( vconv2uin, FVCONV2UIN, V_UNARY, M_ALL, REAL_ARG_MASK )
  114. CREAT_VEC_FUNC( vconv2udi, FVCONV2UDI, V_UNARY, M_ALL, REAL_ARG_MASK )
  115. CREAT_VEC_FUNC( vconv2uli, FVCONV2ULI, V_UNARY, M_ALL, REAL_ARG_MASK )
  116. CREAT_VEC_FUNC( vconv2sp, FVCONV2SP, V_UNARY, M_ALL, REAL_ARG_MASK )
  117. CREAT_VEC_FUNC( vconv2dp, FVCONV2DP, V_UNARY, M_ALL, REAL_ARG_MASK )
  118. #ifdef OLD_STYLE_CONVERSIONS
  119. CREAT_VEC_FUNC( vby2in, FVBY2IN, V_UNARY, 0, REAL_ARG_MASK )
  120. CREAT_VEC_FUNC( vby2di, FVBY2DI, V_UNARY, 0, REAL_ARG_MASK )
  121. CREAT_VEC_FUNC( vby2sp, FVBY2SP, V_UNARY, 0, REAL_ARG_MASK )
  122. CREAT_VEC_FUNC( vby2dp, FVBY2DP, V_UNARY, 0, REAL_ARG_MASK )
  123. CREAT_VEC_FUNC( vin2by, FVIN2BY, V_UNARY, 0, REAL_ARG_MASK )
  124. CREAT_VEC_FUNC( vin2di, FVIN2DI, V_UNARY, 0, REAL_ARG_MASK )
  125. CREAT_VEC_FUNC( vin2sp, FVIN2SP, V_UNARY, 0, REAL_ARG_MASK )
  126. CREAT_VEC_FUNC( vin2dp, FVIN2DP, V_UNARY, 0, REAL_ARG_MASK )
  127. CREAT_VEC_FUNC( vdi2by, FVDI2BY, V_UNARY, 0, REAL_ARG_MASK )
  128. CREAT_VEC_FUNC( vdi2in, FVDI2IN, V_UNARY, 0, REAL_ARG_MASK )
  129. CREAT_VEC_FUNC( vdi2sp, FVDI2SP, V_UNARY, 0, REAL_ARG_MASK )
  130. CREAT_VEC_FUNC( vdi2dp, FVDI2DP, V_UNARY, 0, REAL_ARG_MASK )
  131. CREAT_VEC_FUNC( vsp2by, FVSP2BY, V_UNARY, 0, REAL_ARG_MASK )
  132. CREAT_VEC_FUNC( vsp2in, FVSP2IN, V_UNARY, 0, REAL_ARG_MASK )
  133. CREAT_VEC_FUNC( vsp2di, FVSP2DI, V_UNARY, 0, REAL_ARG_MASK )
  134. CREAT_VEC_FUNC( vsp2dp, FVSPDP, V_UNARY, 0, RCQ_MASK )
  135. CREAT_VEC_FUNC( vdp2by, FVDP2BY, V_UNARY, 0, REAL_ARG_MASK )
  136. CREAT_VEC_FUNC( vdp2in, FVDP2IN, V_UNARY, 0, REAL_ARG_MASK )
  137. CREAT_VEC_FUNC( vdp2sp, FVDPSP, V_UNARY, 0, RCQ_MASK )
  138. CREAT_VEC_FUNC( vdp2di, FVDP2DI, V_UNARY, 0, REAL_ARG_MASK )
  139. // unsigned conversions
  140. CREAT_VEC_FUNC( vuby2by, FVUBY2BY, V_UNARY, 0, REAL_ARG_MASK )
  141. CREAT_VEC_FUNC( vuby2in, FVUBY2IN, V_UNARY, 0, REAL_ARG_MASK )
  142. CREAT_VEC_FUNC( vuby2di, FVUBY2DI, V_UNARY, 0, REAL_ARG_MASK )
  143. CREAT_VEC_FUNC( vuby2sp, FVUBY2SP, V_UNARY, 0, REAL_ARG_MASK )
  144. CREAT_VEC_FUNC( vuby2dp, FVUBY2DP, V_UNARY, 0, REAL_ARG_MASK )
  145. CREAT_VEC_FUNC( vuby2uin, FVUBY2UIN, V_UNARY, 0, REAL_ARG_MASK )
  146. CREAT_VEC_FUNC( vuby2udi, FVUBY2UDI, V_UNARY, 0, REAL_ARG_MASK )
  147. CREAT_VEC_FUNC( vuin2by, FVUIN2BY, V_UNARY, 0, REAL_ARG_MASK )
  148. CREAT_VEC_FUNC( vuin2in, FVUIN2IN, V_UNARY, 0, REAL_ARG_MASK )
  149. CREAT_VEC_FUNC( vuin2di, FVUIN2DI, V_UNARY, 0, REAL_ARG_MASK )
  150. CREAT_VEC_FUNC( vuin2sp, FVUIN2SP, V_UNARY, 0, REAL_ARG_MASK )
  151. CREAT_VEC_FUNC( vuin2dp, FVUIN2DP, V_UNARY, 0, REAL_ARG_MASK )
  152. CREAT_VEC_FUNC( vuin2uby, FVUIN2UBY, V_UNARY, 0, REAL_ARG_MASK )
  153. CREAT_VEC_FUNC( vuin2udi, FVUIN2UDI, V_UNARY, 0, REAL_ARG_MASK )
  154. CREAT_VEC_FUNC( vudi2by, FVUDI2BY, V_UNARY, 0, REAL_ARG_MASK )
  155. CREAT_VEC_FUNC( vudi2in, FVUDI2IN, V_UNARY, 0, REAL_ARG_MASK )
  156. CREAT_VEC_FUNC( vudi2di, FVUDI2DI, V_UNARY, 0, REAL_ARG_MASK )
  157. CREAT_VEC_FUNC( vudi2sp, FVUDI2SP, V_UNARY, 0, REAL_ARG_MASK )
  158. CREAT_VEC_FUNC( vudi2dp, FVUDI2DP, V_UNARY, 0, REAL_ARG_MASK )
  159. CREAT_VEC_FUNC( vudi2uby, FVUDI2UBY, V_UNARY, 0, REAL_ARG_MASK )
  160. CREAT_VEC_FUNC( vudi2uin, FVUDI2UIN, V_UNARY, 0, REAL_ARG_MASK )
  161. CREAT_VEC_FUNC( vby2uby, FVBY2UBY, V_UNARY, 0, REAL_ARG_MASK )
  162. CREAT_VEC_FUNC( vin2uby, FVIN2UBY, V_UNARY, 0, REAL_ARG_MASK )
  163. CREAT_VEC_FUNC( vdi2uby, FVDI2UBY, V_UNARY, 0, REAL_ARG_MASK )
  164. CREAT_VEC_FUNC( vsp2uby, FVSP2UBY, V_UNARY, 0, REAL_ARG_MASK )
  165. CREAT_VEC_FUNC( vdp2uby, FVDP2UBY, V_UNARY, 0, REAL_ARG_MASK )
  166. CREAT_VEC_FUNC( vby2uin, FVBY2UIN, V_UNARY, 0, REAL_ARG_MASK )
  167. CREAT_VEC_FUNC( vin2uin, FVIN2UIN, V_UNARY, 0, REAL_ARG_MASK )
  168. CREAT_VEC_FUNC( vdi2uin, FVDI2UIN, V_UNARY, 0, REAL_ARG_MASK )
  169. CREAT_VEC_FUNC( vsp2uin, FVSP2UIN, V_UNARY, 0, REAL_ARG_MASK )
  170. CREAT_VEC_FUNC( vdp2uin, FVDP2UIN, V_UNARY, 0, REAL_ARG_MASK )
  171. CREAT_VEC_FUNC( vby2udi, FVBY2UDI, V_UNARY, 0, REAL_ARG_MASK )
  172. CREAT_VEC_FUNC( vin2udi, FVIN2UDI, V_UNARY, 0, REAL_ARG_MASK )
  173. CREAT_VEC_FUNC( vdi2udi, FVDI2UDI, V_UNARY, 0, REAL_ARG_MASK )
  174. CREAT_VEC_FUNC( vsp2udi, FVSP2UDI, V_UNARY, 0, REAL_ARG_MASK )
  175. CREAT_VEC_FUNC( vdp2udi, FVDP2UDI, V_UNARY, 0, REAL_ARG_MASK )
  176. // long long conversions
  177. CREAT_VEC_FUNC( vby2li, FVBY2LI, V_UNARY, 0, REAL_ARG_MASK )
  178. CREAT_VEC_FUNC( vin2li, FVIN2LI, V_UNARY, 0, REAL_ARG_MASK )
  179. CREAT_VEC_FUNC( vdi2li, FVDI2LI, V_UNARY, 0, REAL_ARG_MASK )
  180. CREAT_VEC_FUNC( vsp2li, FVSP2LI, V_UNARY, 0, REAL_ARG_MASK )
  181. CREAT_VEC_FUNC( vdp2li, FVDP2LI, V_UNARY, 0, REAL_ARG_MASK )
  182. CREAT_VEC_FUNC( vuby2li, FVUBY2LI, V_UNARY, 0, REAL_ARG_MASK )
  183. CREAT_VEC_FUNC( vuin2li, FVUIN2LI, V_UNARY, 0, REAL_ARG_MASK )
  184. CREAT_VEC_FUNC( vudi2li, FVUDI2LI, V_UNARY, 0, REAL_ARG_MASK )
  185. CREAT_VEC_FUNC( vuli2li, FVULI2LI, V_UNARY, 0, REAL_ARG_MASK )
  186. CREAT_VEC_FUNC( vby2uli, FVBY2ULI, V_UNARY, 0, REAL_ARG_MASK )
  187. CREAT_VEC_FUNC( vin2uli, FVIN2ULI, V_UNARY, 0, REAL_ARG_MASK )
  188. CREAT_VEC_FUNC( vdi2uli, FVDI2ULI, V_UNARY, 0, REAL_ARG_MASK )
  189. CREAT_VEC_FUNC( vli2uli, FVLI2ULI, V_UNARY, 0, REAL_ARG_MASK )
  190. CREAT_VEC_FUNC( vsp2uli, FVSP2ULI, V_UNARY, 0, REAL_ARG_MASK )
  191. CREAT_VEC_FUNC( vdp2uli, FVDP2ULI, V_UNARY, 0, REAL_ARG_MASK )
  192. CREAT_VEC_FUNC( vuby2uli, FVUBY2ULI, V_UNARY, 0, REAL_ARG_MASK )
  193. CREAT_VEC_FUNC( vuin2uli, FVUIN2ULI, V_UNARY, 0, REAL_ARG_MASK )
  194. CREAT_VEC_FUNC( vudi2uli, FVUDI2ULI, V_UNARY, 0, REAL_ARG_MASK )
  195. CREAT_VEC_FUNC( vli2by, FVLI2BY, V_UNARY, 0, REAL_ARG_MASK )
  196. CREAT_VEC_FUNC( vli2in, FVLI2IN, V_UNARY, 0, REAL_ARG_MASK )
  197. CREAT_VEC_FUNC( vli2di, FVLI2DI, V_UNARY, 0, REAL_ARG_MASK )
  198. CREAT_VEC_FUNC( vli2sp, FVLI2SP, V_UNARY, 0, REAL_ARG_MASK )
  199. CREAT_VEC_FUNC( vli2dp, FVLI2DP, V_UNARY, 0, REAL_ARG_MASK )
  200. CREAT_VEC_FUNC( vli2uby, FVLI2UBY, V_UNARY, 0, REAL_ARG_MASK )
  201. CREAT_VEC_FUNC( vli2uin, FVLI2UIN, V_UNARY, 0, REAL_ARG_MASK )
  202. CREAT_VEC_FUNC( vli2udi, FVLI2UDI, V_UNARY, 0, REAL_ARG_MASK )
  203. CREAT_VEC_FUNC( vuli2by, FVULI2BY, V_UNARY, 0, REAL_ARG_MASK )
  204. CREAT_VEC_FUNC( vuli2in, FVULI2IN, V_UNARY, 0, REAL_ARG_MASK )
  205. CREAT_VEC_FUNC( vuli2di, FVULI2DI, V_UNARY, 0, REAL_ARG_MASK )
  206. CREAT_VEC_FUNC( vuli2sp, FVULI2SP, V_UNARY, 0, REAL_ARG_MASK )
  207. CREAT_VEC_FUNC( vuli2dp, FVULI2DP, V_UNARY, 0, REAL_ARG_MASK )
  208. CREAT_VEC_FUNC( vuli2uby, FVULI2UBY, V_UNARY, 0, REAL_ARG_MASK )
  209. CREAT_VEC_FUNC( vuli2uin, FVULI2UIN, V_UNARY, 0, REAL_ARG_MASK )
  210. CREAT_VEC_FUNC( vuli2udi, FVULI2UDI, V_UNARY, 0, REAL_ARG_MASK )
  211. #endif // OLD_STYLE_CONVERSIONS
  212. /* max mag, min max changed to M_ALL to allow long destination... */
  213. CREAT_VEC_FUNC( vsum, FVSUM, V_PROJECTION, M_ALL, RCQ_MASK )
  214. CREAT_VEC_FUNC( vdot, FVDOT, V_PROJECTION2, M_ALL, RC_MASK )
  215. CREAT_CPU_VEC_FUNC( vrand, FVRAND, V_UNARY, M_ALL, RC_MASK )
  216. CREAT_VEC_FUNC( vsm_lt, FVSMLT, VS_TEST, M_ALL, REAL_ARG_MASK )
  217. CREAT_VEC_FUNC( vsm_gt, FVSMGT, VS_TEST, M_ALL, REAL_ARG_MASK )
  218. CREAT_VEC_FUNC( vsm_le, FVSMLE, VS_TEST, M_ALL, REAL_ARG_MASK )
  219. CREAT_VEC_FUNC( vsm_ge, FVSMGE, VS_TEST, M_ALL, REAL_ARG_MASK )
  220. CREAT_VEC_FUNC( vsm_ne, FVSMNE, VS_TEST, M_ALL, REAL_ARG_MASK )
  221. CREAT_VEC_FUNC( vsm_eq, FVSMEQ, VS_TEST, M_ALL, REAL_ARG_MASK )
  222. CREAT_VEC_FUNC( vvm_lt, FVVMLT, VV_TEST, M_ALL, REAL_ARG_MASK )
  223. CREAT_VEC_FUNC( vvm_gt, FVVMGT, VV_TEST, M_ALL, REAL_ARG_MASK )
  224. CREAT_VEC_FUNC( vvm_le, FVVMLE, VV_TEST, M_ALL, REAL_ARG_MASK )
  225. CREAT_VEC_FUNC( vvm_ge, FVVMGE, VV_TEST, M_ALL, REAL_ARG_MASK )
  226. CREAT_VEC_FUNC( vvm_ne, FVVMNE, VV_TEST, M_ALL, REAL_ARG_MASK )
  227. CREAT_VEC_FUNC( vvm_eq, FVVMEQ, VV_TEST, M_ALL, REAL_ARG_MASK )
  228. CREAT_VEC_FUNC( vvv_slct, FVVVSLCT, VV_SELECT, M_ALL, REAL_ARG_MASK )
  229. CREAT_VEC_FUNC( vvs_slct, FVVSSLCT, VS_SELECT, M_ALL, REAL_ARG_MASK )
  230. CREAT_VEC_FUNC( vss_slct, FVSSSLCT, SS_SELECT, M_ALL, REAL_ARG_MASK )
  231. /* New conditionals */
  232. CREAT_VEC_FUNC( vv_vv_lt, FVV_VV_LT, VVVVCA, M_ALL, REAL_ARG_MASK )
  233. CREAT_VEC_FUNC( vv_vv_gt, FVV_VV_GT, VVVVCA, M_ALL, REAL_ARG_MASK )
  234. CREAT_VEC_FUNC( vv_vv_le, FVV_VV_LE, VVVVCA, M_ALL, REAL_ARG_MASK )
  235. CREAT_VEC_FUNC( vv_vv_ge, FVV_VV_GE, VVVVCA, M_ALL, REAL_ARG_MASK )
  236. CREAT_VEC_FUNC( vv_vv_eq, FVV_VV_EQ, VVVVCA, M_ALL, REAL_ARG_MASK )
  237. CREAT_VEC_FUNC( vv_vv_ne, FVV_VV_NE, VVVVCA, M_ALL, REAL_ARG_MASK )
  238. CREAT_VEC_FUNC( vv_vs_lt, FVV_VS_LT, VVVSCA, M_ALL, REAL_ARG_MASK )
  239. CREAT_VEC_FUNC( vv_vs_gt, FVV_VS_GT, VVVSCA, M_ALL, REAL_ARG_MASK )
  240. CREAT_VEC_FUNC( vv_vs_le, FVV_VS_LE, VVVSCA, M_ALL, REAL_ARG_MASK )
  241. CREAT_VEC_FUNC( vv_vs_ge, FVV_VS_GE, VVVSCA, M_ALL, REAL_ARG_MASK )
  242. CREAT_VEC_FUNC( vv_vs_eq, FVV_VS_EQ, VVVSCA, M_ALL, REAL_ARG_MASK )
  243. CREAT_VEC_FUNC( vv_vs_ne, FVV_VS_NE, VVVSCA, M_ALL, REAL_ARG_MASK )
  244. CREAT_VEC_FUNC( vs_vv_lt, FVS_VV_LT, VSVVCA, M_ALL, REAL_ARG_MASK )
  245. CREAT_VEC_FUNC( vs_vv_gt, FVS_VV_GT, VSVVCA, M_ALL, REAL_ARG_MASK )
  246. CREAT_VEC_FUNC( vs_vv_le, FVS_VV_LE, VSVVCA, M_ALL, REAL_ARG_MASK )
  247. CREAT_VEC_FUNC( vs_vv_ge, FVS_VV_GE, VSVVCA, M_ALL, REAL_ARG_MASK )
  248. CREAT_VEC_FUNC( vs_vv_eq, FVS_VV_EQ, VSVVCA, M_ALL, REAL_ARG_MASK )
  249. CREAT_VEC_FUNC( vs_vv_ne, FVS_VV_NE, VSVVCA, M_ALL, REAL_ARG_MASK )
  250. CREAT_VEC_FUNC( vs_vs_lt, FVS_VS_LT, VSVSCA, M_ALL, REAL_ARG_MASK )
  251. CREAT_VEC_FUNC( vs_vs_gt, FVS_VS_GT, VSVSCA, M_ALL, REAL_ARG_MASK )
  252. CREAT_VEC_FUNC( vs_vs_le, FVS_VS_LE, VSVSCA, M_ALL, REAL_ARG_MASK )
  253. CREAT_VEC_FUNC( vs_vs_ge, FVS_VS_GE, VSVSCA, M_ALL, REAL_ARG_MASK )
  254. CREAT_VEC_FUNC( vs_vs_eq, FVS_VS_EQ, VSVSCA, M_ALL, REAL_ARG_MASK )
  255. CREAT_VEC_FUNC( vs_vs_ne, FVS_VS_NE, VSVSCA, M_ALL, REAL_ARG_MASK )
  256. CREAT_VEC_FUNC( ss_vv_lt, FSS_VV_LT, SSVVCA, M_ALL, REAL_ARG_MASK )
  257. CREAT_VEC_FUNC( ss_vv_gt, FSS_VV_GT, SSVVCA, M_ALL, REAL_ARG_MASK )
  258. CREAT_VEC_FUNC( ss_vv_le, FSS_VV_LE, SSVVCA, M_ALL, REAL_ARG_MASK )
  259. CREAT_VEC_FUNC( ss_vv_ge, FSS_VV_GE, SSVVCA, M_ALL, REAL_ARG_MASK )
  260. CREAT_VEC_FUNC( ss_vv_eq, FSS_VV_EQ, SSVVCA, M_ALL, REAL_ARG_MASK )
  261. CREAT_VEC_FUNC( ss_vv_ne, FSS_VV_NE, SSVVCA, M_ALL, REAL_ARG_MASK )
  262. CREAT_VEC_FUNC( ss_vs_lt, FSS_VS_LT, SSVSCA, M_ALL, REAL_ARG_MASK )
  263. CREAT_VEC_FUNC( ss_vs_gt, FSS_VS_GT, SSVSCA, M_ALL, REAL_ARG_MASK )
  264. CREAT_VEC_FUNC( ss_vs_le, FSS_VS_LE, SSVSCA, M_ALL, REAL_ARG_MASK )
  265. CREAT_VEC_FUNC( ss_vs_ge, FSS_VS_GE, SSVSCA, M_ALL, REAL_ARG_MASK )
  266. CREAT_VEC_FUNC( ss_vs_eq, FSS_VS_EQ, SSVSCA, M_ALL, REAL_ARG_MASK )
  267. CREAT_VEC_FUNC( ss_vs_ne, FSS_VS_NE, SSVSCA, M_ALL, REAL_ARG_MASK )
  268. CREAT_CPU_VEC_FUNC( visnan, FVISNAN, V_UNARY, M_BP, REAL_ARG_MASK )
  269. CREAT_CPU_VEC_FUNC( visinf, FVISINF, V_UNARY, M_BP, REAL_ARG_MASK )
  270. CREAT_CPU_VEC_FUNC( visnorm, FVISNORM, V_UNARY, M_BP, REAL_ARG_MASK )
  271. CREAT_VEC_FUNC( vmgsq, FVMGSQ, V_UNARY_C, M_ALL, CPX_ARG_MASK )
  272. CREAT_VEC_FUNC( vcmul, FVCMUL, VV_BINARY, M_ALL, CPX_ARG_MASK )
  273. CREAT_VEC_FUNC( vscml, FVSCML, VS_BINARY, M_BP, CPX_ARG_MASK )
  274. CREAT_VEC_FUNC( vconj, FVCONJ, V_UNARY, M_ALL, CPX_ARG_MASK )
  275. CREAT_VEC_FUNC( vfft, FVFFT, V_FWD_FFT, M_BP, RCM_MASK )
  276. CREAT_VEC_FUNC( vift, FVIFT, V_INV_FFT, M_BP, RCM_MASK )
  277. CREAT_VEC_FUNC( vbnd, FVBND, VV_BINARY, M_ALL, REAL_ARG_MASK )
  278. CREAT_VEC_FUNC( vibnd, FVIBND, VV_BINARY, M_ALL, REAL_ARG_MASK )
  279. CREAT_VEC_FUNC( vclip, FVCLIP, VS_BINARY, M_ALL, REAL_ARG_MASK )
  280. CREAT_VEC_FUNC( viclp, FVICLP, VS_BINARY, M_ALL, REAL_ARG_MASK )
  281. CREAT_VEC_FUNC( vcmp, FVCMP, VV_BINARY, M_ALL, REAL_ARG_MASK )
  282. CREAT_VEC_FUNC( vscmp, FVSCMP, VS_BINARY, M_ALL, REAL_ARG_MASK )
  283. CREAT_VEC_FUNC( vscmp2, FVSCMP2, VS_BINARY, M_ALL, REAL_ARG_MASK )
  284. CREAT_VEC_FUNC( vcomp, FVCOMP, V_UNARY, M_AI, REAL_ARG_MASK )
  285. CREAT_VEC_FUNC( vtolower, FVTOLOWER, V_UNARY, M_AI, REAL_ARG_MASK )
  286. CREAT_VEC_FUNC( vtoupper, FVTOUPPER, V_UNARY, M_AI, REAL_ARG_MASK )
  287. CREAT_VEC_FUNC( vislower, FVISLOWER, V_UNARY, M_AI, REAL_ARG_MASK )
  288. CREAT_VEC_FUNC( visupper, FVISUPPER, V_UNARY, M_AI, REAL_ARG_MASK )
  289. CREAT_VEC_FUNC( visalnum, FVISALNUM, V_UNARY, M_AI, REAL_ARG_MASK )
  290. CREAT_VEC_FUNC( visalpha, FVISALPHA, V_UNARY, M_AI, REAL_ARG_MASK )
  291. CREAT_VEC_FUNC( visdigit, FVISDIGIT, V_UNARY, M_AI, REAL_ARG_MASK )
  292. CREAT_VEC_FUNC( visspace, FVISSPACE, V_UNARY, M_AI, REAL_ARG_MASK )
  293. CREAT_VEC_FUNC( visblank, FVISBLANK, V_UNARY, M_AI, REAL_ARG_MASK )
  294. CREAT_VEC_FUNC( viscntrl, FVISCNTRL, V_UNARY, M_AI, REAL_ARG_MASK )
  295. #ifdef NOT_YET
  296. CREAT_VEC_FUNC( vcsadd, FVCSADD, VS_BINARY, M_ALL, CM )
  297. CREAT_VEC_FUNC( vcssub, FVCSSUB, VS_BINARY, M_ALL, CM )
  298. CREAT_VEC_FUNC( vcsmul, FVCSMUL, VS_BINARY, M_ALL, CM )
  299. CREAT_VEC_FUNC( vcsdiv, FVCSDIV, VS_BINARY, M_ALL, CM )
  300. CREAT_VEC_FUNC( vcsdiv2, FVCSDIV2, VS_BINARY, M_ALL, CM )
  301. #endif
  302. /*
  303. CREAT_VEC_FUNC( vqsadd, FVQSADD, VS_BINARY, M_ALL, QP )
  304. CREAT_VEC_FUNC( vqssub, FVQSSUB, VS_BINARY, M_ALL, QP )
  305. CREAT_VEC_FUNC( vqsmul, FVQSMUL, VS_BINARY, M_ALL, QP )
  306. CREAT_VEC_FUNC( vqsdiv, FVQSDIV, VS_BINARY, M_ALL, QP )
  307. CREAT_VEC_FUNC( vqsdiv2, FVQSDIV2, VS_BINARY, M_ALL, QP )
  308. */
  309. #ifdef NOT_YET
  310. CREAT_VEC_FUNC( vd2sp, FVD2SP, V_UNARY, no_func, 0, 0 )
  311. CREAT_VEC_FUNC( vsp2d, FVSP2D, V_UNARY, no_func, 0, 0 )
  312. #endif
  313. END_VFUNC_DECLS
  314. // In the old coding, we created items and copied their values from the table...
  315. // But we don't need to have two copies - we just have to insert the names
  316. #define N_NVFS (sizeof(vec_func_tbl)/sizeof(Vector_Function))
  317. static void create_vfs(SINGLE_QSP_ARG_DECL)
  318. {
  319. u_int i;
  320. init_vec_funcs(SINGLE_QSP_ARG); // init item type
  321. for(i=0;i<N_NVFS;i++){
  322. add_item(QSP_ARG vec_func_itp, &vec_func_tbl[i], NO_NODE );
  323. }
  324. }
  325. static int vf_cmp(CONST void *vfp1,CONST void *vfp2)
  326. {
  327. if( ((CONST Vector_Function *)vfp1)->vf_code > ((CONST Vector_Function *)vfp2)->vf_code ) return(1);
  328. else return(-1);
  329. }
  330. static int vfa_cmp(CONST void *vfp1,CONST void *vfp2)
  331. {
  332. if( ((CONST Vec_Func_Array *)vfp1)->vfa_code > ((CONST Vec_Func_Array *)vfp2)->vfa_code ) return(1);
  333. else return(-1);
  334. }
  335. int check_vfa_tbl_size(QSP_ARG_DECL Vec_Func_Array vfa_tbl[], int size)
  336. {
  337. if( size != N_VEC_FUNCS ){
  338. sprintf(ERROR_STRING,"CAUTIOUS: %d inititialized vfa_tbl entries, expected %d!?",
  339. size,N_VEC_FUNCS);
  340. WARN(ERROR_STRING);
  341. return -1;
  342. }
  343. return 0;
  344. }
  345. void check_vfa_tbl(QSP_ARG_DECL Vec_Func_Array *vfa_tbl, int size)
  346. {
  347. int i;
  348. // int retval=0;
  349. // if( check_vfa_tbl_size(QSP_ARG vfa_tbl, size) < 0 )
  350. // return -1;
  351. assert( size == N_VEC_FUNCS );
  352. qsort(vfa_tbl,size,sizeof(Vec_Func_Array),vfa_cmp);
  353. #ifdef CAUTIOUS
  354. /* make sure the table is complete */
  355. for(i=0;i<size;i++){
  356. /*
  357. if( verbose ){
  358. sprintf(ERROR_STRING,"check_vfa_tbl: vfa_tbl[%d] (%s): code = %d (%s)",
  359. i, VF_NAME(&vec_func_tbl[i]),
  360. vfa_tbl[i].vfa_code,
  361. VF_NAME(&vec_func_tbl[ vfa_tbl[i].vfa_code ])
  362. );
  363. ADVISE(ERROR_STRING);
  364. }
  365. */
  366. // if( vfa_tbl[i].vfa_code != i ){
  367. // sprintf(ERROR_STRING,
  368. // "CAUTIOUS: check_vfa_tbl: Vec_Func_Array table entry %d (%s) has code %d (%s)!?",
  369. // i,VF_NAME(&vec_func_tbl[i]),
  370. // vfa_tbl[i].vfa_code,VF_NAME(&vec_func_tbl[ vfa_tbl[i].vfa_code ]) );
  371. // WARN(ERROR_STRING);
  372. // retval = (-1);
  373. // }
  374. assert( vfa_tbl[i].vfa_code == i );
  375. }
  376. #endif /* CAUTIOUS */
  377. }
  378. void vl_init(SINGLE_QSP_ARG_DECL)
  379. {
  380. static int inited=0;
  381. int i;
  382. if( inited ){
  383. // Don't warn, could be called from warmenu & vl_menu...
  384. /*warn("vl_init: already initialized"); */
  385. return;
  386. }
  387. if( veclib_debug == 0 )
  388. veclib_debug = add_debug_module(QSP_ARG "veclib");
  389. /* sort the table to insure that each entry is at the location of its code */
  390. //#ifdef CAUTIOUS
  391. // if( N_VEC_FUNCS != N_NVFS ){
  392. // sprintf(ERROR_STRING,"CAUTIOUS: vl_init: Vector function table is missing %ld entries!?",
  393. // N_VEC_FUNCS-N_NVFS);
  394. // ERROR1(ERROR_STRING);
  395. // }
  396. //#endif // CAUTIOUS
  397. assert( N_VEC_FUNCS == N_NVFS );
  398. qsort(vec_func_tbl,N_NVFS,sizeof(Vector_Function),vf_cmp);
  399. #ifdef CAUTIOUS
  400. /* make sure the table is complete */
  401. for(i=0;i<N_NVFS;i++){
  402. if( verbose ){
  403. sprintf(ERROR_STRING,"vl_init: vec_func_tbl[%d] (%s): code %d (%s)",
  404. i, VF_NAME(&vec_func_tbl[i]),
  405. VF_CODE(&vec_func_tbl[i]), VF_NAME(&vec_func_tbl[ VF_CODE(&vec_func_tbl[i]) ])
  406. );
  407. ADVISE(ERROR_STRING);
  408. }
  409. // if( VF_CODE(&vec_func_tbl[i]) != i ){
  410. // sprintf(ERROR_STRING,
  411. // "CAUTIOUS: vl_init: Vec_Func table entry %d (%s) has code %d (%s)!?",
  412. // i, VF_NAME(&vec_func_tbl[i]),
  413. // VF_CODE(&vec_func_tbl[i]),
  414. // VF_NAME(&vec_func_tbl[ VF_CODE(&vec_func_tbl[i]) ]) );
  415. // ERROR1(ERROR_STRING);
  416. // }
  417. assert( VF_CODE(&vec_func_tbl[i]) == i );
  418. }
  419. #endif /* CAUTIOUS */
  420. // Initialize the platforms
  421. //init_all_platforms(SINGLE_QSP_ARG);
  422. vl2_init_platform(SINGLE_QSP_ARG);
  423. /* now create some items */
  424. create_vfs(SINGLE_QSP_ARG);
  425. declare_vector_functions();
  426. /* We used to have these in a table, indexed by their code, for fast lookup...
  427. * Would that be a good idea still?
  428. */
  429. set_random_seed(SINGLE_QSP_ARG); /* use low order bits of microsecond clock */
  430. inited++;
  431. }