diff --git a/lib/singlepass-backend/src/emitter_x64.rs b/lib/singlepass-backend/src/emitter_x64.rs index 4fb4e0ebb..8882ef82c 100644 --- a/lib/singlepass-backend/src/emitter_x64.rs +++ b/lib/singlepass-backend/src/emitter_x64.rs @@ -215,6 +215,10 @@ pub trait Emitter { fn arch_has_fneg(&self) -> bool { false } fn arch_emit_f32_neg(&mut self, _src: XMM, _dst: XMM) { unimplemented!() } fn arch_emit_f64_neg(&mut self, _src: XMM, _dst: XMM) { unimplemented!() } + + fn arch_has_xzcnt(&self) -> bool { false } + fn arch_emit_lzcnt(&mut self, _sz: Size, _src: Location, _dst: Location) { unimplemented!() } + fn arch_emit_tzcnt(&mut self, _sz: Size, _src: Location, _dst: Location) { unimplemented!() } } fn _dummy(a: &mut Assembler) { diff --git a/lib/singlepass-backend/src/translator_aarch64.rs b/lib/singlepass-backend/src/translator_aarch64.rs index 5083ca844..4530db39b 100644 --- a/lib/singlepass-backend/src/translator_aarch64.rs +++ b/lib/singlepass-backend/src/translator_aarch64.rs @@ -94,6 +94,14 @@ pub fn map_xmm(xmm: XMM) -> AV { XMM5 => AV(5), XMM6 => AV(6), XMM7 => AV(7), + XMM8 => AV(8), + XMM9 => AV(9), + XMM10 => AV(10), + XMM11 => AV(11), + XMM12 => AV(12), + XMM13 => AV(13), + XMM14 => AV(14), + XMM15 => AV(15), } } @@ -1195,12 +1203,22 @@ impl Emitter for Assembler { fn emit_or(&mut self, sz: Size, src: Location, dst: Location) { binop_all_nofp!(orr, self, sz, src, dst, { unreachable!("or") }); } - fn emit_lzcnt(&mut self, sz: Size, src: Location, dst: Location) { + fn emit_bsr(&mut self, sz: Size, src: Location, dst: Location) { + unimplemented!("aarch64: bsr"); + } + fn emit_bsf(&mut self, sz: Size, src: Location, dst: Location) { + unimplemented!("aarch64: bsf"); + } + fn arch_has_xzcnt(&self) -> bool { true } + fn arch_emit_lzcnt(&mut self, sz: Size, src: Location, dst: Location) { emit_clz_variant(self, sz, &src, &dst, false); } - fn emit_tzcnt(&mut self, sz: Size, src: Location, dst: Location) { + fn arch_emit_tzcnt(&mut self, sz: Size, src: Location, dst: Location) { emit_clz_variant(self, sz, &src, &dst, true); } + fn emit_neg(&mut self, sz: Size, value: Location) { + unimplemented!("aarch64: neg"); + } fn emit_popcnt(&mut self, sz: Size, src: Location, dst: Location) { match sz { Size::S32 => { @@ -1363,6 +1381,48 @@ impl Emitter for Assembler { } } + fn emit_xchg(&mut self, sz: Size, src: Location, dst: Location) { + unimplemented!("aarch64: xchg") + } + fn emit_lock_xadd(&mut self, sz: Size, src: Location, dst: Location) { + unimplemented!("aarch64: xadd") + } + fn emit_lock_cmpxchg(&mut self, sz: Size, src: Location, dst: Location) { + unimplemented!("aarch64: cmpxchg") + } + fn emit_vmovaps(&mut self, src: XMMOrMemory, dst: XMMOrMemory) { + unimplemented!("aarch64: vmovaps") + } + fn emit_vmovapd(&mut self, src: XMMOrMemory, dst: XMMOrMemory) { + unimplemented!("aarch64: vmovapd") + } + fn emit_vxorps(&mut self, src1: XMM, src2: XMMOrMemory, dst: XMM) { + unimplemented!("aarch64: vxorps") + } + fn emit_vxorpd(&mut self, src1: XMM, src2: XMMOrMemory, dst: XMM) { + unimplemented!("aarch64: vxorpd") + } + fn emit_vcmpunordss(&mut self, src1: XMM, src2: XMMOrMemory, dst: XMM) { + unimplemented!("aarch64: vcmpunordss") + } + fn emit_vcmpunordsd(&mut self, src1: XMM, src2: XMMOrMemory, dst: XMM) { + unimplemented!("aarch64: vcmpunordsd") + } + + fn emit_vcmpordss(&mut self, src1: XMM, src2: XMMOrMemory, dst: XMM) { + unimplemented!("aarch64: vcmpordss") + } + fn emit_vcmpordsd(&mut self, src1: XMM, src2: XMMOrMemory, dst: XMM) { + unimplemented!("aarch64: vcmpordsd") + } + + fn emit_vblendvps(&mut self, src1: XMM, src2: XMMOrMemory, mask: XMM, dst: XMM) { + unimplemented!("aarch64: vblendvps") + } + fn emit_vblendvpd(&mut self, src1: XMM, src2: XMMOrMemory, mask: XMM, dst: XMM) { + unimplemented!("aarch64: vblendvpd") + } + avx_fn!(fadd, S, W, emit_vaddss); avx_fn!(fsub, S, W, emit_vsubss); avx_fn!(fmul, S, W, emit_vmulss);