Skip to content

Commit

Permalink
Arm64/SVE: Add insEncodeReg* methods (#95105)
Browse files Browse the repository at this point in the history
* Add insEncodeReg* methods

* Adjust the `ins` for sve instruction

Picked up the change in #95127 (comment)

* Update the comments

* Use sve_ins_offset
  • Loading branch information
kunalspathak authored Nov 23, 2023
1 parent eb4e50c commit 944c4aa
Show file tree
Hide file tree
Showing 2 changed files with 284 additions and 43 deletions.
270 changes: 233 additions & 37 deletions src/coreclr/jit/emitarm64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3768,60 +3768,61 @@ emitter::code_t emitter::emitInsCodeSve(instruction ins, insFormat fmt)
}

assert(encoding_found);
const unsigned sve_ins_offset = ((unsigned)ins - INS_sve_invalid);

switch (index)
{
case 0:
assert(ins < ArrLen(insCodes1));
code = insCodes1[ins];
assert(sve_ins_offset < ArrLen(insCodes1));
code = insCodes1[sve_ins_offset];
break;
case 1:
assert(ins < ArrLen(insCodes2));
code = insCodes2[ins];
assert(sve_ins_offset < ArrLen(insCodes2));
code = insCodes2[sve_ins_offset];
break;
case 2:
assert(ins < ArrLen(insCodes3));
code = insCodes3[ins];
assert(sve_ins_offset < ArrLen(insCodes3));
code = insCodes3[sve_ins_offset];
break;
case 3:
assert(ins < ArrLen(insCodes4));
code = insCodes4[ins];
assert(sve_ins_offset < ArrLen(insCodes4));
code = insCodes4[sve_ins_offset];
break;
case 4:
assert(ins < ArrLen(insCodes5));
code = insCodes5[ins];
assert(sve_ins_offset < ArrLen(insCodes5));
code = insCodes5[sve_ins_offset];
break;
case 5:
assert(ins < ArrLen(insCodes6));
code = insCodes6[ins];
assert(sve_ins_offset < ArrLen(insCodes6));
code = insCodes6[sve_ins_offset];
break;
case 6:
assert(ins < ArrLen(insCodes7));
code = insCodes7[ins];
assert(sve_ins_offset < ArrLen(insCodes7));
code = insCodes7[sve_ins_offset];
break;
case 7:
assert(ins < ArrLen(insCodes8));
code = insCodes8[ins];
assert(sve_ins_offset < ArrLen(insCodes8));
code = insCodes8[sve_ins_offset];
break;
case 8:
assert(ins < ArrLen(insCodes9));
code = insCodes9[ins];
assert(sve_ins_offset < ArrLen(insCodes9));
code = insCodes9[sve_ins_offset];
break;
case 9:
assert(ins < ArrLen(insCodes10));
code = insCodes10[ins];
assert(sve_ins_offset < ArrLen(insCodes10));
code = insCodes10[sve_ins_offset];
break;
case 10:
assert(ins < ArrLen(insCodes11));
code = insCodes11[ins];
assert(sve_ins_offset < ArrLen(insCodes11));
code = insCodes11[sve_ins_offset];
break;
case 11:
assert(ins < ArrLen(insCodes12));
code = insCodes12[ins];
assert(sve_ins_offset < ArrLen(insCodes12));
code = insCodes12[sve_ins_offset];
break;
case 12:
assert(ins < ArrLen(insCodes13));
code = insCodes13[ins];
assert(sve_ins_offset < ArrLen(insCodes13));
code = insCodes13[sve_ins_offset];
break;
}

