diff options
author | Mike Pall <mike> | 2013-04-21 00:58:32 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2013-04-21 00:58:32 +0200 |
commit | 9ead735159de2a83c6903360bec3f681e28ba10e (patch) | |
tree | d38cc08e59cac3b691f47d508ab33848eb13451d | |
parent | e92e29dd4e23809cdc0fee795c68e8819eff0b54 (diff) | |
download | luajit-9ead735159de2a83c6903360bec3f681e28ba10e.tar.gz luajit-9ead735159de2a83c6903360bec3f681e28ba10e.tar.bz2 luajit-9ead735159de2a83c6903360bec3f681e28ba10e.zip |
Add generic load/store with offset to assembler backends.
-rw-r--r-- | src/lj_asm.c | 6 | ||||
-rw-r--r-- | src/lj_emit_arm.h | 16 | ||||
-rw-r--r-- | src/lj_emit_mips.h | 16 | ||||
-rw-r--r-- | src/lj_emit_ppc.h | 16 | ||||
-rw-r--r-- | src/lj_emit_x86.h | 16 | ||||
-rw-r--r-- | src/lj_target_x86.h | 1 |
6 files changed, 39 insertions, 32 deletions
diff --git a/src/lj_asm.c b/src/lj_asm.c index 089c13ec..358ace6e 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c | |||
@@ -179,6 +179,12 @@ IRFLDEF(FLOFS) | |||
179 | #error "Missing instruction emitter for target CPU" | 179 | #error "Missing instruction emitter for target CPU" |
180 | #endif | 180 | #endif |
181 | 181 | ||
182 | /* Generic load/store of register from/to stack slot. */ | ||
183 | #define emit_spload(as, ir, r, ofs) \ | ||
184 | emit_loadofs(as, ir, (r), RID_SP, (ofs)) | ||
185 | #define emit_spstore(as, ir, r, ofs) \ | ||
186 | emit_storeofs(as, ir, (r), RID_SP, (ofs)) | ||
187 | |||
182 | /* -- Register allocator debugging ---------------------------------------- */ | 188 | /* -- Register allocator debugging ---------------------------------------- */ |
183 | 189 | ||
184 | /* #define LUAJIT_DEBUG_RA */ | 190 | /* #define LUAJIT_DEBUG_RA */ |
diff --git a/src/lj_emit_arm.h b/src/lj_emit_arm.h index b76a9a45..1a9a6852 100644 --- a/src/lj_emit_arm.h +++ b/src/lj_emit_arm.h | |||
@@ -308,30 +308,30 @@ static void emit_movrr(ASMState *as, IRIns *ir, Reg dst, Reg src) | |||
308 | emit_dm(as, ARMI_MOV, dst, src); | 308 | emit_dm(as, ARMI_MOV, dst, src); |
309 | } | 309 | } |
310 | 310 | ||
311 | /* Generic load of register from stack slot. */ | 311 | /* Generic load of register with base and (small) offset address. */ |
312 | static void emit_spload(ASMState *as, IRIns *ir, Reg r, int32_t ofs) | 312 | static void emit_loadofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs) |
313 | { | 313 | { |
314 | #if LJ_SOFTFP | 314 | #if LJ_SOFTFP |
315 | lua_assert(!irt_isnum(ir->t)); UNUSED(ir); | 315 | lua_assert(!irt_isnum(ir->t)); UNUSED(ir); |
316 | #else | 316 | #else |
317 | if (r >= RID_MAX_GPR) | 317 | if (r >= RID_MAX_GPR) |
318 | emit_vlso(as, irt_isnum(ir->t) ? ARMI_VLDR_D : ARMI_VLDR_S, r, RID_SP, ofs); | 318 | emit_vlso(as, irt_isnum(ir->t) ? ARMI_VLDR_D : ARMI_VLDR_S, r, base, ofs); |
319 | else | 319 | else |
320 | #endif | 320 | #endif |
321 | emit_lso(as, ARMI_LDR, r, RID_SP, ofs); | 321 | emit_lso(as, ARMI_LDR, r, base, ofs); |
322 | } | 322 | } |
323 | 323 | ||
324 | /* Generic store of register to stack slot. */ | 324 | /* Generic store of register with base and (small) offset address. */ |
325 | static void emit_spstore(ASMState *as, IRIns *ir, Reg r, int32_t ofs) | 325 | static void emit_storeofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs) |
326 | { | 326 | { |
327 | #if LJ_SOFTFP | 327 | #if LJ_SOFTFP |
328 | lua_assert(!irt_isnum(ir->t)); UNUSED(ir); | 328 | lua_assert(!irt_isnum(ir->t)); UNUSED(ir); |
329 | #else | 329 | #else |
330 | if (r >= RID_MAX_GPR) | 330 | if (r >= RID_MAX_GPR) |
331 | emit_vlso(as, irt_isnum(ir->t) ? ARMI_VSTR_D : ARMI_VSTR_S, r, RID_SP, ofs); | 331 | emit_vlso(as, irt_isnum(ir->t) ? ARMI_VSTR_D : ARMI_VSTR_S, r, base, ofs); |
332 | else | 332 | else |
333 | #endif | 333 | #endif |
334 | emit_lso(as, ARMI_STR, r, RID_SP, ofs); | 334 | emit_lso(as, ARMI_STR, r, base, ofs); |
335 | } | 335 | } |
336 | 336 | ||
337 | /* Emit an arithmetic/logic operation with a constant operand. */ | 337 | /* Emit an arithmetic/logic operation with a constant operand. */ |
diff --git a/src/lj_emit_mips.h b/src/lj_emit_mips.h index 74821b8b..d6ea1d52 100644 --- a/src/lj_emit_mips.h +++ b/src/lj_emit_mips.h | |||
@@ -178,24 +178,24 @@ static void emit_movrr(ASMState *as, IRIns *ir, Reg dst, Reg src) | |||
178 | emit_fg(as, irt_isnum(ir->t) ? MIPSI_MOV_D : MIPSI_MOV_S, dst, src); | 178 | emit_fg(as, irt_isnum(ir->t) ? MIPSI_MOV_D : MIPSI_MOV_S, dst, src); |
179 | } | 179 | } |
180 | 180 | ||
181 | /* Generic load of register from stack slot. */ | 181 | /* Generic load of register with base and (small) offset address. */ |
182 | static void emit_spload(ASMState *as, IRIns *ir, Reg r, int32_t ofs) | 182 | static void emit_loadofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs) |
183 | { | 183 | { |
184 | if (r < RID_MAX_GPR) | 184 | if (r < RID_MAX_GPR) |
185 | emit_tsi(as, MIPSI_LW, r, RID_SP, ofs); | 185 | emit_tsi(as, MIPSI_LW, r, base, ofs); |
186 | else | 186 | else |
187 | emit_tsi(as, irt_isnum(ir->t) ? MIPSI_LDC1 : MIPSI_LWC1, | 187 | emit_tsi(as, irt_isnum(ir->t) ? MIPSI_LDC1 : MIPSI_LWC1, |
188 | (r & 31), RID_SP, ofs); | 188 | (r & 31), base, ofs); |
189 | } | 189 | } |
190 | 190 | ||
191 | /* Generic store of register to stack slot. */ | 191 | /* Generic store of register with base and (small) offset address. */ |
192 | static void emit_spstore(ASMState *as, IRIns *ir, Reg r, int32_t ofs) | 192 | static void emit_storeofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs) |
193 | { | 193 | { |
194 | if (r < RID_MAX_GPR) | 194 | if (r < RID_MAX_GPR) |
195 | emit_tsi(as, MIPSI_SW, r, RID_SP, ofs); | 195 | emit_tsi(as, MIPSI_SW, r, base, ofs); |
196 | else | 196 | else |
197 | emit_tsi(as, irt_isnum(ir->t) ? MIPSI_SDC1 : MIPSI_SWC1, | 197 | emit_tsi(as, irt_isnum(ir->t) ? MIPSI_SDC1 : MIPSI_SWC1, |
198 | (r&31), RID_SP, ofs); | 198 | (r&31), base, ofs); |
199 | } | 199 | } |
200 | 200 | ||
201 | /* Add offset to pointer. */ | 201 | /* Add offset to pointer. */ |
diff --git a/src/lj_emit_ppc.h b/src/lj_emit_ppc.h index a589f3a6..6938c446 100644 --- a/src/lj_emit_ppc.h +++ b/src/lj_emit_ppc.h | |||
@@ -186,22 +186,22 @@ static void emit_movrr(ASMState *as, IRIns *ir, Reg dst, Reg src) | |||
186 | emit_fb(as, PPCI_FMR, dst, src); | 186 | emit_fb(as, PPCI_FMR, dst, src); |
187 | } | 187 | } |
188 | 188 | ||
189 | /* Generic load of register from stack slot. */ | 189 | /* Generic load of register with base and (small) offset address. */ |
190 | static void emit_spload(ASMState *as, IRIns *ir, Reg r, int32_t ofs) | 190 | static void emit_loadofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs) |
191 | { | 191 | { |
192 | if (r < RID_MAX_GPR) | 192 | if (r < RID_MAX_GPR) |
193 | emit_tai(as, PPCI_LWZ, r, RID_SP, ofs); | 193 | emit_tai(as, PPCI_LWZ, r, base, ofs); |
194 | else | 194 | else |
195 | emit_fai(as, irt_isnum(ir->t) ? PPCI_LFD : PPCI_LFS, r, RID_SP, ofs); | 195 | emit_fai(as, irt_isnum(ir->t) ? PPCI_LFD : PPCI_LFS, r, base, ofs); |
196 | } | 196 | } |
197 | 197 | ||
198 | /* Generic store of register to stack slot. */ | 198 | /* Generic store of register with base and (small) offset address. */ |
199 | static void emit_spstore(ASMState *as, IRIns *ir, Reg r, int32_t ofs) | 199 | static void emit_storeofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs) |
200 | { | 200 | { |
201 | if (r < RID_MAX_GPR) | 201 | if (r < RID_MAX_GPR) |
202 | emit_tai(as, PPCI_STW, r, RID_SP, ofs); | 202 | emit_tai(as, PPCI_STW, r, base, ofs); |
203 | else | 203 | else |
204 | emit_fai(as, irt_isnum(ir->t) ? PPCI_STFD : PPCI_STFS, r, RID_SP, ofs); | 204 | emit_fai(as, irt_isnum(ir->t) ? PPCI_STFD : PPCI_STFS, r, base, ofs); |
205 | } | 205 | } |
206 | 206 | ||
207 | /* Emit a compare (for equality) with a constant operand. */ | 207 | /* Emit a compare (for equality) with a constant operand. */ |
diff --git a/src/lj_emit_x86.h b/src/lj_emit_x86.h index 2454c899..ca63f59c 100644 --- a/src/lj_emit_x86.h +++ b/src/lj_emit_x86.h | |||
@@ -426,22 +426,22 @@ static void emit_movrr(ASMState *as, IRIns *ir, Reg dst, Reg src) | |||
426 | emit_rr(as, XO_MOVAPS, dst, src); | 426 | emit_rr(as, XO_MOVAPS, dst, src); |
427 | } | 427 | } |
428 | 428 | ||
429 | /* Generic load of register from stack slot. */ | 429 | /* Generic load of register with base and (small) offset address. */ |
430 | static void emit_spload(ASMState *as, IRIns *ir, Reg r, int32_t ofs) | 430 | static void emit_loadofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs) |
431 | { | 431 | { |
432 | if (r < RID_MAX_GPR) | 432 | if (r < RID_MAX_GPR) |
433 | emit_rmro(as, XO_MOV, REX_64IR(ir, r), RID_ESP, ofs); | 433 | emit_rmro(as, XO_MOV, REX_64IR(ir, r), base, ofs); |
434 | else | 434 | else |
435 | emit_rmro(as, irt_isnum(ir->t) ? XO_MOVSD : XO_MOVSS, r, RID_ESP, ofs); | 435 | emit_rmro(as, irt_isnum(ir->t) ? XO_MOVSD : XO_MOVSS, r, base, ofs); |
436 | } | 436 | } |
437 | 437 | ||
438 | /* Generic store of register to stack slot. */ | 438 | /* Generic store of register with base and (small) offset address. */ |
439 | static void emit_spstore(ASMState *as, IRIns *ir, Reg r, int32_t ofs) | 439 | static void emit_storeofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs) |
440 | { | 440 | { |
441 | if (r < RID_MAX_GPR) | 441 | if (r < RID_MAX_GPR) |
442 | emit_rmro(as, XO_MOVto, REX_64IR(ir, r), RID_ESP, ofs); | 442 | emit_rmro(as, XO_MOVto, REX_64IR(ir, r), base, ofs); |
443 | else | 443 | else |
444 | emit_rmro(as, irt_isnum(ir->t) ? XO_MOVSDto : XO_MOVSSto, r, RID_ESP, ofs); | 444 | emit_rmro(as, irt_isnum(ir->t) ? XO_MOVSDto : XO_MOVSSto, r, base, ofs); |
445 | } | 445 | } |
446 | 446 | ||
447 | /* Add offset to pointer. */ | 447 | /* Add offset to pointer. */ |
diff --git a/src/lj_target_x86.h b/src/lj_target_x86.h index 450df77f..38f464fc 100644 --- a/src/lj_target_x86.h +++ b/src/lj_target_x86.h | |||
@@ -33,6 +33,7 @@ enum { | |||
33 | RID_MRM = RID_MAX, /* Pseudo-id for ModRM operand. */ | 33 | RID_MRM = RID_MAX, /* Pseudo-id for ModRM operand. */ |
34 | 34 | ||
35 | /* Calling conventions. */ | 35 | /* Calling conventions. */ |
36 | RID_SP = RID_ESP, | ||
36 | RID_RET = RID_EAX, | 37 | RID_RET = RID_EAX, |
37 | #if LJ_64 | 38 | #if LJ_64 |
38 | RID_FPRET = RID_XMM0, | 39 | RID_FPRET = RID_XMM0, |