@@ -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