-
Notifications
You must be signed in to change notification settings - Fork 5.1k
ARM64-SVE: Add TrigonometricSelectCoefficient
, TrigonometricStartingValue
#104681
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5218,6 +5218,36 @@ public static float MultiplyExtended(float op1, float op2) | |
} | ||
} | ||
|
||
public static float TrigonometricSelectCoefficient(float op1, uint op2) | ||
{ | ||
float result = ((op2 % 2) == 0) ? op1 : (float)1.0; | ||
bool isNegative = (op2 & 0b10) == 0b10; | ||
|
||
if (isNegative != (result < 0)) | ||
{ | ||
result *= -1; | ||
} | ||
|
||
return result; | ||
} | ||
|
||
public static float TrigonometricStartingValue(float op1, uint op2) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. are we sure we are taking into account all the possibilities of the operation? https://docsmirror.github.io/A64/2023-06/shared_pseudocode.html#impl-shared.FPMul.3? @SwapnilGaikwad, can we double check this one? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The logic in the helper function is correct for the valid input (-π/4 < x <= π/4). However, behaviour of the instruction may be undefined if the input falls outside the valid range. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @amanasifkhalid - for our testing purpose, we would certainly fall out of valid range. how does the API behave for them? wondering if test is robust enough to not fail for invalid values or we at least handle them? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I've verified we are generating out-of-range values, though the tests are still passing. I can constrain the inputs to this test to ensure we don't go out of range to avoid potential undefined behavior. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
that's interesting. so undefined could be that sometime they will pass and sometime they won't.
Or probably constaint the validation for only the lanes that had valid inputs? that way we will still have coverage for invalid values, which realistically someone can pass in? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
That sounds like a better idea. I'll update the validation logic to do this. |
||
{ | ||
float result = op1 * op1; | ||
|
||
if (float.IsNaN(result)) | ||
{ | ||
return result; | ||
} | ||
|
||
if ((op2 % 2) == 1) | ||
{ | ||
result *= -1; | ||
} | ||
|
||
return result; | ||
} | ||
|
||
public static float FPExponentialAccelerator(uint op1) | ||
{ | ||
uint index = op1 & 0b111111; | ||
|
@@ -5338,6 +5368,36 @@ public static double MultiplyExtended(double op1, double op2) | |
} | ||
} | ||
|
||
public static double TrigonometricSelectCoefficient(double op1, ulong op2) | ||
{ | ||
double result = ((op2 % 2) == 0) ? op1 : 1.0; | ||
bool isNegative = (op2 & 0b10) == 0b10; | ||
|
||
if (isNegative != (result < 0)) | ||
{ | ||
result *= -1; | ||
} | ||
|
||
return result; | ||
} | ||
|
||
public static double TrigonometricStartingValue(double op1, ulong op2) | ||
{ | ||
double result = op1 * op1; | ||
|
||
if (double.IsNaN(result)) | ||
{ | ||
return result; | ||
} | ||
|
||
if ((op2 % 2) == 1) | ||
{ | ||
result *= -1; | ||
} | ||
|
||
return result; | ||
} | ||
|
||
public static double FPExponentialAccelerator(ulong op1) | ||
{ | ||
ulong index = op1 & 0b111111; | ||
|
Uh oh!
There was an error while loading. Please reload this page.