From 608b6d5269ab9ae751f3d68ab567379df9b07bea Mon Sep 17 00:00:00 2001 From: brunph Date: Sun, 7 Jun 2026 14:50:41 +0200 Subject: [PATCH 1/2] 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/2] 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)