|
1 | 1 | //! This module defines x86_64-specific machine instruction types. |
2 | 2 |
|
3 | 3 | use crate::binemit::{CodeOffset, StackMap}; |
4 | | -use crate::ir::{types, ExternalName, Opcode, SourceLoc, TrapCode, Type}; |
| 4 | +use crate::ir::{types, ExternalName, Opcode, SourceLoc, TrapCode, Type, ValueLabel}; |
5 | 5 | use crate::isa::x64::settings as x64_settings; |
6 | 6 | use crate::machinst::*; |
7 | 7 | use crate::{settings, settings::Flags, CodegenError, CodegenResult}; |
@@ -474,6 +474,9 @@ pub enum Inst { |
474 | 474 | /// reports its own `def`s/`use`s/`mod`s; this adds complexity (the instruction list is no |
475 | 475 | /// longer flat) and requires knowledge about semantics and initial-value independence anyway. |
476 | 476 | XmmUninitializedValue { dst: Writable<Reg> }, |
| 477 | + |
| 478 | + /// A definition of a value label. |
| 479 | + ValueLabelMarker { reg: Reg, label: ValueLabel }, |
477 | 480 | } |
478 | 481 |
|
479 | 482 | pub(crate) fn low32_will_sign_extend_to_64(x: u64) -> bool { |
@@ -532,7 +535,8 @@ impl Inst { |
532 | 535 | | Inst::XmmCmpRmR { .. } |
533 | 536 | | Inst::XmmLoadConst { .. } |
534 | 537 | | Inst::XmmMinMaxSeq { .. } |
535 | | - | Inst::XmmUninitializedValue { .. } => None, |
| 538 | + | Inst::XmmUninitializedValue { .. } |
| 539 | + | Inst::ValueLabelMarker { .. } => None, |
536 | 540 |
|
537 | 541 | // These use dynamic SSE opcodes. |
538 | 542 | Inst::GprToXmm { op, .. } |
@@ -1762,6 +1766,10 @@ impl PrettyPrint for Inst { |
1762 | 1766 | Inst::Hlt => "hlt".into(), |
1763 | 1767 |
|
1764 | 1768 | Inst::Ud2 { trap_code } => format!("ud2 {}", trap_code), |
| 1769 | + |
| 1770 | + Inst::ValueLabelMarker { label, reg } => { |
| 1771 | + format!("value_label {:?}, {}", label, reg.show_rru(mb_rru)) |
| 1772 | + } |
1765 | 1773 | } |
1766 | 1774 | } |
1767 | 1775 | } |
@@ -2021,6 +2029,9 @@ fn x64_get_regs(inst: &Inst, collector: &mut RegUsageCollector) { |
2021 | 2029 | | Inst::Fence { .. } => { |
2022 | 2030 | // No registers are used. |
2023 | 2031 | } |
| 2032 | + Inst::ValueLabelMarker { reg, .. } => { |
| 2033 | + collector.add_use(*reg); |
| 2034 | + } |
2024 | 2035 | } |
2025 | 2036 | } |
2026 | 2037 |
|
@@ -2385,6 +2396,8 @@ fn x64_map_regs<RUM: RegUsageMapper>(inst: &mut Inst, mapper: &RUM) { |
2385 | 2396 | dst.map_uses(mapper); |
2386 | 2397 | } |
2387 | 2398 |
|
| 2399 | + Inst::ValueLabelMarker { ref mut reg, .. } => map_use(mapper, reg), |
| 2400 | + |
2388 | 2401 | Inst::Ret |
2389 | 2402 | | Inst::EpiloguePlaceholder |
2390 | 2403 | | Inst::JmpKnown { .. } |
@@ -2473,6 +2486,17 @@ impl MachInst for Inst { |
2473 | 2486 | } |
2474 | 2487 | } |
2475 | 2488 |
|
| 2489 | + fn stack_op_info(&self) -> Option<MachInstStackOpInfo> { |
| 2490 | + match self { |
| 2491 | + Self::VirtualSPOffsetAdj { offset } => Some(MachInstStackOpInfo::NomSPAdj(*offset)), |
| 2492 | + Self::MovRM { size: 8, src, dst: SyntheticAmode::NominalSPOffset { simm32 } } => |
| 2493 | + Some(MachInstStackOpInfo::StoreNomSPOff(*src, *simm32 as i64)), |
| 2494 | + Self::Mov64MR { src: SyntheticAmode::NominalSPOffset { simm32 }, dst } => |
| 2495 | + Some(MachInstStackOpInfo::LoadNomSPOff(dst.to_reg(), *simm32 as i64)), |
| 2496 | + _ => None, |
| 2497 | + } |
| 2498 | + } |
| 2499 | + |
2476 | 2500 | fn gen_move(dst_reg: Writable<Reg>, src_reg: Reg, ty: Type) -> Inst { |
2477 | 2501 | let rc_dst = dst_reg.to_reg().get_class(); |
2478 | 2502 | let rc_src = src_reg.get_class(); |
@@ -2636,6 +2660,17 @@ impl MachInst for Inst { |
2636 | 2660 | RegClass::I64 |
2637 | 2661 | } |
2638 | 2662 |
|
| 2663 | + fn gen_value_label_marker(label: ValueLabel, reg: Reg) -> Self { |
| 2664 | + Inst::ValueLabelMarker { label, reg } |
| 2665 | + } |
| 2666 | + |
| 2667 | + fn defines_value_label(&self) -> Option<(ValueLabel, Reg)> { |
| 2668 | + match self { |
| 2669 | + Inst::ValueLabelMarker { label, reg } => Some((*label, *reg)), |
| 2670 | + _ => None, |
| 2671 | + } |
| 2672 | + } |
| 2673 | + |
2639 | 2674 | type LabelUse = LabelUse; |
2640 | 2675 | } |
2641 | 2676 |
|
|
0 commit comments