Skip to content

Commit 9487df0

Browse files
ARM64-SVE: Add AddRotateComplex, MultiplyAddRotateComplex (#104926)
1 parent 3922062 commit 9487df0

File tree

14 files changed

+491
-183
lines changed

14 files changed

+491
-183
lines changed

src/coreclr/jit/codegenarm64test.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6096,6 +6096,7 @@ void CodeGen::genArm64EmitterUnitTestsSve()
60966096
theEmitter->emitIns_R_PATTERN_I(INS_sve_uqincw, EA_SCALABLE, REG_V11, SVE_PATTERN_ALL, 16,
60976097
INS_OPTS_SCALABLE_S); // UQINCW <Zdn>.S{, <pattern>{, MUL #<imm>}}
60986098

6099+
#ifdef ALL_ARM64_EMITTER_UNIT_TESTS_SVE_UNSUPPORTED
60996100
// IF_SVE_BQ_2A
61006101
theEmitter->emitIns_R_R_I(INS_sve_ext, EA_SCALABLE, REG_V0, REG_V1, 0, INS_OPTS_SCALABLE_B,
61016102
INS_SCALABLE_OPTS_WITH_VECTOR_PAIR); // EXT <Zd>.B, {<Zn1>.B, <Zn2>.B }, #<imm>
@@ -6105,6 +6106,7 @@ void CodeGen::genArm64EmitterUnitTestsSve()
61056106
INS_SCALABLE_OPTS_WITH_VECTOR_PAIR); // EXT <Zd>.B, {<Zn1>.B, <Zn2>.B }, #<imm>
61066107
theEmitter->emitIns_R_R_I(INS_sve_ext, EA_SCALABLE, REG_V6, REG_FP_LAST, 255, INS_OPTS_SCALABLE_B,
61076108
INS_SCALABLE_OPTS_WITH_VECTOR_PAIR); // EXT <Zd>.B, {<Zn1>.B, <Zn2>.B }, #<imm>
6109+
#endif // ALL_ARM64_EMITTER_UNIT_TESTS_SVE_UNSUPPORTED
61086110

61096111
// IF_SVE_BQ_2B
61106112
theEmitter->emitIns_R_R_I(INS_sve_ext, EA_SCALABLE, REG_V0, REG_V1, 0,
@@ -8391,23 +8393,23 @@ void CodeGen::genArm64EmitterUnitTestsSve()
83918393
INS_OPTS_SCALABLE_D); // ST1B {<Zt>.D }, <Pg>, [<Xn|SP>, <Zm>.D]
83928394

83938395
// IF_SVE_GP_3A
8394-
theEmitter->emitIns_R_R_R_I(INS_sve_fcadd, EA_SCALABLE, REG_V0, REG_P1, REG_V2, 90,
8396+
theEmitter->emitIns_R_R_R_I(INS_sve_fcadd, EA_SCALABLE, REG_V0, REG_P1, REG_V2, 0,
83958397
INS_OPTS_SCALABLE_H); // FCADD <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>, <const>
8396-
theEmitter->emitIns_R_R_R_I(INS_sve_fcadd, EA_SCALABLE, REG_V0, REG_P1, REG_V2, 270,
8398+
theEmitter->emitIns_R_R_R_I(INS_sve_fcadd, EA_SCALABLE, REG_V0, REG_P1, REG_V2, 1,
83978399
INS_OPTS_SCALABLE_H); // FCADD <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>, <const>
8398-
theEmitter->emitIns_R_R_R_I(INS_sve_fcadd, EA_SCALABLE, REG_V0, REG_P1, REG_V2, 270,
8400+
theEmitter->emitIns_R_R_R_I(INS_sve_fcadd, EA_SCALABLE, REG_V0, REG_P1, REG_V2, 1,
83998401
INS_OPTS_SCALABLE_S); // FCADD <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>, <const>
8400-
theEmitter->emitIns_R_R_R_I(INS_sve_fcadd, EA_SCALABLE, REG_V0, REG_P1, REG_V2, 270,
8402+
theEmitter->emitIns_R_R_R_I(INS_sve_fcadd, EA_SCALABLE, REG_V0, REG_P1, REG_V2, 1,
84018403
INS_OPTS_SCALABLE_D); // FCADD <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.<T>, <const>
84028404

84038405
// IF_SVE_GT_4A
84048406
theEmitter->emitIns_R_R_R_R_I(INS_sve_fcmla, EA_SCALABLE, REG_V2, REG_P1, REG_V3, REG_V4, 0,
84058407
INS_OPTS_SCALABLE_H); // FCMLA <Zda>.<T>, <Pg>/M, <Zn>.<T>, <Zm>.<T>, <const>
8406-
theEmitter->emitIns_R_R_R_R_I(INS_sve_fcmla, EA_SCALABLE, REG_V0, REG_P2, REG_V1, REG_V5, 90,
8408+
theEmitter->emitIns_R_R_R_R_I(INS_sve_fcmla, EA_SCALABLE, REG_V0, REG_P2, REG_V1, REG_V5, 1,
84078409
INS_OPTS_SCALABLE_S); // FCMLA <Zda>.<T>, <Pg>/M, <Zn>.<T>, <Zm>.<T>, <const>
8408-
theEmitter->emitIns_R_R_R_R_I(INS_sve_fcmla, EA_SCALABLE, REG_V2, REG_P3, REG_V0, REG_V6, 180,
8410+
theEmitter->emitIns_R_R_R_R_I(INS_sve_fcmla, EA_SCALABLE, REG_V2, REG_P3, REG_V0, REG_V6, 2,
84098411
INS_OPTS_SCALABLE_D); // FCMLA <Zda>.<T>, <Pg>/M, <Zn>.<T>, <Zm>.<T>, <const>
8410-
theEmitter->emitIns_R_R_R_R_I(INS_sve_fcmla, EA_SCALABLE, REG_V2, REG_P3, REG_V0, REG_V6, 270,
8412+
theEmitter->emitIns_R_R_R_R_I(INS_sve_fcmla, EA_SCALABLE, REG_V2, REG_P3, REG_V0, REG_V6, 3,
84118413
INS_OPTS_SCALABLE_D); // FCMLA <Zda>.<T>, <Pg>/M, <Zn>.<T>, <Zm>.<T>, <const>
84128414

84138415
// IF_SVE_GI_4A

src/coreclr/jit/emitarm64sve.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4410,7 +4410,6 @@ void emitter::emitInsSve_R_R_R(instruction ins,
44104410
/*****************************************************************************
44114411
*
44124412
* Add a SVE instruction referencing three registers and a constant.
4413-
* Do not call this directly. Use 'emitIns_R_R_R_I' instead.
44144413
*/
44154414

44164415
void emitter::emitInsSve_R_R_R_I(instruction ins,
@@ -5577,7 +5576,7 @@ void emitter::emitInsSve_R_R_R_I(instruction ins,
55775576
assert(isLowPredicateRegister(reg2));
55785577
assert(isVectorRegister(reg3));
55795578
assert(isScalableVectorSize(size));
5580-
imm = emitEncodeRotationImm90_or_270(imm);
5579+
assert(emitIsValidEncodedRotationImm90_or_270(imm));
55815580
fmt = IF_SVE_GP_3A;
55825581
break;
55835582

@@ -5860,7 +5859,6 @@ void emitter::emitInsSve_R_R_R_I_I(instruction ins,
58605859
/*****************************************************************************
58615860
*
58625861
* Add a SVE instruction referencing four registers.
5863-
* Do not call this directly. Use 'emitIns_R_R_R_R' instead.
58645862
*/
58655863

58665864
void emitter::emitInsSve_R_R_R_R(instruction ins,
@@ -6991,7 +6989,7 @@ void emitter::emitInsSve_R_R_R_R_I(instruction ins,
69916989
assert(isVectorRegister(reg3));
69926990
assert(isVectorRegister(reg4));
69936991
assert(isScalableVectorSize(size));
6994-
imm = emitEncodeRotationImm0_to_270(imm);
6992+
assert(emitIsValidEncodedRotationImm0_to_270(imm));
69956993
fmt = IF_SVE_GT_4A;
69966994
break;
69976995

@@ -9798,7 +9796,7 @@ void emitter::emitIns_PRFOP_R_R_I(instruction ins,
97989796

97999797
/*static*/ bool emitter::emitIsValidEncodedRotationImm90_or_270(ssize_t imm)
98009798
{
9801-
return (imm == 0) || (imm == 1);
9799+
return isValidUimm<1>(imm);
98029800
}
98039801

98049802
/************************************************************************
@@ -9867,7 +9865,7 @@ void emitter::emitIns_PRFOP_R_R_I(instruction ins,
98679865

98689866
/*static*/ bool emitter::emitIsValidEncodedRotationImm0_to_270(ssize_t imm)
98699867
{
9870-
return (imm >= 0) && (imm <= 3);
9868+
return isValidUimm<2>(imm);
98719869
}
98729870

98739871
/*****************************************************************************

src/coreclr/jit/hwintrinsicarm64.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,16 @@ void HWIntrinsicInfo::lookupImmBounds(
504504
immUpperBound = (int)SVE_PRFOP_CONST15;
505505
break;
506506

507+
case NI_Sve_AddRotateComplex:
508+
immLowerBound = 0;
509+
immUpperBound = 1;
510+
break;
511+
512+
case NI_Sve_MultiplyAddRotateComplex:
513+
immLowerBound = 0;
514+
immUpperBound = 3;
515+
break;
516+
507517
case NI_Sve_TrigonometricMultiplyAddCoefficient:
508518
immLowerBound = 0;
509519
immUpperBound = 7;

0 commit comments

Comments
 (0)