Archelon Ischyros Archelon Inc.

Programming tools for your new processor

Retargetable Development Tools

Sample Instruction Set

This is the instruction set which is implemented by the MCSIM simulator which comes with Archelon's tools. The sample CIF file generates instructions in this set. Many instructions have an extension suffix, which tells us about the type and/or the location of the operation to be performed.

The list of extensions is

b - byte;
w - word;
l - long word;
f - float;
d - double;
u - unsigned (used only for branch instructions)

In order to save space, an instruction which can have several different extensions is shown as one instruction with the various possible extensions separated by or-bars. For instance, if there is an instruction called ``rdimm'' which is used for ``l'', ``w'', or ``d'' extensions, then we will show it as

       rdimm_l|w|d

which means we can have one of

       rdimm_l
       rdimm_w
       rdimm_d

We will show the list of instructions grouped into the following categories.


Load/Store Instructions for Primary Data Memory

       ldzi_b|w|l|f|d   address,dst_reg
                        - load from direct address
                        - byte and word loads sign extend
       lduzi_b|w        address,dst_reg
                        - unsigned load from direct address
       ldri_b|w|l|f|d   addr_reg,offset_val,dst_reg
                        - load from *(addr_reg + offset_val)
                        - byte and word loads sign extend
       lduri_b|w        addr_reg,offset_val,dst_reg
                        - unsigned load from *(addr_reg + offset_val)
       ldrr_b|w|l|f|d   addr_reg,offset_reg,dst_reg
                        - load from *(addr_reg + offset_reg)
                        - byte and word loads sign extend
       ldrr_b|w         addr_reg,offset_reg,dst_reg
                        - unsigned load from *(addr_reg + offset_reg)
       strzi_b|w|l|f|d  src_reg,address
                        - store register at direct address
       stizi_b|w|l|f|d  imm_val,address
                        - store immediate at direct address
       strri_b|w|l|f|d  src_reg,addr_reg,offset_val
                        - store register at *(addr_reg + offset_val)
       stiri_b|w|l|f|d  imm_val,addr_reg,offset_val
                        - store immediate at *(addr_reg + offset_val)
       strrr_b|w|l|f|d  src_reg,addr_reg,offset_reg
                        - store register at *(addr_reg + offset_reg)
       stirr_b|w|l|f|d  imm_val,addr_reg,offset_reg
                        - store immediate at *(addr_reg + offset_reg)

(45 possible)


Load/Store Instructions for Secondary Data Memory

       ldzi2_b|w|l|f|d  address,dst_reg
                        - load from direct address
       ldri2_b|w|l|f|d  addr_reg,offset_val,dst_reg
                        - load from *(addr_reg + offset_val)
       ldrr2_b|w|l|f|d  addr_reg,offset_reg,dst_reg
                        - load from *(addr_reg + offset_reg)
       strzi2_b|w|l|f|d src_reg,address
                        - store register at direct address
       stizi2_b|w|l|f|d imm_val,address
                        - store immediate at direct address
       strri2_b|w|l|f|d src_reg,addr_reg,offset_val
                        - store register at *(addr_reg + offset_val)
       stiri2_b|w|l|f|d imm_val,addr_reg,offset_val
                        - store immediate at *(addr_reg + offset_val)
       strrr2_b|w|l|f|d src_reg,addr_reg,offset_reg
                        - store register at *(addr_reg + offset_reg)
       stirr2_b|w|l|f|d imm_val,addr_reg,offset_reg
                        - store immediate at *(addr_reg + offset_reg)

(45 possible)


