Greetings!
I am currently porting a simple JIT, used in a compiler construction class, from C++ to Rust. In C++, I used the asmjit project.
In asmjit, memory operands and registers can be used as values, i.e. I can assign a memory operands to a variable and later use it in an assembler call
auto foo = x86::qword_ptr(x86::rbp, -off_s);
as.mov(foo, 42);
If I want to use a value stored in memory at the moment, I have to repeat
let a = Foo::from_rbp_offset(8);
let b = Foo::from_rbp_offset(16);
dynasm!(self.as
; mov rax, QWORD [rbp - a.offset]
; add rax, QWORD [rbp - b.offset]);
I.e. I have to repeat the memory reference each time.
It would be really handy to have a feature similar to the asmjit one in this crate, i.e. being able to do something like
enum Location {
Register(reg),
RegisterStaticOffset(reg, offset),
RegisterDynamicOffset(reg, reg),
}
impl MemoryReference for Foo {
fn location(&self) -> Location;
}
fn load_to_rax(mut self, loc: Foo) {
dynasm!(self.as
; mov rax, QWORD [loc]);
}
Because then you could encapsulate where certain values are stored (relative to rbp, relative to rsp, etc.) in the Trait Implementation.
I do not know too much about Rust macros, so I apologize if something like this is not feasible to implement.
On the other hand, I'd be willing to tinker with this myself, I would just need a pointer (or reference) in the right direction.
Best regards!
Greetings!
I am currently porting a simple JIT, used in a compiler construction class, from C++ to Rust. In C++, I used the asmjit project.
In asmjit, memory operands and registers can be used as values, i.e. I can assign a memory operands to a variable and later use it in an assembler call
If I want to use a value stored in memory at the moment, I have to repeat
I.e. I have to repeat the memory reference each time.
It would be really handy to have a feature similar to the asmjit one in this crate, i.e. being able to do something like
Because then you could encapsulate where certain values are stored (relative to
rbp, relative torsp, etc.) in the Trait Implementation.I do not know too much about Rust macros, so I apologize if something like this is not feasible to implement.
On the other hand, I'd be willing to tinker with this myself, I would just need a pointer (or reference) in the right direction.
Best regards!