-! Copyright (C) 2020 Doug Coleman.
+! Copyright (C) 2023 Giftpflanze.
! See https://factorcode.org/license.txt for BSD license.
-USING: cpu.arm cpu.arm.assembler.opcodes system ;
+USING: accessors assocs compiler.cfg compiler.cfg.comparisons
+compiler.cfg.instructions compiler.cfg.intrinsics continuations
+cpu.architecture cpu.arm cpu.arm.assembler cpu.arm.assembler.64
+cpu.arm.assembler.opcodes generalizations kernel math math.order
+sequences system words.symbol ;
+FROM: cpu.arm.assembler => S D ;
IN: cpu.arm.64
-M: arm.64 ds-reg X5 ;
-M: arm.64 rs-reg X6 ;
+M: arm.64 frame-reg X29 ;
+: vm-reg ( -- reg ) X28 ; inline
+M: arm.64 ds-reg X27 ;
+M: arm.64 rs-reg X26 ;
+
+! M: arm.64 vm-stack-space 0 ;
+
+M: arm.64 %load-immediate ( reg val -- )
+ [ XZR MOVr ] [
+ { 0 1 2 3 } [
+ tuck -8 * shift 0xffff bitand
+ ] with map>alist [ nip 0 = ] assoc-reject
+ unclip
+ overd first2 rot MOVZ
+ [ first2 rot MOVK ] with each
+ ] if-zero ;
+
+M: arm.64 %load-reference ( reg obj -- )
+ ! [ swap 0 MOV rc-absolute-cell rel-literal ]
+ ! [ \ f type-number MOV ] if* ;
+ 2drop ;
+
+M: arm.64 %load-float 2drop ;
+M: arm.64 %load-double 2drop ;
+M: arm.64 %load-vector 3drop ;
+
+M: arm.64 complex-addressing? eh? ; ! x86: t
+M: arm.64 dummy-fp-params? f ; ! x86.64.windows: t
+M: arm.64 dummy-int-params? f ; ! ppc.64.linux: t
+M: arm.64 dummy-stack-params? f ; ! ppc.64.linux: t
+M: arm.64 float-right-align-on-stack? f ; ! ppc.64.linux: t
+M: arm.64 fused-unboxing? eh? ; ! x86: t
+M: arm.64 integer-float-needs-stack-frame? f ; ! x86.sse: f
+M: arm.64 long-long-odd-register? f ; ! ppc.32: t
+M: arm.64 long-long-on-stack? f ; ! x86.32: t
+M: arm.64 return-struct-in-registers? drop eh? ;
+M: arm.64 struct-return-on-stack? f ; ! x86.32.not-linux: t
+M: arm.64 test-instruction? t ; ! t
+M: arm.64 value-struct? drop eh? ;
+
+M: arm.64 %add rot ADDr ;
+M: arm.64 %add-imm spin ADDi ;
+M: arm.64 %sub spin SUBr ;
+M: arm.64 %sub-imm spin SUBi ;
+M: arm.64 %mul rot MUL ;
+
+M: arm.64 %mul-imm
+ XZR X9 ADDi
+ X9 rot MUL ;
+
+M: arm.64 %neg swap NEG ;
+
+M: arm.64 %min
+ 2dup CMPr
+ rot LT CSEL ;
+
+M: arm.64 %max
+ 2dup CMPr
+ rot GT CSEL ;
+
+M: arm.64 %log2
+ over CLZ
+ 63 over dup SUBi
+ dup NEG ;
+
+M: arm.64 %bit-count
+ D0 XD FMOVgen
+ D0 D0 8B CNT
+ D0 D0 8B ADDV
+ D0 swap DX FMOVgen ;
+
+M: arm.64 %bit-test
+ [ 2^ swap TSTi ] dip
+ swap dup EQ CSEL ;
+
+M: arm.64 %and rot ANDr ;
+M: arm.64 %and-imm spin ANDi ;
+M: arm.64 %not swap MVN ;
+M: arm.64 %or rot ORRr ;
+M: arm.64 %or-imm spin ORRi ;
+M: arm.64 %sar spin ASRr ;
+M: arm.64 %sar-imm spin ASRi ;
+M: arm.64 %shl spin LSLr ;
+M: arm.64 %shl-imm spin LSLi ;
+M: arm.64 %shr spin LSRr ;
+M: arm.64 %shr-imm spin LSRi ;
+M: arm.64 %xor rot EORr ;
+M: arm.64 %xor-imm spin EORi ;
+
+M: arm.64 %copy ( dst src rep -- )
+ 2over eq? [ 3drop ] [
+ ! [ [ ?spill-slot ] bi@ ] dip
+ ! 2over [ register? ] both? [ copy-register* ] [ copy-memory* ] if
+ 3drop
+ ] if ;
+
+: fixnum-overflow ( label dst src1 src2 cc quot -- )
+ [ call ] curry dip {
+ { cc-o VS }
+ { cc/o VC }
+ } at B.cond ; inline
+
+M: arm.64 %fixnum-add [ rot ADDr ] fixnum-overflow ;
+M: arm.64 %fixnum-sub [ spin SUBr ] fixnum-overflow ;
+M: arm.64 %fixnum-mul [ rot MUL ] fixnum-overflow ;
+
+M: arm.64 %add-float rot D FADDs ;
+M: arm.64 %sub-float spin D FSUBs ;
+M: arm.64 %mul-float rot D FMULs ;
+M: arm.64 %div-float spin D FDIVs ;
+M: arm.64 %min-float rot D FMINs ;
+M: arm.64 %max-float rot D FMAXs ;
+M: arm.64 %sqrt swap D FSQRTs ;
+
+M: arm.64 %single>double-float swap S D FCVT ;
+M: arm.64 %double>single-float swap D S FCVT ;
+
+M: arm.64 %integer>float swap D SCVTFsi ;
+M: arm.64 %float>integer swap D FCVTZSsi ;
+
+M: arm.64 %zero-vector 2drop ;
+M: arm.64 %fill-vector 2drop ;
+M: arm.64 %gather-vector-2 4drop ;
+M: arm.64 %gather-int-vector-2 4drop ;
+M: arm.64 %gather-vector-4 6 ndrop ;
+M: arm.64 %gather-int-vector-4 6 ndrop ;
+M: arm.64 %select-vector 4drop ;
+M: arm.64 %shuffle-vector 4drop ;
+M: arm.64 %shuffle-vector-imm 4drop ;
+M: arm.64 %shuffle-vector-halves-imm 5drop ;
+M: arm.64 %tail>head-vector 3drop ;
+M: arm.64 %merge-vector-head 4drop ;
+M: arm.64 %merge-vector-tail 4drop ;
+M: arm.64 %float-pack-vector 3drop ;
+M: arm.64 %signed-pack-vector 4drop ;
+M: arm.64 %unsigned-pack-vector 4drop ;
+M: arm.64 %unpack-vector-head 3drop ;
+M: arm.64 %unpack-vector-tail 3drop ;
+M: arm.64 %integer>float-vector 3drop ;
+M: arm.64 %float>integer-vector 3drop ;
+M: arm.64 %compare-vector 5drop ;
+M: arm.64 %move-vector-mask 3drop ;
+M: arm.64 %test-vector 5drop ;
+M: arm.64 %test-vector-branch 5drop ;
+M: arm.64 %add-vector 4drop ;
+M: arm.64 %saturated-add-vector 4drop ;
+M: arm.64 %add-sub-vector 4drop ;
+M: arm.64 %sub-vector 4drop ;
+M: arm.64 %saturated-sub-vector 4drop ;
+M: arm.64 %mul-vector 4drop ;
+M: arm.64 %mul-high-vector 4drop ;
+M: arm.64 %mul-horizontal-add-vector 4drop ;
+M: arm.64 %saturated-mul-vector 4drop ;
+M: arm.64 %div-vector 4drop ;
+M: arm.64 %min-vector 4drop ;
+M: arm.64 %max-vector 4drop ;
+M: arm.64 %avg-vector 4drop ;
+M: arm.64 %dot-vector 4drop ;
+M: arm.64 %sad-vector 4drop ;
+M: arm.64 %sqrt-vector 3drop ;
+M: arm.64 %horizontal-add-vector 4drop ;
+M: arm.64 %horizontal-sub-vector 4drop ;
+M: arm.64 %abs-vector 3drop ;
+M: arm.64 %and-vector 4drop ;
+M: arm.64 %andn-vector 4drop ;
+M: arm.64 %or-vector 4drop ;
+M: arm.64 %xor-vector 4drop ;
+M: arm.64 %not-vector 3drop ;
+M: arm.64 %shl-vector 4drop ;
+M: arm.64 %shr-vector 4drop ;
+M: arm.64 %shl-vector-imm 4drop ;
+M: arm.64 %shr-vector-imm 4drop ;
+M: arm.64 %horizontal-shl-vector-imm 4drop ;
+M: arm.64 %horizontal-shr-vector-imm 4drop ;
+
+M: arm.64 %integer>scalar 3drop ;
+M: arm.64 %scalar>integer 3drop ;
+M: arm.64 %vector>scalar 3drop ;
+M: arm.64 %scalar>vector 3drop ;
+
+M: arm.64 %zero-vector-reps f ;
+M: arm.64 %fill-vector-reps f ;
+M: arm.64 %gather-vector-2-reps f ;
+M: arm.64 %gather-int-vector-2-reps f ;
+M: arm.64 %gather-vector-4-reps f ;
+M: arm.64 %gather-int-vector-4-reps f ;
+M: arm.64 %select-vector-reps f ;
+M: arm.64 %alien-vector-reps f ;
+M: arm.64 %shuffle-vector-reps f ;
+M: arm.64 %shuffle-vector-imm-reps f ;
+M: arm.64 %shuffle-vector-halves-imm-reps f ;
+M: arm.64 %merge-vector-reps f ;
+M: arm.64 %float-pack-vector-reps f ;
+M: arm.64 %signed-pack-vector-reps f ;
+M: arm.64 %unsigned-pack-vector-reps f ;
+M: arm.64 %unpack-vector-head-reps f ;
+M: arm.64 %unpack-vector-tail-reps f ;
+M: arm.64 %integer>float-vector-reps f ;
+M: arm.64 %float>integer-vector-reps f ;
+M: arm.64 %compare-vector-reps drop f ;
+M: arm.64 %compare-vector-ccs nip eh? ;
+M: arm.64 %move-vector-mask-reps f ;
+M: arm.64 %test-vector-reps f ;
+M: arm.64 %add-vector-reps f ;
+M: arm.64 %saturated-add-vector-reps f ;
+M: arm.64 %add-sub-vector-reps f ;
+M: arm.64 %sub-vector-reps f ;
+M: arm.64 %saturated-sub-vector-reps f ;
+M: arm.64 %mul-vector-reps f ;
+M: arm.64 %mul-high-vector-reps f ;
+M: arm.64 %mul-horizontal-add-vector-reps f ;
+M: arm.64 %saturated-mul-vector-reps f ;
+M: arm.64 %div-vector-reps f ;
+M: arm.64 %min-vector-reps f ;
+M: arm.64 %max-vector-reps f ;
+M: arm.64 %avg-vector-reps f ;
+M: arm.64 %dot-vector-reps f ;
+M: arm.64 %sad-vector-reps f ;
+M: arm.64 %sqrt-vector-reps f ;
+M: arm.64 %horizontal-add-vector-reps f ;
+M: arm.64 %horizontal-sub-vector-reps f ;
+M: arm.64 %abs-vector-reps f ;
+M: arm.64 %and-vector-reps f ;
+M: arm.64 %andn-vector-reps f ;
+M: arm.64 %or-vector-reps f ;
+M: arm.64 %xor-vector-reps f ;
+M: arm.64 %not-vector-reps f ;
+M: arm.64 %shl-vector-reps f ;
+M: arm.64 %shr-vector-reps f ;
+M: arm.64 %shl-vector-imm-reps f ;
+M: arm.64 %shr-vector-imm-reps f ;
+M: arm.64 %horizontal-shl-vector-imm-reps f ;
+M: arm.64 %horizontal-shr-vector-imm-reps f ;
+
+M: arm.64 %unbox-alien 2drop ;
+M: arm.64 %unbox-any-c-ptr 2drop ;
+M: arm.64 %box-alien 3drop ;
+M: arm.64 %box-displaced-alien 5drop ;
+
+M: arm.64 %convert-integer 3drop ;
+
+M: arm.64 %load-memory 7 ndrop ;
+M: arm.64 %load-memory-imm 5drop ;
+M: arm.64 %store-memory 7 ndrop ;
+M: arm.64 %store-memory-imm 5drop ;
+
+M: arm.64 %alien-global 3drop ;
+M: arm.64 %vm-field 2drop ;
+M: arm.64 %set-vm-field 2drop ;
+
+M: arm.64 %allot 4drop ;
+M: arm.64 %write-barrier 6 ndrop ;
+M: arm.64 %write-barrier-imm 5drop ;
+
+M: arm.64 stack-frame-size ;
+M: arm.64 %call drop ;
+M: arm.64 %epilogue drop ;
+M: arm.64 %jump drop ;
+M: arm.64 %jump-label drop ;
+M: arm.64 %prologue drop ;
+M: arm.64 %return f RET ;
+M: arm.64 %safepoint ;
+
+M: arm.64 %compare 5drop ;
+M: arm.64 %compare-imm 5drop ;
+M: arm.64 %compare-integer-imm 5drop ;
+M: arm.64 %test 5drop ;
+M: arm.64 %test-imm 5drop ;
+M: arm.64 %compare-float-ordered 5drop ;
+M: arm.64 %compare-float-unordered 5drop ;
+
+M: arm.64 %compare-branch 4drop ;
+M: arm.64 %compare-imm-branch 4drop ;
+M: arm.64 %compare-integer-imm-branch 4drop ;
+M: arm.64 %test-branch 4drop ;
+M: arm.64 %test-imm-branch 4drop ;
+M: arm.64 %compare-float-ordered-branch 4drop ;
+M: arm.64 %compare-float-unordered-branch 4drop ;
+
+M: arm.64 %dispatch 2drop ;
+
+M: arm.64 %c-invoke 3drop ;
+
+M: arm.64 %call-gc drop ;
+M: arm.64 %check-nursery-branch 5drop ;
+
+M: arm.64 %clear drop ;
+M: arm.64 %peek 2drop ;
+M: arm.64 %replace 2drop ;
+M: arm.64 %replace-imm 2drop ;
+M: arm.64 %inc drop ;
+
+M: arm.64 machine-registers {
+ {
+ int-regs {
+ X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15
+ X19 X20 X21 X22 X23 X24
+ }
+ }
+ {
+ float-regs
+ {
+ V0 V1 V2 V3 V4 V5 V6 V7
+ V16 V17 V18 V19 V20 V21 V22 V23 V24 V25 V26 V27 V28
+ V29 V30 V31
+ }
+ }
+} ;
+M: arm.64 param-regs drop {
+ { int-regs { X0 X1 X2 X3 X4 X5 X6 X7 X8 } }
+ { float-regs { V0 V1 V2 V3 V4 V5 V6 V7 } }
+} ;
+M: arm.64 return-regs {
+ { int-regs { X0 X1 X2 X3 X4 X5 X6 X7 X8 } }
+ { float-regs { V0 V1 V2 V3 V4 V5 V6 V7 } }
+} ;
+
+M: arm.64 %set-slot 5drop ;
+M: arm.64 %set-slot-imm 4drop ;
+M: arm.64 %slot 5drop ;
+M: arm.64 %slot-imm 4drop ;
+
+M: arm.64 %spill 3drop ;
+M: arm.64 %reload 3drop ;
+M: arm.64 gc-root-offset ;
+
+M: arm.64 immediate-arithmetic? -2147483648 2147483647 between? ;
+M: arm.64 immediate-bitwise?
+ [ encode-bitmask drop t ] [ 2drop f ] recover ;
+M: arm.64 immediate-comparand? drop eh? ;
+M: arm.64 immediate-store? drop eh? ;
+
+M: arm.64 %unbox 4drop ;
+M: arm.64 %unbox-long-long 4drop ;
+M: arm.64 %local-allot 4drop ;
+M: arm.64 %box 5drop ;
+M: arm.64 %box-long-long 5drop ;
+M: arm.64 %save-context 2drop ;
+
+M: arm.64 %alien-invoke 10 ndrop ;
+M: arm.64 %alien-indirect 9 ndrop ;
+M: arm.64 %alien-assembly 8 ndrop ;
+M: arm.64 %callback-inputs 2drop ;
+M: arm.64 %callback-outputs drop ;
+M: arm.64 stack-cleanup 2drop ;
+M: arm.64 enable-cpu-features
+ enable-min/max
+ enable-log2
+ enable-bit-test
+ enable-alien-4-intrinsics
+ enable-float-min/max
+ enable-bit-count
+ enable-float-intrinsics
+ enable-fsqrt ;
! Copyright (C) 2020 Doug Coleman.
! Copyright (C) 2023 Giftpflanze.
! See https://factorcode.org/license.txt for BSD license.
-USING: combinators cpu.arm.assembler.opcodes grouping kernel
-math math.bitwise math.parser sequences ;
+USING: assocs combinators cpu.arm.assembler.opcodes
+generalizations grouping kernel math math.bitwise math.parser
+sequences shuffle ;
IN: cpu.arm.assembler
! pre-index mode: computed addres is the base-register + offset
: split-imm ( imm -- shift imm ) 12 (split-imm) 1 0 ? swap ;
+! Logical immediates
+
ERROR: illegal-bitmask-immediate n ;
: ?bitmask ( imm imm-size -- imm )
dupd on-bits 0 [ = ] bi-curry@ bi or
[ ?element ] keep [ >Nimms ] [ >immr ] 2bi
{ 12 0 6 } bitfield* ;
-: ADR ( simm21 Rd -- ) [ [ 2 bits ] [ -2 shift 19 ?sbits ] bi ] dip ADR-encode ;
+! Floating-point variants
-: ADRP ( simm21 Rd -- ) [ 4096 / [ 2 bits ] [ -2 shift 19 ?sbits ] bi ] dip ADRP-encode ;
+SYMBOLS: H S D ;
-: RET ( Rn/f -- ) X30 or RET-encode ;
+: >ftype ( symbol -- n ) { { H 3 } { S 0 } { D 1 } } at ; inline
-: SVC ( uimm16 -- ) 16 ?ubits SVC-encode ;
-: BRK ( uimm16 -- ) 16 ?ubits BRK-encode ;
-: HLT ( uimm16 -- ) 16 ?ubits HLT-encode ;
+: ADDV ( Rn Rd size Q -- ) -roll -rot ADDV-encode ;
+
+: ADR ( simm21 Rd -- ) [ [ 2 bits ] [ -2 shift 19 ?sbits ] bi ] dip ADR-encode ;
+
+: ADRP ( simm21 Rd -- ) [ 4096 / [ 2 bits ] [ -2 shift 19 ?sbits ] bi ] dip ADRP-encode ;
! B but that is breakpoint
: Br ( simm28 -- ) 2 ?>> 26 ?sbits B-encode ;
: BL ( simm28 -- ) 2 ?>> 26 ?sbits BL-encode ;
: BR ( Rn -- ) BR-encode ;
: BLR ( Rn -- ) BLR-encode ;
+
+: BRK ( uimm16 -- ) 16 ?ubits BRK-encode ;
+
+: CNT ( Vn Vd size Q -- ) -roll -rot CNT-encode ;
+
+: DUPgen ( Rn Rd size Q -- ) -roll 2^ -rot DUPgen-encode ;
+
+: FADDs ( Rm Rn Rd var -- ) >ftype -roll FADDs-encode ;
+: FCVT ( Rn Rd svar dvar -- ) [ >ftype ] bi@ 2swap FCVT-encode ;
+: FDIVs ( Rm Rn Rd var -- ) >ftype -roll FDIVs-encode ;
+: FMAXs ( Rm Rn Rd var -- ) >ftype -roll FMAXs-encode ;
+: FMINs ( Rm Rn Rd var -- ) >ftype -roll FMINs-encode ;
+: FMULs ( Rm Rn Rd var -- ) >ftype -roll FMULs-encode ;
+: FSQRTs ( Rn Rd var -- ) >ftype -rot FSQRTs-encode ;
+: FSUBs ( Rm Rn Rd var -- ) >ftype -roll FSUBs-encode ;
+
+: FMOVgen ( Rn Rd sf ftype rmode opcode -- ) 4 2 mnswap FMOVgen-encode ;
+
+: FPCR ( -- op0 op1 CRn CRm op2 ) 3 3 4 4 0 ;
+: FPSR ( -- op0 op1 CRn CRm op2 ) 3 3 4 4 1 ;
+
+: HLT ( uimm16 -- ) 16 ?ubits HLT-encode ;
+
+: LDRBr ( Rm Rn Rt -- ) [ 0 ] 2dip LDRBsr-encode ;
+: LDRBuoff ( uimm12 Rn Rt -- ) [ 12 ?ubits ] 2dip LDRBuoff-encode ;
+: LDRHuoff ( uimm13 Rn Rt -- ) [ 1 ?>> 12 ?ubits ] 2dip LDRHuoff-encode ;
+
+: MRS ( op0 op1 CRn CRm op2 Rt -- ) MRS-encode ;
+: MSRr ( op0 op1 CRn CRm op2 Rt -- ) MSRr-encode ;
+
+: NZCV ( -- op0 op1 CRn CRm op2 ) 3 3 4 2 0 ;
+
+: RET ( Rn/f -- ) X30 or RET-encode ;
+
+: SVC ( uimm16 -- ) 16 ?ubits SVC-encode ;
FIELD: Z 1
FIELD: sf 1
+FIELD: ftype 2
+FIELD: rmode 2
FIELD: size1 1
FIELD: size2 2
: AL ( -- n ) 0b1110 ; inline ! always
: NV ( -- n ) 0b1111 ; inline ! always
+! Arrangement specifiers
+
+: 8B ( -- size Q ) 0 0 ; inline
+: 16B ( -- size Q ) 0 1 ; inline
+: 4H ( -- size Q ) 1 0 ; inline
+: 8H ( -- size Q ) 1 1 ; inline
+: 2S ( -- size Q ) 2 0 ; inline
+: 4S ( -- size Q ) 2 1 ; inline
+: 2D ( -- size Q ) 3 1 ; inline
+
+! FMOVgen variants
+
+: HW ( -- sf ftype rmode opcode ) 0 3 0 6 ; inline
+: HX ( -- sf ftype rmode opcode ) 1 3 0 6 ; inline
+: WH ( -- sf ftype rmode opcode ) 0 3 0 7 ; inline
+: WS ( -- sf ftype rmode opcode ) 0 0 0 7 ; inline
+: SW ( -- sf ftype rmode opcode ) 0 0 0 6 ; inline
+: XH ( -- sf ftype rmode opcode ) 1 3 0 7 ; inline
+: XD ( -- sf ftype rmode opcode ) 1 1 0 7 ; inline
+: XD[1] ( -- sf ftype rmode opcode ) 1 2 0 7 ; inline
+: DX ( -- sf ftype rmode opcode ) 1 1 0 6 ; inline
+: D[1]X ( -- sf ftype rmode opcode ) 1 2 0 6 ; inline
+
+
ERROR: no-field-word vocab name ;
TUPLE: integer-literal value width ;
ARM-INSTRUCTION: ADDSsr32-encode ( 0 0 1 01011 shift2 0 Rm imm6 Rn Rd -- )
ARM-INSTRUCTION: ADDSsr64-encode ( 1 0 1 01011 shift2 0 Rm imm6 Rn Rd -- )
+! ADDV: Add across Vector.
+ARM-INSTRUCTION: ADDV-encode ( 0 Q 0 01110 size2 11000 11011 10 Rn Rd -- )
+
! ADR: Form PC-relative address.
! ADRP: Form PC-relative address to 4KB page.
ARM-INSTRUCTION: ADR-encode ( 0 immlo2 10000 immhi19 Rd -- )
! BICS (shifted register): Bitwise Bit Clear (shifted register), setting flags.
ARM-INSTRUCTION: BICS32-encode ( 0 11 01010 shift2 1 Rm imm6 Rn Rd -- )
ARM-INSTRUCTION: BICS64-encode ( 1 11 01010 shift2 1 Rm imm6 Rn Rd -- )
+
! BL: Branch with Link.
ARM-INSTRUCTION: BL-encode ( 1 00101 imm26 -- )
! BLR: Branch with Link to Register.
! BRK: Breakpoint instruction.
ARM-INSTRUCTION: BRK-encode ( 11010100 001 imm16 000 00 -- )
+
! BTI: Branch Target Identification.
ARM-INSTRUCTION: BTI-encode ( 1101010100 0 00 011 0010 0100 000 11111 -- )
! CFINV: Invert Carry Flag.
ARM-INSTRUCTION: CFINV-encode ( 1101010100 0 0 0 000 0100 0000 000 11111 -- )
+
! CFP: Control Flow Prediction Restriction by Context: an alias of SYS.
ARM-INSTRUCTION: CFP-encode ( 1101010100 0 01 011 0111 0011 100 Rt -- )
+
! CINC: Conditional Increment: an alias of CSINC.
ARM-INSTRUCTION: CINC32-encode ( 0 0 0 11010100 Rm cond4 0 1 Rn Rd -- )
ARM-INSTRUCTION: CINC64-encode ( 1 0 0 11010100 Rm cond4 0 1 Rn Rd -- )
+
! CINV: Conditional Invert: an alias of CSINV.
ARM-INSTRUCTION: CINV32-encode ( 0 0 0 11010100 Rm cond4 0 0 Rn Rd -- )
ARM-INSTRUCTION: CINV64-encode ( 1 0 0 11010100 Rm cond4 0 0 Rn Rd -- )
+
! CLREX: Clear Exclusive.
ARM-INSTRUCTION: CLREX-encode ( 1101010100 0 00 011 0011 CRm 010 11111 -- )
+
! CLS: Count Leading Sign bits.
ARM-INSTRUCTION: CLS32-encode ( 0 1 0 11010110 00000 00010 1 Rn Rd -- )
ARM-INSTRUCTION: CLS64-encode ( 1 1 0 11010110 00000 00010 1 Rn Rd -- )
! CMPP: Compare with Tag: an alias of SUBPS.
ARM-INSTRUCTION: CMPP-encode ( 1 0 1 11010110 Xm 0 0 0 0 0 0 Xn Xd -- )
+
! CNEG: Conditional Negate: an alias of CSNEG.
ARM-INSTRUCTION: CNEG32-encode ( 0 1 0 11010100 Rm cond4 0 1 Rn Rd -- )
ARM-INSTRUCTION: CNEG64-encode ( 1 1 0 11010100 Rm cond4 0 1 Rn Rd -- )
+
+! CNT: Population Count per byte.
+ARM-INSTRUCTION: CNT-encode ( 0 Q 0 01110 size2 10000 00101 10 Rn Rd -- )
+
! CPP: Cache Prefetch Prediction Restriction by Context: an alias of SYS.
ARM-INSTRUCTION: CPP-encode ( 1101010100 0 01 011 0111 0011 111 Rt -- )
! DC: Data Cache operation: an alias of SYS.
ARM-INSTRUCTION: DC-encode ( 1101010100 0 01 op3 0111 CRm op3 Rt -- )
+
! DCPS1: Debug Change PE State to EL1..
ARM-INSTRUCTION: DCPS1-encode ( 11010100 101 imm16 000 01 -- )
! DCPS2: Debug Change PE State to EL2..
! DMB: Data Memory Barrier.
ARM-INSTRUCTION: DMB-encode ( 1101010100 0 00 011 0011 CRm 1 01 11111 -- )
+
! DRPS: Debug restore process state.
ARM-INSTRUCTION: DPRS-encode ( 1101011 0101 11111 000000 11111 00000 -- )
+
! DSB: Data Synchronization Barrier.
ARM-INSTRUCTION: DSB-encode ( 1101010100 0 00 011 0011 CRm 1 00 11111 -- )
+
+! DUP (general): Duplicate general-purpose register to vector.
+ARM-INSTRUCTION: DUPgen-encode ( 0 Q 0 01110000 imm5 0 0001 1 Rn Rd -- )
+
! DVP: Data Value Prediction Restriction by Context: an alias of SYS.
ARM-INSTRUCTION: DVP-encode ( 1101010100 0 01 011 0111 0011 101 Rt -- )
! ESB: Error Synchronization Barrier.
! ARMv8.2
ARM-INSTRUCTION: ESB-encode ( 1101010100 0 00 011 0010 0010 000 11111 -- )
+
! EXTR: Extract register.
ARM-INSTRUCTION: EXTR32-encode ( 0 00 100111 0 0 Rm imms Rn Rd -- )
ARM-INSTRUCTION: EXTR64-encode ( 1 00 100111 1 0 Rm imms Rn Rd -- )
+! FADD (scalar): Floating-point Add (scalar).
+ARM-INSTRUCTION: FADDs-encode ( 0 0 0 11110 ftype 1 Rm 001 0 10 Rn Rd -- )
+
+! FCVT: Floating-point Convert percision (scalar).
+ARM-INSTRUCTION: FCVT-encode ( 0 0 0 11110 ftype 1 0001 opc2 10000 Rn Rd -- )
+
+! FCVTZS (scalar, integer): Floating-point Convert to Signed integer, rounding toward Zero (scalar).
+ARM-INSTRUCTION: FCVTZSsi64-encode ( 1 0 0 11110 ftype 1 11 000 000000 Rn Rd -- )
+
+! FDIV (scalar): Floating-point Divide (scalar).
+ARM-INSTRUCTION: FDIVs-encode ( 0 0 0 11110 ftype 1 Rm 0001 10 Rn Rd -- )
+
+! FMAX (scalar): Floating-point Maximum (scalar).
+ARM-INSTRUCTION: FMAXs-encode ( 0 0 0 11110 ftype 1 Rm 01 00 10 Rn Rd -- )
+
+! FMIN (scalar): Floating-point Minimum (scalar).
+ARM-INSTRUCTION: FMINs-encode ( 0 0 0 11110 ftype 1 Rm 01 01 10 Rn Rd -- )
+
+! FMOV (general): Floating-point Move to or from general-purpose register without conversion.
+ARM-INSTRUCTION: FMOVgen-encode ( sf 0 0 11110 ftype 1 rmode opc3 000000 Rn Rd -- )
+
+! FMUL (scalar): Floating-point Multiply (scalar).
+ARM-INSTRUCTION: FMULs-encode ( 0 0 0 11110 ftype 1 Rm 0 000 10 Rn Rd -- )
+
+! FSQRT (scalar): Floating-point Square Root (scalar).
+ARM-INSTRUCTION: FSQRTs-encode ( 0 0 0 11110 ftype 1 0000 11 10000 Rn Rd -- )
+
+! FSUB (scalar): Floating-point Subtract (scalar).
+ARM-INSTRUCTION: FSUBs-encode ( 0 0 0 11110 ftype 1 Rm 001 1 10 Rn Rd -- )
+
! GMI: Tag Mask Insert.
ARM-INSTRUCTION: GMI-encode ( 1 0 0 11010110 Xm 0 0 0 1 0 1 Xn Xd -- )
+
! HINT: Hint instruction.
ARM-INSTRUCTION: HINT-encode ( 1101010100 0 00 011 0010 CRm op3 11111 -- )
+
! HLT: Halt instruction.
ARM-INSTRUCTION: HLT-encode ( 11010100 010 imm16 000 00 -- )
! HVC: Hypervisor Call.
ARM-INSTRUCTION: HVC-encode ( 11010100 000 imm16 000 10 -- )
+
! IC: Instruction Cache operation: an alias of SYS.
ARM-INSTRUCTION: IC-encode ( 1101010100 0 01 op3 0111 CRm op3 Rt -- )
+
! IRG: Insert Random Tag.
ARM-INSTRUCTION: IRG-encode ( 1 0 0 11010110 Xm 0 0 0 1 0 0 Xn Xd -- )
+
! ISB: Instruction Synchronization Barrier.
ARM-INSTRUCTION: ISB-encode ( 1101010100 0 00 011 0011 CRm 1 10 11111 -- )
! LDG: Load Allocation Tag.
! ARMv8.5
ARM-INSTRUCTION: LDG-encode ( 11011001 0 1 1 imm9 0 0 Xn Xt -- )
-! LDGV: Load Allocation Tag.
+! LDGV: Load Tag Multiple.
! ARMv8.5
-ARM-INSTRUCTION: LDGV-encode ( 11011001 1 1 1 0 0 0 0 0 0 0 0 0 0 0 Xn Xt -- )
+ARM-INSTRUCTION: LDGM-encode ( 11011001 1 1 1 0 0 0 0 0 0 0 0 0 0 0 Xn Xt -- )
! LDLAR: Load LOAcquire Register.
! ARMv8.1
ARM-INSTRUCTION: SBFX32-encode ( 0 00 100110 0 immr imms Rn Rd -- )
ARM-INSTRUCTION: SBFX64-encode ( 1 00 100110 1 immr imms Rn Rd -- )
+! SCVTF (scalar, integer): Signed integer Convert to Floting-point (scalar).
+ARM-INSTRUCTION: SCVTFsi64-encode ( 1 0 0 11110 ftype 1 00 010 000000 Rn Rd -- )
+
! SDIV: Signed Divide.
ARM-INSTRUCTION: SDIV32-encode ( 0 0 0 11010110 Rm 00001 1 Rn Rd -- )
ARM-INSTRUCTION: SDIV64-encode ( 1 0 0 11010110 Rm 00001 1 Rn Rd -- )