ffi 1.11.3 → 1.12.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (154) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -0
  3. data/CHANGELOG.md +27 -0
  4. data/Gemfile +2 -2
  5. data/README.md +10 -1
  6. data/ext/ffi_c/Struct.c +47 -51
  7. data/ext/ffi_c/Struct.h +12 -6
  8. data/ext/ffi_c/StructLayout.c +13 -12
  9. data/ext/ffi_c/extconf.rb +0 -1
  10. data/ext/ffi_c/libffi/.travis.yml +28 -12
  11. data/ext/ffi_c/libffi/.travis/bfin-sim.exp +58 -0
  12. data/ext/ffi_c/libffi/.travis/build-cross-in-container.sh +14 -0
  13. data/ext/ffi_c/libffi/.travis/build-in-container.sh +2 -12
  14. data/ext/ffi_c/libffi/.travis/build.sh +58 -30
  15. data/ext/ffi_c/libffi/.travis/install.sh +65 -37
  16. data/ext/ffi_c/libffi/.travis/m32r-sim.exp +58 -0
  17. data/ext/ffi_c/libffi/.travis/or1k-sim.exp +58 -0
  18. data/ext/ffi_c/libffi/.travis/powerpc-eabisim.exp +58 -0
  19. data/ext/ffi_c/libffi/.travis/site.exp +10 -1
  20. data/ext/ffi_c/libffi/.travis/wine-sim.exp +55 -0
  21. data/ext/ffi_c/libffi/{ChangeLog.libffi-3.1 → ChangeLog.old} +1407 -0
  22. data/ext/ffi_c/libffi/LICENSE +1 -1
  23. data/ext/ffi_c/libffi/Makefile.am +4 -3
  24. data/ext/ffi_c/libffi/README.md +12 -6
  25. data/ext/ffi_c/libffi/configure.ac +1 -1
  26. data/ext/ffi_c/libffi/configure.host +5 -2
  27. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +1 -3
  28. data/ext/ffi_c/libffi/include/ffi.h.in +7 -7
  29. data/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +2 -48
  30. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +5 -26
  31. data/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +5 -26
  32. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +2 -1
  33. data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +5 -26
  34. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +7 -3
  35. data/ext/ffi_c/libffi/src/closures.c +10 -2
  36. data/ext/ffi_c/libffi/src/mips/o32.S +2 -0
  37. data/ext/ffi_c/libffi/src/powerpc/ffi.c +3 -2
  38. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +154 -8
  39. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +18 -7
  40. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +10 -4
  41. data/ext/ffi_c/libffi/src/powerpc/linux64.S +83 -28
  42. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +67 -3
  43. data/ext/ffi_c/libffi/testsuite/Makefile.am +78 -75
  44. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +1 -18
  45. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp +7 -2
  46. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +1 -1
  47. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +1 -1
  48. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +12 -1
  49. data/ext/ffi_c/libffi/testsuite/libffi.closures/closure.exp +67 -0
  50. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn0.c +0 -0
  51. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn1.c +0 -0
  52. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn2.c +0 -0
  53. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn3.c +0 -0
  54. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn4.c +0 -0
  55. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn5.c +0 -0
  56. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_fn6.c +0 -0
  57. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_loc_fn0.c +0 -0
  58. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/closure_simple.c +0 -0
  59. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_12byte.c +0 -0
  60. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_16byte.c +0 -0
  61. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_18byte.c +0 -0
  62. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_19byte.c +0 -0
  63. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_1_1byte.c +0 -0
  64. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte.c +0 -0
  65. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_20byte1.c +0 -0
  66. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_24byte.c +0 -0
  67. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_2byte.c +0 -0
  68. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3_1byte.c +0 -0
  69. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte1.c +0 -0
  70. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3byte2.c +0 -0
  71. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_3float.c +0 -0
  72. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4_1byte.c +0 -0
  73. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_4byte.c +0 -0
  74. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5_1_byte.c +0 -0
  75. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_5byte.c +0 -0
  76. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_64byte.c +0 -0
  77. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6_1_byte.c +0 -0
  78. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_6byte.c +0 -0
  79. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7_1_byte.c +0 -0
  80. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_7byte.c +0 -0
  81. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_8byte.c +0 -0
  82. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte1.c +0 -0
  83. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_9byte2.c +0 -0
  84. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_double.c +0 -0
  85. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_float.c +0 -0
  86. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble.c +0 -0
  87. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split.c +0 -0
  88. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_longdouble_split2.c +0 -0
  89. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_pointer.c +0 -0
  90. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint16.c +0 -0
  91. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint32.c +0 -0
  92. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_sint64.c +0 -0
  93. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint16.c +0 -0
  94. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint32.c +0 -0
  95. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_align_uint64.c +0 -0
  96. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_dbls_struct.c +0 -0
  97. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double.c +0 -0
  98. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_double_va.c +0 -0
  99. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_float.c +0 -0
  100. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble.c +0 -0
  101. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_longdouble_va.c +0 -0
  102. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_many_mixed_args.c +0 -0
  103. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_many_mixed_float_double.c +0 -0
  104. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_schar.c +0 -0
  105. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshort.c +0 -0
  106. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_sshortchar.c +0 -0
  107. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_uchar.c +0 -0
  108. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushort.c +0 -0
  109. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_multi_ushortchar.c +0 -0
  110. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer.c +0 -0
  111. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_pointer_stack.c +0 -0
  112. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_schar.c +0 -0
  113. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sint.c +0 -0
  114. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_sshort.c +0 -0
  115. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_struct_va1.c +0 -0
  116. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uchar.c +0 -0
  117. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uchar_va.c +0 -0
  118. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uint.c +0 -0
  119. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_uint_va.c +0 -0
  120. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ulong_va.c +0 -0
  121. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ulonglong.c +0 -0
  122. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ushort.c +0 -0
  123. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/cls_ushort_va.c +0 -0
  124. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/err_bad_abi.c +0 -0
  125. data/ext/ffi_c/libffi/testsuite/libffi.closures/ffitest.h +138 -0
  126. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/huge_struct.c +1 -1
  127. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct.c +0 -0
  128. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct1.c +0 -0
  129. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct10.c +0 -0
  130. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct11.c +0 -0
  131. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct2.c +0 -0
  132. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct3.c +0 -0
  133. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct4.c +0 -0
  134. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct5.c +0 -0
  135. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct6.c +0 -0
  136. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct7.c +0 -0
  137. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct8.c +0 -0
  138. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/nested_struct9.c +0 -0
  139. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/problem1.c +0 -0
  140. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large.c +0 -0
  141. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_large2.c +0 -0
  142. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium.c +0 -0
  143. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/stret_medium2.c +0 -0
  144. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/testclosure.c +0 -0
  145. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/unwindtest.cc +0 -0
  146. data/ext/ffi_c/libffi/testsuite/{libffi.call → libffi.closures}/unwindtest_ffi_call.cc +0 -0
  147. data/ffi.gemspec +2 -2
  148. data/lib/ffi/ffi.rb +1 -0
  149. data/lib/ffi/struct.rb +2 -3
  150. data/lib/ffi/version.rb +1 -1
  151. metadata +112 -108
  152. data/ext/ffi_c/libffi/ChangeLog.libffi +0 -584
  153. data/ext/ffi_c/libffi/ChangeLog.libgcj +0 -40
  154. data/ext/ffi_c/libffi/ChangeLog.v1 +0 -764
