Ich habe nun mein Programm mal minimiert.
Code: Alles auswählen
program project1;
const
libgraphene = 'libgraphene-1.0';
type
Tgraphene_simd4f_t = record
x, y, z, w: single;
end;
function graphene_simd4f_init(x: single; y: single; z: single; w: single): Tgraphene_simd4f_t; cdecl; external libgraphene;
function graphene_simd4f_get_x(s: Tgraphene_simd4f_t): single; cdecl; external libgraphene;
function graphene_simd4f_get_y(s: Tgraphene_simd4f_t): single; cdecl; external libgraphene;
function graphene_simd4f_get_z(s: Tgraphene_simd4f_t): single; cdecl; external libgraphene;
function graphene_simd4f_get_w(s: Tgraphene_simd4f_t): single; cdecl; external libgraphene;
var
res: Tgraphene_simd4f_t;
x, y, z, w: single;
begin
res := graphene_simd4f_init(1.1, 2.2, 3.3, 4.4);
WriteLn('size: ', SizeOf(res));
x := graphene_simd4f_get_x(res);
y := graphene_simd4f_get_y(res);
z := graphene_simd4f_get_z(res);
w := graphene_simd4f_get_w(res);
WriteLn('x: ', x: 4: 2, ' y: ', y: 4: 2, ' z: ', z: 4: 2, ' w: ', w: 4: 2);
end.
Ausgabe:
Mache ich das ganze in einem C-Programm, kommen alle 4 Werte richtig.
Das sizeof ist zum test, ob an beiden Orten der record/struct 16Byte gross ist.
In C ist der struct so deklariert:
Code: Alles auswählen
# if defined(GRAPHENE_USE_SSE)
# include <xmmintrin.h>
# include <emmintrin.h>
# if defined(_M_IX86_FP)
# if _M_IX86_FP >= 2
# define GRAPHENE_USE_SSE4_1
# endif
# elif defined(__SSE4_1__)
# define GRAPHENE_USE_SSE4_1
# elif defined(_MSC_VER)
# define GRAPHENE_USE_SSE4_1
# endif
# if defined(GRAPHENE_USE_SSE4_1)
# include <smmintrin.h>
# endif
typedef __m128 graphene_simd4f_t;
# elif defined(GRAPHENE_USE_ARM_NEON)
# if defined (_MSC_VER) && (_MSC_VER < 1920) && defined (_M_ARM64)
# include <arm64_neon.h>
# else
# include <arm_neon.h>
# endif
typedef float32x4_t graphene_simd4f_t;
# elif defined(GRAPHENE_USE_GCC)
typedef float graphene_simd4f_t __attribute__((vector_size(16)));
# elif defined(GRAPHENE_USE_SCALAR)
typedef struct {
/*< private >*/
float x, y, z, w;
} graphene_simd4f_t;
# else
# error "Unsupported platform."
# endif
Diese Zeile ist in codeblock schwarz, somit ist dies die richtige Deklaration.
Code: Alles auswählen
typedef float graphene_simd4f_t __attribute__((vector_size(16)));
Alles andere ist grau.
Wen das ganze etwas mit SEE zu tun hätte, müsste dann bei sizeof nicht was anderes als 16 kommen ?