Generate LLVM IR for OP_XEQUAL that is recognized by LLVM's vector pattern recognizers.
authorImran Hameed <imhameed@microsoft.com>
Thu, 10 Oct 2019 23:05:34 +0000 (16:05 -0700)
committerImran Hameed <imhameed@microsoft.com>
Thu, 10 Oct 2019 23:05:34 +0000 (16:05 -0700)
Commit migrated from https://github.com/mono/mono/commit/7c7d406fc01e6f867519c8aa3959d5a96a896a3e

src/mono/mono/mini/mini-llvm.c

index 9b784a5..9b65eb8 100644 (file)
@@ -7371,15 +7371,26 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
                        LLVMValueRef cmp, mask [32], shuffle;
                        int nelems;
 
+                       LLVMTypeRef srcelemt = LLVMGetElementType (LLVMTypeOf (lhs));
+
                        //%c = icmp sgt <16 x i8> %a0, %a1
-                       if (LLVMGetElementType (LLVMTypeOf (lhs)) == LLVMDoubleType () || LLVMGetElementType (LLVMTypeOf (lhs)) == LLVMFloatType ())
+                       if (srcelemt == LLVMDoubleType () || srcelemt == LLVMFloatType ())
                                cmp = LLVMBuildFCmp (builder, LLVMRealOEQ, lhs, rhs, "");
                        else
                                cmp = LLVMBuildICmp (builder, LLVMIntEQ, lhs, rhs, "");
                        nelems = LLVMGetVectorSize (LLVMTypeOf (cmp));
-                       t = LLVMVectorType (LLVMInt8Type (), nelems);
+
+                       LLVMTypeRef elemt;
+                       if (srcelemt == LLVMDoubleType ())
+                               elemt = LLVMInt64Type ();
+                       else if (srcelemt == LLVMFloatType ())
+                               elemt = LLVMInt32Type ();
+                       else
+                               elemt = srcelemt;
+
+                       t = LLVMVectorType (elemt, nelems);
                        cmp = LLVMBuildSExt (builder, cmp, t, "");
-                       // cmp is a <16 x i8> vector, each element is either 0xff or 0
+                       // cmp is a <nelems x elemt> vector, each element is either 0xff... or 0
                        int half = nelems / 2;
                        while (half >= 1) {
                                // AND the top and bottom halfes into the bottom half
@@ -10730,4 +10741,4 @@ MonoCPUFeatures mono_llvm_get_cpu_features (void)
                cpu_features |= MONO_CPU_INITED;
        }
        return cpu_features;
-}
\ No newline at end of file
+}