Expand Down Expand Up @@ -10633,41 +10634,236 @@ void emitter::emitIns_Call(EmitCallType callType,

/*****************************************************************************
*
* Returns an encoding for the specified register used in the 'Pd' position
* Return an encoding for the specified 'V' register used in '4' thru '0' position.
*/

/*static*/ emitter::code_t emitter::insEncodeReg_V_4_to_0(regNumber reg)
{
assert(isVectorRegister(reg));
emitter::code_t ureg = (emitter::code_t)reg - (emitter::code_t)REG_V0;
assert((ureg >= 0) && (ureg <= 32));
return ureg << 0;
}

/*****************************************************************************
*
* Return an encoding for the specified 'V' register used in '9' thru '5' position.
*/

/*static*/ emitter::code_t emitter::insEncodeReg_Pd(regNumber reg)
/*static*/ emitter::code_t emitter::insEncodeReg_V_9_to_5(regNumber reg)
{
assert(emitter::isPredicateRegister(reg));
assert(isVectorRegister(reg));
emitter::code_t ureg = (emitter::code_t)reg - (emitter::code_t)REG_V0;
assert((ureg >= 0) && (ureg <= 32));
return ureg << 5;
}

/*****************************************************************************
*
* Return an encoding for the specified 'P' register used in '12' thru '10' position.
*/

/*static*/ emitter::code_t emitter::insEncodeReg_P_12_to_10(regNumber reg)
{
assert(isPredicateRegister(reg));
emitter::code_t ureg = (emitter::code_t)reg - (emitter::code_t)REG_P0;
assert((ureg >= 0) && (ureg <= 15));
return ureg;
return ureg << 10;
}

/*****************************************************************************
*
* Return an encoding for the specified 'V' register used in '21' thru '17' position.
*/

/*static*/ emitter::code_t emitter::insEncodeReg_V_21_to_17(regNumber reg)
{
assert(isVectorRegister(reg));
emitter::code_t ureg = (emitter::code_t)reg - (emitter::code_t)REG_V0;
assert((ureg >= 0) && (ureg <= 32));
return ureg << 17;
}

/*****************************************************************************
*
* Return an encoding for the specified 'R' register used in '21' thru '17' position.
*/

/*static*/ emitter::code_t emitter::insEncodeReg_R_21_to_17(regNumber reg)
{
assert(isIntegerRegister(reg));
emitter::code_t ureg = (emitter::code_t)reg;
assert((ureg >= 0) && (ureg <= 32));
return ureg << 17;
}

/*****************************************************************************
*
* Return an encoding for the specified 'R' register used in '9' thru '5' position.
*/

/*static*/ emitter::code_t emitter::insEncodeReg_R_9_to_5(regNumber reg)
{
assert(isIntegerRegister(reg));
emitter::code_t ureg = (emitter::code_t)reg;
assert((ureg >= 0) && (ureg <= 32));
return ureg << 5;
}

/*****************************************************************************
*
* Return an encoding for the specified 'R' register used in '4' thru '0' position.
*/

/*static*/ emitter::code_t emitter::insEncodeReg_R_4_to_0(regNumber reg)
{
assert(isIntegerRegister(reg));
emitter::code_t ureg = (emitter::code_t)reg;
assert((ureg >= 0) && (ureg <= 32));
return ureg << 0;
}

/*****************************************************************************
*
* Return an encoding for the specified 'P' register used in '20' thru '17' position.
*/

/*static*/ emitter::code_t emitter::insEncodeReg_P_20_to_17(regNumber reg)
{
assert(isPredicateRegister(reg));
emitter::code_t ureg = (emitter::code_t)reg - (emitter::code_t)REG_P0;
assert((ureg >= 0) && (ureg <= 15));
return ureg << 17;
}

/*****************************************************************************
*
* Returns an encoding for the specified register used in the 'Pn' position
* Return an encoding for the specified 'P' register used in '3' thru '0' position.
*/

/*static*/ emitter::code_t emitter::insEncodeReg_Pn(regNumber reg)
/*static*/ emitter::code_t emitter::insEncodeReg_P_3_to_0(regNumber reg)
{
assert(emitter::isPredicateRegister(reg));
assert(isPredicateRegister(reg));
emitter::code_t ureg = (emitter::code_t)reg - (emitter::code_t)REG_P0;
assert((ureg >= 0) && (ureg <= 15));
return ureg << 0;
}

/*****************************************************************************
*
* Return an encoding for the specified 'P' register used in '8' thru '5' position.
*/

/*static*/ emitter::code_t emitter::insEncodeReg_P_8_to_5(regNumber reg)
{
assert(isPredicateRegister(reg));
emitter::code_t ureg = (emitter::code_t)reg - (emitter::code_t)REG_P0;
assert((ureg >= 0) && (ureg <= 15));
return ureg << 5;
}

/*****************************************************************************
*
* Returns an encoding for the specified register used in the 'Pm' position
* Return an encoding for the specified 'P' register used in '13' thru '10' position.
*/

/*static*/ emitter::code_t emitter::insEncodeReg_Pm(regNumber reg)
/*static*/ emitter::code_t emitter::insEncodeReg_P_13_to_10(regNumber reg)
{
assert(emitter::isPredicateRegister(reg));
assert(isPredicateRegister(reg));
emitter::code_t ureg = (emitter::code_t)reg - (emitter::code_t)REG_P0;
assert((ureg >= 0) && (ureg <= 15));
return ureg << 16;
return ureg << 10;
}

/*****************************************************************************
*
* Return an encoding for the specified 'R' register used in '18' thru '17' position.
*/

/*static*/ emitter::code_t emitter::insEncodeReg_R_18_to_17(regNumber reg)
{
assert(isIntegerRegister(reg));
emitter::code_t ureg = (emitter::code_t)reg;
assert((ureg >= 0) && (ureg <= 32));
return ureg << 17;
}

/*****************************************************************************
*
* Return an encoding for the specified 'P' register used in '7' thru '5' position.
*/

/*static*/ emitter::code_t emitter::insEncodeReg_P_7_to_5(regNumber reg)
{
assert(isPredicateRegister(reg));
emitter::code_t ureg = (emitter::code_t)reg - (emitter::code_t)REG_P0;
assert((ureg >= 0) && (ureg <= 15));
return ureg << 5;
}

/*****************************************************************************
*
* Return an encoding for the specified 'P' register used in '3' thru '1' position.
*/

/*static*/ emitter::code_t emitter::insEncodeReg_P_3_to_1(regNumber reg)
{
assert(isPredicateRegister(reg));
emitter::code_t ureg = (emitter::code_t)reg - (emitter::code_t)REG_P0;
assert((ureg >= 0) && (ureg <= 15));
return ureg << 1;
}

/*****************************************************************************
*
* Return an encoding for the specified 'P' register used in '2' thru '0' position.
*/

/*static*/ emitter::code_t emitter::insEncodeReg_P_2_to_0(regNumber reg)
{
assert(isPredicateRegister(reg));
emitter::code_t ureg = (emitter::code_t)reg - (emitter::code_t)REG_P0;
assert((ureg >= 0) && (ureg <= 15));
return ureg << 0;
}

/*****************************************************************************
*
* Return an encoding for the specified 'V' register used in '19' thru '17' position.
*/

/*static*/ emitter::code_t emitter::insEncodeReg_V_19_to_17(regNumber reg)
{
assert(isVectorRegister(reg));
emitter::code_t ureg = (emitter::code_t)reg - (emitter::code_t)REG_V0;
assert((ureg >= 0) && (ureg <= 32));
return ureg << 17;
}

/*****************************************************************************
*
* Return an encoding for the specified 'V' register used in '20' thru '17' position.
*/

/*static*/ emitter::code_t emitter::insEncodeReg_V_20_to_17(regNumber reg)
{
assert(isVectorRegister(reg));
emitter::code_t ureg = (emitter::code_t)reg - (emitter::code_t)REG_V0;
assert((ureg >= 0) && (ureg <= 32));
return ureg << 17;
}

/*****************************************************************************
*
* Return an encoding for the specified 'V' register used in '9' thru '6' position.
*/

/*static*/ emitter::code_t emitter::insEncodeReg_V_9_to_6(regNumber reg)
{
assert(isVectorRegister(reg));
emitter::code_t ureg = (emitter::code_t)reg - (emitter::code_t)REG_V0;
assert((ureg >= 0) && (ureg <= 32));
return ureg << 6;
}

/*****************************************************************************
Expand Down
Loading

0 comments on commit 944c4aa

Please sign in to comment.