Skip to content

Instantly share code, notes, and snippets.

@IKoshelev
Last active March 1, 2021 19:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save IKoshelev/325f0e10bee0806d7bb2c9d63d09ba9e to your computer and use it in GitHub Desktop.
Save IKoshelev/325f0e10bee0806d7bb2c9d63d09ba9e to your computer and use it in GitHub Desktop.
public static int IntrinsicTest(byte[] lhs, byte[] rhs)
{
byte ths = 16;
Intrinsics.Vector128<byte> threshold = Intrinsics.Vector128.Create(ths, ths, ths, ths, ths, ths, ths, ths, ths, ths, ths, ths, ths, ths, ths, ths);
byte bit = 1;
var VECTOR_ONE = Intrinsics.Vector128.Create(bit, bit, bit, bit, bit, bit, bit, bit, bit, bit, bit, bit, bit, bit, bit, bit);
var result = new Intrinsics.Vector128<int>();
var i = 0;
for (i = 0; i <= lhs.Length - 16; i += 16)
{
//using System.Numerics.Vector for loading, then converting to Intrinsics.Vector128
var v128a = new Vector<byte>(lhs, i).AsVector128();
var v128b = new Vector<byte>(rhs, i).AsVector128();
var subtracted = Intrinsics.Arm.AdvSimd.AbsoluteDifference(v128a, v128b);
var thresholdPassed = Intrinsics.Arm.AdvSimd.CompareGreaterThanOrEqual(subtracted, threshold);
var normalized = Intrinsics.Vector128.AsSByte(thresholdPassed);
var rtemp = Intrinsics.Arm.AdvSimd.AddPairwiseWidening(normalized);
result = Intrinsics.Arm.AdvSimd.AddPairwiseWideningAndAdd(result, rtemp);
}
return -1 * (int)(Intrinsics.Arm.AdvSimd.Extract(result, 0)
+ Intrinsics.Arm.AdvSimd.Extract(result, 1)
+ Intrinsics.Arm.AdvSimd.Extract(result, 2)
+ Intrinsics.Arm.AdvSimd.Extract(result, 3));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment