sim_fpu op2;
sim_fpu ans;
unsigned32 res;
+ sim_fpu_status status;
sim_fpu_32to (&op1, x);
sim_fpu_32to (&op2, y);
- sim_fpu_sub (&ans, &op1, &op2);
+ status = sim_fpu_sub (&ans, &op1, &op2);
+ if (status != 0)
+ (*fpu->ops->error) (fpu, status);
sim_fpu_to32 (&res, &ans);
return res;
sim_fpu op2;
sim_fpu ans;
unsigned32 res;
+ sim_fpu_status status;
sim_fpu_32to (&op1, x);
sim_fpu_32to (&op2, y);
- sim_fpu_mul (&ans, &op1, &op2);
+ status = sim_fpu_mul (&ans, &op1, &op2);
+ if (status != 0)
+ (*fpu->ops->error) (fpu, status);
sim_fpu_to32 (&res, &ans);
return res;
sim_fpu op2;
sim_fpu ans;
unsigned32 res;
+ sim_fpu_status status;
+
+ sim_fpu_32to (&op1, x);
+ sim_fpu_32to (&op2, y);
+ status = sim_fpu_div (&ans, &op1, &op2);
+ if (status != 0)
+ (*fpu->ops->error) (fpu, status);
+ sim_fpu_to32 (&res, &ans);
+
+ return res;
+}
+
+static SF
+remsf (CGEN_FPU* fpu, SF x, SF y)
+{
+ sim_fpu op1;
+ sim_fpu op2;
+ sim_fpu ans;
+ unsigned32 res;
+ sim_fpu_status status;
sim_fpu_32to (&op1, x);
sim_fpu_32to (&op2, y);
- sim_fpu_div (&ans, &op1, &op2);
+ status = sim_fpu_rem (&ans, &op1, &op2);
+ if (status != 0)
+ (*fpu->ops->error) (fpu, status);
sim_fpu_to32 (&res, &ans);
return res;
sim_fpu op1;
sim_fpu ans;
unsigned32 res;
+ sim_fpu_status status;
sim_fpu_32to (&op1, x);
- sim_fpu_neg (&ans, &op1);
+ status = sim_fpu_neg (&ans, &op1);
+ if (status != 0)
+ (*fpu->ops->error) (fpu, status);
sim_fpu_to32 (&res, &ans);
return res;
sim_fpu op1;
sim_fpu ans;
unsigned32 res;
+ sim_fpu_status status;
sim_fpu_32to (&op1, x);
- sim_fpu_abs (&ans, &op1);
+ status = sim_fpu_abs (&ans, &op1);
+ if (status != 0)
+ (*fpu->ops->error) (fpu, status);
sim_fpu_to32 (&res, &ans);
return res;
sim_fpu op1;
sim_fpu ans;
unsigned32 res;
+ sim_fpu_status status;
sim_fpu_32to (&op1, x);
- sim_fpu_sqrt (&ans, &op1);
+ status = sim_fpu_sqrt (&ans, &op1);
+ if (status != 0)
+ (*fpu->ops->error) (fpu, status);
sim_fpu_to32 (&res, &ans);
return res;
sim_fpu op1;
sim_fpu ans;
unsigned32 res;
+ sim_fpu_status status;
sim_fpu_32to (&op1, x);
- sim_fpu_inv (&ans, &op1);
+ status = sim_fpu_inv (&ans, &op1);
+ if (status != 0)
+ (*fpu->ops->error) (fpu, status);
sim_fpu_to32 (&res, &ans);
return res;
sim_fpu op2;
sim_fpu ans;
unsigned32 res;
+ sim_fpu_status status;
sim_fpu_32to (&op1, x);
sim_fpu_32to (&op2, y);
- sim_fpu_min (&ans, &op1, &op2);
+ status = sim_fpu_min (&ans, &op1, &op2);
+ if (status != 0)
+ (*fpu->ops->error) (fpu, status);
sim_fpu_to32 (&res, &ans);
return res;
sim_fpu op2;
sim_fpu ans;
unsigned32 res;
+ sim_fpu_status status;
sim_fpu_32to (&op1, x);
sim_fpu_32to (&op2, y);
- sim_fpu_max (&ans, &op1, &op2);
+ status = sim_fpu_max (&ans, &op1, &op2);
+ if (status != 0)
+ (*fpu->ops->error) (fpu, status);
sim_fpu_to32 (&res, &ans);
return res;
return sim_fpu_is_ge (&op1, &op2);
}
+static int
+unorderedsf (CGEN_FPU* fpu, SF x, SF y)
+{
+ sim_fpu op1;
+ sim_fpu op2;
+
+ sim_fpu_32to (&op1, x);
+ sim_fpu_32to (&op2, y);
+ return sim_fpu_is_nan (&op1) || sim_fpu_is_nan (&op2);
+}
+
+
+static DF
+fextsfdf (CGEN_FPU* fpu, int how UNUSED, SF x)
+{
+ sim_fpu op1;
+ unsigned64 res;
+
+ sim_fpu_32to (&op1, x);
+ sim_fpu_to64 (&res, &op1);
+
+ return res;
+}
+
static SF
-floatsisf (CGEN_FPU* fpu, SI x)
+ftruncdfsf (CGEN_FPU* fpu, int how UNUSED, DF x)
+{
+ sim_fpu op1;
+ unsigned32 res;
+
+ sim_fpu_64to (&op1, x);
+ sim_fpu_to32 (&res, &op1);
+
+ return res;
+}
+
+static SF
+floatsisf (CGEN_FPU* fpu, int how UNUSED, SI x)
{
sim_fpu ans;
unsigned32 res;
}
static DF
-floatsidf (CGEN_FPU* fpu, SI x)
+floatsidf (CGEN_FPU* fpu, int how UNUSED, SI x)
{
sim_fpu ans;
unsigned64 res;
return res;
}
+static DF
+floatdidf (CGEN_FPU* fpu, int how UNUSED, DI x)
+{
+ sim_fpu ans;
+ unsigned64 res;
+
+ sim_fpu_i64to (&ans, x, sim_fpu_round_near);
+ sim_fpu_to64 (&res, &ans);
+ return res;
+}
+
static SF
-ufloatsisf (CGEN_FPU* fpu, USI x)
+ufloatsisf (CGEN_FPU* fpu, int how UNUSED, USI x)
{
sim_fpu ans;
unsigned32 res;
}
static SI
-fixsfsi (CGEN_FPU* fpu, SF x)
+fixsfsi (CGEN_FPU* fpu, int how UNUSED, SF x)
{
sim_fpu op1;
unsigned32 res;
}
static SI
-fixdfsi (CGEN_FPU* fpu, DF x)
+fixdfsi (CGEN_FPU* fpu, int how UNUSED, DF x)
{
sim_fpu op1;
unsigned32 res;
return res;
}
+static DI
+fixdfdi (CGEN_FPU* fpu, int how UNUSED, DF x)
+{
+ sim_fpu op1;
+ unsigned64 res;
+
+ sim_fpu_64to (&op1, x);
+ sim_fpu_to64i (&res, &op1, sim_fpu_round_near);
+ return res;
+}
+
static USI
-ufixsfsi (CGEN_FPU* fpu, SF x)
+ufixsfsi (CGEN_FPU* fpu, int how UNUSED, SF x)
{
sim_fpu op1;
unsigned32 res;
sim_fpu op2;
sim_fpu ans;
unsigned64 res;
+ sim_fpu_status status;
sim_fpu_64to (&op1, x);
sim_fpu_64to (&op2, y);
- sim_fpu_sub (&ans, &op1, &op2);
+ status = sim_fpu_sub (&ans, &op1, &op2);
+ if (status != 0)
+ (*fpu->ops->error) (fpu, status);
sim_fpu_to64 (&res, &ans);
return res;
sim_fpu op2;
sim_fpu ans;
unsigned64 res;
+ sim_fpu_status status;
sim_fpu_64to (&op1, x);
sim_fpu_64to (&op2, y);
- sim_fpu_mul (&ans, &op1, &op2);
+ status = sim_fpu_mul (&ans, &op1, &op2);
+ if (status != 0)
+ (*fpu->ops->error) (fpu, status);
sim_fpu_to64 (&res, &ans);
return res;
sim_fpu op2;
sim_fpu ans;
unsigned64 res;
+ sim_fpu_status status;
sim_fpu_64to (&op1, x);
sim_fpu_64to (&op2, y);
- sim_fpu_div (&ans, &op1, &op2);
+ status = sim_fpu_div (&ans, &op1, &op2);
+ if (status != 0)
+ (*fpu->ops->error) (fpu, status);
sim_fpu_to64 (&res, &ans);
return res;
}
+static DF
+remdf (CGEN_FPU* fpu, DF x, DF y)
+{
+ sim_fpu op1;
+ sim_fpu op2;
+ sim_fpu ans;
+ unsigned64 res;
+ sim_fpu_status status;
+
+ sim_fpu_64to (&op1, x);
+ sim_fpu_64to (&op2, y);
+ status = sim_fpu_rem (&ans, &op1, &op2);
+ if (status != 0)
+ (*fpu->ops->error) (fpu, status);
+ sim_fpu_to64(&res, &ans);
+
+ return res;
+}
+
static DF
negdf (CGEN_FPU* fpu, DF x)
{
sim_fpu op1;
sim_fpu ans;
unsigned64 res;
+ sim_fpu_status status;
sim_fpu_64to (&op1, x);
- sim_fpu_neg (&ans, &op1);
+ status = sim_fpu_neg (&ans, &op1);
+ if (status != 0)
+ (*fpu->ops->error) (fpu, status);
sim_fpu_to64 (&res, &ans);
return res;
sim_fpu op1;
sim_fpu ans;
unsigned64 res;
+ sim_fpu_status status;
sim_fpu_64to (&op1, x);
- sim_fpu_abs (&ans, &op1);
+ status = sim_fpu_abs (&ans, &op1);
+ if (status != 0)
+ (*fpu->ops->error) (fpu, status);
sim_fpu_to64 (&res, &ans);
return res;
sim_fpu op1;
sim_fpu ans;
unsigned64 res;
+ sim_fpu_status status;
sim_fpu_64to (&op1, x);
- sim_fpu_sqrt (&ans, &op1);
+ status = sim_fpu_sqrt (&ans, &op1);
+ if (status != 0)
+ (*fpu->ops->error) (fpu, status);
sim_fpu_to64 (&res, &ans);
return res;
sim_fpu op1;
sim_fpu ans;
unsigned64 res;
+ sim_fpu_status status;
sim_fpu_64to (&op1, x);
- sim_fpu_inv (&ans, &op1);
+ status = sim_fpu_inv (&ans, &op1);
+ if (status != 0)
+ (*fpu->ops->error) (fpu, status);
sim_fpu_to64 (&res, &ans);
return res;
sim_fpu op2;
sim_fpu ans;
unsigned64 res;
+ sim_fpu_status status;
sim_fpu_64to (&op1, x);
sim_fpu_64to (&op2, y);
- sim_fpu_min (&ans, &op1, &op2);
+ status = sim_fpu_min (&ans, &op1, &op2);
+ if (status != 0)
+ (*fpu->ops->error) (fpu, status);
sim_fpu_to64 (&res, &ans);
return res;
sim_fpu op2;
sim_fpu ans;
unsigned64 res;
+ sim_fpu_status status;
sim_fpu_64to (&op1, x);
sim_fpu_64to (&op2, y);
- sim_fpu_max (&ans, &op1, &op2);
+ status = sim_fpu_max (&ans, &op1, &op2);
+ if (status != 0)
+ (*fpu->ops->error) (fpu, status);
sim_fpu_to64 (&res, &ans);
return res;
sim_fpu_64to (&op2, y);
return sim_fpu_is_ge (&op1, &op2);
}
+
+static int
+unordereddf (CGEN_FPU* fpu, DF x, DF y)
+{
+ sim_fpu op1;
+ sim_fpu op2;
+
+ sim_fpu_64to (&op1, x);
+ sim_fpu_64to (&op2, y);
+ return sim_fpu_is_nan (&op1) || sim_fpu_is_nan (&op2);
+}
\f
/* Initialize FP_OPS to use accurate library. */
o->subsf = subsf;
o->mulsf = mulsf;
o->divsf = divsf;
+ o->remsf = remsf;
o->negsf = negsf;
o->abssf = abssf;
o->sqrtsf = sqrtsf;
o->lesf = lesf;
o->gtsf = gtsf;
o->gesf = gesf;
+ o->unorderedsf = unorderedsf;
o->adddf = adddf;
o->subdf = subdf;
o->muldf = muldf;
o->divdf = divdf;
+ o->remdf = remdf;
o->negdf = negdf;
o->absdf = absdf;
o->sqrtdf = sqrtdf;
o->ledf = ledf;
o->gtdf = gtdf;
o->gedf = gedf;
+ o->unordereddf = unordereddf;
+ o->fextsfdf = fextsfdf;
+ o->ftruncdfsf = ftruncdfsf;
o->floatsisf = floatsisf;
o->floatsidf = floatsidf;
+ o->floatdidf = floatdidf;
o->ufloatsisf = ufloatsisf;
o->fixsfsi = fixsfsi;
o->fixdfsi = fixdfsi;
+ o->fixdfdi = fixdfdi;
o->ufixsfsi = ufixsfsi;
}