From 0232e524a9761276e61e3a6427779b88e8f1417d Mon Sep 17 00:00:00 2001 From: Pat Gavlin Date: Mon, 28 Aug 2017 15:45:15 -0700 Subject: [PATCH 1/2] Fix `INDEX_ADDR` codegen on ARM for large element sizes. We were attempting to generate `base + index * size` using `MADD`, but had the registers in the wrong order and were generating `base * index + size`. This change fixes the register order s.t. the expected instruction is generated. Fixes #13593. --- src/jit/codegenarmarch.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/jit/codegenarmarch.cpp b/src/jit/codegenarmarch.cpp index bf83e13a6f51..83f06bb07317 100644 --- a/src/jit/codegenarmarch.cpp +++ b/src/jit/codegenarmarch.cpp @@ -1615,9 +1615,9 @@ void CodeGen::genCodeForIndexAddr(GenTreeIndexAddr* node) // tmp = scale CodeGen::genSetRegToIcon(tmpReg, (ssize_t)node->gtElemSize, TYP_INT); - // dest = base + index * tmp - getEmitter()->emitIns_R_R_R_R(INS_MULADD, emitTypeSize(node), node->gtRegNum, node->gtRegNum, - index->gtRegNum, tmpReg); + // dest = index * tmp + base + getEmitter()->emitIns_R_R_R_R(INS_MULADD, emitTypeSize(node), node->gtRegNum, index->gtRegNum, + tmpReg, base->gtRegNum); break; } } From 4f09bd8dd064bb5596cdc45a9147149542177c48 Mon Sep 17 00:00:00 2001 From: Pat Gavlin Date: Mon, 28 Aug 2017 16:02:06 -0700 Subject: [PATCH 2/2] Format code. --- src/jit/codegenarmarch.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/jit/codegenarmarch.cpp b/src/jit/codegenarmarch.cpp index 83f06bb07317..521f1e4b00c5 100644 --- a/src/jit/codegenarmarch.cpp +++ b/src/jit/codegenarmarch.cpp @@ -1616,8 +1616,8 @@ void CodeGen::genCodeForIndexAddr(GenTreeIndexAddr* node) CodeGen::genSetRegToIcon(tmpReg, (ssize_t)node->gtElemSize, TYP_INT); // dest = index * tmp + base - getEmitter()->emitIns_R_R_R_R(INS_MULADD, emitTypeSize(node), node->gtRegNum, index->gtRegNum, - tmpReg, base->gtRegNum); + getEmitter()->emitIns_R_R_R_R(INS_MULADD, emitTypeSize(node), node->gtRegNum, index->gtRegNum, tmpReg, + base->gtRegNum); break; } }