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 canonical LanguagePlan 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.

Public developer manual. Internal reviews, proposals and maintainer material live under internal-docs/.