일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- LLVM
- TLS
- Android
- pthread
- 안티디버깅
- tracing
- OSR
- v8 tracing
- tracerpid
- Injection
- v8 optimizing
- uftrace
- linux thread
- on stack replacement
- 난독화
- LLVM Obfuscator
- Linux packer
- anti debugging
- on-stack replacement
- so inject
- pinpoint
- Obfuscator
- linux debugging
- LLVM 난독화
- custom packer
- Linux custom packer
- thread local storage
- initial-exec
- apm
- android inject
- Today
- Total
Why should I know this?
[AArch64] STPX 본문
// 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 oops, dag iops,
string asm>
: I<oops, iops, 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 |