diff options
author | Andreas Schwab <schwab@linux-m68k.org> | 2012-12-01 17:12:53 -0800 |
---|---|---|
committer | David Schleef <ds@schleef.org> | 2012-12-01 17:13:36 -0800 |
commit | 8f247bf2fd675dc67991f4d01a7ff8058e9b822d (patch) | |
tree | 78b3fa167a0bdd3eee7413d9d753dc541381fdbe /orc/orcprogram-altivec.c | |
parent | 55e6eeaa66cdd3a3a57703dfaf99d89c7c557672 (diff) | |
download | orc-8f247bf2fd675dc67991f4d01a7ff8058e9b822d.tar.gz |
Adds support for PowerPC64
Diffstat (limited to 'orc/orcprogram-altivec.c')
-rw-r--r-- | orc/orcprogram-altivec.c | 69 |
1 files changed, 55 insertions, 14 deletions
diff --git a/orc/orcprogram-altivec.c b/orc/orcprogram-altivec.c index 3801b88..56fbc7d 100644 --- a/orc/orcprogram-altivec.c +++ b/orc/orcprogram-altivec.c @@ -26,7 +26,17 @@ powerpc_emit_prologue (OrcCompiler *compiler) ORC_ASM_CODE (compiler, ".global %s\n", compiler->program->name); ORC_ASM_CODE (compiler, "%s:\n", compiler->program->name); - powerpc_emit_stwu (compiler, POWERPC_R1, POWERPC_R1, -16); + if (compiler->is_64bit) { + ORC_ASM_CODE (compiler, " .quad .%s,.TOC.@tocbase,0\n", + compiler->program->name); + ORC_ASM_CODE (compiler, ".%s:\n", compiler->program->name); + powerpc_emit (compiler, 0); powerpc_emit (compiler, 0); + powerpc_emit (compiler, 0); powerpc_emit (compiler, 0); + powerpc_emit (compiler, 0); powerpc_emit (compiler, 0); + powerpc_emit_stdu (compiler, POWERPC_R1, POWERPC_R1, -16); + } else { + powerpc_emit_stwu (compiler, POWERPC_R1, POWERPC_R1, -16); + } for(i=POWERPC_R13;i<=POWERPC_R31;i++){ if (compiler->used_regs[i]) { @@ -82,7 +92,13 @@ orc_powerpc_init (void) unsigned int orc_compiler_powerpc_get_default_flags (void) { - return 0; + unsigned int flags = 0; + +#ifdef __powerpc64__ + flags |= ORC_TARGET_POWERPC_64BIT; +#endif + + return flags; } void @@ -90,6 +106,10 @@ orc_compiler_powerpc_init (OrcCompiler *compiler) { int i; + if (compiler->target_flags & ORC_TARGET_POWERPC_64BIT) { + compiler->is_64bit = TRUE; + } + for(i=0;i<32;i++){ compiler->valid_regs[POWERPC_R0+i] = 1; compiler->valid_regs[POWERPC_V0+i] = 1; @@ -127,10 +147,17 @@ powerpc_load_inner_constants (OrcCompiler *compiler) case ORC_VAR_TYPE_SRC: case ORC_VAR_TYPE_DEST: if (compiler->vars[i].ptr_register) { - powerpc_emit_lwz (compiler, - compiler->vars[i].ptr_register, - POWERPC_R3, - (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[i])); + if (compiler->is_64bit) { + powerpc_emit_ld (compiler, + compiler->vars[i].ptr_register, + POWERPC_R3, + (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[i])); + } else { + powerpc_emit_lwz (compiler, + compiler->vars[i].ptr_register, + POWERPC_R3, + (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[i])); + } } else { /* FIXME */ ORC_ASM_CODE(compiler,"ERROR"); @@ -319,10 +346,17 @@ orc_compiler_powerpc_assemble (OrcCompiler *compiler) if (compiler->vars[k].vartype == ORC_VAR_TYPE_SRC || compiler->vars[k].vartype == ORC_VAR_TYPE_DEST) { if (compiler->vars[k].ptr_register) { - powerpc_emit_lwz (compiler, - compiler->vars[k].ptr_register, - POWERPC_R3, - (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[k])); + if (compiler->is_64bit) { + powerpc_emit_ld (compiler, + compiler->vars[k].ptr_register, + POWERPC_R3, + (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[k])); + } else { + powerpc_emit_lwz (compiler, + compiler->vars[k].ptr_register, + POWERPC_R3, + (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[k])); + } powerpc_emit_lwz (compiler, POWERPC_R0, POWERPC_R3, @@ -331,10 +365,17 @@ orc_compiler_powerpc_assemble (OrcCompiler *compiler) compiler->vars[k].ptr_register, compiler->vars[k].ptr_register, POWERPC_R0); - powerpc_emit_stw (compiler, - compiler->vars[k].ptr_register, - POWERPC_R3, - (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[k])); + if (compiler->is_64bit) { + powerpc_emit_std (compiler, + compiler->vars[k].ptr_register, + POWERPC_R3, + (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[k])); + } else { + powerpc_emit_stw (compiler, + compiler->vars[k].ptr_register, + POWERPC_R3, + (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[k])); + } } else { ORC_ASM_CODE(compiler,"ERROR\n"); } |