summaryrefslogtreecommitdiff
path: root/orc/orcprogram-altivec.c
diff options
context:
space:
mode:
authorAndreas Schwab <schwab@linux-m68k.org>2012-12-01 17:12:53 -0800
committerDavid Schleef <ds@schleef.org>2012-12-01 17:13:36 -0800
commit8f247bf2fd675dc67991f4d01a7ff8058e9b822d (patch)
tree78b3fa167a0bdd3eee7413d9d753dc541381fdbe /orc/orcprogram-altivec.c
parent55e6eeaa66cdd3a3a57703dfaf99d89c7c557672 (diff)
downloadorc-8f247bf2fd675dc67991f4d01a7ff8058e9b822d.tar.gz
Adds support for PowerPC64
Diffstat (limited to 'orc/orcprogram-altivec.c')
-rw-r--r--orc/orcprogram-altivec.c69
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");
}