mirror of
https://github.com/fluencelabs/wasmer
synced 2025-03-16 16:20:49 +00:00
Add emitter for LOCK CMPXCHG so that we can emit compare-and-swap loops.
This commit is contained in:
parent
efc89e829d
commit
81895830f0
@ -97,6 +97,7 @@ pub trait Emitter {
|
||||
fn emit_movsx(&mut self, sz_src: Size, src: Location, sz_dst: Size, dst: Location);
|
||||
fn emit_xchg(&mut self, sz: Size, src: Location, dst: Location);
|
||||
fn emit_lock_xadd(&mut self, sz: Size, src: Location, dst: Location);
|
||||
fn emit_lock_cmpxchg(&mut self, sz: Size, src: Location, dst: Location);
|
||||
|
||||
fn emit_btc_gpr_imm8_32(&mut self, src: u8, dst: GPR);
|
||||
fn emit_btc_gpr_imm8_64(&mut self, src: u8, dst: GPR);
|
||||
@ -858,6 +859,24 @@ impl Emitter for Assembler {
|
||||
}
|
||||
}
|
||||
|
||||
fn emit_lock_cmpxchg(&mut self, sz: Size, src: Location, dst: Location) {
|
||||
match (sz, src, dst) {
|
||||
(Size::S8, Location::GPR(src), Location::Memory(dst, disp)) => {
|
||||
dynasm!(self ; lock cmpxchg [Rq(dst as u8) + disp], Rb(src as u8));
|
||||
}
|
||||
(Size::S16, Location::GPR(src), Location::Memory(dst, disp)) => {
|
||||
dynasm!(self ; lock cmpxchg [Rq(dst as u8) + disp], Rw(src as u8));
|
||||
}
|
||||
(Size::S32, Location::GPR(src), Location::Memory(dst, disp)) => {
|
||||
dynasm!(self ; lock cmpxchg [Rq(dst as u8) + disp], Rd(src as u8));
|
||||
}
|
||||
(Size::S64, Location::GPR(src), Location::Memory(dst, disp)) => {
|
||||
dynasm!(self ; lock cmpxchg [Rq(dst as u8) + disp], Rq(src as u8));
|
||||
}
|
||||
_ => panic!("LOCK CMPXCHG {:?} {:?} {:?}", sz, src, dst),
|
||||
}
|
||||
}
|
||||
|
||||
fn emit_btc_gpr_imm8_32(&mut self, src: u8, dst: GPR) {
|
||||
dynasm!(self ; btc Rd(dst as u8), BYTE src as i8);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user