Generate inc/dec [mem] instead of add/sub [mem], 1 for read-modify-write operations.
authorsivarv <sivarv@microsoft.com>
Sat, 12 Nov 2016 00:41:16 +0000 (16:41 -0800)
committersivarv <sivarv@microsoft.com>
Sat, 12 Nov 2016 00:41:16 +0000 (16:41 -0800)
src/jit/codegenxarch.cpp

index 36a6cf5..5e4153c 100644 (file)
@@ -4533,6 +4533,22 @@ void CodeGen::genStoreInd(GenTreePtr node)
                     assert(rmwSrc == data->gtGetOp2());
                     genCodeForShiftRMW(storeInd);
                 }
+                else if (data->OperGet() == GT_ADD && rmwSrc->IsIntegralConst(1))
+                {
+                    // Generate inc [mem] instead of "add [mem], 1".
+                    // Note that we don't need to check for GT_SUB of -1 because
+                    // global morph would transform it to GT_ADD of 1.
+                    assert(rmwSrc->isContainedIntOrIImmed());
+                    getEmitter()->emitInsRMW(INS_inc, emitTypeSize(storeInd), storeInd);
+                }
+                else if (data->OperGet() == GT_ADD && rmwSrc->IsIntegralConst(-1))
+                {
+                    // Generate dec [mem] instead of "add [mem], -1".
+                    // Note that we don't need to check for GT_SUB of 1 because
+                    // global morph would transform it to GT_ADD of -1.
+                    assert(rmwSrc->isContainedIntOrIImmed());
+                    getEmitter()->emitInsRMW(INS_dec, emitTypeSize(storeInd), storeInd);
+                }
                 else
                 {
                     // generate code for remaining binary RMW memory ops like add/sub/and/or/xor