瀏覽代碼

UserspaceEmulator: Split SAR inline assembly into 8/16/32 bit variants

Andreas Kling 5 年之前
父節點
當前提交
133803b8a7
共有 1 個文件被更改,包括 13 次插入4 次删除
  1. 13 4
      DevTools/UserspaceEmulator/SoftCPU.cpp

+ 13 - 4
DevTools/UserspaceEmulator/SoftCPU.cpp

@@ -702,12 +702,21 @@ T SoftCPU::sar_impl(T data, u8 steps)
 
 
     u32 result = 0;
     u32 result = 0;
     u32 new_flags = 0;
     u32 new_flags = 0;
-    asm("sarl %%cl, %%eax\n"
+
+    if constexpr (sizeof(T) == 4)
+        asm volatile("sarl %%cl, %%eax\n" ::"a"(data), "c"(steps));
+    else if constexpr (sizeof(T) == 2)
+        asm volatile("sarw %%cl, %%ax\n" ::"a"(data), "c"(steps));
+    else if constexpr (sizeof(T) == 1)
+        asm volatile("sarb %%cl, %%al\n" ::"a"(data), "c"(steps));
+
+    asm volatile(
         "mov %%eax, %%ebx\n"
         "mov %%eax, %%ebx\n"
+        : "=b"(result));
+    asm volatile(
         "pushf\n"
         "pushf\n"
-        "pop %%eax\n"
-        : "=a"(new_flags), "=b"(result)
-        : "a"(data), "c"(steps));
+        "pop %%eax"
+        : "=a"(new_flags));
 
 
     set_flags_oszapc(new_flags);
     set_flags_oszapc(new_flags);
     return result;
     return result;