genProduceReg(tree);
}
+//------------------------------------------------------------------------
+// genCodeForBswap: Produce code for a GT_BSWAP / GT_BSWAP16 node.
+//
+// Arguments:
+// tree - the node
+//
+void CodeGen::genCodeForBswap(GenTree* tree)
+{
+ assert(tree->OperIs(GT_BSWAP, GT_BSWAP16));
+
+ regNumber targetReg = tree->GetRegNum();
+ var_types targetType = tree->TypeGet();
+
+ GenTree* operand = tree->gtGetOp1();
+ assert(operand->isUsedFromReg());
+ regNumber operandReg = genConsumeReg(operand);
+
+ if (tree->OperIs(GT_BSWAP16))
+ {
+ inst_RV_RV(INS_rev16, targetReg, operandReg, targetType);
+ }
+ else
+ {
+ inst_RV_RV(INS_rev, targetReg, operandReg, targetType);
+ }
+
+ genProduceReg(tree);
+}
+
//------------------------------------------------------------------------
// genCodeForDivMod: Produce code for a GT_DIV/GT_UDIV node. We don't see MOD:
// (1) integer MOD is morphed into a sequence of sub, mul, div in fgMorph;
genCodeForNegNot(treeNode);
break;
+#if defined(TARGET_ARM64)
+ case GT_BSWAP:
+ case GT_BSWAP16:
+ genCodeForBswap(treeNode);
+ break;
+#endif // defined(TARGET_ARM64)
+
case GT_MOD:
case GT_UMOD:
case GT_DIV:
}
}
}
-#if defined(TARGET_XARCH) // We currently only support BSWAP on x86
+#if defined(TARGET_XARCH) || defined(TARGET_ARM64)
else if (strcmp(namespaceName, "System.Buffers.Binary") == 0)
{
if ((strcmp(className, "BinaryPrimitives") == 0) && (strcmp(methodName, "ReverseEndianness") == 0))
result = NI_System_Buffers_Binary_BinaryPrimitives_ReverseEndianness;
}
}
-#endif // !defined(TARGET_XARCH)
+#endif // defined(TARGET_XARCH) || defined(TARGET_ARM64)
else if (strcmp(namespaceName, "System.Collections.Generic") == 0)
{
if ((strcmp(className, "EqualityComparer`1") == 0) && (strcmp(methodName, "get_Default") == 0))