@@ -31,22 +31,24 @@
31
31
  enum {
32
32
  /* The assembly depends on these exact flags. */
33
33
  /* These go in cr7 */
34
- FLAG_RETURNS_SMST = 1 << (31-31), /* Used for FFI_SYSV small structs. */
34
+ FLAG_RETURNS_SMST = 1 << (31-31), /* Used for FFI_SYSV small structs. */
35
35
  FLAG_RETURNS_NOTHING = 1 << (31-30),
36
36
  FLAG_RETURNS_FP = 1 << (31-29),
37
- FLAG_RETURNS_64BITS = 1 << (31-28),
37
+ FLAG_RETURNS_VEC = 1 << (31-28),
38
38
 
39
- /* This goes in cr6 */
40
- FLAG_RETURNS_128BITS = 1 << (31-27),
39
+ /* These go in cr6 */
40
+ FLAG_RETURNS_64BITS = 1 << (31-27),
41
+ FLAG_RETURNS_128BITS = 1 << (31-26),
41
42
 
42
- FLAG_COMPAT = 1 << (31- 8), /* Not used by assembly */
43
+ FLAG_COMPAT = 1 << (31- 8), /* Not used by assembly */
43
44
 
44
45
  /* These go in cr1 */
45
46
  FLAG_ARG_NEEDS_COPY = 1 << (31- 7), /* Used by sysv code */
46
47
  FLAG_ARG_NEEDS_PSAVE = FLAG_ARG_NEEDS_COPY, /* Used by linux64 code */
47
48
  FLAG_FP_ARGUMENTS = 1 << (31- 6), /* cr1.eq; specified by ABI */
48
49
  FLAG_4_GPR_ARGUMENTS = 1 << (31- 5),
49
- FLAG_RETVAL_REFERENCE = 1 << (31- 4)
50
+ FLAG_RETVAL_REFERENCE = 1 << (31- 4),
51
+ FLAG_VEC_ARGUMENTS = 1 << (31- 3),
50
52
  };
51
53
 
52
54
  typedef union
@@ -55,6 +57,14 @@ typedef union
55
57
  double d;
56
58
  } ffi_dblfl;
57
59
 
60
+ #if defined(__FLOAT128_TYPE__)
61
+ typedef _Float128 float128;
62
+ #elif defined(__FLOAT128__)
63
+ typedef __float128 float128;
64
+ #else
65
+ typedef char float128[16] __attribute__((aligned(16)));
66
+ #endif
67
+
58
68
  void FFI_HIDDEN ffi_closure_SYSV (void);
