Skip to content

Intrinsics Reference

This page lists the current built-in intrinsic symbol families and documents how to treat intrinsic support.

For conceptual background, read Intrinsics.

Symbol shape

Built-in intrinsic symbols are represented as namespaced symbols such as:

text
Core.LoadConst
Arithmetic.Add
Comparison.Equal
Storage.LoadLocal

Do not treat these as arbitrary strings scattered across the codebase. They are producer/consumer contracts between AIR emitters, optimizers and backends.

Built-in symbol families

Core

SymbolPurpose
Core.LoadConsttyped constant loading
Core.CallCSharpC# method call descriptor path
Core.CallCSharpCtorC# constructor call descriptor path
Core.LoadExternalexternal binding load
Core.StoreExternalexternal binding store

Arithmetic

SymbolPurpose
Arithmetic.Addaddition
Arithmetic.Subtractsubtraction
Arithmetic.Multiplymultiplication
Arithmetic.Dividedivision

Comparison

SymbolPurpose
Comparison.Equalequality comparison
Comparison.NotEqualinequality comparison
Comparison.Greatergreater-than comparison
Comparison.GreaterOrEqualgreater-or-equal comparison
Comparison.Lessless-than comparison
Comparison.LessOrEqualless-or-equal comparison

Boolean

SymbolPurpose
Boolean.Andboolean conjunction
Boolean.Orboolean disjunction
Boolean.Notboolean negation

Storage

SymbolPurpose
Storage.LoadLocallocal value load
Storage.StoreLocallocal value store
Storage.LoadLocalReflocal reference load

Capability model

Intrinsic support is capability-based.

A backend or optimizer path should check whether a symbol and type argument set is supported before emitting or consuming that intrinsic form.

Current optimizer-side checks use:

text
IOptimizerIntrinsicCapabilityContext.Supports(symbol, typeArguments)
OptimizerCapabilityGuards.SupportsAll(...)

Type arguments

Many intrinsics are type-specialized.

Examples:

  • arithmetic intrinsics may be specialized for numeric runtime types;
  • constant loading may be specialized for concrete primitive types;
  • comparison and boolean intrinsics may have their own supported type shapes.

Do not assume a symbol is supported for every type.

Backend support

Backend support is not universal.

BackendIntrinsic behavior
Interpreterexecutes supported intrinsic instructions through interpreter intrinsic execution
CILcompiles supported intrinsic instructions through the CIL intrinsic compiler/registry

A dialect exposing both backends should not enable optimizer output that only one backend can consume unless the selected runtime plan keeps that output backend-specific and guarded.

Optimizer interaction

Optimizers may introduce built-in intrinsic instructions from more general AIR shapes.

Examples:

  • arithmetic optimization may rewrite C# call descriptors into Arithmetic.* intrinsic instructions;
  • native CIL optimization may rewrite Push constants into Core.LoadConst instructions;
  • comparison and boolean optimization may rewrite general calls into typed comparison/boolean intrinsics.

These rewrites must be capability-gated.

What to document for new intrinsics

When adding a new intrinsic, document:

  • symbol family;
  • symbol name;
  • expected operands;
  • supported type arguments;
  • stack effect;
  • interpreter support;
  • CIL support;
  • optimizer producers;
  • tests covering supported and unsupported cases.

Common mistakes

  • Assuming a symbol is supported by every backend.
  • Assuming a symbol is supported for every type argument.
  • Adding an optimizer rewrite without a capability check.
  • Adding backend support without type-stack simulation support.
  • Treating C# interop descriptors and built-in intrinsics as the same abstraction.

Built for developers who want to use, extend, or understand UniversalToolchain.