Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Arm64] ASIMD By Element Intrinsics #36916

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
66f2c16
Don't use fully qualified name for DuplicateSelectedScalarToVector128…
echesakov May 23, 2020
e1f7713
Rename acc->addend in FusedMultiplyAdd* in AdvSimd.cs AdvSimd.Platfor…
echesakov Jun 10, 2020
58cc8ad
Rename acc->minuend in FusedMultiplySubtract* in AdvSimd.cs AdvSimd.P…
echesakov Jun 10, 2020
1c815af
Add FusedMultiplyAddByScalar and FusedMultiplyAddBySelectedScalar in …
echesakov May 23, 2020
ee63943
Add FusedMultiplySubtractByScalar and FusedMultiplyBySelectedScalar i…
echesakov May 23, 2020
ae0226d
Rename acc->addend in MultiplyAdd* in AdvSimd.cs AdvSimd.PlatformNotS…
echesakov Jun 10, 2020
b2375a3
Rename acc->minuend in MultiplySubtract* in AdvSimd.cs AdvSimd.Platfo…
echesakov Jun 10, 2020
dce2801
Re-order MultiplyScalar in AdvSimd.cs AdvSimd.PlatformNotSupported.cs
echesakov Jun 10, 2020
afd0116
Add MultiplyScalarBySelectedScalar and MultiplyExtendedScalarBySelect…
echesakov Jun 10, 2020
7319bff
Add MultiplyByScalar and MultiplyBySelectedScalar in AdvSimd.cs AdvSi…
echesakov May 23, 2020
4007bcc
Add MultiplyExtendedBySelectedScalar and MultiplyExtendedByScalar in …
echesakov Jun 10, 2020
9221b42
Add MultiplyAddByScalar and MultiplyAddBySelectedScalar in Arm32 in A…
echesakov Jun 10, 2020
44dd74b
Add MultiplySubtractByScalar and MultiplySubtractBySelectedScalar in …
echesakov Jun 10, 2020
f331f34
Add MultiplyBySelectedScalarWideningLower in AdvSimd.cs AdvSimd.Platf…
echesakov Jun 10, 2020
e275811
Add MultiplyBySelectedScalarWideningLowerAndAdd in AdvSimd.cs AdvSimd…
echesakov Jun 10, 2020
fa4db87
Add MultiplyBySelectedScalarWideningLowerAndSubtract in AdvSimd.cs Ad…
echesakov Jun 10, 2020
a0e9c44
Add MultiplyBySelectedScalarWideningUpper in AdvSimd.cs AdvSimd.Platf…
echesakov Jun 10, 2020
3098adf
Add MultiplyBySelectedScalarWideningUpperAndAdd in AdvSimd.cs AdvSimd…
echesakov Jun 10, 2020
21e3340
Add MultiplyBySelectedScalarWideningUpperAndSubtract in AdvSimd.cs Ad…
echesakov Jun 10, 2020
d5eab60
Add MultiplyAddByScalar and MultiplyAddBySelectedScalar in AdvSimd.cs…
echesakov May 27, 2020
ed6873c
Add MultiplySubtractByScalar and MultiplySubtractBySelectedScalar in …
echesakov May 27, 2020
6d8dd30
Add LoadAndReplicateToVector64 and LoadAndReplicateToVector128 in Adv…
echesakov Jun 6, 2020
4774f36
Add LoadAndInsertScalar in AdvSimd.cs AdvSimd.PlatformNotSupported.cs
echesakov Jun 6, 2020
ab5bf86
Add StoreSelectedScalar in AdvSimd.cs AdvSimd.PlatformNotSupported.cs
echesakov Jun 6, 2020
a345590
Add InsertSelectedScalar in AdvSimd.cs AdvSimd.PlatformNotSupported.cs
echesakov Jun 10, 2020
ed5d929
Update System.Runtime.Intrinsics.cs
echesakov Jun 10, 2020
edca2d7
In a non-const immediates case expand InsertSelectedScalar into Inser…
echesakov Jun 11, 2020
ef16dd7
Update _ImmBinaryOpTestTemplate.template
echesakov Jun 2, 2020
561db04
Update _ImmTernaryOpTestTemplate.template
echesakov Jun 12, 2020
8c7ba8d
Add LoadAndInsertScalarTest.template
echesakov Jun 12, 2020
bb46f60
Add StoreSelectedScalarTest.template
echesakov Jun 12, 2020
3bb7b3c
Add InsertSelectedScalarTest.template
echesakov Jun 11, 2020
326ed04
Update Helpers.cs Helpers.tt
echesakov Jun 2, 2020
7532703
Update GenerateTests.csx
echesakov Jun 11, 2020
2a2ad56
Re-format GenerateTests.csx
echesakov Jun 12, 2020
11faee7
Simplify DuplicateSelectedScalarToVector64 and DuplicateSelectedScala…
echesakov Jun 12, 2020
fb62d4f
Fix ShiftLeftAndInsert and ShiftRightAndInsert in GenerateTests.csx
echesakov Jun 12, 2020
8aee5c7
Re-format GenerateTests.csx
echesakov Jun 12, 2020
80200b1
Define RBM_ASIMD_INDEXED_H_ELEMENT_ALLOWED_REGS in target.h
echesakov Jun 5, 2020
cb3f4ad
Update AdvSimd/ AdvSimd.Arm64/
echesakov Jun 15, 2020
f4a4874
Rename lastOp -> immOp in addRangeCheckIfNeeded() in compiler.h
echesakov Jun 12, 2020
74780e0
Re-work categories and flags on Arm64 in hwintrinsic.h
echesakov Jun 10, 2020
ba806ab
Adjust Compiler::optIsCSEcandidate() in optcse.cpp
echesakov Jun 10, 2020
5f59750
Adjust OperIsMemoryLoad and OperIsMemoryStore in gentree.cpp
echesakov Jun 10, 2020
ddace96
Re-format hwintrinsiclistarm64.h
echesakov Jun 12, 2020
1d02229
Add LoadAndInsertScalar in hwintrinsiclistarm64.h
echesakov Jun 12, 2020
2e4608c
Add LoadAndReplicateToVector64 and LoadAndReplicateToVector128 in hwi…
echesakov Jun 12, 2020
8b043ed
Add StoreSelectedScalar in hwintrinsiclistarm64.h
echesakov Jun 12, 2020
3436926
Add InsertSelectedScalar in hwintrinsiclistarm64.h
echesakov Jun 12, 2020
7875ad9
Re-order ShiftRightLogicalAndInsertScalar in hwintrinsiclistarm64.h
echesakov Jun 12, 2020
18acc05
Add MultiplyByScalar, MultiplyBySelectedScalar and MultiplyScalarBySe…
echesakov Jun 12, 2020
fec69da
Add MultiplyAddByScalar, MultiplyAddBySelectedScalar, MultiplySubtrac…
echesakov Jun 12, 2020
5cc03af
Add MultiplyBySelectedScalarWidening* in hwintrinsiclistarm64.h
echesakov Jun 12, 2020
71af924
Add FusedMultiplyAddByScalar, FusedMultiplyAddBySelectedScalar, Fused…
echesakov Jun 12, 2020
e274d9c
Add MultiplyExtendedByScalar, MultiplyExtendedBySelectedScalar and Mu…
echesakov Jun 12, 2020
e3627f1
ASIMD vector x indexed element immediate operand range is based on 16…
echesakov Jun 5, 2020
2dc7cd8
Remove redundant asserts in emitarm64.cpp
echesakov Jun 6, 2020
c5be864
For smlal{2}, smlsl{2}, smull{2}, umlal{2}, umlsl{2} and umull{2} ass…
echesakov Jun 6, 2020
ca5e301
Add missing tests for umlal{2} and umlsl in genArm64EmitterUnitTests …
echesakov Jun 6, 2020
bd0ff14
Remove HWIntrinsicInfo::isInImmRange() in hwintrinsic.h hwintrinsicxa…
echesakov Jun 10, 2020
a9df368
Adjust HWIntrinsicInfo::isImmOp() in hwintrinsic.cpp
echesakov Jun 12, 2020
d7305a4
Add HWIntrinsicSignatureReader in hwintrinsic.cpp
echesakov Jun 12, 2020
aaad148
Simplify HWIntrinsicInfo::lookupImmBounds() for SIMD Shift and SIMD B…
echesakov Jun 12, 2020
6c21a9f
Add InsertSelectedScalar in HWIntrinsicInfo::lookupImmBounds in hwint…
echesakov Jun 12, 2020
3008b76
Update HWIntrinsic helper struct to support 4-operands intrinsics in …
echesakov Jun 10, 2020
0b57f20
Adjust Compiler::addRangeCheckIfNeeded in hwintrinsic.cpp
echesakov Jun 12, 2020
b04a6a8
Re-factor immediate operand logic in Compiler::impHWIntrinsic() in hw…
echesakov Jun 13, 2020
e569448
Add InsertSelectedScalar in Compiler::impHWIntrinsic() in hwintrinsic…
echesakov Jun 13, 2020
82bb818
Simplify table-driven importation logic in Compiler::impHWIntrinsic i…
echesakov Jun 12, 2020
c942634
Rename GetOtherBaseType() -> GetAuxiliaryType() and SetOtherBaseType(…
echesakov Jun 10, 2020
21d25f9
Simplify Lowering::ContainCheckHWIntrinsic() for SIMD Shift and SIMD …
echesakov Jun 9, 2020
45eefb7
Simplify LinearScan::BuildHWIntrinsic() for SIMD Shift and SIMD By El…
echesakov Jun 6, 2020
0f56a99
Simplify and use table-driven approach in CodeGen::genHWIntrinsic() f…
echesakov Jun 5, 2020
716c20c
Add InsertSelectedScalar in hwintrinsiccodegenarm64.cpp
echesakov Jun 11, 2020
283e686
Support SIMD By Element intrinsics in HWIntrinsicImmOpHelper in hwint…
echesakov Jun 10, 2020
bd40e7c
Remove SIMDScalar from helpers in hwintrinsiclistarm64.h
echesakov Jun 16, 2020
ee7db3c
Add SIMDScalar to AdvSimd.Arm64.DuplicateToVector64 in hwintrinsiclis…
echesakov Jun 16, 2020
b01be48
Address Carol's feedback regarding assertions in emitarm64.cpp
echesakov Jun 16, 2020
bb35382
Add comment for HWIntrinsicSignatureReader in hwintrinsic.cpp
echesakov Jun 16, 2020
a4b6601
Fix comment in hwintrinsic.cpp
echesakov Jun 16, 2020
950613f
Fix TODO-comment in hwintrinsic.cpp
echesakov Jun 16, 2020
c312d27
Don't use fully qualified name for DuplicateSelectedScalarToVector128…
echesakov Jun 15, 2020
af9f146
Revert "Remove redundant asserts in emitarm64.cpp"
echesakov Jun 16, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
11 changes: 11 additions & 0 deletions src/coreclr/src/jit/codegenarm64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9303,6 +9303,17 @@ void CodeGen::genArm64EmitterUnitTests()
theEmitter->emitIns_R_R_R_I(INS_smull2, EA_16BYTE, REG_V6, REG_V7, REG_V8, 7, INS_OPTS_8H);
theEmitter->emitIns_R_R_R_I(INS_smull2, EA_16BYTE, REG_V9, REG_V10, REG_V11, 3, INS_OPTS_4S);

// umlal vector, by element
theEmitter->emitIns_R_R_R_I(INS_umlal, EA_8BYTE, REG_V0, REG_V1, REG_V2, 3, INS_OPTS_4H);
theEmitter->emitIns_R_R_R_I(INS_umlal, EA_8BYTE, REG_V3, REG_V4, REG_V5, 1, INS_OPTS_2S);

// umlal2 vector, by element
theEmitter->emitIns_R_R_R_I(INS_umlal2, EA_16BYTE, REG_V6, REG_V7, REG_V8, 7, INS_OPTS_8H);
theEmitter->emitIns_R_R_R_I(INS_umlal2, EA_16BYTE, REG_V9, REG_V10, REG_V11, 3, INS_OPTS_4S);

// umlsl vector, by element
theEmitter->emitIns_R_R_R_I(INS_umlsl, EA_8BYTE, REG_V0, REG_V1, REG_V2, 3, INS_OPTS_4H);

// umlsl2 vector, by element
theEmitter->emitIns_R_R_R_I(INS_umlsl2, EA_16BYTE, REG_V6, REG_V7, REG_V8, 7, INS_OPTS_8H);
theEmitter->emitIns_R_R_R_I(INS_umlsl2, EA_16BYTE, REG_V9, REG_V10, REG_V11, 3, INS_OPTS_4S);
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/src/jit/compiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -3782,7 +3782,7 @@ class Compiler
GenTree* getArgForHWIntrinsic(var_types argType, CORINFO_CLASS_HANDLE argClass, bool expectAddr = false);
GenTree* impNonConstFallback(NamedIntrinsic intrinsic, var_types simdType, var_types baseType);
GenTree* addRangeCheckIfNeeded(
NamedIntrinsic intrinsic, GenTree* lastOp, bool mustExpand, int immLowerBound, int immUpperBound);
NamedIntrinsic intrinsic, GenTree* immOp, bool mustExpand, int immLowerBound, int immUpperBound);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's minor, but thanks for renaming this - even if/when it was the last op, semantically it's more important that it's an immediate.