59
69
  void FFI_HIDDEN ffi_go_closure_sysv (void);
60
70
  void FFI_HIDDEN ffi_call_SYSV(extended_cif *, void (*)(void), void *,
@@ -91,4 +101,5 @@ int FFI_HIDDEN ffi_closure_helper_LINUX64 (ffi_cif *,
91
101
  void (*) (ffi_cif *, void *,
92
102
  void **, void *),
93
103
  void *, void *,
94
- unsigned long *, ffi_dblfl *);
104
+ unsigned long *, ffi_dblfl *,
105
+ float128 *);
@@ -91,15 +91,19 @@ typedef enum ffi_abi {
91
91
  /* This and following bits can reuse FFI_COMPAT values. */
92
92
  FFI_LINUX_STRUCT_ALIGN = 1,
93
93
  FFI_LINUX_LONG_DOUBLE_128 = 2,
94
+ FFI_LINUX_LONG_DOUBLE_IEEE128 = 4,
94
95
  FFI_DEFAULT_ABI = (FFI_LINUX
95
96
  # ifdef __STRUCT_PARM_ALIGN__
96
97
  | FFI_LINUX_STRUCT_ALIGN
97
98
  # endif
98
99
  # ifdef __LONG_DOUBLE_128__
99
100
  | FFI_LINUX_LONG_DOUBLE_128
101
+ # ifdef __LONG_DOUBLE_IEEE128__
102
+ | FFI_LINUX_LONG_DOUBLE_IEEE128
103
+ # endif
100
104
  # endif
101
105
  ),
102
- FFI_LAST_ABI = 12
106
+ FFI_LAST_ABI = 16
103
107
 
104
108
  # else
105
109
  /* This bit, always set in new code, must not be set in any of the
@@ -167,9 +171,11 @@ typedef enum ffi_abi {
167
171
  #define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_PPC_TYPE_LAST + 2)
168
172
 
169
173
  /* Used by ELFv2 for homogenous structure returns. */
170
- #define FFI_V2_TYPE_FLOAT_HOMOG (FFI_PPC_TYPE_LAST + 1)
171
- #define FFI_V2_TYPE_DOUBLE_HOMOG (FFI_PPC_TYPE_LAST + 2)
172
- #define FFI_V2_TYPE_SMALL_STRUCT (FFI_PPC_TYPE_LAST + 3)
174
+ #define FFI_V2_TYPE_VECTOR (FFI_PPC_TYPE_LAST + 1)
175
+ #define FFI_V2_TYPE_VECTOR_HOMOG (FFI_PPC_TYPE_LAST + 2)
176
+ #define FFI_V2_TYPE_FLOAT_HOMOG (FFI_PPC_TYPE_LAST + 3)
177
+ #define FFI_V2_TYPE_DOUBLE_HOMOG (FFI_PPC_TYPE_LAST + 4)
178
+ #define FFI_V2_TYPE_SMALL_STRUCT (FFI_PPC_TYPE_LAST + 5)
173
179
 
174
180
  #if _CALL_ELF == 2
175
181
  # define FFI_TRAMPOLINE_SIZE 32
@@ -101,40 +101,70 @@ ffi_call_LINUX64:
101
101
  ld %r2, 8(%r29)
102
102
  # endif
103
103
  /* Now do the call. */
104
- /* Set up cr1 with bits 4-7 of the flags. */
105
- mtcrf 0x40, %r31
104
+ /* Set up cr1 with bits 3-7 of the flags. */
105
+ mtcrf 0xc0, %r31
106
106
 
107
107
  /* Get the address to call into CTR. */
108
108
  mtctr %r12
109
109
  /* Load all those argument registers. */
110
- ld %r3, -32-(8*8)(%r28)
111
- ld %r4, -32-(7*8)(%r28)
112
- ld %r5, -32-(6*8)(%r28)
113
- ld %r6, -32-(5*8)(%r28)
110
+ addi %r29, %r28, -32-(8*8)
111
+ ld %r3, (0*8)(%r29)
112
+ ld %r4, (1*8)(%r29)
113
+ ld %r5, (2*8)(%r29)
114
+ ld %r6, (3*8)(%r29)
114
115
  bf- 5, 1f
115
- ld %r7, -32-(4*8)(%r28)
116
- ld %r8, -32-(3*8)(%r28)
117
- ld %r9, -32-(2*8)(%r28)
118
- ld %r10, -32-(1*8)(%r28)
116
+ ld %r7, (4*8)(%r29)
117
+ ld %r8, (5*8)(%r29)
118
+ ld %r9, (6*8)(%r29)
119
+ ld %r10, (7*8)(%r29)
119
120
  1:
120
121
 
121
122
  /* Load all the FP registers. */
122
123
  bf- 6, 2f
123
- lfd %f1, -32-(21*8)(%r28)
124
- lfd %f2, -32-(20*8)(%r28)
125
- lfd %f3, -32-(19*8)(%r28)
126
- lfd %f4, -32-(18*8)(%r28)
127
- lfd %f5, -32-(17*8)(%r28)
128
- lfd %f6, -32-(16*8)(%r28)
129
- lfd %f7, -32-(15*8)(%r28)
130
- lfd %f8, -32-(14*8)(%r28)
131
- lfd %f9, -32-(13*8)(%r28)
132
- lfd %f10, -32-(12*8)(%r28)
133
- lfd %f11, -32-(11*8)(%r28)
134
- lfd %f12, -32-(10*8)(%r28)
135
- lfd %f13, -32-(9*8)(%r28)
124
+ addi %r29, %r29, -(14*8)
125
+ lfd %f1, ( 1*8)(%r29)
126
+ lfd %f2, ( 2*8)(%r29)
127
+ lfd %f3, ( 3*8)(%r29)
128
+ lfd %f4, ( 4*8)(%r29)
129
+ lfd %f5, ( 5*8)(%r29)
130
+ lfd %f6, ( 6*8)(%r29)
131
+ lfd %f7, ( 7*8)(%r29)
132
+ lfd %f8, ( 8*8)(%r29)
133
+ lfd %f9, ( 9*8)(%r29)
134
+ lfd %f10, (10*8)(%r29)
135
+ lfd %f11, (11*8)(%r29)
136
+ lfd %f12, (12*8)(%r29)
137
+ lfd %f13, (13*8)(%r29)
136
138
  2:
137
139
 
140
+ /* Load all the vector registers. */
141
+ bf- 3, 3f
142
+ addi %r29, %r29, -16
143
+ lvx %v13, 0, %r29
144
+ addi %r29, %r29, -16
145
+ lvx %v12, 0, %r29
146
+ addi %r29, %r29, -16
147
+ lvx %v11, 0, %r29
148
+ addi %r29, %r29, -16
149
+ lvx %v10, 0, %r29
150
+ addi %r29, %r29, -16
151
+ lvx %v9, 0, %r29
152
+ addi %r29, %r29, -16
153
+ lvx %v8, 0, %r29
154
+ addi %r29, %r29, -16
155
+ lvx %v7, 0, %r29
156
+ addi %r29, %r29, -16
157
+ lvx %v6, 0, %r29
158
+ addi %r29, %r29, -16
159
+ lvx %v5, 0, %r29
160
+ addi %r29, %r29, -16
161
+ lvx %v4, 0, %r29
162
+ addi %r29, %r29, -16
163
+ lvx %v3, 0, %r29
164
+ addi %r29, %r29, -16
165
+ lvx %v2, 0, %r29
166
+ 3:
167
+
138
168
  /* Make the call. */
139
169
  ld %r11, 8(%r28)
140
170
  bctrl
@@ -152,6 +182,7 @@ ffi_call_LINUX64:
152
182
  bt 31, .Lstruct_return_value
153
183
  bt 30, .Ldone_return_value
154
184
  bt 29, .Lfp_return_value
185
+ bt 28, .Lvec_return_value
155
186
  std %r3, 0(%r30)
156
187
  /* Fall through... */
157
188
 
@@ -167,12 +198,16 @@ ffi_call_LINUX64:
167
198
  ld %r31, -8(%r1)
168
199
  blr
169
200
 
201
+ .Lvec_return_value:
202
+ stvx %v2, 0, %r30
203
+ b .Ldone_return_value
204
+
170
205
  .Lfp_return_value:
171
206
  .cfi_def_cfa_register 28
172
- bf 28, .Lfloat_return_value
173
- stfd %f1, 0(%r30)
174
207
  mtcrf 0x02, %r31 /* cr6 */
175
- bf 27, .Ldone_return_value
208
+ bf 27, .Lfloat_return_value
209
+ stfd %f1, 0(%r30)
210
+ bf 26, .Ldone_return_value
176
211
  stfd %f2, 8(%r30)
177
212
  b .Ldone_return_value
178
213
  .Lfloat_return_value:
@@ -180,8 +215,9 @@ ffi_call_LINUX64:
180
215
  b .Ldone_return_value
181
216
 
182
217
  .Lstruct_return_value:
183
- bf 29, .Lsmall_struct
184
- bf 28, .Lfloat_homog_return_value
218
+ bf 29, .Lvec_homog_or_small_struct
219
+ mtcrf 0x02, %r31 /* cr6 */
220
+ bf 27, .Lfloat_homog_return_value
185
221
  stfd %f1, 0(%r30)
186
222
  stfd %f2, 8(%r30)
187
223
  stfd %f3, 16(%r30)
@@ -203,6 +239,25 @@ ffi_call_LINUX64:
203
239
  stfs %f8, 28(%r30)
204
240
  b .Ldone_return_value
205
241
 
242
+ .Lvec_homog_or_small_struct:
243
+ bf 28, .Lsmall_struct
244
+ stvx %v2, 0, %r30
245
+ addi %r30, %r30, 16
246
+ stvx %v3, 0, %r30
247
+ addi %r30, %r30, 16
248
+ stvx %v4, 0, %r30
249
+ addi %r30, %r30, 16
250
+ stvx %v5, 0, %r30
251
+ addi %r30, %r30, 16
252
+ stvx %v6, 0, %r30
253
+ addi %r30, %r30, 16
254
+ stvx %v7, 0, %r30
255
+ addi %r30, %r30, 16
256
+ stvx %v8, 0, %r30
257
+ addi %r30, %r30, 16
258
+ stvx %v9, 0, %r30
259
+ b .Ldone_return_value
260
+
206
261
  .Lsmall_struct:
207
262
  std %r3, 0(%r30)
208
263
  std %r4, 8(%r30)
@@ -61,9 +61,15 @@ ffi_closure_LINUX64:
61
61
  # endif
62
62
 
63
63
  # if _CALL_ELF == 2
64
- # 32 byte special reg save area + 64 byte parm save area
65
- # + 64 byte retval area + 13*8 fpr save area + round to 16
66
- # define STACKFRAME 272
64
+ # ifdef __VEC__
65
+ # 32 byte special reg save area + 64 byte parm save area
66
+ # + 128 byte retval area + 13*8 fpr save area + 12*16 vec save area + round to 16
67
+ # define STACKFRAME 528
68
+ # else
69
+ # 32 byte special reg save area + 64 byte parm save area
70
+ # + 64 byte retval area + 13*8 fpr save area + round to 16
71
+ # define STACKFRAME 272
72
+ # endif
67
73
  # define PARMSAVE 32
68
74
  # define RETVAL PARMSAVE+64
69
75
  # else
@@ -146,6 +152,35 @@ ffi_closure_LINUX64:
146
152
  # load up the pointer to the saved fpr registers
147
153
  addi %r8, %r1, -104
148
154
 
155
+ # ifdef __VEC__
156
+ # load up the pointer to the saved vector registers
157
+ # 8 bytes padding for 16-byte alignment at -112(%r1)
158
+ addi %r9, %r8, -24
159
+ stvx %v13, 0, %r9
160
+ addi %r9, %r9, -16
161
+ stvx %v12, 0, %r9
162
+ addi %r9, %r9, -16
163
+ stvx %v11, 0, %r9
164
+ addi %r9, %r9, -16
165
+ stvx %v10, 0, %r9
166
+ addi %r9, %r9, -16
167
+ stvx %v9, 0, %r9
168
+ addi %r9, %r9, -16
169
+ stvx %v8, 0, %r9
170
+ addi %r9, %r9, -16
171
+ stvx %v7, 0, %r9
172
+ addi %r9, %r9, -16
173
+ stvx %v6, 0, %r9
174
+ addi %r9, %r9, -16
175
+ stvx %v5, 0, %r9
176
+ addi %r9, %r9, -16
177
+ stvx %v4, 0, %r9
178
+ addi %r9, %r9, -16
179
+ stvx %v3, 0, %r9
180
+ addi %r9, %r9, -16
181
+ stvx %v2, 0, %r9
182
+ # endif
183
+
149
184
  # load up the pointer to the result storage
150
185
  addi %r6, %r1, -STACKFRAME+RETVAL
151
186
 
@@ -313,6 +348,16 @@ ffi_closure_LINUX64:
313
348
  .cfi_def_cfa_offset 0
314
349
  blr
315
350
  .cfi_def_cfa_offset STACKFRAME
351
+ # case FFI_V2_TYPE_VECTOR
352
+ addi %r3, %r1, RETVAL
353
+ lvx %v2, 0, %r3
354
+ mtlr %r0
355
+ b .Lfinish
356
+ # case FFI_V2_TYPE_VECTOR_HOMOG
357
+ addi %r3, %r1, RETVAL
358
+ lvx %v2, 0, %r3
359
+ addi %r3, %r3, 16
360
+ b .Lmorevector
316
361
  # case FFI_V2_TYPE_FLOAT_HOMOG
317
362
  lfs %f1, RETVAL+0(%r1)
318
363
  lfs %f2, RETVAL+4(%r1)
@@ -332,6 +377,25 @@ ffi_closure_LINUX64:
332
377
  .cfi_def_cfa_offset 0
333
378
  blr
334
379
  .cfi_def_cfa_offset STACKFRAME
380
+ .Lmorevector:
381
+ lvx %v3, 0, %r3
382
+ addi %r3, %r3, 16
383
+ lvx %v4, 0, %r3
384
+ addi %r3, %r3, 16
385
+ lvx %v5, 0, %r3
386
+ mtlr %r0
387
+ addi %r3, %r3, 16
388
+ lvx %v6, 0, %r3
389
+ addi %r3, %r3, 16
390
+ lvx %v7, 0, %r3
391
+ addi %r3, %r3, 16
392
+ lvx %v8, 0, %r3
393
+ addi %r3, %r3, 16
394
+ lvx %v9, 0, %r3
395
+ addi %r1, %r1, STACKFRAME
396
+ .cfi_def_cfa_offset 0
397
+ blr
398
+ .cfi_def_cfa_offset STACKFRAME
335
399
  .Lmorefloat:
336
400
  lfs %f4, RETVAL+12(%r1)
337
401
  mtlr %r0
@@ -7,79 +7,28 @@ EXTRA_DEJAGNU_SITE_CONFIG=../local.exp
7
7
  CLEANFILES = *.exe core* *.log *.sum
8
8
 
9
9
  EXTRA_DIST = lib/target-libpath.exp lib/libffi.exp lib/wrapper.exp \
10
- libffi.call/strlen4.c libffi.call/cls_multi_sshort.c \
11
- libffi.call/cls_align_longdouble_split2.c libffi.call/cls_1_1byte.c \
12
- libffi.call/struct10.c libffi.call/cls_uint_va.c \
13
- libffi.call/many_mixed.c libffi.call/float.c libffi.call/struct5.c \
14
- libffi.call/return_fl3.c libffi.call/cls_3_1byte.c \
15
- libffi.call/return_fl1.c libffi.call/cls_many_mixed_args.c \
16
- libffi.call/cls_20byte1.c libffi.call/cls_pointer_stack.c \
17
- libffi.call/cls_align_float.c libffi.call/call.exp \
18
- libffi.call/pyobjc-tc.c libffi.call/float_va.c \
19
- libffi.call/cls_5_1_byte.c libffi.call/cls_9byte1.c \
20
- libffi.call/cls_align_uint32.c libffi.call/stret_medium.c \
21
- libffi.call/cls_3byte1.c libffi.call/cls_align_uint64.c \
22
- libffi.call/cls_longdouble_va.c libffi.call/cls_align_pointer.c \
23
- libffi.call/cls_19byte.c libffi.call/cls_ushort.c \
24
- libffi.call/cls_align_sint32.c libffi.call/struct8.c \
25
- libffi.call/pr1172638.c libffi.call/cls_ulonglong.c \
26
- libffi.call/cls_struct_va1.c libffi.call/cls_9byte2.c \
27
- libffi.call/closure_fn5.c libffi.call/cls_5byte.c \
28
- libffi.call/cls_3float.c libffi.call/return_sc.c \
29
- libffi.call/cls_schar.c libffi.call/closure_fn4.c \
30
- libffi.call/cls_uchar_va.c libffi.call/closure_fn0.c \
31
- libffi.call/huge_struct.c libffi.call/va_struct1.c \
32
- libffi.call/cls_ushort_va.c libffi.call/struct9.c libffi.call/va_1.c \
33
- libffi.call/cls_64byte.c libffi.call/va_struct2.c \
34
- libffi.call/cls_longdouble.c libffi.call/return_fl2.c \
35
- libffi.call/cls_ulong_va.c libffi.call/cls_6_1_byte.c \
36
- libffi.call/cls_align_uint16.c libffi.call/closure_fn2.c \
37
- libffi.call/align_mixed.c libffi.call/unwindtest_ffi_call.cc \
38
- libffi.call/cls_multi_ushortchar.c libffi.call/cls_8byte.c \
39
- libffi.call/ffitest.h libffi.call/nested_struct8.c \
40
- libffi.call/cls_pointer.c libffi.call/nested_struct2.c \
41
- libffi.call/nested_struct.c libffi.call/struct4.c \
42
- libffi.call/cls_multi_schar.c \
43
- libffi.call/cls_align_longdouble_split.c libffi.call/cls_uchar.c \
44
- libffi.call/return_ldl.c libffi.call/nested_struct9.c \
45
- libffi.call/cls_float.c libffi.call/stret_medium2.c \
46
- libffi.call/closure_loc_fn0.c libffi.call/float3.c \
47
- libffi.call/cls_6byte.c libffi.call/return_sl.c \
48
- libffi.call/closure_simple.c libffi.call/return_dbl1.c \
49
- libffi.call/cls_align_double.c libffi.call/cls_multi_uchar.c \
50
- libffi.call/err_bad_typedef.c libffi.call/cls_4_1byte.c \
51
- libffi.call/closure_fn3.c libffi.call/return_ll1.c \
52
- libffi.call/return_dbl2.c libffi.call/cls_align_sint64.c \
53
- libffi.call/nested_struct1.c libffi.call/negint.c \
54
- libffi.call/nested_struct3.c libffi.call/unwindtest.cc \
10
+ libffi.call/strlen4.c libffi.call/struct10.c libffi.call/many_mixed.c \
11
+ libffi.call/float.c libffi.call/struct5.c libffi.call/return_fl3.c \
12
+ libffi.call/return_fl1.c libffi.call/call.exp libffi.call/pyobjc-tc.c \
13
+ libffi.call/float_va.c libffi.call/struct8.c libffi.call/pr1172638.c \
14
+ libffi.call/return_sc.c libffi.call/va_struct1.c \
15
+ libffi.call/align_stdcall.c libffi.call/struct9.c libffi.call/va_1.c \
16
+ libffi.call/va_struct2.c libffi.call/return_fl2.c \
17
+ libffi.call/align_mixed.c libffi.call/ffitest.h libffi.call/struct4.c \
18
+ libffi.call/return_ldl.c libffi.call/float3.c libffi.call/return_sl.c \
19
+ libffi.call/return_dbl1.c libffi.call/err_bad_typedef.c \
20
+ libffi.call/return_ll1.c libffi.call/return_dbl2.c \
21
+ libffi.call/negint.c libffi.closures/nested_struct3.c \
55
22
  libffi.call/struct2.c libffi.call/struct3.c libffi.call/return_fl.c \
56
- libffi.call/nested_struct5.c libffi.call/cls_multi_ushort.c \
57
- libffi.call/nested_struct11.c libffi.call/cls_multi_sshortchar.c \
58
- libffi.call/cls_align_longdouble.c libffi.call/cls_dbls_struct.c \
59
- libffi.call/cls_many_mixed_float_double.c libffi.call/stret_large.c \
60
- libffi.call/stret_large2.c libffi.call/cls_align_sint16.c \
61
- libffi.call/cls_2byte.c libffi.call/offsets.c libffi.call/struct7.c \
62
- libffi.call/nested_struct4.c libffi.call/problem1.c \
63
- libffi.call/va_struct3.c libffi.call/testclosure.c \
64
- libffi.call/float1.c libffi.call/nested_struct6.c \
65
- libffi.call/cls_4byte.c libffi.call/cls_24byte.c \
66
- libffi.call/uninitialized.c libffi.call/many2.c \
67
- libffi.call/nested_struct10.c libffi.call/struct6.c \
68
- libffi.call/strlen2.c libffi.call/float2.c libffi.call/cls_uint.c \
69
- libffi.call/cls_12byte.c libffi.call/return_ul.c \
70
- libffi.call/cls_sint.c libffi.call/cls_7_1_byte.c \
71
- libffi.call/struct1.c libffi.call/cls_sshort.c \
72
- libffi.call/cls_16byte.c libffi.call/strlen3.c \
73
- libffi.call/nested_struct7.c libffi.call/cls_double_va.c \
74
- libffi.call/return_dbl.c libffi.call/cls_3byte2.c \
75
- libffi.call/float4.c libffi.call/cls_double.c libffi.call/many.c \
76
- libffi.call/cls_7byte.c libffi.call/strlen.c \
77
- libffi.call/closure_fn6.c libffi.call/return_uc.c \
78
- libffi.call/closure_fn1.c libffi.call/cls_20byte.c \
79
- libffi.call/cls_18byte.c libffi.call/err_bad_abi.c \
80
- libffi.call/many_double.c libffi.call/return_ll.c \
81
- libffi.call/promotion.c libffi.complex/complex_defs_longdouble.inc \
82
- libffi.call/align_stdcall.c libffi.complex/cls_align_complex_float.c \
23
+ libffi.call/offsets.c libffi.call/struct7.c libffi.call/va_struct3.c \
24
+ libffi.call/float1.c libffi.call/uninitialized.c libffi.call/many2.c \
25
+ libffi.call/struct6.c libffi.call/strlen2.c libffi.call/float2.c \
26
+ libffi.call/return_ul.c libffi.call/struct1.c libffi.call/strlen3.c \
27
+ libffi.call/return_dbl.c libffi.call/float4.c libffi.call/many.c \
28
+ libffi.call/strlen.c libffi.call/return_uc.c libffi.call/many_double.c \
29
+ libffi.call/return_ll.c libffi.call/promotion.c \
30
+ libffi.complex/complex_defs_longdouble.inc \
31
+ libffi.complex/cls_align_complex_float.c \
83
32
  libffi.complex/cls_complex_va_float.c \
84
33
  libffi.complex/cls_complex_struct_float.c \
85
34
  libffi.complex/return_complex2_longdouble.c \
@@ -90,9 +39,9 @@ libffi.complex/cls_complex_va_longdouble.c \
90
39
  libffi.complex/return_complex_double.c \
91
40
  libffi.complex/return_complex.inc libffi.complex/many_complex.inc \
92
41
  libffi.complex/complex_float.c libffi.complex/cls_align_complex.inc \
93
- libffi.complex/return_complex2_double.c \
42
+ libffi.complex/return_complex2_double.c \
94
43
  libffi.complex/many_complex_float.c libffi.complex/ffitest.h \
95
- libffi.complex/return_complex1_double.c \
44
+ libffi.complex/return_complex1_double.c \
96
45
  libffi.complex/cls_complex_struct_longdouble.c \
97
46
  libffi.complex/complex_defs_double.inc \
98
47
  libffi.complex/cls_complex_va_double.c \
@@ -116,4 +65,58 @@ libffi.go/aa-direct.c libffi.go/ffitest.h libffi.go/go.exp \
116
65
  libffi.go/static-chain.h libffi.bhaible/bhaible.exp \
117
66
  libffi.bhaible/test-call.c libffi.bhaible/alignof.h \
118
67
  libffi.bhaible/testcases.c libffi.bhaible/test-callback.c \
119
- libffi.bhaible/Makefile libffi.bhaible/README config/default.exp
68
+ libffi.bhaible/Makefile libffi.bhaible/README config/default.exp \
69
+ libffi.closures/cls_multi_sshort.c \
70
+ libffi.closures/cls_align_longdouble_split2.c \
71
+ libffi.closures/cls_1_1byte.c libffi.closures/cls_uint_va.c \
72
+ libffi.closures/cls_3_1byte.c libffi.closures/cls_many_mixed_args.c \
73
+ libffi.closures/cls_20byte1.c libffi.closures/cls_pointer_stack.c \
74
+ libffi.closures/cls_align_float.c libffi.closures/cls_5_1_byte.c \
75
+ libffi.closures/cls_9byte1.c libffi.closures/cls_align_uint32.c \
76
+ libffi.closures/stret_medium.c libffi.closures/cls_3byte1.c \
77
+ libffi.closures/cls_align_uint64.c libffi.closures/cls_longdouble_va.c \
78
+ libffi.closures/cls_align_pointer.c libffi.closures/cls_19byte.c \
79
+ libffi.closures/cls_ushort.c libffi.closures/cls_align_sint32.c \
80
+ libffi.closures/cls_ulonglong.c libffi.closures/cls_struct_va1.c \
81
+ libffi.closures/cls_9byte2.c libffi.closures/closure_fn5.c \
82
+ libffi.closures/cls_5byte.c libffi.closures/cls_3float.c \
83
+ libffi.closures/closure.exp libffi.closures/cls_schar.c \
84
+ libffi.closures/closure_fn4.c libffi.closures/cls_uchar_va.c \
85
+ libffi.closures/closure_fn0.c libffi.closures/huge_struct.c \
86
+ libffi.closures/cls_ushort_va.c \
87
+ libffi.closures/cls_64byte.c libffi.closures/cls_longdouble.c \
88
+ libffi.closures/cls_ulong_va.c libffi.closures/cls_6_1_byte.c \
89
+ libffi.closures/cls_align_uint16.c libffi.closures/closure_fn2.c \
90
+ libffi.closures/unwindtest_ffi_call.cc \
91
+ libffi.closures/cls_multi_ushortchar.c libffi.closures/cls_8byte.c \
92
+ libffi.closures/ffitest.h libffi.closures/nested_struct8.c \
93
+ libffi.closures/cls_pointer.c libffi.closures/nested_struct2.c \
94
+ libffi.closures/nested_struct.c libffi.closures/cls_multi_schar.c \
95
+ libffi.closures/cls_align_longdouble_split.c \
96
+ libffi.closures/cls_uchar.c libffi.closures/nested_struct9.c \
97
+ libffi.closures/cls_float.c libffi.closures/stret_medium2.c \
98
+ libffi.closures/closure_loc_fn0.c libffi.closures/cls_6byte.c \
99
+ libffi.closures/closure_simple.c libffi.closures/cls_align_double.c \
100
+ libffi.closures/cls_multi_uchar.c libffi.closures/cls_4_1byte.c \
101
+ libffi.closures/closure_fn3.c libffi.closures/cls_align_sint64.c \
102
+ libffi.closures/nested_struct1.c libffi.closures/unwindtest.cc \
103
+ libffi.closures/nested_struct5.c libffi.closures/cls_multi_ushort.c \
104
+ libffi.closures/nested_struct11.c \
105
+ libffi.closures/cls_multi_sshortchar.c \
106
+ libffi.closures/cls_align_longdouble.c \
107
+ libffi.closures/cls_dbls_struct.c \
108
+ libffi.closures/cls_many_mixed_float_double.c \
109
+ libffi.closures/stret_large.c libffi.closures/stret_large2.c \
110
+ libffi.closures/cls_align_sint16.c libffi.closures/cls_2byte.c \
111
+ libffi.closures/nested_struct4.c libffi.closures/problem1.c \
112
+ libffi.closures/testclosure.c libffi.closures/nested_struct6.c \
113
+ libffi.closures/cls_4byte.c libffi.closures/cls_24byte.c \
114
+ libffi.closures/nested_struct10.c libffi.closures/cls_uint.c \
115
+ libffi.closures/cls_12byte.c libffi.closures/cls_sint.c \
116
+ libffi.closures/cls_7_1_byte.c libffi.closures/cls_sshort.c \
117
+ libffi.closures/cls_16byte.c libffi.closures/nested_struct7.c \
118
+ libffi.closures/cls_double_va.c libffi.closures/cls_3byte2.c \
119
+ libffi.closures/cls_double.c libffi.closures/cls_7byte.c \
120
+ libffi.closures/closure_fn6.c libffi.closures/closure_fn1.c \
121
+ libffi.closures/cls_20byte.c libffi.closures/cls_18byte.c \
122
+ libffi.closures/err_bad_abi.c