From 5d59dec8b37d6468ca15f849d3b6b7baa3122552 Mon Sep 17 00:00:00 2001 From: Mike Danes Date: Tue, 7 Jan 2020 19:39:51 +0200 Subject: [PATCH] Use movups instead of movdqu in block op codegen When VEX encoding is not availbale, movups encoding is one byte shorter. With VEX the two instructions have same length encoding so we can just use movups all the time. Also fix perf score latency for movups & co., it was incorrectly set higher than movdqu's latency. --- src/coreclr/src/jit/codegenxarch.cpp | 12 ++++++------ src/coreclr/src/jit/emitxarch.cpp | 26 ++++---------------------- 2 files changed, 10 insertions(+), 28 deletions(-) diff --git a/src/coreclr/src/jit/codegenxarch.cpp b/src/coreclr/src/jit/codegenxarch.cpp index 66bc4fe486a3b5..e9e37548eb6c16 100644 --- a/src/coreclr/src/jit/codegenxarch.cpp +++ b/src/coreclr/src/jit/codegenxarch.cpp @@ -3022,11 +3022,11 @@ void CodeGen::genCodeForInitBlkUnroll(GenTreeBlk* node) { if (dstLclNum != BAD_VAR_NUM) { - emit->emitIns_S_R(INS_movdqu, EA_ATTR(regSize), srcXmmReg, dstLclNum, dstOffset); + emit->emitIns_S_R(INS_movups, EA_ATTR(regSize), srcXmmReg, dstLclNum, dstOffset); } else { - emit->emitIns_ARX_R(INS_movdqu, EA_ATTR(regSize), srcXmmReg, dstAddrBaseReg, dstAddrIndexReg, + emit->emitIns_ARX_R(INS_movups, EA_ATTR(regSize), srcXmmReg, dstAddrBaseReg, dstAddrIndexReg, dstAddrIndexScale, dstOffset); } } @@ -3221,21 +3221,21 @@ void CodeGen::genCodeForCpBlkUnroll(GenTreeBlk* node) { if (srcLclNum != BAD_VAR_NUM) { - emit->emitIns_R_S(INS_movdqu, EA_ATTR(regSize), tempReg, srcLclNum, srcOffset); + emit->emitIns_R_S(INS_movups, EA_ATTR(regSize), tempReg, srcLclNum, srcOffset); } else { - emit->emitIns_R_ARX(INS_movdqu, EA_ATTR(regSize), tempReg, srcAddrBaseReg, srcAddrIndexReg, + emit->emitIns_R_ARX(INS_movups, EA_ATTR(regSize), tempReg, srcAddrBaseReg, srcAddrIndexReg, srcAddrIndexScale, srcOffset); } if (dstLclNum != BAD_VAR_NUM) { - emit->emitIns_S_R(INS_movdqu, EA_ATTR(regSize), tempReg, dstLclNum, dstOffset); + emit->emitIns_S_R(INS_movups, EA_ATTR(regSize), tempReg, dstLclNum, dstOffset); } else { - emit->emitIns_ARX_R(INS_movdqu, EA_ATTR(regSize), tempReg, dstAddrBaseReg, dstAddrIndexReg, + emit->emitIns_ARX_R(INS_movups, EA_ATTR(regSize), tempReg, dstAddrBaseReg, dstAddrIndexReg, dstAddrIndexScale, dstOffset); } } diff --git a/src/coreclr/src/jit/emitxarch.cpp b/src/coreclr/src/jit/emitxarch.cpp index 90b254f00d28fc..816fb626946031 100644 --- a/src/coreclr/src/jit/emitxarch.cpp +++ b/src/coreclr/src/jit/emitxarch.cpp @@ -14353,6 +14353,10 @@ emitter::insExecutionCharacteristics emitter::getInsExecutionCharacteristics(ins case INS_movdqa: case INS_movdqu: + case INS_movaps: + case INS_movups: + case INS_movapd: + case INS_movupd: if (memAccessKind == PERFSCORE_MEMORY_NONE) { // ins reg, reg @@ -14537,28 +14541,6 @@ emitter::insExecutionCharacteristics emitter::getInsExecutionCharacteristics(ins result.insLatency += PERFSCORE_LATENCY_5C; break; - case INS_movaps: - case INS_movups: - case INS_movapd: - case INS_movupd: - if (memAccessKind == PERFSCORE_MEMORY_NONE) - { - result.insThroughput = PERFSCORE_THROUGHPUT_4X; - result.insLatency = PERFSCORE_LATENCY_1C; - } - else if (memAccessKind == PERFSCORE_MEMORY_READ) - { - result.insThroughput = PERFSCORE_THROUGHPUT_2X; - result.insLatency += PERFSCORE_LATENCY_2C; - } - else - { - assert(memAccessKind == PERFSCORE_MEMORY_WRITE); - result.insThroughput = PERFSCORE_THROUGHPUT_1C; - result.insLatency += PERFSCORE_LATENCY_3C; - } - break; - case INS_paddb: case INS_psubb: case INS_paddw: