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, |
