summaryrefslogtreecommitdiff
path: root/src/jit/emitarm64.cpp
diff options
context:
space:
mode:
authorSteve MacLean <sdmaclea.qdt@qualcommdatacenter.com>2017-10-03 16:23:35 -0400
committerSteve MacLean <sdmaclea.qdt@qualcommdatacenter.com>2017-10-04 10:13:43 -0400
commitfba51b04114bd0a8265455e32a33fdcb087124e2 (patch)
tree60a521d4245e0c87a77f00618a7f40a5dcd26a55 /src/jit/emitarm64.cpp
parent375107fade072f81e011c16e8a7ac68b58ccdd03 (diff)
downloadcoreclr-fba51b04114bd0a8265455e32a33fdcb087124e2.tar.gz
coreclr-fba51b04114bd0a8265455e32a33fdcb087124e2.tar.bz2
coreclr-fba51b04114bd0a8265455e32a33fdcb087124e2.zip
[Arm64] Fix IF_LS_3D emitter
Diffstat (limited to 'src/jit/emitarm64.cpp')
-rw-r--r--src/jit/emitarm64.cpp24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/jit/emitarm64.cpp b/src/jit/emitarm64.cpp
index 374c16059a..7cd355a035 100644
--- a/src/jit/emitarm64.cpp
+++ b/src/jit/emitarm64.cpp
@@ -978,8 +978,12 @@ emitAttr emitter::emitInsTargetRegSize(instrDesc* id)
switch (ins)
{
+ case INS_ldxrb:
case INS_ldarb:
+ case INS_ldaxrb:
+ case INS_stxrb:
case INS_stlrb:
+ case INS_stlxrb:
case INS_ldrb:
case INS_strb:
case INS_ldurb:
@@ -987,8 +991,12 @@ emitAttr emitter::emitInsTargetRegSize(instrDesc* id)
result = EA_4BYTE;
break;
+ case INS_ldxrh:
case INS_ldarh:
+ case INS_ldaxrh:
+ case INS_stxrh:
case INS_stlrh:
+ case INS_stlxrh:
case INS_ldrh:
case INS_strh:
case INS_ldurh:
@@ -1019,8 +1027,12 @@ emitAttr emitter::emitInsTargetRegSize(instrDesc* id)
result = id->idOpSize();
break;
+ case INS_ldxr:
case INS_ldar:
+ case INS_ldaxr:
+ case INS_stxr:
case INS_stlr:
+ case INS_stlxr:
case INS_ldr:
case INS_str:
case INS_ldur:
@@ -8994,10 +9006,14 @@ size_t emitter::emitOutputInstr(insGroup* ig, instrDesc* id, BYTE** dp)
case IF_LS_3D: // LS_3D .X.......X.mmmmm ......nnnnnttttt Wm Rt Rn
code = emitInsCode(ins, fmt);
- code |= insEncodeDatasize(id->idOpSize()); // X
- code |= insEncodeReg_Rm(id->idReg1()); // mmmmm
- code |= insEncodeReg_Rt(id->idReg2()); // ttttt
- code |= insEncodeReg_Rn(id->idReg2()); // nnnnn
+ // Arm64 store exclusive unpredictable cases
+ assert(id->idReg1() != id->idReg2());
+ assert(id->idReg1() != id->idReg3());
+ code |= insEncodeDatasizeLS(code, id->idOpSize()); // X
+ code |= insEncodeReg_Rm(id->idReg1()); // mmmmm
+ code |= insEncodeReg_Rt(id->idReg2()); // ttttt
+ code |= insEncodeReg_Rn(id->idReg3()); // nnnnn
+ dst += emitOutput_Instr(dst, code);
break;
case IF_DI_1A: // DI_1A X.......shiiiiii iiiiiinnnnn..... Rn imm(i12,sh)