Skip to content

Commit a045849

Browse files
committed
X86Assembler: Implement SHL and SAR Instructions
1 parent cdf08dd commit a045849

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

src/libasr/codegen/x86_assembler.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1254,6 +1254,38 @@ class X86Assembler {
12541254
EMIT("syscall");
12551255
}
12561256

1257+
// SHL - Shift Logical/Unsigned Left
1258+
void asm_shl_r64_cl(X64Reg r64) {
1259+
X86Reg r32 = X86Reg(r64 & 7);
1260+
m_code.push_back(m_al, rex(1, 0, 0, r64 >> 3));
1261+
m_code.push_back(m_al, 0xD3);
1262+
modrm_sib_disp(m_code, m_al, X86Reg::esp, &r32, nullptr, 1, 0, false);
1263+
EMIT("shl " + r2s(r64) + ", cl");
1264+
}
1265+
1266+
// SHL - Shift Logical/Unsigned Left
1267+
void asm_shl_r32_cl(X86Reg r32) {
1268+
m_code.push_back(m_al, 0xD3);
1269+
modrm_sib_disp(m_code, m_al, X86Reg::esp, &r32, nullptr, 1, 0, false);
1270+
EMIT("shl " + r2s(r32) + ", cl");
1271+
}
1272+
1273+
// SAR - Shift Arithmetic/Signed Right
1274+
void asm_sar_r64_cl(X64Reg r64) {
1275+
X86Reg r32 = X86Reg(r64 & 7);
1276+
m_code.push_back(m_al, rex(1, 0, 0, r64 >> 3));
1277+
m_code.push_back(m_al, 0xD3);
1278+
modrm_sib_disp(m_code, m_al, X86Reg::edi, &r32, nullptr, 1, 0, false);
1279+
EMIT("sar " + r2s(r64) + ", cl");
1280+
}
1281+
1282+
// SAR - Shift Arithmetic/Signed Right
1283+
void asm_sar_r32_cl(X86Reg r32) {
1284+
m_code.push_back(m_al, 0xD3);
1285+
modrm_sib_disp(m_code, m_al, X86Reg::edi, &r32, nullptr, 1, 0, false);
1286+
EMIT("sar " + r2s(r32) + ", cl");
1287+
}
1288+
12571289
void asm_fld_m32(X86Reg *base, X86Reg *index,
12581290
uint8_t scale, int32_t disp) {
12591291
m_code.push_back(m_al, 0xd9);

0 commit comments

Comments
 (0)