```{index} single: Imager::Expr::Assem ``` # Imager::Expr::Assem ```text Imager::Expr::Assem - an assembler for producing code for the Imager register machine ``` ## SYNOPSIS ```perl use Imager::Expr::Assem; my $expr = Imager::Expr->new(assem=>'...', ...) ``` ## DESCRIPTION This module is a simple Imager::Expr compiler that compiles a low-level language that has a nearly 1-to-1 relationship to the internal representation used for compiled register machine code. ### Syntax Each line can contain multiple statements separated by semi-colons. Anything after '#' in a line is ignored. Types of statements: - variable definition > `var` _name_:_type_ defines variable _name_ to have _type_, which can be any of `n` or `num` for a numeric type or `pixel`, `p` or `c` for a pixel or color type. Variable names cannot include white-space. - operators Operators can be split into 3 basic types, those that have a result value, those that don't and the null operator, eg. jump has no value. The format for operators that return a value is typically: > _result_ = _operator_ _operand_ ... and for those that don't return a value: > _operator_ _operand_ where operator is any valid register machine operator, result is any variable defined with `var`, and operands are variables, constants or literals, or for jump operators, labels. The set operator can be simplified to: > _result_ = _operator_ All operators maybe preceded by a label, which is any non-white-space text immediately followed by a colon (':'). ## BUGS Note that the current optimizer may produce incorrect optimization for your code, fortunately the optimizer will disable itself if you include any jump operator in your code. A single jump to anywhere after your final `ret` operator can be used to disable the optimizer without slowing down your code. There's currently no high-level code generation that can generate code with loops or real conditions. ## SEE ALSO Imager(3), `transform.perl`, `regmach.c` ## AUTHOR Tony Cook