]> gitweb.factorcode.org Git - factor.git/blob - basis/cpu/arm/assembler/64/64.factor
837c4a062b6289970a16b8902600e584f90fd064
[factor.git] / basis / cpu / arm / assembler / 64 / 64.factor
1 ! Copyright (C) 2023 Doug Coleman.
2 ! See https://factorcode.org/license.txt for BSD license.
3 USING: cpu.arm.assembler cpu.arm.assembler.opcodes kernel math
4 math.bitwise ;
5 IN: cpu.arm.assembler.64
6
7 : encode-bitmask ( imm64 -- Nimmrimms ) 64 (encode-bitmask) ;
8
9 : ADC ( Rm Rn Rd -- ) ADC64-encode ;
10 : ADCS ( Rm Rn Rd -- ) ADCS64-encode ;
11
12 : ADDi ( uimm24 Rn Rd -- ) [ split-imm ] 2dip ADDi64-encode ;
13 : ADDr ( Rm Rn Rd -- ) [ 3 0 ] 2dip ADDer64-encode ;
14
15 : ANDi ( imm64 Rn Rd -- ) [ encode-bitmask ] 2dip ANDi64-encode ;
16 : ANDr ( Rm Rn Rd -- ) [ [ 0 ] dip 0 ] 2dip ANDsr64-encode ;
17
18 : ASRi ( uimm6 Rn Rd -- ) [ 6 ?ubits ] 2dip ASRi64-encode ;
19 : ASRr ( Rm Rn Rd -- ) ASRr64-encode ;
20
21 : BIC ( Rm Rn Rd -- ) [ [ 0 ] dip 0 ] 2dip BIC64-encode ;
22
23 : CBNZ ( simm21 Rt -- ) [ 2 ?>> 19 ?sbits ] dip CBNZ64-encode ;
24
25 : CMPi ( imm24 Rd -- ) [ split-imm ] dip CMPi64-encode ;
26 : CMPr ( Rm Rn -- ) [ 3 0 ] dip CMPer64-encode ;
27
28 ! cond is EQ NE CS HS CC LO MI PL VS VC HI LS GE LT GT LE AL NV
29 : CSEL ( Rm Rn Rd cond -- ) -rot CSEL64-encode ;
30 : CSET ( Rd cond -- ) swap CSET64-encode ;
31 : CSETM ( Rd cond -- ) swap CSETM64-encode ;
32
33 : EORi ( imm64 Rn Rd -- ) [ encode-bitmask ] 2dip EORi64-encode ;
34 : EORr ( Rm Rn Rd -- ) [ [ 0 ] dip 0 ] 2dip EORsr64-encode ;
35
36 : FPCR ( -- op0 op1 CRn CRm op2 ) 3 3 4 4 0 ;
37 : FPSR ( -- op0 op1 CRn CRm op2 ) 3 3 4 4 1 ;
38
39 : LDPpost ( simm10 Rn Rt2 Rt -- ) [ 3 ?>> 7 ?sbits ] 3dip swapd LDPpost64-encode ;
40 : LDPpre ( simm10 Rn Rt2 Rt -- ) [ 3 ?>> 7 ?sbits ] 3dip swapd LDPpre64-encode ;
41 : LDPsoff ( simm10 Rn Rt2 Rt -- ) [ 3 ?>> 7 ?sbits ] 3dip swapd LDPsoff64-encode ;
42
43 : LDRl ( simm21 Rt -- ) [ 2 ?>> 19 ?sbits ] dip LDRl64-encode ;
44 : LDRpost ( simm9 Rn Rt -- ) [ 9 ?sbits ] 2dip LDRpost64-encode ;
45 : LDRpre ( simm9 Rn Rt -- ) [ 9 ?sbits ] 2dip LDRpre64-encode ;
46 : LDRr ( Rm Rn Rt -- ) [ 3 0 ] 2dip LDRr64-encode ;
47 : LDRuoff ( uimm15 Rn Rt -- ) [ 3 ?>> 12 ?ubits ] 2dip LDRuoff64-encode ;
48
49 : LDRBr ( Rm Rn Rt -- ) [ 0 ] 2dip LDRBsr-encode ;
50 : LDRBuoff ( uimm12 Rn Rt -- ) [ 12 ?ubits ] 2dip LDRBuoff-encode ;
51
52 : LDRHuoff ( uimm13 Rn Rt -- ) [ 1 ?>> 12 ?ubits ] 2dip LDRHuoff-encode ;
53
54 : LDUR ( simm9 Rn Rt -- ) [ 9 ?sbits ] 2dip LDUR64-encode ;
55
56 : LSLi ( uimm6 Rn Rd -- ) [ 6 ?ubits ] 2dip LSLi64-encode ;
57 : LSLr ( Rm Rn Rd -- ) LSLr64-encode ;
58
59 : LSRi ( uimm6 Rn Rd -- ) [ 6 ?ubits ] 2dip LSRi64-encode ;
60
61 : MOVr ( Rn Rd -- ) MOVr64-encode ;
62 : MOVsp ( Rn Rd -- ) [ 0 ] 2dip MOVsp64-encode ;
63 : MOVwi ( imm16 Rt -- ) [ [ 0 ] dip 16 bits ] dip MOVwi64-encode ;
64
65 : MRS ( op0 op1 CRn CRm op2 Rt -- ) MRS-encode ;
66
67 : MSRr ( op0 op1 CRn CRm op2 Rt -- ) MSRr-encode ;
68
69 : MSUB ( Ra Rm Rn Rd -- ) [ swap ] 2dip MSUB64-encode ;
70
71 : MUL ( Rm Rn Rd -- ) MUL64-encode ;
72
73 : MVN ( Rm Rd -- ) [ [ 0 ] dip 0 ] dip MVN64-encode ;
74
75 : NEG ( Rm Rd -- ) [ [ 0 ] dip 0 ] dip NEG64-encode ;
76
77 : NZCV ( -- op0 op1 CRn CRm op2 ) 3 3 4 2 0 ;
78
79 : ORRr ( Rm Rn Rd -- ) [ [ 0 ] dip 0 ] 2dip ORRsr64-encode ;
80
81 : SDIV ( Rm Rn Rd -- ) SDIV64-encode ;
82
83 : STADD ( Rs Rn -- ) STADD64-encode ;
84
85 : STPpost ( simm10 Rn Rt2 Rt -- ) [ 3 ?>> 7 ?sbits ] 3dip swapd STPpost64-encode ;
86 : STPpre ( simm10 Rn Rt2 Rt -- ) [ 3 ?>> 7 ?sbits ] 3dip swapd STPpre64-encode ;
87 : STPsoff ( simm10 Rn Rt2 Rt -- ) [ 3 ?>> 7 ?sbits ] 3dip swapd STPsoff64-encode ;
88
89 : STRpre ( simm9 Rn Rt -- ) [ 9 ?sbits ] 2dip STRpre64-encode ;
90 : STRpost ( simm9 Rn Rt -- ) [ 9 ?sbits ] 2dip STRpost64-encode ;
91 : STRr ( Rm Rn Rt -- ) [ 3 0 ] 2dip STRr64-encode ;
92 : STRuoff ( uimm15 Rn Rt -- ) [ 3 ?>> 12 ?ubits ] 2dip STRuoff64-encode ;
93
94 : SUBi ( uimm24 Rn Rd -- ) [ split-imm ] 2dip SUBi64-encode ;
95 : SUBr ( Rm Rn Rd -- ) [ 3 0 ] 2dip SUBer64-encode ;
96
97 : TSTi ( imm64 Rn -- ) [ encode-bitmask ] dip TSTi64-encode ;