1 /******************************** -*- C -*- **************************** 2 * 3 * Platform-independent layer support 4 * 5 ***********************************************************************/ 6 7 8 /*********************************************************************** 9 * 10 * Copyright 2000, 2001, 2002, 2003 Free Software Foundation, Inc. 11 * Written by Paolo Bonzini. 12 * 13 * This file is part of GNU lightning. 14 * 15 * GNU lightning is free software; you can redistribute it and/or modify it 16 * under the terms of the GNU Lesser General Public License as published 17 * by the Free Software Foundation; either version 3, or (at your option) 18 * any later version. 19 * 20 * GNU lightning is distributed in the hope that it will be useful, but 21 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 22 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 23 * License for more details. 24 * 25 * You should have received a copy of the GNU Lesser General Public License 26 * along with GNU lightning; see the file COPYING.LESSER; if not, write to the 27 * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, 28 * MA 02110-1301, USA. 29 * 30 ***********************************************************************/ 31 32 #ifndef __lightning_core_common_h_ 33 #define __lightning_core_common_h_ 34 35 #define JIT_NOREG (-1) 36 37 #define jit_get_raw_ip() _jitp->x.pc 38 #define jit_get_ip() jit_adjust_ip(_jitp->x.pc) 39 #define jit_set_ip(ptr) (_jitp->x.pc = (ptr), jit_get_ip ()) 40 #define jit_get_label() jit_get_ip() 41 #define jit_forward() jit_get_ip() 42 43 #define jit_adjust_ip(x) ((jit_insn *)(((char *)(x)) + (jit_thumb_p() ? 1 : 0))) 44 #define jit_unadjust_ip(x) ((jit_insn *)(((char *)(x)) - (jit_thumb_p() ? 1 : 0))) 45 46 #define jit_field(struc, f) ( ((long) (&((struc *) 8)->f) ) - 8) 47 #define jit_ptr_field(struc_p, f) ( ((long) (&((struc_p) 8)->f) ) - 8) 48 49 /* realignment via N-byte no-ops */ 50 51 #ifndef jit_align 52 #define jit_align(n) 53 #endif 54 55 /* jit_code: union of many possible function pointer types. Returned 56 * by jit_get_ip(). 57 */ 58 typedef union jit_code { 59 char *ptr; 60 void (*vptr)(void); 61 char (*cptr)(void); 62 unsigned char (*ucptr)(void); 63 short (*sptr)(void); 64 unsigned short (*usptr)(void); 65 int (*iptr)(void); 66 unsigned int (*uiptr)(void); 67 long (*lptr)(void); 68 unsigned long (*ulptr)(void); 69 void * (*pptr)(void); 70 float (*fptr)(void); 71 double (*dptr)(void); 72 } jit_code; 73 74 #ifndef jit_fill_delay_after 75 #define jit_fill_delay_after(branch) (branch) 76 #endif 77 78 #define jit_delay(insn, branch) ((insn), jit_fill_delay_after(branch)) 79 80 81 /* ALU synonyms */ 82 #if !defined(jit_addci_ui) 83 # if !defined(jit_addci_i) 84 /* need add/sub that sets carry for all operands */ 85 # if _ASM_SAFETY 86 # warning Assuming jit_{add,sub}{r,i}_{i,ui} always sets carry 87 # endif 88 # define jit_addci_ui(d, rs, is) jit_addi_ui((d), (rs), (is)) 89 # define jit_addcr_ui(d, s1, s2) jit_addr_ui((d), (s1), (s2)) 90 # define jit_subci_ui(d, rs, is) jit_subi_ui((d), (rs), (is)) 91 # define jit_subcr_ui(d, s1, s2) jit_subr_ui((d), (s1), (s2)) 92 # elif defined(jit_addci_i) 93 /* allow logically reversed definitions */ 94 # define jit_addci_ui(d, rs, is) jit_addci_i((d), (rs), (is)) 95 # define jit_addcr_ui(d, s1, s2) jit_addcr_i((d), (s1), (s2)) 96 # define jit_subci_ui(d, rs, is) jit_subci_i((d), (rs), (is)) 97 # define jit_subcr_ui(d, s1, s2) jit_subcr_i((d), (s1), (s2)) 98 # endif 99 #endif 100 #if !defined(jit_addci_i) && defined(jit_addci_ui) 101 /* provide compatibility logically wrong definitions */ 102 # define jit_addci_i(d, rs, is) jit_addci_ui((d), (rs), (is)) 103 # define jit_addcr_i(d, s1, s2) jit_addcr_ui((d), (s1), (s2)) 104 # define jit_subci_i(d, rs, is) jit_subci_ui((d), (rs), (is)) 105 # define jit_subcr_i(d, s1, s2) jit_subcr_ui((d), (s1), (s2)) 106 #endif 107 #if !defined(jit_addxi_ui) && defined(jit_addxi_i) 108 /* allow logically reversed definitions */ 109 # define jit_addxi_ui(d, rs, is) jit_addxi_i((d), (rs), (is)) 110 # define jit_addxr_ui(d, s1, s2) jit_addxr_i((d), (s1), (s2)) 111 # define jit_subxi_ui(d, rs, is) jit_subxi_i((d), (rs), (is)) 112 # define jit_subxr_ui(d, s1, s2) jit_subxr_i((d), (s1), (s2)) 113 #endif 114 #if !defined(jit_addxi_i) && defined(jit_addxi_ui) 115 /* provide compatibility logically wrong definitions */ 116 # define jit_addxi_i(d, rs, is) jit_addxi_ui((d), (rs), (is)) 117 # define jit_addxr_i(d, s1, s2) jit_addxr_ui((d), (s1), (s2)) 118 # define jit_subxi_i(d, rs, is) jit_subxi_ui((d), (rs), (is)) 119 # define jit_subxr_i(d, s1, s2) jit_subxr_ui((d), (s1), (s2)) 120 #endif 121 122 #define jit_addi_ui(d, rs, is) jit_addi_i((d), (rs), (is)) 123 #define jit_addr_ui(d, s1, s2) jit_addr_i((d), (s1), (s2)) 124 #define jit_andi_ui(d, rs, is) jit_andi_i((d), (rs), (is)) 125 #define jit_andr_ui(d, s1, s2) jit_andr_i((d), (s1), (s2)) 126 #define jit_lshi_ui(d, rs, is) jit_lshi_i((d), (rs), (is)) 127 #define jit_lshr_ui(d, s1, s2) jit_lshr_i((d), (s1), (s2)) 128 #ifndef jit_movi_ui 129 # define jit_movi_ui(d, rs) jit_movi_i((d), (rs)) 130 #endif 131 #define jit_movr_ui(d, rs) jit_movr_i((d), (rs)) 132 #define jit_ori_ui(d, rs, is) jit_ori_i((d), (rs), (is)) 133 #define jit_orr_ui(d, s1, s2) jit_orr_i((d), (s1), (s2)) 134 #define jit_rsbi_ui(d, rs, is) jit_rsbi_i((d), (rs), (is)) 135 #define jit_rsbr_ui(d, s1, s2) jit_rsbr_i((d), (s1), (s2)) 136 #define jit_subi_ui(d, rs, is) jit_subi_i((d), (rs), (is)) 137 #define jit_subr_ui(d, s1, s2) jit_subr_i((d), (s1), (s2)) 138 #define jit_xori_ui(d, rs, is) jit_xori_i((d), (rs), (is)) 139 #define jit_xorr_ui(d, s1, s2) jit_xorr_i((d), (s1), (s2)) 140 141 #if __WORDSIZE == 32 142 /* common definitions when sizeof(long) == sizeof(int) */ 143 # if !defined(jit_addci_ul) && defined(jit_addci_ui) 144 # define jit_addci_ul(d, rs, is) jit_addci_ui((d), (rs), (is)) 145 # define jit_addcr_ul(d, s1, s2) jit_addcr_ui((d), (s1), (s2)) 146 # define jit_subci_ul(d, rs, is) jit_subci_ui((d), (rs), (is)) 147 # define jit_subcr_ul(d, s1, s2) jit_subcr_ui((d), (s1), (s2)) 148 # endif 149 # if !defined(jit_addxi_ul) && defined(jit_addxi_ui) 150 # define jit_addxi_ul(d, rs, is) jit_addxi_ui((d), (rs), (is)) 151 # define jit_addxr_ul(d, s1, s2) jit_addxr_ui((d), (s1), (s2)) 152 # define jit_subxi_ul(d, rs, is) jit_subxi_ui((d), (rs), (is)) 153 # define jit_subxr_ul(d, s1, s2) jit_subxr_ui((d), (s1), (s2)) 154 # endif 155 #endif 156 #if !defined(jit_addci_ul) 157 # if !defined(jit_addci_l) 158 /* need add/sub that sets carry for all operands */ 159 # if _ASM_SAFETY 160 # warning Assuming jit_{add,sub}{r,i}_{l,ul} always sets carry 161 # endif 162 # define jit_addci_ul(d, rs, is) jit_addi_ul((d), (rs), (is)) 163 # define jit_addcr_ul(d, s1, s2) jit_addr_ul((d), (s1), (s2)) 164 # define jit_subci_ul(d, rs, is) jit_subi_ul((d), (rs), (is)) 165 # define jit_subcr_ul(d, s1, s2) jit_subr_ul((d), (s1), (s2)) 166 # elif defined(jit_addci_l) 167 /* allow logically reversed definitions */ 168 # define jit_addci_ul(d, rs, is) jit_addci_l((d), (rs), (is)) 169 # define jit_addcr_ul(d, s1, s2) jit_addcr_l((d), (s1), (s2)) 170 # define jit_subci_ul(d, rs, is) jit_subci_l((d), (rs), (is)) 171 # define jit_subcr_ul(d, s1, s2) jit_subcr_l((d), (s1), (s2)) 172 # endif 173 #endif 174 #if !defined(jit_addci_l) && defined(jit_addci_ul) 175 /* provide compatibility logically wrong definitions */ 176 # define jit_addci_l(d, rs, is) jit_addci_ul((d), (rs), (is)) 177 # define jit_addcr_l(d, s1, s2) jit_addcr_ul((d), (s1), (s2)) 178 # define jit_subci_l(d, rs, is) jit_subci_ul((d), (rs), (is)) 179 # define jit_subcr_l(d, s1, s2) jit_subcr_ul((d), (s1), (s2)) 180 #endif 181 #if !defined(jit_addxi_ul) && defined(jit_addxi_l) 182 /* allow logically reversed definitions */ 183 # define jit_addxi_ul(d, rs, is) jit_addxi_l((d), (rs), (is)) 184 # define jit_addxr_ul(d, s1, s2) jit_addxr_l((d), (s1), (s2)) 185 # define jit_subxi_ul(d, rs, is) jit_subxi_l((d), (rs), (is)) 186 # define jit_subxr_ul(d, s1, s2) jit_subxr_l((d), (s1), (s2)) 187 #endif 188 #if !defined(jit_addxi_l) && defined(jit_addxi_ul) 189 /* provide compatibility logically wrong definitions */ 190 # define jit_addxi_l(d, rs, is) jit_addxi_ul((d), (rs), (is)) 191 # define jit_addxr_l(d, s1, s2) jit_addxr_ul((d), (s1), (s2)) 192 # define jit_subxi_l(d, rs, is) jit_subxi_ul((d), (rs), (is)) 193 # define jit_subxr_l(d, s1, s2) jit_subxr_ul((d), (s1), (s2)) 194 #endif 195 #define jit_addi_ul(d, rs, is) jit_addi_l((d), (rs), (is)) 196 #define jit_addr_ul(d, s1, s2) jit_addr_l((d), (s1), (s2)) 197 #define jit_andi_ul(d, rs, is) jit_andi_l((d), (rs), (is)) 198 #define jit_andr_ul(d, s1, s2) jit_andr_l((d), (s1), (s2)) 199 #define jit_lshi_ul(d, rs, is) jit_lshi_l((d), (rs), (is)) 200 #define jit_lshr_ul(d, s1, s2) jit_lshr_l((d), (s1), (s2)) 201 #ifndef jit_movi_ul 202 # define jit_movi_ul(d, rs) jit_movi_l((d), (rs)) 203 #endif 204 #ifndef jit_movr_ul 205 # define jit_movr_ul(d, rs) jit_movr_l((d), (rs)) 206 #endif 207 #define jit_ori_ul(d, rs, is) jit_ori_l((d), (rs), (is)) 208 #define jit_orr_ul(d, s1, s2) jit_orr_l((d), (s1), (s2)) 209 #define jit_rsbi_ul(d, rs, is) jit_rsbi_l((d), (rs), (is)) 210 #define jit_rsbr_ul(d, s1, s2) jit_rsbr_l((d), (s1), (s2)) 211 #define jit_subi_ul(d, rs, is) jit_subi_l((d), (rs), (is)) 212 #define jit_subr_ul(d, s1, s2) jit_subr_l((d), (s1), (s2)) 213 #define jit_xori_ul(d, rs, is) jit_xori_l((d), (rs), (is)) 214 #define jit_xorr_ul(d, s1, s2) jit_xorr_l((d), (s1), (s2)) 215 #define jit_addr_p(d, s1, s2) jit_addr_ul((d), (s1), (s2)) 216 #define jit_addi_p(d, rs, is) jit_addi_ul((d), (rs), (long) (is)) 217 #ifndef jit_movr_p 218 # define jit_movr_p(d, rs) jit_movr_ul((d), (rs)) 219 #endif 220 #define jit_subr_p(d, s1, s2) jit_subr_ul((d), (s1), (s2)) 221 #define jit_subi_p(d, rs, is) jit_subi_ul((d), (rs), (long) (is)) 222 #define jit_rsbi_p(d, rs, is) jit_rsbi_ul((d), (rs), (long) (is)) 223 224 #ifndef jit_movi_p 225 #define jit_movi_p(d, is) (jit_movi_ul((d), (long) (is)), jit_get_ip()) 226 #endif 227 228 #define jit_patch(pv) jit_patch_at ((pv), jit_get_ip()) 229 230 /* NEG is not mandatory -- pick an appropriate implementation */ 231 #ifndef jit_negr_i 232 # ifdef JIT_RZERO 233 # define jit_negr_i(d, rs) jit_subr_i((d), JIT_RZERO, (rs)) 234 # if __WORDSIZE == 64 235 # define jit_negr_l(d, rs) jit_subr_l((d), JIT_RZERO, (rs)) 236 # endif 237 # else /* !JIT_RZERO */ 238 # ifndef jit_rsbi_i 239 # define jit_negr_i(d, rs) (jit_xori_i((d), (rs), -1), jit_addi_l((d), (d), 1)) 240 # define jit_negr_l(d, rs) (jit_xori_l((d), (rs), -1), jit_addi_l((d), (d), 1)) 241 # else /* jit_rsbi_i */ 242 # define jit_negr_i(d, rs) jit_rsbi_i((d), (rs), 0) 243 # define jit_negr_l(d, rs) jit_rsbi_l((d), (rs), 0) 244 # endif /* jit_rsbi_i */ 245 # endif /* !JIT_RZERO */ 246 #endif /* !jit_negr_i */ 247 248 /* Common 'shortcut' implementations */ 249 #ifndef jit_subi_i 250 # define jit_subi_i(d, rs, is) jit_addi_i((d), (rs), -(is)) 251 #endif 252 #ifndef jit_subi_l 253 # define jit_subi_l(d, rs, is) jit_subi_i((d), (rs), (is)) 254 #endif 255 #define jit_rsbr_f(d, s1, s2) jit_subr_f((d), (s2), (s1)) 256 #define jit_rsbr_d(d, s1, s2) jit_subr_d((d), (s2), (s1)) 257 #ifndef jit_rsbr_i 258 # define jit_rsbr_i(d, s1, s2) jit_subr_i((d), (s2), (s1)) 259 #endif 260 #define jit_rsbr_l(d, s1, s2) jit_subr_l((d), (s2), (s1)) 261 #define jit_rsbr_p(d, s1, s2) jit_subr_p((d), (s2), (s1)) 262 263 /* Unary */ 264 #ifndef jit_notr_i 265 # define jit_notr_i(d, rs) jit_xori_i((d), (rs), ~0) 266 #endif 267 #ifndef jit_notr_l 268 # define jit_notr_l(d, rs) jit_xori_l((d), (rs), ~0L) 269 #endif 270 #ifndef jit_notr_c 271 # define jit_notr_c(d, rs) jit_notr_i((d), (rs)) 272 # define jit_notr_uc(d, rs) jit_notr_i((d), (rs)) 273 # define jit_notr_s(d, rs) jit_notr_i((d), (rs)) 274 # define jit_notr_us(d, rs) jit_notr_i((d), (rs)) 275 #endif 276 #ifndef jit_notr_ui 277 # define jit_notr_ui(d, rs) jit_notr_i((d), (rs)) 278 #endif 279 #ifndef jit_notr_ul 280 # define jit_notr_ul(d, rs) jit_notr_l((d), (rs)) 281 #endif 282 283 #ifndef jit_extr_c_ui 284 # define jit_extr_c_ui(d, rs) jit_andi_ui((d), (rs), 0xFF) 285 #endif 286 #ifndef jit_extr_s_ui 287 # define jit_extr_s_ui(d, rs) jit_andi_ui((d), (rs), 0xFFFF) 288 #endif 289 #ifndef jit_extr_c_i 290 # define jit_extr_c_i(d, rs) (jit_lshi_i((d), (rs), 24), jit_rshi_i((d), (d), 24)) 291 #endif 292 #ifndef jit_extr_s_i 293 # define jit_extr_s_i(d, rs) (jit_lshi_i((d), (rs), 16), jit_rshi_i((d), (d), 16)) 294 #endif 295 296 #if __WORDSIZE == 64 297 # ifndef jit_extr_c_l 298 # define jit_extr_c_l(d, rs) (jit_lshi_l((d), (rs), 56), jit_rshi_l((d), (d), 56)) 299 # endif 300 # ifndef jit_extr_s_l 301 # define jit_extr_s_l(d, rs) (jit_lshi_l((d), (rs), 48), jit_rshi_l((d), (d), 48)) 302 # endif 303 # ifndef jit_extr_i_l 304 # define jit_extr_i_l(d, rs) (jit_lshi_l((d), (rs), 32), jit_rshi_l((d), (d), 32)) 305 # endif 306 # ifndef jit_extr_c_ul 307 # define jit_extr_c_ul(d, rs) jit_andi_l((d), (rs), 0xFF) 308 # endif 309 # ifndef jit_extr_s_ul 310 # define jit_extr_s_ul(d, rs) jit_andi_l((d), (rs), 0xFFFF) 311 # endif 312 # ifndef jit_extr_i_ul 313 # define jit_extr_i_ul(d, rs) jit_andi_l((d), (rs), 0xFFFFFFFFUL) 314 # endif 315 #endif /* __WORDSIZE == 64 */ 316 317 #define jit_extr_c_s(d, rs) jit_extr_c_i((d), (rs)) 318 #define jit_extr_c_us(d, rs) jit_extr_c_ui((d), (rs)) 319 #define jit_extr_uc_s(d, rs) jit_extr_uc_i((d), (rs)) 320 #define jit_extr_uc_us(d, rs) jit_extr_uc_ui((d), (rs)) 321 #define jit_extr_uc_i(d, rs) jit_extr_c_ui((d), (rs)) 322 #define jit_extr_uc_ui(d, rs) jit_extr_c_ui((d), (rs)) 323 #define jit_extr_us_i(d, rs) jit_extr_s_ui((d), (rs)) 324 #define jit_extr_us_ui(d, rs) jit_extr_s_ui((d), (rs)) 325 #define jit_extr_uc_l(d, rs) jit_extr_c_ul((d), (rs)) 326 #define jit_extr_uc_ul(d, rs) jit_extr_c_ul((d), (rs)) 327 #define jit_extr_us_l(d, rs) jit_extr_s_ul((d), (rs)) 328 #define jit_extr_us_ul(d, rs) jit_extr_s_ul((d), (rs)) 329 #define jit_extr_ui_l(d, rs) jit_extr_i_ul((d), (rs)) 330 #define jit_extr_ui_ul(d, rs) jit_extr_i_ul((d), (rs)) 331 332 333 /* NTOH/HTON is not mandatory for big endian architectures */ 334 #ifndef jit_ntoh_ui /* big endian */ 335 #define jit_ntoh_ui(d, rs) ((d) == (rs) ? (void)0 : jit_movr_i((d), (rs))) 336 #define jit_ntoh_us(d, rs) ((d) == (rs) ? (void)0 : jit_movr_i((d), (rs))) 337 #endif /* big endian */ 338 339 /* hton is a synonym for ntoh */ 340 #define jit_hton_ui(d, rs) jit_ntoh_ui((d), (rs)) 341 #define jit_hton_us(d, rs) jit_ntoh_us((d), (rs)) 342 343 /* Stack synonyms */ 344 #define jit_pushr_ui(rs) jit_pushr_i(rs) 345 #define jit_popr_ui(rs) jit_popr_i(rs) 346 #define jit_pushr_ul(rs) jit_pushr_l(rs) 347 #define jit_popr_ul(rs) jit_popr_l(rs) 348 #define jit_pushr_p(rs) jit_pushr_ul(rs) 349 #define jit_popr_p(rs) jit_popr_ul(rs) 350 351 #define jit_prepare(nint) jit_prepare_i((nint)) 352 #define jit_pusharg_c(rs) jit_pusharg_i(rs) 353 #define jit_pusharg_s(rs) jit_pusharg_i(rs) 354 #define jit_pusharg_uc(rs) jit_pusharg_i(rs) 355 #define jit_pusharg_us(rs) jit_pusharg_i(rs) 356 #define jit_pusharg_ui(rs) jit_pusharg_i(rs) 357 #define jit_pusharg_ul(rs) jit_pusharg_l(rs) 358 #define jit_pusharg_p(rs) jit_pusharg_ul(rs) 359 360 #define jit_normal_pushonlyarg_p(r0) jit_normal_pushonlyarg_i(r0) 361 362 /* Memory synonyms */ 363 364 #ifdef JIT_RZERO 365 #ifndef jit_ldi_c 366 #define jit_ldi_c(rd, is) jit_ldxi_c((rd), JIT_RZERO, (is)) 367 #define jit_sti_c(id, rs) jit_stxi_c((id), JIT_RZERO, (rs)) 368 #define jit_ldi_s(rd, is) jit_ldxi_s((rd), JIT_RZERO, (is)) 369 #define jit_sti_s(id, rs) jit_stxi_s((id), JIT_RZERO, (rs)) 370 #define jit_ldi_i(rd, is) jit_ldxi_i((rd), JIT_RZERO, (is)) 371 #define jit_sti_i(id, rs) jit_stxi_i((id), JIT_RZERO, (rs)) 372 #define jit_ldi_l(rd, is) jit_ldxi_l((rd), JIT_RZERO, (is)) 373 #define jit_sti_l(id, rs) jit_stxi_l((id), JIT_RZERO, (rs)) 374 #define jit_ldi_uc(rd, is) jit_ldxi_uc((rd), JIT_RZERO, (is)) 375 #define jit_ldi_us(rd, is) jit_ldxi_us((rd), JIT_RZERO, (is)) 376 #define jit_ldi_ui(rd, is) jit_ldxi_ui((rd), JIT_RZERO, (is)) 377 # if __WORDSIZE == 64 378 # define jit_ldi_ul(rd, is) jit_ldxi_ul((rd), JIT_RZERO, (is)) 379 # endif 380 #endif 381 382 #ifndef jit_ldr_c 383 #define jit_ldr_c(rd, rs) jit_ldxr_c((rd), JIT_RZERO, (rs)) 384 #define jit_str_c(rd, rs) jit_stxr_c(JIT_RZERO, (rd), (rs)) 385 #define jit_ldr_s(rd, rs) jit_ldxr_s((rd), JIT_RZERO, (rs)) 386 #define jit_str_s(rd, rs) jit_stxr_s(JIT_RZERO, (rd), (rs)) 387 #define jit_ldr_i(rd, rs) jit_ldxr_i((rd), JIT_RZERO, (rs)) 388 #define jit_str_i(rd, rs) jit_stxr_i(JIT_RZERO, (rd), (rs)) 389 #define jit_ldr_l(rd, rs) jit_ldxr_l((rd), JIT_RZERO, (rs)) 390 #define jit_str_l(rd, rs) jit_stxr_l(JIT_RZERO, (rd), (rs)) 391 #define jit_ldr_uc(rd, rs) jit_ldxr_uc((rd), JIT_RZERO, (rs)) 392 #define jit_ldr_us(rd, rs) jit_ldxr_us((rd), JIT_RZERO, (rs)) 393 #define jit_ldr_ui(rd, rs) jit_ldxr_ui((rd), JIT_RZERO, (rs)) 394 # if __WORDSIZE == 64 395 # define jit_ldr_ul(rd, rs) jit_ldxr_ul((rd), JIT_RZERO, (rs)) 396 # endif 397 #endif 398 #endif 399 400 #define jit_str_uc(rd, rs) jit_str_c((rd), (rs)) 401 #define jit_sti_uc(id, rs) jit_sti_c((id), (rs)) 402 #define jit_stxr_uc(d1, d2, rs) jit_stxr_c((d1), (d2), (rs)) 403 #define jit_stxi_uc(id, rd, is) jit_stxi_c((id), (rd), (is)) 404 405 #define jit_str_us(rd, rs) jit_str_s((rd), (rs)) 406 #define jit_sti_us(id, rs) jit_sti_s((id), (rs)) 407 #define jit_stxr_us(d1, d2, rs) jit_stxr_s((d1), (d2), (rs)) 408 #define jit_stxi_us(id, rd, is) jit_stxi_s((id), (rd), (is)) 409 410 #define jit_str_ui(rd, rs) jit_str_i((rd), (rs)) 411 #define jit_sti_ui(id, rs) jit_sti_i((id), (rs)) 412 #define jit_stxr_ui(d1, d2, rs) jit_stxr_i((d1), (d2), (rs)) 413 #define jit_stxi_ui(id, rd, is) jit_stxi_i((id), (rd), (is)) 414 415 #define jit_str_ul(rd, rs) jit_str_l((rd), (rs)) 416 #define jit_sti_ul(id, rs) jit_sti_l((id), (rs)) 417 #define jit_stxr_ul(d1, d2, rs) jit_stxr_l((d1), (d2), (rs)) 418 #define jit_stxi_ul(id, rd, is) jit_stxi_l((id), (rd), (is)) 419 420 #define jit_str_p(rd, rs) jit_str_l((rd), (rs)) 421 #define jit_sti_p(id, rs) jit_sti_l((id), (rs)) 422 #define jit_stxr_p(d1, d2, rs) jit_stxr_l((d1), (d2), (rs)) 423 #define jit_stxi_p(id, rd, is) jit_stxi_l((id), (rd), (is)) 424 425 #define jit_ldr_p(rd, rs) jit_ldr_l((rd), (rs)) 426 #define jit_ldi_p(rd, is) jit_ldi_l((rd), (is)) 427 #define jit_ldxr_p(rd, s1, s2) jit_ldxr_l((rd), (s1), (s2)) 428 #ifndef jit_ldxi_p 429 # define jit_ldxi_p(rd, rs, is) jit_ldxi_l((rd), (rs), (is)) 430 #endif 431 432 #define jit_ldr_ul(d, rs) jit_ldr_l((d), (rs)) 433 #define jit_ldi_ul(d, is) jit_ldi_l((d), (is)) 434 #define jit_ldxr_ul(d, s1, s2) jit_ldxr_l((d), (s1), (s2)) 435 #ifndef jit_ldxi_ul 436 # define jit_ldxi_ul(d, rs, is) jit_ldxi_l((d), (rs), (is)) 437 #endif 438 439 440 /* Boolean & branch synonyms */ 441 #define jit_eqr_ui(d, s1, s2) jit_eqr_i((d), (s1), (s2)) 442 #define jit_eqi_ui(d, rs, is) jit_eqi_i((d), (rs), (is)) 443 #define jit_ner_ui(d, s1, s2) jit_ner_i((d), (s1), (s2)) 444 #define jit_nei_ui(d, rs, is) jit_nei_i((d), (rs), (is)) 445 446 #define jit_eqr_ul(d, s1, s2) jit_eqr_l((d), (s1), (s2)) 447 #define jit_eqi_ul(d, rs, is) jit_eqi_l((d), (rs), (is)) 448 #define jit_ner_ul(d, s1, s2) jit_ner_l((d), (s1), (s2)) 449 #define jit_nei_ul(d, rs, is) jit_nei_l((d), (rs), (is)) 450 451 #define jit_beqr_ui(label, s1, s2) jit_beqr_i((label), (s1), (s2)) 452 #define jit_beqi_ui(label, rs, is) jit_beqi_i((label), (rs), (is)) 453 #define jit_bner_ui(label, s1, s2) jit_bner_i((label), (s1), (s2)) 454 #define jit_bnei_ui(label, rs, is) jit_bnei_i((label), (rs), (is)) 455 #define jit_bmcr_ui(label, s1, s2) jit_bmcr_i((label), (s1), (s2)) 456 #define jit_bmci_ui(label, rs, is) jit_bmci_i((label), (rs), (is)) 457 #define jit_bmsr_ui(label, s1, s2) jit_bmsr_i((label), (s1), (s2)) 458 #define jit_bmsi_ui(label, rs, is) jit_bmsi_i((label), (rs), (is)) 459 460 #define jit_beqr_ul(label, s1, s2) jit_beqr_l((label), (s1), (s2)) 461 #define jit_beqi_ul(label, rs, is) jit_beqi_l((label), (rs), (is)) 462 #define jit_bner_ul(label, s1, s2) jit_bner_l((label), (s1), (s2)) 463 #define jit_bnei_ul(label, rs, is) jit_bnei_l((label), (rs), (is)) 464 #define jit_bmcr_ul(label, s1, s2) jit_bmcr_l((label), (s1), (s2)) 465 #define jit_bmci_ul(label, rs, is) jit_bmci_l((label), (rs), (is)) 466 #define jit_bmsr_ul(label, s1, s2) jit_bmsr_l((label), (s1), (s2)) 467 #define jit_bmsi_ul(label, rs, is) jit_bmsi_l((label), (rs), (is)) 468 469 #define jit_ltr_p(d, s1, s2) jit_ltr_ul((d), (s1), (s2)) 470 #define jit_lti_p(d, rs, is) jit_lti_ul((d), (rs), (long)(is)) 471 #define jit_ler_p(d, s1, s2) jit_ler_ul((d), (s1), (s2)) 472 #define jit_lei_p(d, rs, is) jit_lei_ul((d), (rs), (long)(is)) 473 #define jit_gtr_p(d, s1, s2) jit_gtr_ul((d), (s1), (s2)) 474 #define jit_gti_p(d, rs, is) jit_gti_ul((d), (rs), (long)(is)) 475 #define jit_ger_p(d, s1, s2) jit_ger_ul((d), (s1), (s2)) 476 #define jit_gei_p(d, rs, is) jit_gei_ul((d), (rs), (long)(is)) 477 #define jit_eqr_p(d, s1, s2) jit_eqr_ul((d), (s1), (s2)) 478 #define jit_eqi_p(d, rs, is) jit_eqi_ul((d), (rs), (long)(is)) 479 #define jit_ner_p(d, s1, s2) jit_ner_ul((d), (s1), (s2)) 480 #define jit_nei_p(d, rs, is) jit_nei_ul((d), (rs), (long)(is)) 481 482 #define jit_bltr_p(label, s1, s2) jit_bltr_ul((label), (s1), (s2)) 483 #define jit_blti_p(label, rs, is) jit_blti_ul((label), (rs), (long)(is)) 484 #define jit_bler_p(label, s1, s2) jit_bler_ul((label), (s1), (s2)) 485 #define jit_blei_p(label, rs, is) jit_blei_ul((label), (rs), (long)(is)) 486 #define jit_bgtr_p(label, s1, s2) jit_bgtr_ul((label), (s1), (s2)) 487 #define jit_bgti_p(label, rs, is) jit_bgti_ul((label), (rs), (long)(is)) 488 #define jit_bger_p(label, s1, s2) jit_bger_ul((label), (s1), (s2)) 489 #define jit_bgei_p(label, rs, is) jit_bgei_ul((label), (rs), (long)(is)) 490 #define jit_beqr_p(label, s1, s2) jit_beqr_ul((label), (s1), (s2)) 491 #define jit_beqi_p(label, rs, is) jit_beqi_ul((label), (rs), (long)(is)) 492 #define jit_bner_p(label, s1, s2) jit_bner_ul((label), (s1), (s2)) 493 #define jit_bnei_p(label, rs, is) jit_bnei_ul((label), (rs), (long)(is)) 494 495 #define jit_retval_ui(rd) jit_retval_i((rd)) 496 #define jit_retval_uc(rd) jit_retval_i((rd)) 497 #define jit_retval_us(rd) jit_retval_i((rd)) 498 #define jit_retval_ul(rd) jit_retval_l((rd)) 499 #define jit_retval_p(rd) jit_retval_ul((rd)) 500 #define jit_retval_c(rd) jit_retval_i((rd)) 501 #define jit_retval_s(rd) jit_retval_i((rd)) 502 503 /* This was a bug, but we keep it. */ 504 #define jit_retval(rd) jit_retval_i ((rd)) 505 506 #ifndef jit_finish 507 #define jit_finish(sub) jit_calli(sub) 508 #endif 509 510 #ifndef jit_finishr 511 #define jit_finishr(reg) jit_callr(reg) 512 #endif 513 514 #ifndef jit_prolog 515 #define jit_prolog(numargs) 516 #endif 517 518 #ifndef jit_leaf 519 #define jit_leaf(numargs) jit_prolog(numargs) 520 #endif 521 522 #ifndef jit_getarg_c 523 #ifndef JIT_AP 524 #define jit_getarg_c(reg, ofs) jit_extr_c_l ((reg), (ofs)) 525 #define jit_getarg_i(reg, ofs) jit_extr_i_l ((reg), (ofs)) 526 #define jit_getarg_l(reg, ofs) jit_movr_l ((reg), (ofs)) 527 #define jit_getarg_p(reg, ofs) jit_movr_p ((reg), (ofs)) 528 #define jit_getarg_s(reg, ofs) jit_extr_s_l ((reg), (ofs)) 529 #define jit_getarg_uc(reg, ofs) jit_extr_uc_ul((reg), (ofs)) 530 #define jit_getarg_ui(reg, ofs) jit_extr_ui_ul((reg), (ofs)) 531 #define jit_getarg_ul(reg, ofs) jit_movr_ul ((reg), (ofs)) 532 #define jit_getarg_us(reg, ofs) jit_extr_us_ul((reg), (ofs)) 533 #else 534 #define jit_getarg_c(reg, ofs) jit_ldxi_c((reg), JIT_AP, (ofs)); 535 #define jit_getarg_uc(reg, ofs) jit_ldxi_uc((reg), JIT_AP, (ofs)); 536 #define jit_getarg_s(reg, ofs) jit_ldxi_s((reg), JIT_AP, (ofs)); 537 #define jit_getarg_us(reg, ofs) jit_ldxi_us((reg), JIT_AP, (ofs)); 538 #define jit_getarg_i(reg, ofs) jit_ldxi_i((reg), JIT_AP, (ofs)); 539 #define jit_getarg_ui(reg, ofs) jit_ldxi_ui((reg), JIT_AP, (ofs)); 540 #define jit_getarg_l(reg, ofs) jit_ldxi_l((reg), JIT_AP, (ofs)); 541 #define jit_getarg_ul(reg, ofs) jit_ldxi_ul((reg), JIT_AP, (ofs)); 542 #define jit_getarg_p(reg, ofs) jit_ldxi_p((reg), JIT_AP, (ofs)); 543 #endif 544 #endif 545 546 547 /* Common definitions when sizeof(long) = sizeof(int) */ 548 #if __WORDSIZE == 32 549 /* ALU */ 550 # define jit_addi_l(d, rs, is) jit_addi_i((d), (rs), (is)) 551 # define jit_addr_l(d, s1, s2) jit_addr_i((d), (s1), (s2)) 552 # define jit_andi_l(d, rs, is) jit_andi_i((d), (rs), (is)) 553 # define jit_andr_l(d, s1, s2) jit_andr_i((d), (s1), (s2)) 554 # define jit_divi_l(d, rs, is) jit_divi_i((d), (rs), (is)) 555 # define jit_divr_l(d, s1, s2) jit_divr_i((d), (s1), (s2)) 556 # define jit_hmuli_l(d, rs, is) jit_hmuli_i((d), (rs), (is)) 557 # define jit_hmulr_l(d, s1, s2) jit_hmulr_i((d), (s1), (s2)) 558 # define jit_lshi_l(d, rs, is) jit_lshi_i((d), (rs), (is)) 559 # define jit_lshr_l(d, s1, s2) jit_lshr_i((d), (s1), (s2)) 560 # define jit_modi_l(d, rs, is) jit_modi_i((d), (rs), (is)) 561 # define jit_modr_l(d, s1, s2) jit_modr_i((d), (s1), (s2)) 562 # define jit_muli_l(d, rs, is) jit_muli_i((d), (rs), (is)) 563 # define jit_mulr_l(d, s1, s2) jit_mulr_i((d), (s1), (s2)) 564 # ifndef jit_negr_l 565 # define jit_negr_l(d, s1) jit_negr_i((d), (s1)) 566 # endif 567 # define jit_ori_l(d, rs, is) jit_ori_i((d), (rs), (is)) 568 # define jit_orr_l(d, s1, s2) jit_orr_i((d), (s1), (s2)) 569 # define jit_rshi_l(d, rs, is) jit_rshi_i((d), (rs), (is)) 570 # define jit_rshr_l(d, s1, s2) jit_rshr_i((d), (s1), (s2)) 571 # define jit_subr_l(d, s1, s2) jit_subr_i((d), (s1), (s2)) 572 # define jit_xori_l(d, rs, is) jit_xori_i((d), (rs), (is)) 573 # define jit_xorr_l(d, s1, s2) jit_xorr_i((d), (s1), (s2)) 574 # define jit_rsbi_l(d, rs, is) jit_rsbi_i((d), (rs), (is)) 575 # define jit_divi_ul(d, rs, is) jit_divi_ui((d), (rs), (is)) 576 # define jit_divr_ul(d, s1, s2) jit_divr_ui((d), (s1), (s2)) 577 # define jit_hmuli_ul(d, rs, is) jit_hmuli_ui((d), (rs), (is)) 578 # define jit_hmulr_ul(d, s1, s2) jit_hmulr_ui((d), (s1), (s2)) 579 # define jit_modi_ul(d, rs, is) jit_modi_ui((d), (rs), (is)) 580 # define jit_modr_ul(d, s1, s2) jit_modr_ui((d), (s1), (s2)) 581 # define jit_muli_ul(d, rs, is) jit_muli_ui((d), (rs), (is)) 582 # define jit_mulr_ul(d, s1, s2) jit_mulr_ui((d), (s1), (s2)) 583 # define jit_rshi_ul(d, rs, is) jit_rshi_ui((d), (rs), (is)) 584 # define jit_rshr_ul(d, s1, s2) jit_rshr_ui((d), (s1), (s2)) 585 586 # define jit_bomulr_l(d, s1, s2) jit_bomulr_i((d), (s1), (s2)) 587 588 /* Sign/Zero extension */ 589 # define jit_extr_c_l(d, rs) jit_extr_c_i(d, rs) 590 # define jit_extr_c_ul(d, rs) jit_extr_c_ui(d, rs) 591 # define jit_extr_s_l(d, rs) jit_extr_s_i(d, rs) 592 # define jit_extr_s_ul(d, rs) jit_extr_s_ui(d, rs) 593 # define jit_extr_i_l(d, rs) jit_movr_i(d, rs) 594 # define jit_extr_i_ul(d, rs) jit_movr_i(d, rs) 595 596 /* Unary */ 597 # define jit_movi_l(d, rs) jit_movi_i((d), (rs)) 598 # define jit_movr_l(d, rs) jit_movr_i((d), (rs)) 599 600 /* Stack */ 601 # define jit_pushr_l(rs) jit_pushr_i(rs) 602 # define jit_popr_l(rs) jit_popr_i(rs) 603 # define jit_pusharg_l(rs) jit_pusharg_i(rs) 604 605 /* Memory */ 606 # ifndef JIT_RZERO 607 # define jit_ldr_l(d, rs) jit_ldr_i((d), (rs)) 608 # define jit_ldi_l(d, is) jit_ldi_i((d), (is)) 609 # define jit_str_l(d, rs) jit_str_i((d), (rs)) 610 # define jit_sti_l(d, is) jit_sti_i((d), (is)) 611 # define jit_ldr_ui(d, rs) jit_ldr_i((d), (rs)) 612 # define jit_ldi_ui(d, is) jit_ldi_i((d), (is)) 613 # endif 614 615 # define jit_ldxr_l(d, s1, s2) jit_ldxr_i((d), (s1), (s2)) 616 # define jit_ldxi_l(d, rs, is) jit_ldxi_i((d), (rs), (is)) 617 # define jit_stxr_l(d, s1, s2) jit_stxr_i((d), (s1), (s2)) 618 # define jit_stxi_l(d, rs, is) jit_stxi_i((d), (rs), (is)) 619 # if !defined (jit_ldxr_ui) 620 # define jit_ldxr_ui(d, s1, s2) jit_ldxr_i((d), (s1), (s2)) 621 # endif 622 # if !defined (jit_ldxi_ui) 623 # define jit_ldxi_ui(d, rs, is) jit_ldxi_i((d), (rs), (is)) 624 # endif 625 626 627 /* Boolean */ 628 # define jit_ltr_l(d, s1, s2) jit_ltr_i((d), (s1), (s2)) 629 # define jit_lti_l(d, rs, is) jit_lti_i((d), (rs), (is)) 630 # define jit_ler_l(d, s1, s2) jit_ler_i((d), (s1), (s2)) 631 # define jit_lei_l(d, rs, is) jit_lei_i((d), (rs), (is)) 632 # define jit_gtr_l(d, s1, s2) jit_gtr_i((d), (s1), (s2)) 633 # define jit_gti_l(d, rs, is) jit_gti_i((d), (rs), (is)) 634 # define jit_ger_l(d, s1, s2) jit_ger_i((d), (s1), (s2)) 635 # define jit_gei_l(d, rs, is) jit_gei_i((d), (rs), (is)) 636 # define jit_eqr_l(d, s1, s2) jit_eqr_i((d), (s1), (s2)) 637 # define jit_eqi_l(d, rs, is) jit_eqi_i((d), (rs), (is)) 638 # define jit_ner_l(d, s1, s2) jit_ner_i((d), (s1), (s2)) 639 # define jit_nei_l(d, rs, is) jit_nei_i((d), (rs), (is)) 640 # define jit_ltr_ul(d, s1, s2) jit_ltr_ui((d), (s1), (s2)) 641 # define jit_lti_ul(d, rs, is) jit_lti_ui((d), (rs), (is)) 642 # define jit_ler_ul(d, s1, s2) jit_ler_ui((d), (s1), (s2)) 643 # define jit_lei_ul(d, rs, is) jit_lei_ui((d), (rs), (is)) 644 # define jit_gtr_ul(d, s1, s2) jit_gtr_ui((d), (s1), (s2)) 645 # define jit_gti_ul(d, rs, is) jit_gti_ui((d), (rs), (is)) 646 # define jit_ger_ul(d, s1, s2) jit_ger_ui((d), (s1), (s2)) 647 # define jit_gei_ul(d, rs, is) jit_gei_ui((d), (rs), (is)) 648 649 /* Branches */ 650 # define jit_bltr_l(label, s1, s2) jit_bltr_i((label), (s1), (s2)) 651 # define jit_blti_l(label, rs, is) jit_blti_i((label), (rs), (is)) 652 # define jit_bler_l(label, s1, s2) jit_bler_i((label), (s1), (s2)) 653 # define jit_blei_l(label, rs, is) jit_blei_i((label), (rs), (is)) 654 # define jit_bgtr_l(label, s1, s2) jit_bgtr_i((label), (s1), (s2)) 655 # define jit_bgti_l(label, rs, is) jit_bgti_i((label), (rs), (is)) 656 # define jit_bger_l(label, s1, s2) jit_bger_i((label), (s1), (s2)) 657 # define jit_bgei_l(label, rs, is) jit_bgei_i((label), (rs), (is)) 658 # define jit_beqr_l(label, s1, s2) jit_beqr_i((label), (s1), (s2)) 659 # define jit_beqi_l(label, rs, is) jit_beqi_i((label), (rs), (is)) 660 # define jit_bner_l(label, s1, s2) jit_bner_i((label), (s1), (s2)) 661 # define jit_bnei_l(label, rs, is) jit_bnei_i((label), (rs), (is)) 662 # define jit_bmcr_l(label, s1, s2) jit_bmcr_i((label), (s1), (s2)) 663 # define jit_bmci_l(label, rs, is) jit_bmci_i((label), (rs), (is)) 664 # define jit_bmsr_l(label, s1, s2) jit_bmsr_i((label), (s1), (s2)) 665 # define jit_bmsi_l(label, rs, is) jit_bmsi_i((label), (rs), (is)) 666 # define jit_boaddr_l(label, s1, s2) jit_boaddr_i((label), (s1), (s2)) 667 # define jit_boaddi_l(label, rs, is) jit_boaddi_i((label), (rs), (is)) 668 # define jit_bosubr_l(label, s1, s2) jit_bosubr_i((label), (s1), (s2)) 669 # define jit_bosubi_l(label, rs, is) jit_bosubi_i((label), (rs), (is)) 670 # define jit_bltr_ul(label, s1, s2) jit_bltr_ui((label), (s1), (s2)) 671 # define jit_blti_ul(label, rs, is) jit_blti_ui((label), (rs), (is)) 672 # define jit_bler_ul(label, s1, s2) jit_bler_ui((label), (s1), (s2)) 673 # define jit_blei_ul(label, rs, is) jit_blei_ui((label), (rs), (is)) 674 # define jit_bgtr_ul(label, s1, s2) jit_bgtr_ui((label), (s1), (s2)) 675 # define jit_bgti_ul(label, rs, is) jit_bgti_ui((label), (rs), (is)) 676 # define jit_bger_ul(label, s1, s2) jit_bger_ui((label), (s1), (s2)) 677 # define jit_bgei_ul(label, rs, is) jit_bgei_ui((label), (rs), (is)) 678 # define jit_boaddr_ul(label, s1, s2) jit_boaddr_ui((label), (s1), (s2)) 679 # define jit_boaddi_ul(label, rs, is) jit_boaddi_ui((label), (rs), (is)) 680 # define jit_bosubr_ul(label, s1, s2) jit_bosubr_ui((label), (s1), (s2)) 681 # define jit_bosubi_ul(label, rs, is) jit_bosubi_ui((label), (rs), (is)) 682 683 # define jit_retval_l(rd) jit_retval_i((rd)) 684 #endif /* __WORDSIZE == 32 */ 685 686 /* RSB is not mandatory */ 687 #ifndef jit_rsbi_i 688 # define jit_rsbi_i(d, rs, is) (jit_subi_i((d), (rs), (is)), jit_negr_i((d), (d))) 689 690 # ifndef jit_rsbi_l 691 # define jit_rsbi_l(d, rs, is) (jit_subi_l((d), (rs), (is)), jit_negr_l((d), (d))) 692 # endif 693 #endif 694 695 #endif /* __lightning_core_common_h_ */ 696