summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarol Eidt <carol.eidt@microsoft.com>2018-01-19 15:17:18 -0800
committerGitHub <noreply@github.com>2018-01-19 15:17:18 -0800
commit5fa59e3919366b35ea99a6268197f8d23140f38f (patch)
tree7e94e48edd1a564543257476c498c4228e0d36fe /src
parent48ee74a9e7990f1ca535a58af18dd42c62c384c7 (diff)
parent37f018815bdc8bac0680eb8fe0cb082a5d919a2e (diff)
downloadcoreclr-5fa59e3919366b35ea99a6268197f8d23140f38f.tar.gz
coreclr-5fa59e3919366b35ea99a6268197f8d23140f38f.tar.bz2
coreclr-5fa59e3919366b35ea99a6268197f8d23140f38f.zip
Merge pull request #15933 from sdmaclea/PR-ARM64-EMIT-COMPARE-ZERO
[Arm64] Add compare vector to zero emitters
Diffstat (limited to 'src')
-rw-r--r--src/jit/emitarm64.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/jit/emitarm64.cpp b/src/jit/emitarm64.cpp
index 4e07087541..46782aefb3 100644
--- a/src/jit/emitarm64.cpp
+++ b/src/jit/emitarm64.cpp
@@ -4224,6 +4224,58 @@ void emitter::emitIns_R_R(
fmt = IF_DV_2J;
break;
+ case INS_cmeq:
+ case INS_cmge:
+ case INS_cmgt:
+ case INS_cmle:
+ case INS_cmlt:
+ assert(isVectorRegister(reg1));
+ assert(isVectorRegister(reg2));
+
+ if (isValidVectorDatasize(size))
+ {
+ // Vector operation
+ assert(insOptsAnyArrangement(opt));
+ assert(isValidArrangement(size, opt));
+ elemsize = optGetElemsize(opt);
+ fmt = IF_DV_2M;
+ }
+ else
+ {
+ NYI("Untested");
+ // Scalar operation
+ assert(size == EA_8BYTE); // Only Double supported
+ fmt = IF_DV_2L;
+ }
+ break;
+
+ case INS_fcmeq:
+ case INS_fcmge:
+ case INS_fcmgt:
+ case INS_fcmle:
+ case INS_fcmlt:
+ assert(isVectorRegister(reg1));
+ assert(isVectorRegister(reg2));
+
+ 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_2A;
+ }
+ else
+ {
+ NYI("Untested");
+ // Scalar operation
+ assert((size == EA_8BYTE) || (size == EA_4BYTE)); // Only Double/Float supported
+ fmt = IF_DV_2G;
+ }
+ break;
+
default:
unreached();
break;