Skip to content

Commit 616723c

Browse files
SwapnilGaikwadmatouskozak
authored andcommitted
Fix checks to accommodate register wraparounds in multi-reg ops (dotnet#101430)
Fixes issue dotnet#101070
1 parent 5d6e572 commit 616723c

File tree

2 files changed

+14
-4
lines changed

2 files changed

+14
-4
lines changed

src/coreclr/jit/codegen.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,16 @@ class CodeGen final : public CodeGenInterface
101101
}
102102
}
103103

104+
#if defined(TARGET_ARM64)
105+
regNumber getNextSIMDRegWithWraparound(regNumber reg)
106+
{
107+
regNumber nextReg = REG_NEXT(reg);
108+
109+
// Wraparound if necessary, REG_V0 comes next after REG_V31.
110+
return (nextReg > REG_V31) ? REG_V0 : nextReg;
111+
}
112+
#endif // defined(TARGET_ARM64)
113+
104114
static GenTreeIndir indirForm(var_types type, GenTree* base);
105115
static GenTreeStoreInd storeIndirForm(var_types type, GenTree* base, GenTree* data);
106116

src/coreclr/jit/hwintrinsiccodegenarm64.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -833,7 +833,7 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node)
833833

834834
GenTree* argNode = use.GetNode();
835835
assert(argReg == argNode->GetRegNum());
836-
argReg = REG_NEXT(argReg);
836+
argReg = getNextSIMDRegWithWraparound(argReg);
837837
}
838838
assert((ins == INS_st2 && regCount == 2) || (ins == INS_st3 && regCount == 3) ||
839839
(ins == INS_st4 && regCount == 4));
@@ -883,7 +883,7 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node)
883883

884884
GenTree* argNode = use.GetNode();
885885
assert(argReg == argNode->GetRegNum());
886-
argReg = REG_NEXT(argReg);
886+
argReg = getNextSIMDRegWithWraparound(argReg);
887887
}
888888
assert((ins == INS_st1_2regs && regCount == 2) || (ins == INS_st2 && regCount == 2) ||
889889
(ins == INS_st1_3regs && regCount == 3) || (ins == INS_st3 && regCount == 3) ||
@@ -1186,7 +1186,7 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node)
11861186

11871187
GenTree* argNode = use.GetNode();
11881188
assert(argReg == argNode->GetRegNum());
1189-
argReg = REG_NEXT(argReg);
1189+
argReg = getNextSIMDRegWithWraparound(argReg);
11901190
#endif
11911191
}
11921192
}
@@ -1241,7 +1241,7 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node)
12411241
assert(argReg == argNode->GetRegNum());
12421242
// and they should not interfere with targetReg
12431243
assert(targetReg != argReg);
1244-
argReg = REG_NEXT(argReg);
1244+
argReg = getNextSIMDRegWithWraparound(argReg);
12451245
#endif
12461246
}
12471247
}

0 commit comments

Comments
 (0)