#ifdef TARGET_XARCH
GenTree* impBaseIntrinsic(NamedIntrinsic intrinsic,
Expand Down
18 changes: 14 additions & 4 deletions src/coreclr/src/jit/emitarm64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -817,7 +817,7 @@ void emitter::emitInsSanityCheck(instrDesc* id)
assert(isVectorRegister(id->idReg2()));
assert(isVectorRegister(id->idReg3()));
elemsize = optGetElemsize(id->idInsOpt());
assert(isValidVectorIndex(id->idOpSize(), elemsize, emitGetInsSC(id)));
assert(isValidVectorIndex(EA_16BYTE, elemsize, emitGetInsSC(id)));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was this changed to account for the simd8 result with simd16 selection?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The size of the destination/source registers shouldn't matter here. For example,

FMLA Vd.T, Vn.T, Vm.Ts[index]

index is always encoded as H:L (2 bits) when T is either 2S or 4S (and Ts is S).

In other words, the range of valid values for index is computed based on the assumption that Vm is 16 bytes.

break;

case IF_DV_3C: // DV_3C .Q.........mmmmm ......nnnnnddddd Vd Vn Vm (vector)
Expand Down Expand Up @@ -6247,7 +6247,7 @@ void emitter::emitIns_R_R_R_I(instruction ins,
assert(isValidArrangement(size, opt));
elemsize = optGetElemsize(opt);
assert(isValidVectorElemsizeFloat(elemsize));
assert(isValidVectorIndex(size, elemsize, imm));
assert(isValidVectorIndex(EA_16BYTE, elemsize, imm));
assert(opt != INS_OPTS_1D); // Reserved encoding
fmt = IF_DV_3BI;
}
Expand Down Expand Up @@ -6277,7 +6277,7 @@ void emitter::emitIns_R_R_R_I(instruction ins,
// Only has encodings for H or S elemsize
assert((elemsize == EA_2BYTE) || (elemsize == EA_4BYTE));
// Only has encodings for V0..V15
if ((elemsize == EA_2BYTE) && (reg3 >= REG_V16))
if ((elemsize == EA_2BYTE) && ((genRegMask(reg3) & RBM_ASIMD_INDEXED_H_ELEMENT_ALLOWED_REGS) == 0))
{
noway_assert(!"Invalid reg3");
}
Expand Down Expand Up @@ -6368,6 +6368,11 @@ void emitter::emitIns_R_R_R_I(instruction ins,
assert((opt == INS_OPTS_4H) || (opt == INS_OPTS_2S));
elemsize = optGetElemsize(opt);
assert(isValidVectorIndex(EA_16BYTE, elemsize, imm));
// Restricted to V0-V15 when element size is H
if ((elemsize == EA_2BYTE) && ((genRegMask(reg3) & RBM_ASIMD_INDEXED_H_ELEMENT_ALLOWED_REGS) == 0))
{
assert(!"Invalid reg3");
}
fmt = IF_DV_3HI;
break;

Expand All @@ -6384,6 +6389,11 @@ void emitter::emitIns_R_R_R_I(instruction ins,
assert((opt == INS_OPTS_8H) || (opt == INS_OPTS_4S));
elemsize = optGetElemsize(opt);
assert(isValidVectorIndex(EA_16BYTE, elemsize, imm));
// Restricted to V0-V15 when element size is H
if ((elemsize == EA_2BYTE) && ((genRegMask(reg3) & RBM_ASIMD_INDEXED_H_ELEMENT_ALLOWED_REGS) == 0))
{
assert(!"Invalid reg3");
}
fmt = IF_DV_3HI;
break;

Expand Down Expand Up @@ -10966,7 +10976,7 @@ size_t emitter::emitOutputInstr(insGroup* ig, instrDesc* id, BYTE** dp)
code = emitInsCode(ins, fmt);
imm = emitGetInsSC(id);
elemsize = optGetElemsize(id->idInsOpt());
assert(isValidVectorIndex(id->idOpSize(), elemsize, imm));
assert(isValidVectorIndex(EA_16BYTE, elemsize, imm));
code |= insEncodeVectorsize(id->idOpSize()); // Q
code |= insEncodeFloatElemsize(elemsize); // X
code |= insEncodeFloatIndex(elemsize, imm); // L H
Expand Down
18 changes: 10 additions & 8 deletions src/coreclr/src/jit/gentree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1461,7 +1461,7 @@ bool GenTree::Compare(GenTree* op1, GenTree* op2, bool swapOK)
if ((op1->AsHWIntrinsic()->gtHWIntrinsicId != op2->AsHWIntrinsic()->gtHWIntrinsicId) ||
(op1->AsHWIntrinsic()->gtSIMDBaseType != op2->AsHWIntrinsic()->gtSIMDBaseType) ||
(op1->AsHWIntrinsic()->gtSIMDSize != op2->AsHWIntrinsic()->gtSIMDSize) ||
(op1->AsHWIntrinsic()->GetOtherBaseType() != op2->AsHWIntrinsic()->GetOtherBaseType()))
(op1->AsHWIntrinsic()->GetAuxiliaryType() != op2->AsHWIntrinsic()->GetAuxiliaryType()))
{
return false;
}
Expand Down Expand Up @@ -2131,7 +2131,7 @@ unsigned Compiler::gtHashValue(GenTree* tree)
hash += tree->AsHWIntrinsic()->gtHWIntrinsicId;
hash += tree->AsHWIntrinsic()->gtSIMDBaseType;
hash += tree->AsHWIntrinsic()->gtSIMDSize;
hash += tree->AsHWIntrinsic()->GetOtherBaseType();
hash += tree->AsHWIntrinsic()->GetAuxiliaryType();
break;
#endif // FEATURE_HW_INTRINSICS

Expand Down Expand Up @@ -7478,7 +7478,7 @@ GenTree* Compiler::gtCloneExpr(
GenTreeHWIntrinsic(hwintrinsicOp->TypeGet(), hwintrinsicOp->gtGetOp1(),
hwintrinsicOp->gtGetOp2IfPresent(), hwintrinsicOp->gtHWIntrinsicId,
hwintrinsicOp->gtSIMDBaseType, hwintrinsicOp->gtSIMDSize);
copy->AsHWIntrinsic()->SetOtherBaseType(hwintrinsicOp->GetOtherBaseType());
copy->AsHWIntrinsic()->SetAuxiliaryType(hwintrinsicOp->GetAuxiliaryType());
}
break;
#endif
Expand Down Expand Up @@ -18661,13 +18661,13 @@ GenTreeHWIntrinsic* Compiler::gtNewScalarHWIntrinsicNode(
// Returns true for the HW Instrinsic instructions that have MemoryLoad semantics, false otherwise
bool GenTreeHWIntrinsic::OperIsMemoryLoad() const
{
#ifdef TARGET_XARCH
// Some xarch instructions have MemoryLoad sematics
#if defined(TARGET_XARCH) || defined(TARGET_ARM64)
HWIntrinsicCategory category = HWIntrinsicInfo::lookupCategory(gtHWIntrinsicId);
if (category == HW_Category_MemoryLoad)
{
return true;
}
#ifdef TARGET_XARCH
else if (HWIntrinsicInfo::MaybeMemoryLoad(gtHWIntrinsicId))
{
// Some intrinsics (without HW_Category_MemoryLoad) also have MemoryLoad semantics
Expand Down Expand Up @@ -18697,19 +18697,20 @@ bool GenTreeHWIntrinsic::OperIsMemoryLoad() const
}
}
#endif // TARGET_XARCH
#endif // TARGET_XARCH || TARGET_ARM64
return false;
}

// Returns true for the HW Instrinsic instructions that have MemoryStore semantics, false otherwise
bool GenTreeHWIntrinsic::OperIsMemoryStore() const
{
#ifdef TARGET_XARCH
// Some xarch instructions have MemoryStore sematics
#if defined(TARGET_XARCH) || defined(TARGET_ARM64)
HWIntrinsicCategory category = HWIntrinsicInfo::lookupCategory(gtHWIntrinsicId);
if (category == HW_Category_MemoryStore)
{
return true;
}
#ifdef TARGET_XARCH
else if (HWIntrinsicInfo::MaybeMemoryStore(gtHWIntrinsicId) &&
(category == HW_Category_IMM || category == HW_Category_Scalar))
{
Expand All @@ -18732,13 +18733,14 @@ bool GenTreeHWIntrinsic::OperIsMemoryStore() const
}
}
#endif // TARGET_XARCH
#endif // TARGET_XARCH || TARGET_ARM64
return false;
}

// Returns true for the HW Instrinsic instructions that have MemoryLoad semantics, false otherwise
bool GenTreeHWIntrinsic::OperIsMemoryLoadOrStore() const
{
#ifdef TARGET_XARCH
#if defined(TARGET_XARCH) || defined(TARGET_ARM64)
return OperIsMemoryLoad() || OperIsMemoryStore();
#else
return false;
Expand Down
12 changes: 6 additions & 6 deletions src/coreclr/src/jit/gentree.h
Original file line number Diff line number Diff line change
Expand Up @@ -4728,8 +4728,8 @@ struct GenTreeJitIntrinsic : public GenTreeOp
ClassLayout* m_layout;

union {
var_types gtOtherBaseType; // For AVX2 Gather* intrinsics
regNumberSmall gtOtherReg; // For intrinsics that return 2 registers
var_types gtAuxiliaryType; // For intrinsics than need another type (e.g. Avx2.Gather* or SIMD (by element))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why rename to AuxiliaryType but not AuxiliaryReg?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since I didn't touch gtOtherReg in other files.

The intent of the renaming was to get rid of BaseType since for SIMD By Element intrinsics I use this field to encode a SIMD type of an indexed element while in some other case we do use it to keep the "other" base type (e.g. in case of wide/long intrinsics). I could've renamed it to gtOtherType.

Do you want me to rename the gtOtherReg -> gtAuxiliaryReg?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was mostly just interested. This makes sense, thanks!

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like the renaming. I think it's reasonable to keep the reg as gtOtherReg, as that naming is used on other GenTree nodes. In any case, if we didn't change it to gtAuxiliaryType we might want to name it gtOtherType (though I'm happy with this change as-is).

regNumberSmall gtOtherReg; // For intrinsics that return 2 registers
};

public:
Expand Down Expand Up @@ -4766,14 +4766,14 @@ struct GenTreeJitIntrinsic : public GenTreeOp
assert(gtOtherReg == reg);
}

var_types GetOtherBaseType() const
var_types GetAuxiliaryType() const
{
return gtOtherBaseType;
return gtAuxiliaryType;
}

void SetOtherBaseType(var_types type)
void SetAuxiliaryType(var_types type)
{
gtOtherBaseType = type;
gtAuxiliaryType = type;
}

GenTreeJitIntrinsic(genTreeOps oper, var_types type, GenTree* op1, GenTree* op2, var_types baseType, unsigned size)
Expand Down
Loading