mirror of git://gcc.gnu.org/git/gcc.git
ffi.c (ffi_prep_args_SYSV): Move var declaration before statements.
* src/powerpc/ffi.c (ffi_prep_args_SYSV): Move var declaration before statements. (ffi_prep_args64): Support little-endian. (ffi_closure_helper_SYSV, ffi_closure_helper_LINUX64): Likewise. * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Likewise. * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Likewise. From-SVN: r200383
This commit is contained in:
parent
fe7144f48e
commit
40b45a6d76
|
|
@ -1,3 +1,12 @@
|
||||||
|
2013-06-25 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
* src/powerpc/ffi.c (ffi_prep_args_SYSV): Move var declaration
|
||||||
|
before statements.
|
||||||
|
(ffi_prep_args64): Support little-endian.
|
||||||
|
(ffi_closure_helper_SYSV, ffi_closure_helper_LINUX64): Likewise.
|
||||||
|
* src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Likewise.
|
||||||
|
* src/powerpc/ppc_closure.S (ffi_closure_SYSV): Likewise.
|
||||||
|
|
||||||
2013-05-22 Dominique d'Humieres <dominiq@lps.ens.fr>
|
2013-05-22 Dominique d'Humieres <dominiq@lps.ens.fr>
|
||||||
Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
|
Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -127,6 +127,9 @@ ffi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack)
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
ffi_type **ptr;
|
ffi_type **ptr;
|
||||||
|
#ifndef __NO_FPRS__
|
||||||
|
double double_tmp;
|
||||||
|
#endif
|
||||||
union {
|
union {
|
||||||
void **v;
|
void **v;
|
||||||
char **c;
|
char **c;
|
||||||
|
|
@ -146,7 +149,6 @@ ffi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack)
|
||||||
gpr_base.u = stacktop.u - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS;
|
gpr_base.u = stacktop.u - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS;
|
||||||
intarg_count = 0;
|
intarg_count = 0;
|
||||||
#ifndef __NO_FPRS__
|
#ifndef __NO_FPRS__
|
||||||
double double_tmp;
|
|
||||||
fpr_base.d = gpr_base.d - NUM_FPR_ARG_REGISTERS;
|
fpr_base.d = gpr_base.d - NUM_FPR_ARG_REGISTERS;
|
||||||
fparg_count = 0;
|
fparg_count = 0;
|
||||||
copy_space.c = ((flags & FLAG_FP_ARGUMENTS) ? fpr_base.c : gpr_base.c);
|
copy_space.c = ((flags & FLAG_FP_ARGUMENTS) ? fpr_base.c : gpr_base.c);
|
||||||
|
|
@ -542,11 +544,12 @@ ffi_prep_args64 (extended_cif *ecif, unsigned long *const stack)
|
||||||
{
|
{
|
||||||
char *where = next_arg.c;
|
char *where = next_arg.c;
|
||||||
|
|
||||||
|
#ifndef __LITTLE_ENDIAN__
|
||||||
/* Structures with size less than eight bytes are passed
|
/* Structures with size less than eight bytes are passed
|
||||||
left-padded. */
|
left-padded. */
|
||||||
if ((*ptr)->size < 8)
|
if ((*ptr)->size < 8)
|
||||||
where += 8 - (*ptr)->size;
|
where += 8 - (*ptr)->size;
|
||||||
|
#endif
|
||||||
memcpy (where, *p_argv.c, (*ptr)->size);
|
memcpy (where, *p_argv.c, (*ptr)->size);
|
||||||
next_arg.ul += words;
|
next_arg.ul += words;
|
||||||
if (next_arg.ul == gpr_end.ul)
|
if (next_arg.ul == gpr_end.ul)
|
||||||
|
|
@ -1208,6 +1211,7 @@ ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue,
|
||||||
|
|
||||||
case FFI_TYPE_SINT8:
|
case FFI_TYPE_SINT8:
|
||||||
case FFI_TYPE_UINT8:
|
case FFI_TYPE_UINT8:
|
||||||
|
#ifndef __LITTLE_ENDIAN__
|
||||||
/* there are 8 gpr registers used to pass values */
|
/* there are 8 gpr registers used to pass values */
|
||||||
if (ng < 8)
|
if (ng < 8)
|
||||||
{
|
{
|
||||||
|
|
@ -1221,9 +1225,10 @@ ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue,
|
||||||
pst++;
|
pst++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
case FFI_TYPE_SINT16:
|
case FFI_TYPE_SINT16:
|
||||||
case FFI_TYPE_UINT16:
|
case FFI_TYPE_UINT16:
|
||||||
|
#ifndef __LITTLE_ENDIAN__
|
||||||
/* there are 8 gpr registers used to pass values */
|
/* there are 8 gpr registers used to pass values */
|
||||||
if (ng < 8)
|
if (ng < 8)
|
||||||
{
|
{
|
||||||
|
|
@ -1237,7 +1242,7 @@ ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue,
|
||||||
pst++;
|
pst++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
case FFI_TYPE_SINT32:
|
case FFI_TYPE_SINT32:
|
||||||
case FFI_TYPE_UINT32:
|
case FFI_TYPE_UINT32:
|
||||||
case FFI_TYPE_POINTER:
|
case FFI_TYPE_POINTER:
|
||||||
|
|
@ -1367,22 +1372,25 @@ ffi_closure_helper_LINUX64 (ffi_closure *closure, void *rvalue,
|
||||||
{
|
{
|
||||||
case FFI_TYPE_SINT8:
|
case FFI_TYPE_SINT8:
|
||||||
case FFI_TYPE_UINT8:
|
case FFI_TYPE_UINT8:
|
||||||
|
#ifndef __LITTLE_ENDIAN__
|
||||||
avalue[i] = (char *) pst + 7;
|
avalue[i] = (char *) pst + 7;
|
||||||
pst++;
|
pst++;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
case FFI_TYPE_SINT16:
|
case FFI_TYPE_SINT16:
|
||||||
case FFI_TYPE_UINT16:
|
case FFI_TYPE_UINT16:
|
||||||
|
#ifndef __LITTLE_ENDIAN__
|
||||||
avalue[i] = (char *) pst + 6;
|
avalue[i] = (char *) pst + 6;
|
||||||
pst++;
|
pst++;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
case FFI_TYPE_SINT32:
|
case FFI_TYPE_SINT32:
|
||||||
case FFI_TYPE_UINT32:
|
case FFI_TYPE_UINT32:
|
||||||
|
#ifndef __LITTLE_ENDIAN__
|
||||||
avalue[i] = (char *) pst + 4;
|
avalue[i] = (char *) pst + 4;
|
||||||
pst++;
|
pst++;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
case FFI_TYPE_SINT64:
|
case FFI_TYPE_SINT64:
|
||||||
case FFI_TYPE_UINT64:
|
case FFI_TYPE_UINT64:
|
||||||
case FFI_TYPE_POINTER:
|
case FFI_TYPE_POINTER:
|
||||||
|
|
@ -1391,11 +1399,13 @@ ffi_closure_helper_LINUX64 (ffi_closure *closure, void *rvalue,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FFI_TYPE_STRUCT:
|
case FFI_TYPE_STRUCT:
|
||||||
|
#ifndef __LITTLE_ENDIAN__
|
||||||
/* Structures with size less than eight bytes are passed
|
/* Structures with size less than eight bytes are passed
|
||||||
left-padded. */
|
left-padded. */
|
||||||
if (arg_types[i]->size < 8)
|
if (arg_types[i]->size < 8)
|
||||||
avalue[i] = (char *) pst + 8 - arg_types[i]->size;
|
avalue[i] = (char *) pst + 8 - arg_types[i]->size;
|
||||||
else
|
else
|
||||||
|
#endif
|
||||||
avalue[i] = pst;
|
avalue[i] = pst;
|
||||||
pst += (arg_types[i]->size + 7) / 8;
|
pst += (arg_types[i]->size + 7) / 8;
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -132,7 +132,11 @@ ffi_closure_LINUX64:
|
||||||
blr
|
blr
|
||||||
nop
|
nop
|
||||||
# case FFI_TYPE_INT
|
# case FFI_TYPE_INT
|
||||||
|
#ifdef __LITTLE_ENDIAN__
|
||||||
|
lwa %r3, 112+0(%r1)
|
||||||
|
#else
|
||||||
lwa %r3, 112+4(%r1)
|
lwa %r3, 112+4(%r1)
|
||||||
|
#endif
|
||||||
mtlr %r0
|
mtlr %r0
|
||||||
addi %r1, %r1, 240
|
addi %r1, %r1, 240
|
||||||
blr
|
blr
|
||||||
|
|
@ -152,33 +156,57 @@ ffi_closure_LINUX64:
|
||||||
lfd %f2, 112+8(%r1)
|
lfd %f2, 112+8(%r1)
|
||||||
b .Lfinish
|
b .Lfinish
|
||||||
# case FFI_TYPE_UINT8
|
# case FFI_TYPE_UINT8
|
||||||
|
#ifdef __LITTLE_ENDIAN__
|
||||||
|
lbz %r3, 112+0(%r1)
|
||||||
|
#else
|
||||||
lbz %r3, 112+7(%r1)
|
lbz %r3, 112+7(%r1)
|
||||||
|
#endif
|
||||||
mtlr %r0
|
mtlr %r0
|
||||||
addi %r1, %r1, 240
|
addi %r1, %r1, 240
|
||||||
blr
|
blr
|
||||||
# case FFI_TYPE_SINT8
|
# case FFI_TYPE_SINT8
|
||||||
|
#ifdef __LITTLE_ENDIAN__
|
||||||
|
lbz %r3, 112+0(%r1)
|
||||||
|
#else
|
||||||
lbz %r3, 112+7(%r1)
|
lbz %r3, 112+7(%r1)
|
||||||
|
#endif
|
||||||
extsb %r3,%r3
|
extsb %r3,%r3
|
||||||
mtlr %r0
|
mtlr %r0
|
||||||
b .Lfinish
|
b .Lfinish
|
||||||
# case FFI_TYPE_UINT16
|
# case FFI_TYPE_UINT16
|
||||||
|
#ifdef __LITTLE_ENDIAN__
|
||||||
|
lhz %r3, 112+0(%r1)
|
||||||
|
#else
|
||||||
lhz %r3, 112+6(%r1)
|
lhz %r3, 112+6(%r1)
|
||||||
|
#endif
|
||||||
mtlr %r0
|
mtlr %r0
|
||||||
.Lfinish:
|
.Lfinish:
|
||||||
addi %r1, %r1, 240
|
addi %r1, %r1, 240
|
||||||
blr
|
blr
|
||||||
# case FFI_TYPE_SINT16
|
# case FFI_TYPE_SINT16
|
||||||
|
#ifdef __LITTLE_ENDIAN__
|
||||||
|
lha %r3, 112+0(%r1)
|
||||||
|
#else
|
||||||
lha %r3, 112+6(%r1)
|
lha %r3, 112+6(%r1)
|
||||||
|
#endif
|
||||||
mtlr %r0
|
mtlr %r0
|
||||||
addi %r1, %r1, 240
|
addi %r1, %r1, 240
|
||||||
blr
|
blr
|
||||||
# case FFI_TYPE_UINT32
|
# case FFI_TYPE_UINT32
|
||||||
|
#ifdef __LITTLE_ENDIAN__
|
||||||
|
lwz %r3, 112+0(%r1)
|
||||||
|
#else
|
||||||
lwz %r3, 112+4(%r1)
|
lwz %r3, 112+4(%r1)
|
||||||
|
#endif
|
||||||
mtlr %r0
|
mtlr %r0
|
||||||
addi %r1, %r1, 240
|
addi %r1, %r1, 240
|
||||||
blr
|
blr
|
||||||
# case FFI_TYPE_SINT32
|
# case FFI_TYPE_SINT32
|
||||||
|
#ifdef __LITTLE_ENDIAN__
|
||||||
|
lwa %r3, 112+0(%r1)
|
||||||
|
#else
|
||||||
lwa %r3, 112+4(%r1)
|
lwa %r3, 112+4(%r1)
|
||||||
|
#endif
|
||||||
mtlr %r0
|
mtlr %r0
|
||||||
addi %r1, %r1, 240
|
addi %r1, %r1, 240
|
||||||
blr
|
blr
|
||||||
|
|
|
||||||
|
|
@ -159,25 +159,41 @@ ENTRY(ffi_closure_SYSV)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# case FFI_TYPE_UINT8
|
# case FFI_TYPE_UINT8
|
||||||
|
#ifdef __LITTLE_ENDIAN__
|
||||||
|
lbz %r3,112+0(%r1)
|
||||||
|
#else
|
||||||
lbz %r3,112+3(%r1)
|
lbz %r3,112+3(%r1)
|
||||||
|
#endif
|
||||||
mtlr %r0
|
mtlr %r0
|
||||||
addi %r1,%r1,144
|
addi %r1,%r1,144
|
||||||
blr
|
blr
|
||||||
|
|
||||||
# case FFI_TYPE_SINT8
|
# case FFI_TYPE_SINT8
|
||||||
|
#ifdef __LITTLE_ENDIAN__
|
||||||
|
lbz %r3,112+0(%r1)
|
||||||
|
#else
|
||||||
lbz %r3,112+3(%r1)
|
lbz %r3,112+3(%r1)
|
||||||
|
#endif
|
||||||
extsb %r3,%r3
|
extsb %r3,%r3
|
||||||
mtlr %r0
|
mtlr %r0
|
||||||
b .Lfinish
|
b .Lfinish
|
||||||
|
|
||||||
# case FFI_TYPE_UINT16
|
# case FFI_TYPE_UINT16
|
||||||
|
#ifdef __LITTLE_ENDIAN__
|
||||||
|
lhz %r3,112+0(%r1)
|
||||||
|
#else
|
||||||
lhz %r3,112+2(%r1)
|
lhz %r3,112+2(%r1)
|
||||||
|
#endif
|
||||||
mtlr %r0
|
mtlr %r0
|
||||||
addi %r1,%r1,144
|
addi %r1,%r1,144
|
||||||
blr
|
blr
|
||||||
|
|
||||||
# case FFI_TYPE_SINT16
|
# case FFI_TYPE_SINT16
|
||||||
|
#ifdef __LITTLE_ENDIAN__
|
||||||
|
lha %r3,112+0(%r1)
|
||||||
|
#else
|
||||||
lha %r3,112+2(%r1)
|
lha %r3,112+2(%r1)
|
||||||
|
#endif
|
||||||
mtlr %r0
|
mtlr %r0
|
||||||
addi %r1,%r1,144
|
addi %r1,%r1,144
|
||||||
blr
|
blr
|
||||||
|
|
@ -239,9 +255,15 @@ ENTRY(ffi_closure_SYSV)
|
||||||
|
|
||||||
# case FFI_SYSV_TYPE_SMALL_STRUCT + 3. Three byte struct.
|
# case FFI_SYSV_TYPE_SMALL_STRUCT + 3. Three byte struct.
|
||||||
lwz %r3,112+0(%r1)
|
lwz %r3,112+0(%r1)
|
||||||
|
#ifdef __LITTLE_ENDIAN__
|
||||||
|
mtlr %r0
|
||||||
|
addi %r1,%r1,144
|
||||||
|
blr
|
||||||
|
#else
|
||||||
srwi %r3,%r3,8
|
srwi %r3,%r3,8
|
||||||
mtlr %r0
|
mtlr %r0
|
||||||
b .Lfinish
|
b .Lfinish
|
||||||
|
#endif
|
||||||
|
|
||||||
# case FFI_SYSV_TYPE_SMALL_STRUCT + 4. Four byte struct.
|
# case FFI_SYSV_TYPE_SMALL_STRUCT + 4. Four byte struct.
|
||||||
lwz %r3,112+0(%r1)
|
lwz %r3,112+0(%r1)
|
||||||
|
|
@ -252,20 +274,35 @@ ENTRY(ffi_closure_SYSV)
|
||||||
# case FFI_SYSV_TYPE_SMALL_STRUCT + 5. Five byte struct.
|
# case FFI_SYSV_TYPE_SMALL_STRUCT + 5. Five byte struct.
|
||||||
lwz %r3,112+0(%r1)
|
lwz %r3,112+0(%r1)
|
||||||
lwz %r4,112+4(%r1)
|
lwz %r4,112+4(%r1)
|
||||||
|
#ifdef __LITTLE_ENDIAN__
|
||||||
|
mtlr %r0
|
||||||
|
b .Lfinish
|
||||||
|
#else
|
||||||
li %r5,24
|
li %r5,24
|
||||||
b .Lstruct567
|
b .Lstruct567
|
||||||
|
#endif
|
||||||
|
|
||||||
# case FFI_SYSV_TYPE_SMALL_STRUCT + 6. Six byte struct.
|
# case FFI_SYSV_TYPE_SMALL_STRUCT + 6. Six byte struct.
|
||||||
lwz %r3,112+0(%r1)
|
lwz %r3,112+0(%r1)
|
||||||
lwz %r4,112+4(%r1)
|
lwz %r4,112+4(%r1)
|
||||||
|
#ifdef __LITTLE_ENDIAN__
|
||||||
|
mtlr %r0
|
||||||
|
b .Lfinish
|
||||||
|
#else
|
||||||
li %r5,16
|
li %r5,16
|
||||||
b .Lstruct567
|
b .Lstruct567
|
||||||
|
#endif
|
||||||
|
|
||||||
# case FFI_SYSV_TYPE_SMALL_STRUCT + 7. Seven byte struct.
|
# case FFI_SYSV_TYPE_SMALL_STRUCT + 7. Seven byte struct.
|
||||||
lwz %r3,112+0(%r1)
|
lwz %r3,112+0(%r1)
|
||||||
lwz %r4,112+4(%r1)
|
lwz %r4,112+4(%r1)
|
||||||
|
#ifdef __LITTLE_ENDIAN__
|
||||||
|
mtlr %r0
|
||||||
|
b .Lfinish
|
||||||
|
#else
|
||||||
li %r5,8
|
li %r5,8
|
||||||
b .Lstruct567
|
b .Lstruct567
|
||||||
|
#endif
|
||||||
|
|
||||||
# case FFI_SYSV_TYPE_SMALL_STRUCT + 8. Eight byte struct.
|
# case FFI_SYSV_TYPE_SMALL_STRUCT + 8. Eight byte struct.
|
||||||
lwz %r3,112+0(%r1)
|
lwz %r3,112+0(%r1)
|
||||||
|
|
@ -273,6 +310,7 @@ ENTRY(ffi_closure_SYSV)
|
||||||
mtlr %r0
|
mtlr %r0
|
||||||
b .Lfinish
|
b .Lfinish
|
||||||
|
|
||||||
|
#ifndef __LITTLE_ENDIAN__
|
||||||
.Lstruct567:
|
.Lstruct567:
|
||||||
subfic %r6,%r5,32
|
subfic %r6,%r5,32
|
||||||
srw %r4,%r4,%r5
|
srw %r4,%r4,%r5
|
||||||
|
|
@ -282,6 +320,7 @@ ENTRY(ffi_closure_SYSV)
|
||||||
mtlr %r0
|
mtlr %r0
|
||||||
addi %r1,%r1,144
|
addi %r1,%r1,144
|
||||||
blr
|
blr
|
||||||
|
#endif
|
||||||
|
|
||||||
.Luint128:
|
.Luint128:
|
||||||
lwz %r6,112+12(%r1)
|
lwz %r6,112+12(%r1)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue