summaryrefslogtreecommitdiff
path: root/src/jit/emitarm64.cpp
diff options
context:
space:
mode:
authorSteve MacLean <sdmaclea.qdt@qualcommdatacenter.com>2017-10-20 16:36:28 -0400
committerSteve MacLean <sdmaclea.qdt@qualcommdatacenter.com>2017-10-20 17:09:42 -0400
commit60ef43919f5a68125abd6a0960b5795856c0dc65 (patch)
tree0b12ebdda55d63618c190ccbf13c44c90802f9fc /src/jit/emitarm64.cpp
parent8883f2241425e9a74611e667ac1a1af9c4c9a7bc (diff)
downloadcoreclr-60ef43919f5a68125abd6a0960b5795856c0dc65.tar.gz
coreclr-60ef43919f5a68125abd6a0960b5795856c0dc65.tar.bz2
coreclr-60ef43919f5a68125abd6a0960b5795856c0dc65.zip
[Arm64] Add SIMD emitters
Diffstat (limited to 'src/jit/emitarm64.cpp')
-rw-r--r--src/jit/emitarm64.cpp118
1 files changed, 118 insertions, 0 deletions
diff --git a/src/jit/emitarm64.cpp b/src/jit/emitarm64.cpp
index db96580fac..df412a877f 100644
--- a/src/jit/emitarm64.cpp
+++ b/src/jit/emitarm64.cpp
@@ -3807,6 +3807,16 @@ void emitter::emitIns_R_R(
}
break;
+ case INS_dup:
+ // Vector operation
+ assert(insOptsAnyArrangement(opt));
+ assert(isVectorRegister(reg1));
+ assert(isGeneralRegisterOrZR(reg2));
+ assert(isValidVectorDatasize(size));
+ assert(isValidArrangement(size, opt));
+ fmt = IF_DV_2C;
+ break;
+
case INS_abs:
case INS_not:
assert(isVectorRegister(reg1));
@@ -3951,6 +3961,13 @@ void emitter::emitIns_R_R(
fmt = IF_DR_2G;
break;
+ case INS_addv:
+ case INS_saddlv:
+ case INS_smaxv:
+ case INS_sminv:
+ case INS_uaddlv:
+ case INS_umaxv:
+ case INS_uminv:
case INS_rev64:
assert(isVectorRegister(reg1));
assert(isVectorRegister(reg2));
@@ -3961,6 +3978,18 @@ void emitter::emitIns_R_R(
fmt = IF_DV_2M;
break;
+ case INS_xtn:
+ case INS_xtn2:
+ assert(isVectorRegister(reg1));
+ assert(isVectorRegister(reg2));
+ assert(isValidVectorDatasize(size));
+ assert(isValidArrangement(size, opt));
+ elemsize = optGetElemsize(opt);
+ assert(size != EA_16BYTE); // Narrowing must start with wide format
+ assert(elemsize != EA_1BYTE); // Narrowing must start with more than one byte src
+ fmt = IF_DV_2M;
+ break;
+
case INS_ldar:
case INS_ldaxr:
case INS_ldxr:
@@ -4101,6 +4130,28 @@ void emitter::emitIns_R_R(
}
break;
+ case INS_fcvtl:
+ case INS_fcvtl2:
+ assert(isVectorRegister(reg1));
+ assert(isVectorRegister(reg2));
+ assert(isValidVectorDatasize(size));
+ assert(isValidArrangement(size, opt));
+ elemsize = optGetElemsize(opt);
+ assert(elemsize == EA_4BYTE); // Widening from Float to Double, opt should correspond to src layout
+ fmt = IF_DV_2G;
+ break;
+
+ case INS_fcvtn:
+ case INS_fcvtn2:
+ assert(isVectorRegister(reg1));
+ assert(isVectorRegister(reg2));
+ assert(isValidVectorDatasize(size));
+ assert(isValidArrangement(size, opt));
+ elemsize = optGetElemsize(opt);
+ assert(elemsize == EA_8BYTE); // Narrowing from Double to Float, opt should correspond to src layout
+ fmt = IF_DV_2G;
+ break;
+
case INS_scvtf:
case INS_ucvtf:
if (insOptsAnyArrangement(opt))
@@ -4168,6 +4219,15 @@ void emitter::emitIns_R_R(
}
break;
+ case INS_faddp:
+ // Scalar operation
+ assert(insOptsNone(opt));
+ assert(isValidVectorElemsizeFloat(size));
+ assert(isVectorRegister(reg1));
+ assert(isVectorRegister(reg2));
+ fmt = IF_DV_2G;
+ break;
+
case INS_fcvt:
assert(insOptsConvertFloatToFloat(opt));
assert(isValidVectorFcvtsize(size));
@@ -5016,10 +5076,67 @@ void emitter::emitIns_R_R_R(
emitIns_R_R_R_I(ins, attr, reg1, reg2, reg3, 0, INS_OPTS_NONE);
return;
+ case INS_cmeq:
+ case INS_cmge:
+ case INS_cmgt:
+ case INS_cmhi:
+ case INS_cmhs:
+ case INS_ctst:
+ assert(isVectorRegister(reg1));
+ assert(isVectorRegister(reg2));
+ assert(isVectorRegister(reg3));
+
+ if (isValidVectorDatasize(size))
+ {
+ // Vector operation
+ assert(insOptsAnyArrangement(opt));
+ assert(isValidArrangement(size, opt));
+ elemsize = optGetElemsize(opt);
+ fmt = IF_DV_3A;
+ }
+ else
+ {
+ NYI("Untested");
+ // Scalar operation
+ assert(size == EA_8BYTE); // Only Double supported
+ fmt = IF_DV_3E;
+ }
+ break;
+
+ case INS_fcmeq:
+ case INS_fcmge:
+ case INS_fcmgt:
+ assert(isVectorRegister(reg1));
+ assert(isVectorRegister(reg2));
+ assert(isVectorRegister(reg3));
+
+ if (isValidVectorDatasize(size))
+ {
+ // Vector operation
+ assert(insOptsAnyArrangement(opt));
+ assert(isValidArrangement(size, opt));
+ elemsize = optGetElemsize(opt);
+ assert((elemsize == EA_8BYTE) || (elemsize == EA_4BYTE)); // Only Double/Float supported
+ assert(opt != INS_OPTS_1D); // Reserved encoding
+ fmt = IF_DV_3B;
+ }
+ else
+ {
+ NYI("Untested");
+ // Scalar operation
+ assert((size == EA_8BYTE) || (size == EA_4BYTE)); // Only Double/Float supported
+ fmt = IF_DV_3D;
+ }
+ break;
+
case INS_saba:
case INS_sabd:
+ case INS_smax:
+ case INS_smin:
case INS_uaba:
case INS_uabd:
+ case INS_umax:
+ case INS_umin:
assert(isVectorRegister(reg1));
assert(isVectorRegister(reg2));
assert(isVectorRegister(reg3));
@@ -5132,6 +5249,7 @@ void emitter::emitIns_R_R_R(
fmt = IF_DV_3D;
break;
+ case INS_faddp:
case INS_fmla:
case INS_fmls:
assert(isVectorRegister(reg1));