Use INS_inc for Interlocked.Increment (#87442)
authorEgor Bogatov <egorbo@gmail.com>
Tue, 13 Jun 2023 09:21:18 +0000 (11:21 +0200)
committerGitHub <noreply@github.com>
Tue, 13 Jun 2023 09:21:18 +0000 (11:21 +0200)
src/coreclr/jit/codegenxarch.cpp
src/coreclr/jit/emitxarch.cpp

index 8dea6b12769bba7571206c39d55d3ecc2dbeca67..75d8e5432c4ae8019065d30a4b4bf70439d5a014 100644 (file)
@@ -4263,10 +4263,25 @@ void CodeGen::genCodeForLockAdd(GenTreeOp* node)
     {
         int imm = static_cast<int>(data->AsIntCon()->IconValue());
         assert(imm == data->AsIntCon()->IconValue());
-        GetEmitter()->emitIns_I_AR(INS_add, size, imm, addr->GetRegNum(), 0);
+        if (imm == 1)
+        {
+            // inc [addr]
+            GetEmitter()->emitIns_AR(INS_inc, size, addr->GetRegNum(), 0);
+        }
+        else if (imm == -1)
+        {
+            // dec [addr]
+            GetEmitter()->emitIns_AR(INS_dec, size, addr->GetRegNum(), 0);
+        }
+        else
+        {
+            // add [addr], imm
+            GetEmitter()->emitIns_I_AR(INS_add, size, imm, addr->GetRegNum(), 0);
+        }
     }
     else
     {
+        // add [addr], data
         GetEmitter()->emitIns_AR_R(INS_add, size, data->GetRegNum(), addr->GetRegNum(), 0);
     }
 }
index e1586dcf9ff1b9cdbbbd5b78b755550e5c78310b..814f0392db0d0835b5d1b9b0d0764c0889ab59a6 100644 (file)
@@ -6512,7 +6512,8 @@ void emitter::emitIns_R_R_I(instruction ins, emitAttr attr, regNumber reg1, regN
 
 void emitter::emitIns_AR(instruction ins, emitAttr attr, regNumber base, int offs)
 {
-    assert(ins == INS_prefetcht0 || ins == INS_prefetcht1 || ins == INS_prefetcht2 || ins == INS_prefetchnta);
+    assert(ins == INS_prefetcht0 || ins == INS_prefetcht1 || ins == INS_prefetcht2 || ins == INS_prefetchnta ||
+           ins == INS_inc || ins == INS_dec);
 
     instrDesc* id = emitNewInstrAmd(attr, offs);