case 16: ret |= INTRIN_vector128; break;
}
- if (!strcmp ("Vector4", m_class_get_name (klass)) || !strcmp ("Vector2", m_class_get_name (klass)))
+ const char *class_name = m_class_get_name (klass);
+ if (!strcmp ("Vector2", class_name) || !strcmp ("Vector4", class_name) || !strcmp ("Quaternion", class_name) || !strcmp ("Plane", class_name)) {
+ // FIXME: Support Vector3
return ret | INTRIN_float32;
+ }
MonoType *etype = mono_class_get_context (klass)->class_inst->type_argv [0];
switch (etype->type) {
return LLVMVectorType (LLVMFloatType (), 4);
} else if (!strcmp (klass_name, "Vector3")) {
return LLVMVectorType (LLVMFloatType (), 4);
- } else if (!strcmp (klass_name, "Vector4")) {
+ } else if (!strcmp (klass_name, "Vector4") || !strcmp (klass_name, "Quaternion") || !strcmp (klass_name, "Plane")) {
return LLVMVectorType (LLVMFloatType (), 4);
} else if (!strcmp (klass_name, "Vector`1") || !strcmp (klass_name, "Vector64`1") || !strcmp (klass_name, "Vector128`1") || !strcmp (klass_name, "Vector256`1") || !strcmp (klass_name, "Vector512`1")) {
MonoType *etype = mono_class_get_generic_class (klass)->context.class_inst->type_argv [0];
instc0 = OP_FADD;
break;
case SN_Divide:
- case SN_op_Division:
- if (strcmp ("Vector4", m_class_get_name (klass)) && strcmp ("Vector2", m_class_get_name (klass))) {
+ case SN_op_Division: {
+ const char *class_name = m_class_get_name (klass);
+ if (strcmp ("Vector2", class_name) && strcmp ("Vector4", class_name) && strcmp ("Quaternion", class_name) && strcmp ("Plane", class_name)) {
if ((fsig->params [0]->type == MONO_TYPE_GENERICINST) && (fsig->params [1]->type != MONO_TYPE_GENERICINST)) {
MonoInst* ins = emit_simd_ins (cfg, klass, OP_CREATE_SCALAR_UNSAFE, args [1]->dreg, -1);
ins->inst_c1 = arg_type;
}
instc0 = OP_FDIV;
break;
+ }
case SN_Max:
instc0 = OP_FMAX;
break;
instc0 = OP_FMIN;
break;
case SN_Multiply:
- case SN_op_Multiply:
- if (strcmp ("Vector4", m_class_get_name (klass)) && strcmp ("Vector2", m_class_get_name (klass))) {
+ case SN_op_Multiply: {
+ const char *class_name = m_class_get_name (klass);
+ if (strcmp ("Vector2", class_name) && strcmp ("Vector4", class_name) && strcmp ("Quaternion", class_name) && strcmp ("Plane", class_name)) {
if (fsig->params [1]->type != MONO_TYPE_GENERICINST) {
MonoInst* ins = emit_simd_ins (cfg, klass, OP_CREATE_SCALAR_UNSAFE, args [1]->dreg, -1);
ins->inst_c1 = arg_type;
}
instc0 = OP_FMUL;
break;
+ }
case SN_Subtract:
case SN_op_Subtraction:
instc0 = OP_FSUB;
MonoClass *vector_class = mono_class_from_mono_type_internal (vector_type);
int vector_size = mono_class_value_size (vector_class, NULL);
int element_size;
- if (!strcmp ("Vector4", m_class_get_name (vector_class)))
- element_size = vector_size / 4;
- else if (!strcmp ("Vector2", m_class_get_name (vector_class)))
+
+ // FIXME: Support Vector3
+
+ const char *class_name = m_class_get_name (vector_class);
+ if (!strcmp ("Vector2", class_name)) {
element_size = vector_size / 2;
- else {
+ } else if (!strcmp ("Vector4", class_name) || !strcmp ("Quaternion", class_name) || !strcmp ("Plane", class_name)) {
+ element_size = vector_size / 4;
+ } else {
MonoClass *element_class = mono_class_from_mono_type_internal (get_vector_t_elem_type (vector_type));
element_size = mono_class_value_size (element_class, NULL);
}
int esize = mono_class_value_size (mono_class_from_mono_type_internal (etype), NULL);
elems = size / esize;
} else {
- // This exists to handle the static extension methods for Vector2/3/4 and Quaterion
+ // This exists to handle the static extension methods for Vector2/3/4, Quaternion, and Plane
// which live on System.Numerics.Vector
arg0_type = MONO_TYPE_R4;
int esize = mono_class_value_size (mono_class_from_mono_type_internal (etype), NULL);
elems = size / esize;
} else {
- // This exists to handle the static extension methods for Vector2/3/4 and Quaterion
+ // This exists to handle the static extension methods for Vector2/3/4, Quaternion, and Plane
// which live on System.Numerics.Vector
arg0_type = MONO_TYPE_R4;
return NULL;
}
-// System.Numerics.Vector2/Vector3/Vector4
+// System.Numerics.Vector2/Vector3/Vector4, Quaternion, and Plane
static guint16 vector2_methods[] = {
SN_ctor,
SN_Abs,
SN_Add,
SN_Clamp,
+ SN_Conjugate,
SN_CopyTo,
SN_Distance,
SN_DistanceSquared,
SN_Normalize,
SN_SquareRoot,
SN_Subtract,
+ SN_get_Identity,
SN_get_Item,
SN_get_One,
SN_get_UnitW,
}
case SN_get_Zero:
return emit_xzero (cfg, klass);
+ case SN_get_Identity:
case SN_get_UnitX:
case SN_get_UnitY:
case SN_get_UnitZ:
return min;
}
+ case SN_Conjugate:
case SN_Distance:
case SN_DistanceSquared:
case SN_Length:
}
if (!strcmp (class_ns, "System.Numerics")) {
- //if (!strcmp ("Vector2", class_name) || !strcmp ("Vector4", class_name) || !strcmp ("Vector3", class_name))
- if (!strcmp ("Vector4", class_name))
+ // FIXME: Support Vector2/Vector3
+ if (!strcmp (class_name, "Vector4") || !strcmp (class_name, "Quaternion") || !strcmp (class_name, "Plane"))
return emit_vector_2_3_4 (cfg, cmethod, fsig, args);
}
}
if (!strcmp (class_ns, "System.Numerics")) {
- //if (!strcmp ("Vector2", class_name) || !strcmp ("Vector4", class_name) || !strcmp ("Vector3", class_name))
- if (!strcmp ("Vector4", class_name))
+ // FIXME: Support Vector2/Vector3
+ if (!strcmp (class_name, "Vector4") || !strcmp (class_name, "Quaternion") || !strcmp (class_name, "Plane"))
return emit_vector_2_3_4 (cfg, cmethod, fsig, args);
}
}
if (!strcmp (class_ns, "System.Numerics")) {
- //if (!strcmp ("Vector2", class_name) || !strcmp ("Vector4", class_name) || !strcmp ("Vector3", class_name))
- if (!strcmp ("Vector4", class_name))
+ // FIXME: Support Vector2/Vector3
+ if (!strcmp (class_name, "Vector4") || !strcmp (class_name, "Quaternion") || !strcmp (class_name, "Plane"))
return emit_vector_2_3_4 (cfg, cmethod, fsig, args);
}