summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBruce Forstall <brucefo@microsoft.com>2017-11-01 16:37:09 -0700
committerGitHub <noreply@github.com>2017-11-01 16:37:09 -0700
commitaa24cd3e019bda4f2a98295ac0fe6888a554d372 (patch)
treee7b66359f435fe1aeb18d32ddb64b1aa0accf866 /src
parent6b65367881160f445d421bf05269eb57e5c0d4c7 (diff)
parent6ec2b8830eadeff43fe922644d29b3e4100331e0 (diff)
downloadcoreclr-aa24cd3e019bda4f2a98295ac0fe6888a554d372.tar.gz
coreclr-aa24cd3e019bda4f2a98295ac0fe6888a554d372.tar.bz2
coreclr-aa24cd3e019bda4f2a98295ac0fe6888a554d372.zip
Merge pull request #14808 from sdmaclea/PR-ARM64-genSIMDIntrinsicDotProduct
[Arm64] Fix genSIMDIntrinsicDotProduct
Diffstat (limited to 'src')
-rw-r--r--src/jit/codegenarm64.cpp11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/jit/codegenarm64.cpp b/src/jit/codegenarm64.cpp
index 89fe0c92e3..d559c92c81 100644
--- a/src/jit/codegenarm64.cpp
+++ b/src/jit/codegenarm64.cpp
@@ -4423,6 +4423,13 @@ void CodeGen::genSIMDIntrinsicDotProduct(GenTreeSIMD* simdNode)
// Vector multiply
getEmitter()->emitIns_R_R_R(ins, attr, tmpReg, op1Reg, op2Reg, opt);
+ if ((simdNode->gtFlags & GTF_SIMD12_OP) != 0)
+ {
+ // For 12Byte vectors we must zero upper bits to get correct dot product
+ // We do not assume upper bits are zero.
+ getEmitter()->emitIns_R_R_I(INS_ins, EA_4BYTE, tmpReg, REG_ZR, 3);
+ }
+
// Vector add horizontal
if (varTypeIsFloating(baseType))
{
@@ -4432,11 +4439,11 @@ void CodeGen::genSIMDIntrinsicDotProduct(GenTreeSIMD* simdNode)
{
getEmitter()->emitIns_R_R_R(INS_faddp, attr, tmpReg, tmpReg, tmpReg, INS_OPTS_4S);
}
- getEmitter()->emitIns_R_R(INS_faddp, EA_8BYTE, targetReg, tmpReg, INS_OPTS_2S);
+ getEmitter()->emitIns_R_R(INS_faddp, EA_4BYTE, targetReg, tmpReg);
}
else
{
- getEmitter()->emitIns_R_R(INS_faddp, EA_16BYTE, targetReg, tmpReg, INS_OPTS_2D);
+ getEmitter()->emitIns_R_R(INS_faddp, EA_8BYTE, targetReg, tmpReg);
}
}
else