mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 19:42:36 +02:00
176 lines
4.3 KiB
Text
176 lines
4.3 KiB
Text
#---------------------------------------------------------------------
|
|
# 8.3.7 Shift Operations
|
|
#---------------------------------------------------------------------
|
|
|
|
macro do_asr(VAL, SA, DEST) {
|
|
tmp:8 = zext(VAL) << 32;
|
|
tmp = tmp s>> SA;
|
|
DEST = VAL s>> SA;
|
|
C = (tmp & 0x0000000080000000) != 0;
|
|
NZSTATUS(DEST);
|
|
|
|
}
|
|
|
|
#---------------------------------------------------------------------
|
|
# ASR - Arithmetic Shift Right
|
|
# I. {d, x, y} -> {0, 1, ..., 15}
|
|
# II. d -> {0, 1, ..., 15}
|
|
# sa -> {0, 1, ..., 31}
|
|
# III. {d, s} -> {0, 1, ..., 15}
|
|
# sa -> {0, 1, ..., 31}
|
|
#---------------------------------------------------------------------
|
|
|
|
# ASR Format I
|
|
# Operation: Rd <- ASR(Rx, Ry[4:0])
|
|
# Syntax: asr Rd, Rx, Ry
|
|
# 111x xxx0 0000 yyyy 0000 1000 0100 dddd
|
|
|
|
:ASR erd0, RX9A, RY0A is op13_3=7 & op4_5=0 & RY0A & RX9A;
|
|
eop4_12=0x084 & erd0
|
|
{
|
|
do_asr(RX9A, RY0A, erd0);
|
|
}
|
|
|
|
# ASR Format II
|
|
# Operation: Rd <- ASR(Rd, sa5)
|
|
# Syntax: asr Rd, sa
|
|
# 101t ttt1 010t dddd
|
|
|
|
:ASR rd0, shift is op13_3=5 & op5_4=0xa & shift9_4 & shift4_1 & rd0
|
|
[ shift = (shift9_4 << 1) | shift4_1; ]
|
|
{
|
|
do_asr(rd0, shift, rd0);
|
|
}
|
|
|
|
# ASR Format III
|
|
# Operation: Rd <- ASR(Rs, sa5)
|
|
# Syntax: asr Rd, Rs, sa
|
|
# 111s sss0 0000 dddd 0001 0100 000t tttt
|
|
|
|
:ASR rd0, RS9A, shift0_5 is op13_3=7 & op5_4=0 & RS9A & rd0;
|
|
eop5_11=0xa0 & shift0_5
|
|
{
|
|
do_asr(RS9A, shift0_5, rd0);
|
|
}
|
|
|
|
macro do_lsl(VAL, SA, DEST) {
|
|
tmp:8 = zext(VAL);
|
|
tmp = tmp << SA;
|
|
DEST = tmp:4;
|
|
C = (tmp & 0x0000000100000000) != 0;
|
|
NZSTATUS(DEST);
|
|
}
|
|
|
|
#---------------------------------------------------------------------
|
|
# LSL - Logical Shift Left
|
|
# I. {d, x, y} -> {0, 1, ..., 15}
|
|
# II. d -> {0, 1, ..., 15}
|
|
# sa -> {0, 1, ..., 31}
|
|
# III. {d, s} -> {0, 1, ..., 15}
|
|
# sa -> {0, 1, ..., 31}
|
|
#---------------------------------------------------------------------
|
|
|
|
# LSL Format I
|
|
# Operation: Rd <- LSL(Rx, Ry[4:0])
|
|
# Syntax: lsl Rd, Rx, Ry
|
|
# 111x xxx0 0000 yyyy 0000 1001 0100 dddd
|
|
|
|
:LSL erd0, RX9A, RY0A is op13_3=7 & op4_5=0 & RY0A & RX9A;
|
|
eop4_12=0x094 & erd0
|
|
{
|
|
tmp:4 = RY0A & 0x0000001F;
|
|
do_lsl(RX9A, tmp, erd0);
|
|
}
|
|
|
|
# LSL Format II
|
|
# Operation: Rd <- LSL(Rd, sa5)
|
|
# Syntax: lsl Rd, sa
|
|
# 101t ttt1 011t dddd
|
|
|
|
:LSL rd0, shift is op13_3=5 & op5_4=0xb & shift9_4 & shift4_1 & rd0
|
|
[ shift = (shift9_4 << 1) | shift4_1; ]
|
|
{
|
|
do_lsl(rd0, shift, rd0);
|
|
}
|
|
|
|
# LSL Format III
|
|
# Operation: Rd <- LSL(Rs, sa5)
|
|
# Syntax: lsl Rd, Rs, sa
|
|
# 111s sss0 0000 dddd 0001 0101 000t tttt
|
|
|
|
:LSL rd0, RS9A, shift0_5 is op13_3=7 & op5_4=0 & RS9A & rd0;
|
|
eop5_11=0xa8 & shift0_5
|
|
{
|
|
do_lsl(RS9A, shift0_5, rd0);
|
|
}
|
|
|
|
macro do_lsr(VAL, SA, DEST) {
|
|
tmp:8 = zext(VAL) << 32;
|
|
tmp = tmp >> SA;
|
|
DEST = VAL >> SA;
|
|
C = (tmp & 0x0000000080000000) != 0;
|
|
NZSTATUS(DEST);
|
|
}
|
|
|
|
#---------------------------------------------------------------------
|
|
# LSR - Logical Shift Right
|
|
# I. {d, x, y} -> {0, 1, ..., 15}
|
|
# II. d -> {0, 1, ..., 15}
|
|
# sa -> {0, 1, ..., 31}
|
|
# III. {d, s} -> {0, 1, ..., 15}
|
|
# sa -> {0, 1, ..., 31}
|
|
#---------------------------------------------------------------------
|
|
|
|
# LSR Format I
|
|
# Operation: Rd <- LSR(Rx, Ry[4:0])
|
|
# Syntax: lsr Rd, Rx, Ry
|
|
# 111x xxx0 0000 yyyy 0000 1010 0100 dddd
|
|
|
|
:LSR erd0, RX9A, RY0A is op13_3=7 & op4_5=0 & RY0A & RX9A;
|
|
eop4_12=0x0a4 & erd0
|
|
{
|
|
tmp:4 = RY0A & 0x0000001F;
|
|
do_lsr(RX9A, tmp, erd0);
|
|
}
|
|
|
|
# LSR Format II
|
|
# Operation: Rd <- LSR(Rd, sa5)
|
|
# Syntax: lsr Rd, sa
|
|
# 101t ttt1 100t dddd
|
|
|
|
:LSR rd0, shift is op13_3=5 & op5_4=0xc & shift9_4 & shift4_1 & rd0
|
|
[ shift = (shift9_4 << 1) | shift4_1; ]
|
|
{
|
|
do_lsr(rd0, shift, rd0);
|
|
}
|
|
|
|
# LSR Format III
|
|
# Operation: Rd <- LSR(Rs, sa5)
|
|
# Syntax: lsr Rd, Rs, sa
|
|
# 111s sss0 0000 dddd 0001 0110 000t tttt
|
|
|
|
:LSR rd0, RS9A, shift0_5 is op13_3=7 & op5_4=0 & RS9A & rd0;
|
|
eop5_11=0xb0 & shift0_5
|
|
{
|
|
do_lsr(RS9A, shift0_5, rd0);
|
|
}
|
|
|
|
:ROL rd0 is op4_12=0x5cf & rd0 {
|
|
tmp:4 = rd0 >> 31;
|
|
tmpa:4 = zext(C);
|
|
rd0 = rd0 << 1;
|
|
rd0 = rd0 | tmpa;
|
|
C = tmp:1;
|
|
CZNVTOSR();
|
|
}
|
|
|
|
:ROR rd0 is op4_12=0x5d0 & rd0 {
|
|
tmp:4 = rd0 & 0x1;
|
|
tmpa:4 = zext(C);
|
|
tmpa = tmpa << 31;
|
|
rd0 = rd0 >> 1;
|
|
rd0 = rd0 | tmpa;
|
|
C = tmp:1;
|
|
CZNVTOSR();
|
|
}
|
|
|