Path: blob/main/cranelift/codegen/meta/src/shared/formats.rs
1693 views
use crate::cdsl::formats::{InstructionFormat, InstructionFormatBuilder as Builder};1use crate::shared::{entities::EntityRefs, immediates::Immediates};2use std::rc::Rc;34pub(crate) struct Formats {5pub(crate) atomic_cas: Rc<InstructionFormat>,6pub(crate) atomic_rmw: Rc<InstructionFormat>,7pub(crate) binary: Rc<InstructionFormat>,8pub(crate) binary_imm8: Rc<InstructionFormat>,9pub(crate) binary_imm64: Rc<InstructionFormat>,10pub(crate) branch_table: Rc<InstructionFormat>,11pub(crate) brif: Rc<InstructionFormat>,12pub(crate) call: Rc<InstructionFormat>,13pub(crate) call_indirect: Rc<InstructionFormat>,14pub(crate) try_call: Rc<InstructionFormat>,15pub(crate) try_call_indirect: Rc<InstructionFormat>,16pub(crate) cond_trap: Rc<InstructionFormat>,17pub(crate) float_compare: Rc<InstructionFormat>,18pub(crate) func_addr: Rc<InstructionFormat>,19pub(crate) int_compare: Rc<InstructionFormat>,20pub(crate) int_compare_imm: Rc<InstructionFormat>,21pub(crate) int_add_trap: Rc<InstructionFormat>,22pub(crate) jump: Rc<InstructionFormat>,23pub(crate) load: Rc<InstructionFormat>,24pub(crate) load_no_offset: Rc<InstructionFormat>,25pub(crate) multiary: Rc<InstructionFormat>,26pub(crate) nullary: Rc<InstructionFormat>,27pub(crate) shuffle: Rc<InstructionFormat>,28pub(crate) stack_load: Rc<InstructionFormat>,29pub(crate) stack_store: Rc<InstructionFormat>,30pub(crate) dynamic_stack_load: Rc<InstructionFormat>,31pub(crate) dynamic_stack_store: Rc<InstructionFormat>,32pub(crate) store: Rc<InstructionFormat>,33pub(crate) store_no_offset: Rc<InstructionFormat>,34pub(crate) ternary: Rc<InstructionFormat>,35pub(crate) ternary_imm8: Rc<InstructionFormat>,36pub(crate) trap: Rc<InstructionFormat>,37pub(crate) unary: Rc<InstructionFormat>,38pub(crate) unary_const: Rc<InstructionFormat>,39pub(crate) unary_global_value: Rc<InstructionFormat>,40pub(crate) unary_ieee16: Rc<InstructionFormat>,41pub(crate) unary_ieee32: Rc<InstructionFormat>,42pub(crate) unary_ieee64: Rc<InstructionFormat>,43pub(crate) unary_imm: Rc<InstructionFormat>,44pub(crate) exception_handler_address: Rc<InstructionFormat>,45}4647impl Formats {48pub fn new(imm: &Immediates, entities: &EntityRefs) -> Self {49Self {50unary: Builder::new("Unary").value().build(),5152unary_imm: Builder::new("UnaryImm").imm(&imm.imm64).build(),5354unary_ieee16: Builder::new("UnaryIeee16").imm(&imm.ieee16).build(),5556unary_ieee32: Builder::new("UnaryIeee32").imm(&imm.ieee32).build(),5758unary_ieee64: Builder::new("UnaryIeee64").imm(&imm.ieee64).build(),5960unary_const: Builder::new("UnaryConst")61.imm(&entities.pool_constant)62.build(),6364unary_global_value: Builder::new("UnaryGlobalValue")65.imm(&entities.global_value)66.build(),6768binary: Builder::new("Binary").value().value().build(),6970binary_imm8: Builder::new("BinaryImm8").value().imm(&imm.uimm8).build(),7172binary_imm64: Builder::new("BinaryImm64").value().imm(&imm.imm64).build(),7374// The select instructions are controlled by the second VALUE operand.75// The first VALUE operand is the controlling flag which has a derived type.76// The fma instruction has the same constraint on all inputs.77ternary: Builder::new("Ternary")78.value()79.value()80.value()81.typevar_operand(1)82.build(),8384ternary_imm8: Builder::new("TernaryImm8")85.value()86.imm(&imm.uimm8)87.value()88.build(),8990// Catch-all for instructions with many outputs and inputs and no immediate91// operands.92multiary: Builder::new("MultiAry").varargs().build(),9394nullary: Builder::new("NullAry").build(),9596shuffle: Builder::new("Shuffle")97.value()98.value()99.imm(&entities.uimm128)100.build(),101102int_compare: Builder::new("IntCompare")103.imm(&imm.intcc)104.value()105.value()106.build(),107108int_compare_imm: Builder::new("IntCompareImm")109.imm(&imm.intcc)110.value()111.imm(&imm.imm64)112.build(),113114float_compare: Builder::new("FloatCompare")115.imm(&imm.floatcc)116.value()117.value()118.build(),119120jump: Builder::new("Jump").block().build(),121122brif: Builder::new("Brif").value().block().block().build(),123124branch_table: Builder::new("BranchTable")125.value()126.imm(&entities.jump_table)127.build(),128129call: Builder::new("Call")130.imm(&entities.func_ref)131.varargs()132.build(),133134call_indirect: Builder::new("CallIndirect")135.imm(&entities.sig_ref)136.value()137.varargs()138.build(),139140try_call: Builder::new("TryCall")141.imm(&entities.func_ref)142.varargs()143.imm(&&entities.exception_table)144.build(),145146try_call_indirect: Builder::new("TryCallIndirect")147.value()148.varargs()149.imm(&&entities.exception_table)150.build(),151152func_addr: Builder::new("FuncAddr").imm(&entities.func_ref).build(),153154atomic_rmw: Builder::new("AtomicRmw")155.imm(&imm.memflags)156.imm(&imm.atomic_rmw_op)157.value()158.value()159.build(),160161atomic_cas: Builder::new("AtomicCas")162.imm(&imm.memflags)163.value()164.value()165.value()166.typevar_operand(2)167.build(),168169load: Builder::new("Load")170.imm(&imm.memflags)171.value()172.imm(&imm.offset32)173.build(),174175load_no_offset: Builder::new("LoadNoOffset")176.imm(&imm.memflags)177.value()178.build(),179180store: Builder::new("Store")181.imm(&imm.memflags)182.value()183.value()184.imm(&imm.offset32)185.build(),186187store_no_offset: Builder::new("StoreNoOffset")188.imm(&imm.memflags)189.value()190.value()191.build(),192193stack_load: Builder::new("StackLoad")194.imm(&entities.stack_slot)195.imm(&imm.offset32)196.build(),197198stack_store: Builder::new("StackStore")199.value()200.imm(&entities.stack_slot)201.imm(&imm.offset32)202.build(),203204dynamic_stack_load: Builder::new("DynamicStackLoad")205.imm(&entities.dynamic_stack_slot)206.build(),207208dynamic_stack_store: Builder::new("DynamicStackStore")209.value()210.imm(&entities.dynamic_stack_slot)211.build(),212213trap: Builder::new("Trap").imm(&imm.trapcode).build(),214215cond_trap: Builder::new("CondTrap").value().imm(&imm.trapcode).build(),216217int_add_trap: Builder::new("IntAddTrap")218.value()219.value()220.imm(&imm.trapcode)221.build(),222223exception_handler_address: Builder::new("ExceptionHandlerAddress")224.raw_block()225.imm(&imm.imm64)226.build(),227}228}229}230231232