P1.M1pp (4399B)
1 # P1.M1M -- portable P1 macro front-end. 2 # 3 # This file assumes an arch-specific backend M1M has already been prepended. 4 # The backend must provide the target hooks used below: 5 # %p1_li, %p1_la, %p1_labr, %p1_mov, %p1_rrr, %p1_addi, %p1_logi, 6 # %p1_shifti, %p1_mem, %p1_ldarg, %p1_b, %p1_br, %p1_call, %p1_callr, 7 # %p1_ret, %p1_eret, %p1_tail, %p1_tailr, %p1_condb, %p1_condbz, 8 # %p1_enter, %p1_syscall, and %p1_sys_*. 9 10 # ---- Materialization ------------------------------------------------------ 11 12 %macro li(rd, imm) 13 %p1_li(rd, imm) 14 %endm 15 16 %macro la(rd, target) 17 %p1_la(rd) 18 target 19 %endm 20 21 # ---- Moves ---------------------------------------------------------------- 22 23 %macro mov(rd, rs) 24 %p1_mov(rd, rs) 25 %endm 26 27 # ---- Register arithmetic -------------------------------------------------- 28 29 %macro add(rd, ra, rb) 30 %p1_rrr(ADD, rd, ra, rb) 31 %endm 32 33 %macro sub(rd, ra, rb) 34 %p1_rrr(SUB, rd, ra, rb) 35 %endm 36 37 %macro and(rd, ra, rb) 38 %p1_rrr(AND, rd, ra, rb) 39 %endm 40 41 %macro or(rd, ra, rb) 42 %p1_rrr(OR, rd, ra, rb) 43 %endm 44 45 %macro xor(rd, ra, rb) 46 %p1_rrr(XOR, rd, ra, rb) 47 %endm 48 49 %macro shl(rd, ra, rb) 50 %p1_rrr(SHL, rd, ra, rb) 51 %endm 52 53 %macro shr(rd, ra, rb) 54 %p1_rrr(SHR, rd, ra, rb) 55 %endm 56 57 %macro sar(rd, ra, rb) 58 %p1_rrr(SAR, rd, ra, rb) 59 %endm 60 61 %macro mul(rd, ra, rb) 62 %p1_rrr(MUL, rd, ra, rb) 63 %endm 64 65 %macro div(rd, ra, rb) 66 %p1_rrr(DIV, rd, ra, rb) 67 %endm 68 69 %macro udiv(rd, ra, rb) 70 %p1_rrr(UDIV, rd, ra, rb) 71 %endm 72 73 %macro rem(rd, ra, rb) 74 %p1_rrr(REM, rd, ra, rb) 75 %endm 76 77 %macro urem(rd, ra, rb) 78 %p1_rrr(UREM, rd, ra, rb) 79 %endm 80 81 # ---- Immediate arithmetic ------------------------------------------------- 82 83 %macro addi(rd, ra, imm) 84 %p1_addi(rd, ra, imm) 85 %endm 86 87 %macro andi(rd, ra, imm) 88 %p1_logi(ANDI, rd, ra, imm) 89 %endm 90 91 %macro ori(rd, ra, imm) 92 %p1_logi(ORI, rd, ra, imm) 93 %endm 94 95 %macro shli(rd, ra, imm) 96 %p1_shifti(SHLI, rd, ra, imm) 97 %endm 98 99 %macro shri(rd, ra, imm) 100 %p1_shifti(SHRI, rd, ra, imm) 101 %endm 102 103 %macro sari(rd, ra, imm) 104 %p1_shifti(SARI, rd, ra, imm) 105 %endm 106 107 # ---- Memory and ABI access ------------------------------------------------ 108 109 %macro ld(rt, rn, off) 110 %p1_mem(LD, rt, rn, off) 111 %endm 112 113 %macro st(rt, rn, off) 114 %p1_mem(ST, rt, rn, off) 115 %endm 116 117 %macro lb(rt, rn, off) 118 %p1_mem(LB, rt, rn, off) 119 %endm 120 121 %macro sb(rt, rn, off) 122 %p1_mem(SB, rt, rn, off) 123 %endm 124 125 %macro ldarg(rd, slot) 126 %p1_ldarg(rd, slot) 127 %endm 128 129 # ---- Branching ------------------------------------------------------------ 130 131 %macro b(target) 132 %p1_labr 133 target 134 %p1_b 135 %endm 136 137 %macro br(rs) 138 %p1_br(rs) 139 %endm 140 141 %macro beq(ra, rb, target) 142 %p1_labr 143 target 144 %p1_condb(BEQ, ra, rb) 145 %endm 146 147 %macro bne(ra, rb, target) 148 %p1_labr 149 target 150 %p1_condb(BNE, ra, rb) 151 %endm 152 153 %macro blt(ra, rb, target) 154 %p1_labr 155 target 156 %p1_condb(BLT, ra, rb) 157 %endm 158 159 %macro bltu(ra, rb, target) 160 %p1_labr 161 target 162 %p1_condb(BLTU, ra, rb) 163 %endm 164 165 %macro beqz(ra, target) 166 %p1_labr 167 target 168 %p1_condbz(BEQZ, ra) 169 %endm 170 171 %macro bnez(ra, target) 172 %p1_labr 173 target 174 %p1_condbz(BNEZ, ra) 175 %endm 176 177 %macro bltz(ra, target) 178 %p1_labr 179 target 180 %p1_condbz(BLTZ, ra) 181 %endm 182 183 # ---- Calls, returns, and frames ------------------------------------------ 184 185 %macro call(target) 186 %p1_labr 187 target 188 %p1_call 189 %endm 190 191 %macro callr(rs) 192 %p1_callr(rs) 193 %endm 194 195 %macro ret() 196 %p1_ret 197 %endm 198 199 %macro tail(target) 200 %p1_labr 201 target 202 %p1_tail 203 %endm 204 205 %macro tailr(rs) 206 %p1_tailr(rs) 207 %endm 208 209 %macro enter(size) 210 %p1_enter(size) 211 %endm 212 213 %macro eret() 214 %p1_eret 215 %endm 216 217 # ---- System --------------------------------------------------------------- 218 219 %macro syscall() 220 %p1_syscall 221 %endm 222 223 %macro sys_read() 224 %p1_sys_read 225 %endm 226 227 %macro sys_write() 228 %p1_sys_write 229 %endm 230 231 %macro sys_close() 232 %p1_sys_close 233 %endm 234 235 %macro sys_openat() 236 %p1_sys_openat 237 %endm 238 239 %macro sys_exit() 240 %p1_sys_exit 241 %endm 242 243 %macro sys_clone() 244 %p1_sys_clone 245 %endm 246 247 %macro sys_execve() 248 %p1_sys_execve 249 %endm 250 251 %macro sys_spawn() 252 %p1_sys_spawn 253 %endm 254 255 %macro sys_waitid() 256 %p1_sys_waitid 257 %endm 258 259 %macro sys_lseek() 260 %p1_sys_lseek 261 %endm 262 263 %macro sys_brk() 264 %p1_sys_brk 265 %endm 266 267 %macro sys_unlinkat() 268 %p1_sys_unlinkat 269 %endm 270 271 # ---- Program entry -------------------------------------------------------- 272 # 273 # The portable P1 program-entry model emits a backend-specific `:_start` 274 # stub that captures argc/argv from the native entry state, calls the 275 # portable label `p1_main` under the one-word direct-result convention 276 # (a0=argc, a1=argv), and sys_exits p1_main's return value. The stub is 277 # emitted unconditionally here so portable sources only need to define 278 # `:p1_main` as an ordinary P1 function. 279 280 %p1_entry