Arithmetic Instructions

       mov_w|l|f|d      src_reg,dst_reg
                        - dst_reg = src_reg
       movi_w|l|f       imm_val,dst_reg
                        - dst_reg = imm_val
       add_w|l|f|d      lop_reg,rop_reg,dst_reg
                        - dst_reg = lop_reg + rop_reg
       addi_w|l|f       lop_reg,imm_val,dst_reg
                        - dst_reg = lop_reg + imm_val
       sub_w|l|f|d      lop_reg,rop_reg,dst_reg
                        - dst_reg = lop_reg - rop_reg
       subi_w|l|f       lop_reg,imm_val,dst_reg
                        - dst_reg = lop_reg - imm_val
       mul_w|l|f|d      lop_reg,rop_reg,dst_reg
                        - dst_reg = lop_reg * rop_reg
       muli_w|l|f       lop_reg,imm_val,dst_reg
                        - dst_reg = lop_reg * imm_val
       mulu_w|l         lop_reg,rop_reg,dst_reg
                        - dst_reg = lop_reg * rop_reg (unsigned)
       mului_w|l        lop_reg,imm_val,dst_reg
                        - dst_reg = lop_reg * imm_val (unsigned)
       div_w|l|f|d      lop_reg,rop_reg,dst_reg
                        - dst_reg = lop_reg / rop_reg
       divi_w|l|f       lop_reg,imm_val,dst_reg
                        - dst_reg = lop_reg / imm_val
       divu_w|l         lop_reg,rop_reg,dst_reg
                        - dst_reg = lop_reg / rop_reg (unsigned)
       divui_w|l        lop_reg,imm_val,dst_reg
                        - dst_reg = lop_reg / imm_val (unsigned)
       mod_w|l          lop_reg,rop_reg,dst_reg
                        - dst_reg = lop_reg % rop_reg
       modi_w|l         lop_reg,imm_val,dst_reg
                        - dst_reg = lop_reg % imm_val
       modu_w|l         lop_reg,rop_reg,dst_reg
                        - dst_reg = lop_reg % rop_reg (unsigned)
       modui_w|l        lop_reg,imm_val,dst_reg
                        - dst_reg = lop_reg % imm_val (unsigned)
       and_w|l          lop_reg,rop_reg,dst_reg
                        - dst_reg = lop_reg & rop_reg
       andi_w|l         lop_reg,imm_val,dst_reg
                        - dst_reg = lop_reg & imm_val
       or_w|l           lop_reg,rop_reg,dst_reg
                        - dst_reg = lop_reg | rop_reg
       ori_w|l          lop_reg,imm_val,dst_reg
                        - dst_reg = lop_reg | imm_val
       xor_w|l          lop_reg,rop_reg,dst_reg
                        - dst_reg = lop_reg ^ rop_reg
       xori_w|l         lop_reg,imm_val,dst_reg
                        - dst_reg = lop_reg ^ imm_val
       lls_w|l          lop_reg,rop_reg,dst_reg
                        - dst_reg = lop_reg << rop_reg (zero fill)
       llsi_w|l         lop_reg,imm_val,dst_reg
                        - dst_reg = lop_reg << imm_val (zero fill)
       ars_w|l          lop_reg,rop_reg,dst_reg
                        - dst_reg = lop_reg >> rop_reg (sign fill)
       arsi_w|l         lop_reg,imm_val,dst_reg
                        - dst_reg = lop_reg >> imm_val (sign fill)
       lrs_w|l          lop_reg,rop_reg,dst_reg
                        - dst_reg = lop_reg >> rop_reg (zero fill)
       lrsi_w|l         lop_reg,imm_val,dst_reg
                        - dst_reg = lop_reg >> imm_val (zero fill)
       cmp_w|l|f|d      lop_reg,rop_reg
                        - comparative subtract
                        (lop_reg - rop_reg)
                        to set
                        condition codes
       cmpu_w|l         lop_reg,rop_reg
                        - comparative unsigned subtract
                        (lop_reg - rop_reg)
                        to set condition codes
       cmpi_w|l|f       lop_reg,imm_val
                        - comparative subtract immediate
                        (lop_reg - imm_val)
                        to set condition codes
       cmpui_w|l        lop_reg,imm_val
                        - comparative unsigned subtract
                        immediate (lop_reg - imm_val)
                        to set condition codes
       com_w|l          src_reg,dst_reg
                        - dst_reg =  src_reg (one's complement)
       neg_w|l|f|d      src_reg,dst_reg
                        - dst_reg = -src_reg (two's complement)
       abs_w|l|f|d      src_reg,dst_reg
                        - dst_reg = abs(src_reg) (absolute value)
       sqrt_w|l|f|d     src_reg,dst_reg
                        - dst_reg = sqrt(src_reg) (square root)
       sqrtu_w|l        src_reg,dst_reg
                        - dst_reg = sqrt(src_reg) (square root unsigned)

(104 possible)


Conversion Instructions

       cvtsbw           src_reg,dst_reg
                        - convert signed byte to word
       cvtubw           src_reg,dst_reg
                        - convert unsigned byte to word
       cvtsbl           src_reg,dst_reg
                        - convert signed byte to long
       cvtubl           src_reg,dst_reg
                        - convert unsigned byte to long
       cvtswl           src_reg,dst_reg
                        - convert signed word to long
       cvtuwl           src_reg,dst_reg
                        - convert unsigned word to long
       cvtlw            src_reg,dst_reg
                        - convert long to word
       cvtwf            src_reg,dst_reg
                        - convert word to float
       cvtuwf           src_reg,dst_reg
                        - convert unsigned word to float
       cvtlf            src_reg,dst_reg
                        - convert long to float
       cvtulf           src_reg,dst_reg
                        - convert unsigned long to float
       cvtdf            src_reg,dst_reg
                        - convert double to float
       cvtfw            src_reg,dst_reg
                        - convert float to word
       cvtfl            src_reg,dst_reg
                        - convert float to long
       cvtfd            src_reg,dst_reg
                        - convert float to double
       cvtwd            src_reg,dst_reg
                        - convert word to double
       cvtuwd           src_reg,dst_reg
                        - convert unsigned word to double
       cvtld            src_reg,dst_reg
                        - convert long to double
       cvtuld           src_reg,dst_reg
                        - convert unsigned long to double
       cvtdw            src_reg,dst_reg
                        - convert double to word
       cvtdl            src_reg,dst_reg
                        - convert double to long
       cvtlb            src_reg,dst_reg
                        - convert long to byte
       cvtwb            src_reg,dst_reg
                        - convert word to byte

(23 possible)


Branch Instructions

       br               address
       beq              address
       beq_f            address
       bne              address
       bne_f            address
       ble              address
       ble_u|f          address
       blt              address
       blt_u|f          address
       bgt              address
       bgt_u|f          address
       bge              address
       bge_u|f          address
       bch              address
                        - branch if carry high
       bcl              address
                        - branch if carry low
       boh              address
                        - branch if overflow high
       bol              address
                        - branch if overflow low
       bucch            immval,address
                        - branch on user condition code
                        (selected by immval) high
       buccl            immval,address
                        - branch on user condition code
                        (selected by immval) low
       jmpind           addr_reg
                        - jump indirect to
                        code address in addr_reg

(24 possible)


Function Instructions (entry/exit/call/return)

       call             address
                        - call to direct address
       callind          addr_reg
                        - call indirect to address in register
       ret
                        - return to caller
       enti
                        - enter interrupt function
       reti
                        - leave interrupt function

(5 possible)


Access to machine-specific sources and sinks

       control           const
                         - execute some arbitary operation, selected by "const"
       input_b|w|l|f|d   const,reg
                         - receive a value from a port into a register
       output_b|w|l|f|d  const,reg
                         - send a value to a port
       outputi_b|w|l     const,const
                         - send an immediate value to a port

(14 possible)


Loop Instructions

       loopinit         reg,loop_end_label
                        - load loop counter from a register
       loopiniti        immval,loop_end_label
                        - load loop counter with
                        an immediate value
       loophead         loop_top_label,loop_end_label
                        - actions after loop_top_label emitted
       loopend          loop_top_label,loop_end_label
                        - actions after loop_end_label emitted
       looprpt          loop_top_label,loop_end_label
                        - restart the loop if
                        the loop counter is not exhausted
       loopret
                        - return from inside a loop

(6 possible)



Back to Archelon's Home Page