From 608b6d5269ab9ae751f3d68ab567379df9b07bea Mon Sep 17 00:00:00 2001 From: brunph Date: Sun, 7 Jun 2026 14:50:41 +0200 Subject: [PATCH 1/3] added more operations --- src/striga/x86/control.py | 38 ++++++++++++++++++++++++++++++++++++++ src/striga/x86/data.py | 11 +++++++++++ 2 files changed, 49 insertions(+) diff --git a/src/striga/x86/control.py b/src/striga/x86/control.py index 5d58f03..c665bf0 100644 --- a/src/striga/x86/control.py +++ b/src/striga/x86/control.py @@ -393,6 +393,31 @@ def syscall(sem: Semantics): return [Successor(sem.insn.address, sem.const64(fallthrough))] +@semantic +def stc(sem: Semantics): + sem.flag_write("cf", sem.i1.constant(1)) + + +@semantic +def clc(sem: Semantics): + sem.flag_write("cf", sem.i1.constant(0)) + + +@semantic +def int_(sem: Semantics): + sem.ir.ret_void() + return [] + + +@semantic +def cmc(sem: Semantics): + sem.flag_write("cf", bool_not(sem, sem.flag_read("cf"))) + + +@semantic +def int3(sem: Semantics): + sem.ir.ret_void() + return [] @semantic def nop(sem: Semantics): pass @@ -401,3 +426,16 @@ def nop(sem: Semantics): @semantic def pause(sem: Semantics): pass +@semantic +def lfence(sem: Semantics): + pass + + +@semantic +def mfence(sem: Semantics): + pass + + +@semantic +def sfence(sem: Semantics): + pass diff --git a/src/striga/x86/data.py b/src/striga/x86/data.py index 99ab850..f008f03 100644 --- a/src/striga/x86/data.py +++ b/src/striga/x86/data.py @@ -148,6 +148,17 @@ def cqo(sem: Semantics): sem.reg_write("rdx", sem.ir.ashr(rax, sem.const64(63))) +@semantic +def bswap(sem: Semantics): + value = sem.op_read(0) + width = value.type.int_width + assert width in (32, 64) + + intrinsic = sem.module.get_intrinsic_declaration( + lookup_intrinsic_id(f"llvm.bswap.i{width}"), + [value.type], + ) + sem.op_write(0, sem.ir.call(intrinsic, [value])) @semantic def xchg(sem: Semantics): src = sem.op_read(1) From c4d973629a77be7552a1379cdac795b43ac5f816 Mon Sep 17 00:00:00 2001 From: brunph Date: Wed, 17 Jun 2026 02:08:22 +0200 Subject: [PATCH 2/3] Fixed bswap semantic --- src/striga/x86/data.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/striga/x86/data.py b/src/striga/x86/data.py index f008f03..bd420c8 100644 --- a/src/striga/x86/data.py +++ b/src/striga/x86/data.py @@ -1,5 +1,5 @@ from capstone import CS_OP_REG - +from llvm import lookup_intrinsic_id from ..semantics import FLAGS, Semantics, semantic @@ -151,14 +151,11 @@ def cqo(sem: Semantics): @semantic def bswap(sem: Semantics): value = sem.op_read(0) - width = value.type.int_width - assert width in (32, 64) - intrinsic = sem.module.get_intrinsic_declaration( - lookup_intrinsic_id(f"llvm.bswap.i{width}"), - [value.type], - ) + intrinsic = sem.module.get_intrinsic_declaration(lookup_intrinsic_id("llvm.bswap"), [value.type]) + sem.op_write(0, sem.ir.call(intrinsic, [value])) + @semantic def xchg(sem: Semantics): src = sem.op_read(1) From 98aa89e2d96add2aa59c44180b0f2a09051422ff Mon Sep 17 00:00:00 2001 From: brunph Date: Sat, 20 Jun 2026 14:24:17 +0200 Subject: [PATCH 3/3] correct bswap 16-bit implementation --- src/striga/x86/data.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/striga/x86/data.py b/src/striga/x86/data.py index bd420c8..996511c 100644 --- a/src/striga/x86/data.py +++ b/src/striga/x86/data.py @@ -150,11 +150,17 @@ def cqo(sem: Semantics): @semantic def bswap(sem: Semantics): - value = sem.op_read(0) + op = sem.insn.operands[0] - intrinsic = sem.module.get_intrinsic_declaration(lookup_intrinsic_id("llvm.bswap"), [value.type]) + if op.size == 2: + full, _, _ = sem.subregs[sem.reg_name(op.reg)] + value = sem.ir.trunc(sem.reg_read(full), sem.i32) + else: + value = sem.op_read(0) - sem.op_write(0, sem.ir.call(intrinsic, [value])) + intrinsic = sem.module.get_intrinsic_declaration(lookup_intrinsic_id("llvm.bswap"), [value.type]) + result = sem.ir.call(intrinsic, [value]) + sem.op_write(0, sem.resize_int(result, sem.i16) if op.size == 2 else result) @semantic def xchg(sem: Semantics):