diff options
author | Michael Pavone <pavone@retrodev.com> | 2015-01-08 07:49:16 +0100 |
---|---|---|
committer | Michael Pavone <pavone@retrodev.com> | 2015-01-08 07:49:16 +0100 |
commit | a31f4516fe504091f8339884cad69351178c34a2 (patch) | |
tree | 268c840998fea98e68a6bf9eeeb57cfa2330036e | |
parent | bd14f5b08583c050e8e23af5814908b99ba8d547 (diff) | |
parent | f1ad0a3e376b1103b48689fc48ed9443641a038f (diff) |
Merge
-rw-r--r-- | gen_arm.c | 36 | ||||
-rw-r--r-- | gen_arm.h | 4 |
2 files changed, 40 insertions, 0 deletions
@@ -548,3 +548,39 @@ uint32_t popm_cc(code_info *code, uint32_t reglist, uint32_t cc) *(code->cur++) = cc | POPM | reglist; return CODE_OK; } + +uint32_t load_store_immoff(code_info *code, uint32_t op, uint32_t dst, uint32_t base, int32_t offset, uint32_t cc) +{ + if (offset >= 0x1000 || offset <= -0x1000) { + return INVALID_IMMED; + } + check_alloc_code(code); + uint32_t instruction = cc | op | POST_IND | OFF_IMM | SZ_W | base << 16 | dst << 12; + if (offset >= 0) { + instruction |= offset | DIR_UP; + } else { + instruction |= (-offset) | DIR_DOWN; + } + *(code->cur++) = instruction; + return CODE_OK; +} + +uint32_t ldr_cc(code_info *code, uint32_t dst, uint32_t base, int32_t offset, uint32_t cc) +{ + return load_store_immoff(code, OP_LDR, dst, base, offset, cc); +} + +uint32_t ldr(code_info *code, uint32_t dst, uint32_t base, int32_t offset) +{ + return ldr_cc(code, dst, base, offset, CC_AL); +} + +uint32_t str_cc(code_info *code, uint32_t src, uint32_t base, int32_t offset, uint32_t cc) +{ + return load_store_immoff(code, OP_STR, src, base, offset, cc); +} + +uint32_t str(code_info *code, uint32_t src, uint32_t base, int32_t offset) +{ + return str_cc(code, src, base, offset, CC_AL); +} @@ -149,5 +149,9 @@ uint32_t pop(code_info *code, uint32_t reg); uint32_t pop_cc(code_info *code, uint32_t reg, uint32_t cc); uint32_t popm(code_info *code, uint32_t reglist); uint32_t popm_cc(code_info *code, uint32_t reglist, uint32_t cc); +uint32_t ldr_cc(code_info *code, uint32_t dst, uint32_t base, int32_t offset, uint32_t cc); +uint32_t ldr(code_info *code, uint32_t rst, uint32_t base, int32_t offset); +uint32_t str_cc(code_info *code, uint32_t src, uint32_t base, int32_t offset, uint32_t cc); +uint32_t str(code_info *code, uint32_t src, uint32_t base, int32_t offset); #endif //GEN_ARM_H_ |