Various rounding instructions.
This commit is contained in:
@@ -1020,46 +1020,98 @@ int Translate_CONVERT(TranslationContext& ctx, Instr* i) {
|
||||
}
|
||||
|
||||
uint32_t IntCode_ROUND_F32(IntCodeState& ics, const IntCode* i) {
|
||||
if (i->flags == ROUND_TO_NEAREST) {
|
||||
ics.rf[i->dest_reg].f32 = round(ics.rf[i->src1_reg].f32);
|
||||
} else {
|
||||
ics.rf[i->dest_reg].f32 = floor(ics.rf[i->src1_reg].f32);
|
||||
float src1 = ics.rf[i->src1_reg].f32;
|
||||
float dest = src1;
|
||||
switch (i->flags) {
|
||||
case ROUND_TO_ZERO:
|
||||
dest = truncf(src1);
|
||||
break;
|
||||
case ROUND_TO_NEAREST:
|
||||
dest = roundf(src1);
|
||||
break;
|
||||
case ROUND_TO_MINUS_INFINITY:
|
||||
dest = floorf(src1);
|
||||
break;
|
||||
case ROUND_TO_POSITIVE_INFINITY:
|
||||
dest = ceilf(src1);
|
||||
break;
|
||||
}
|
||||
ics.rf[i->dest_reg].f32 = dest;
|
||||
return IA_NEXT;
|
||||
}
|
||||
uint32_t IntCode_ROUND_F64(IntCodeState& ics, const IntCode* i) {
|
||||
if (i->flags == ROUND_TO_NEAREST) {
|
||||
ics.rf[i->dest_reg].f64 = round(ics.rf[i->src1_reg].f64);
|
||||
} else {
|
||||
ics.rf[i->dest_reg].f64 = floor(ics.rf[i->src1_reg].f64);
|
||||
double src1 = ics.rf[i->src1_reg].f64;
|
||||
double dest = src1;
|
||||
switch (i->flags) {
|
||||
case ROUND_TO_ZERO:
|
||||
dest = trunc(src1);
|
||||
break;
|
||||
case ROUND_TO_NEAREST:
|
||||
dest = round(src1);
|
||||
break;
|
||||
case ROUND_TO_MINUS_INFINITY:
|
||||
dest = floor(src1);
|
||||
break;
|
||||
case ROUND_TO_POSITIVE_INFINITY:
|
||||
dest = ceil(src1);
|
||||
break;
|
||||
}
|
||||
ics.rf[i->dest_reg].f64 = dest;
|
||||
return IA_NEXT;
|
||||
}
|
||||
uint32_t IntCode_ROUND_V128_ZERO(IntCodeState& ics, const IntCode* i) {
|
||||
const vec128_t& src1 = ics.rf[i->src1_reg].v128;
|
||||
vec128_t& dest = ics.rf[i->dest_reg].v128;
|
||||
for (size_t n = 0; n < 4; n++) {
|
||||
dest.f4[n] = truncf(src1.f4[n]);
|
||||
}
|
||||
return IA_NEXT;
|
||||
}
|
||||
uint32_t IntCode_ROUND_V128(IntCodeState& ics, const IntCode* i) {
|
||||
uint32_t IntCode_ROUND_V128_NEAREST(IntCodeState& ics, const IntCode* i) {
|
||||
const vec128_t& src1 = ics.rf[i->src1_reg].v128;
|
||||
vec128_t& dest = ics.rf[i->dest_reg].v128;
|
||||
if (i->flags == ROUND_TO_NEAREST) {
|
||||
for (size_t n = 0; n < 4; n++) {
|
||||
dest.f4[n] = round(src1.f4[n]);
|
||||
}
|
||||
} else {
|
||||
for (size_t n = 0; n < 4; n++) {
|
||||
dest.f4[n] = floor(src1.f4[n]);
|
||||
}
|
||||
for (size_t n = 0; n < 4; n++) {
|
||||
dest.f4[n] = roundf(src1.f4[n]);
|
||||
}
|
||||
return IA_NEXT;
|
||||
}
|
||||
uint32_t IntCode_ROUND_V128_MINUS_INFINITY(IntCodeState& ics, const IntCode* i) {
|
||||
const vec128_t& src1 = ics.rf[i->src1_reg].v128;
|
||||
vec128_t& dest = ics.rf[i->dest_reg].v128;
|
||||
for (size_t n = 0; n < 4; n++) {
|
||||
dest.f4[n] = floorf(src1.f4[n]);
|
||||
}
|
||||
return IA_NEXT;
|
||||
}
|
||||
uint32_t IntCode_ROUND_V128_POSITIVE_INFINTIY(IntCodeState& ics, const IntCode* i) {
|
||||
const vec128_t& src1 = ics.rf[i->src1_reg].v128;
|
||||
vec128_t& dest = ics.rf[i->dest_reg].v128;
|
||||
for (size_t n = 0; n < 4; n++) {
|
||||
dest.f4[n] = ceilf(src1.f4[n]);
|
||||
}
|
||||
return IA_NEXT;
|
||||
}
|
||||
int Translate_ROUND(TranslationContext& ctx, Instr* i) {
|
||||
static IntCodeFn fns[] = {
|
||||
IntCode_INVALID_TYPE,
|
||||
IntCode_INVALID_TYPE,
|
||||
IntCode_INVALID_TYPE,
|
||||
IntCode_INVALID_TYPE,
|
||||
IntCode_ROUND_F32,
|
||||
IntCode_ROUND_F64,
|
||||
IntCode_ROUND_V128,
|
||||
};
|
||||
return DispatchToC(ctx, i, fns[i->dest->type]);
|
||||
if (i->dest->type == VEC128_TYPE) {
|
||||
static IntCodeFn fns[] = {
|
||||
IntCode_ROUND_V128_ZERO,
|
||||
IntCode_ROUND_V128_NEAREST,
|
||||
IntCode_ROUND_V128_MINUS_INFINITY,
|
||||
IntCode_ROUND_V128_POSITIVE_INFINTIY,
|
||||
};
|
||||
return DispatchToC(ctx, i, fns[i->flags]);
|
||||
} else {
|
||||
static IntCodeFn fns[] = {
|
||||
IntCode_INVALID_TYPE,
|
||||
IntCode_INVALID_TYPE,
|
||||
IntCode_INVALID_TYPE,
|
||||
IntCode_INVALID_TYPE,
|
||||
IntCode_ROUND_F32,
|
||||
IntCode_ROUND_F64,
|
||||
IntCode_INVALID_TYPE,
|
||||
};
|
||||
return DispatchToC(ctx, i, fns[i->dest->type]);
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t IntCode_VECTOR_CONVERT_I2F(IntCodeState& ics, const IntCode* i) {
|
||||
|
||||
Reference in New Issue
Block a user