Why should I know this?

[AArch64] STPX 본문

LLVM-STUDY/MIR

[AArch64] STPX

die4taoam 2024. 3. 18. 21:26

원문 출처 : https://developer.arm.com/documentation/ddi0602/2023-12/Base-Instructions/STP--Store-Pair-of-Registers-?lang=en#iclass_post_index

 

Documentation – Arm Developer

 

developer.arm.com

 

// FIXME: Use dedicated range-checked addressing mode operand here.
defm STPW : StorePairOffset<0b00, 0, GPR32z, simm7s4, "stp">;
defm STPX : StorePairOffset<0b10, 0, GPR64z, simm7s8, "stp">;

 

multiclass StorePairOffset<bits<2> opc, bit V, RegisterOperand regtype,
                           Operand indextype, string asm> {
  let hasSideEffects = 0, mayLoad = 0, mayStore = 1 in
  def i : BaseLoadStorePairOffset<opc, V, 0, (outs),
                                  (ins regtype:$Rt, regtype:$Rt2,
                                       GPR64sp:$Rn, indextype:$offset),
                                  asm>,
          Sched<[WriteSTP]>;

  def : InstAlias<asm # "\t$Rt, $Rt2, [$Rn]",
                  (!cast<Instruction>(NAME # "i") regtype:$Rt, regtype:$Rt2,
                                                  GPR64sp:$Rn, 0)>;
}

 

class BaseLoadStorePairOffset<bits<2> opc, bit V, bit L, dag oopsdag iops,
                              string asm>
    : I<oopsiops, asm, "\t$Rt, $Rt2, [$Rn, $offset]", "", []> {
  bits<5> Rt;
  bits<5> Rt2;
  bits<5> Rn;
  bits<7> offset;
  let Inst{31-30} = opc;
  let Inst{29-27} = 0b101;
  let Inst{26}    = V;
  let Inst{25-23} = 0b010;
  let Inst{22}    = L;
  let Inst{21-15} = offset;
  let Inst{14-10} = Rt2;
  let Inst{9-5}   = Rn;
  let Inst{4-0}   = Rt;

  let DecoderMethod = "DecodePairLdStInstruction";
}

 

// Normal instructions
class I<dag oops, dag iops, string asm, string operands, string cstr,
        list<dag> pattern>
    : EncodedI<cstr, pattern> {
  dag OutOperandList = oops;
  dag InOperandList  = iops;
  let AsmString      = !strconcat(asm, operands);
}

 

oops (outs)
iops (ins regtype:$Rt, regtype:$Rt2,
                                       GPR64sp:$Rn, indextype:$offset)
Pattern :  [(storeop 
        (Ty regtype:$Rt),

        (ro_Xindexed64 GPR64sp:$Rn, GPR64:$Rm, ro_Xextend64:$extend))]

 

 

STP

레지스터 쌍 저장은 기본 레지스터 값과 즉시 오프셋에서 주소를 계산하고 두 개의 레지스터에서 계산된 주소에 32비트 단어 2개 또는 64비트 이중 단어 2개를 저장합니다. 메모리 액세스에 대한 자세한 내용은 로드/저장 주소 지정 모드를 참조하세요.

 

 

Post-Index

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
x 0 1 0 1 0 0 0 1 0 imm7 Rt2 Rn Rt
opc       L        
boolean wback = TRUE;
boolean postindex = TRUE;

 

Pre-Index

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
x 0 1 0 1 0 0 1 1 0 imm7 Rt2 Rn Rt
opc       L        
boolean wback = TRUE;
boolean postindex = FALSE;

 

Signed offset

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
x 0 1 0 1 0 0 1 0 0 imm7 Rt2 Rn Rt
opc       L        
boolean wback = FALSE;
boolean postindex = FALSE;

 

wback, postindex 는 다음처럼 사용된다.

if n == 31 then
    CheckSPAlignment();
    address = SP[];
else
    address = X[n, 64];

if !postindex then
   address = GenerateAddress(address, offset, accdesc);

... 

if wback then
    if postindex then
        address = GenerateAddress(address, offset, accdesc);
    if n == 31 then
        SP[] = address;
    else
        X[n, 64] = address;

 

postindex == FALSE

  address = address+offset (offset 계산은 언제나처럼  (register size * imm))

 

wback == TRUE

  postindex == TRUE,

    address = address + offset

  n==31(sp)

    sp = address

  else

    X[n, 64] = address

 

postindex는 메모리 적재까지의 과정을 모두 마무리하고 주소의 재 계산에 들어가는데, 이 과정에서 변경되는 것은 오직 accdesc이다.

IsFeatureImplemented(FEAT_LSE2)

위 기능이 활성화 되었을 경우

accdesc.ispair = TRUE;

로 활성화 되는데, 이걸로 어떤 변화가 생기는지는 모르겠다.

 

 

 

STRX와 마찬가지로 STP 역시 7Bit field 를 imm으로 할당한다.

그러므로 이 값의 범위를 넘어서면 동일하게 에러메시지를 보여준다.

 

error: index must be a multiple of 8 in range [-512, 504].

 

라고 나오지만 scale이 포함되므로 64bit 대상이라면 63이 MAX이고,

이는 Signed Offset 값으로 따지면  -512~504이다.

 

'LLVM-STUDY > MIR' 카테고리의 다른 글

LESSONS IN TABLEGEN  (0) 2024.06.21
[AArch64] STR (STRroX, STRXui)  (0) 2024.06.20
[AArch64] LDR (LDRroX, LDRXui)  (0) 2024.04.16
Comments