[JIT] VectorConvertX2X unsigned support
This commit is contained in:
parent
fd0d2185ef
commit
49866e970b
|
@ -701,14 +701,17 @@ bool ConstantPropagationPass::Run(HIRBuilder* builder) {
|
||||||
case OPCODE_VECTOR_CONVERT_F2I:
|
case OPCODE_VECTOR_CONVERT_F2I:
|
||||||
if (i->src1.value->IsConstant()) {
|
if (i->src1.value->IsConstant()) {
|
||||||
v->set_zero(VEC128_TYPE);
|
v->set_zero(VEC128_TYPE);
|
||||||
v->VectorConvertF2I(i->src1.value);
|
v->VectorConvertF2I(i->src1.value,
|
||||||
|
!!(i->flags & ARITHMETIC_UNSIGNED),
|
||||||
|
!!(i->flags & ARITHMETIC_SATURATE));
|
||||||
i->Remove();
|
i->Remove();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case OPCODE_VECTOR_CONVERT_I2F:
|
case OPCODE_VECTOR_CONVERT_I2F:
|
||||||
if (i->src1.value->IsConstant()) {
|
if (i->src1.value->IsConstant()) {
|
||||||
v->set_zero(VEC128_TYPE);
|
v->set_zero(VEC128_TYPE);
|
||||||
v->VectorConvertI2F(i->src1.value);
|
v->VectorConvertI2F(i->src1.value,
|
||||||
|
!!(i->flags & ARITHMETIC_SATURATE));
|
||||||
i->Remove();
|
i->Remove();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1079,20 +1079,28 @@ void Value::VectorCompareUGE(Value* other, TypeName type) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Value::VectorConvertI2F(Value* other) {
|
void Value::VectorConvertI2F(Value* other, bool is_unsigned) {
|
||||||
assert_true(type == VEC128_TYPE);
|
assert_true(type == VEC128_TYPE);
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
|
if (is_unsigned) {
|
||||||
|
constant.v128.f32[i] = (float)other->constant.v128.u32[i];
|
||||||
|
} else {
|
||||||
constant.v128.f32[i] = (float)other->constant.v128.i32[i];
|
constant.v128.f32[i] = (float)other->constant.v128.i32[i];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Value::VectorConvertF2I(Value* other) {
|
void Value::VectorConvertF2I(Value* other, bool is_unsigned, bool saturate) {
|
||||||
assert_true(type == VEC128_TYPE);
|
assert_true(type == VEC128_TYPE);
|
||||||
|
|
||||||
// FIXME(DrChat): This does not saturate!
|
// FIXME(DrChat): This does not saturate!
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
|
if (is_unsigned) {
|
||||||
|
constant.v128.u32[i] = (uint32_t)other->constant.v128.f32[i];
|
||||||
|
} else {
|
||||||
constant.v128.i32[i] = (int32_t)other->constant.v128.f32[i];
|
constant.v128.i32[i] = (int32_t)other->constant.v128.f32[i];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Value::VectorShl(Value* other, TypeName type) {
|
void Value::VectorShl(Value* other, TypeName type) {
|
||||||
|
|
|
@ -526,8 +526,8 @@ class Value {
|
||||||
void VectorCompareSGE(Value* other, TypeName type);
|
void VectorCompareSGE(Value* other, TypeName type);
|
||||||
void VectorCompareUGT(Value* other, TypeName type);
|
void VectorCompareUGT(Value* other, TypeName type);
|
||||||
void VectorCompareUGE(Value* other, TypeName type);
|
void VectorCompareUGE(Value* other, TypeName type);
|
||||||
void VectorConvertI2F(Value* other);
|
void VectorConvertI2F(Value* other, bool is_unsigned);
|
||||||
void VectorConvertF2I(Value* other);
|
void VectorConvertF2I(Value* other, bool is_unsigned, bool saturate);
|
||||||
void VectorShl(Value* other, TypeName type);
|
void VectorShl(Value* other, TypeName type);
|
||||||
void VectorShr(Value* other, TypeName type);
|
void VectorShr(Value* other, TypeName type);
|
||||||
void VectorRol(Value* other, TypeName type);
|
void VectorRol(Value* other, TypeName type);
|
||||||
|
|
Loading…
Reference in New Issue