return 0;
}
+#include <math.h>
+
int cmd_do_testfncapprox(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
{
char *ps = param[1];
+ unsigned long fnc;
unsigned long val;
unsigned long res;
long diff;
uint64_t yl;
si_skspace(&ps);
- if (si_ulong(&ps, &val, 0) < 0)
+ if (si_ulong(&ps, &fnc, 0) < 0)
return -CMDERR_BADPAR;
- x = val;
- xb = __builtin_clz(x);
- xl = x << xb;
-
- *fpga_fncapprox_base = xl;
+ si_skspace(&ps);
+ if (si_ulong(&ps, &val, 0) < 0)
+ return -CMDERR_BADPAR;
- res = *fpga_fncapprox_base;
+ if (fnc == 1) {
+ x = val;
+ xb = __builtin_clz(x);
+ xl = x << xb;
+ } else {
+ xl = val;
+ }
- yl = (1LL << 62) / xl;
+ fpga_fncapprox_base[fnc] = xl;
+
+ res = fpga_fncapprox_base[fnc];
+
+ switch (fnc) {
+ case 0:
+ yl = xl;
+ case 1:
+ yl = (1LL << 62) / xl;
+ break;
+ case 2:
+ yl = sin(xl * M_PI / 2.0 / (1UL << 30)) * (1UL << 30);
+ break;
+ case 3:
+ yl = cos(xl * M_PI / 2.0 / (1UL << 30)) * (1UL << 30);
+ break;
+ default:
+ yl = 0;
+ }
diff = yl - res;
- printf("val=0x%08lx res=0x%08lx ref=0x%08lx diff=%ld\n",
- val, res, (unsigned long)yl, diff);
+ printf("fnc=%ld val=0x%08lx res=0x%08lx ref=0x%08lx diff=%ld\n",
+ fnc, val, res, (unsigned long)yl, diff);
return 0;
}