You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
1.8 KiB
Objective-C
88 lines
1.8 KiB
Objective-C
#include "stdio.h"
|
|
#include "Test.h"
|
|
|
|
// This is a large vector type, which the compiler will lower to some sequence
|
|
// of vector ops on the target, or scalar ops if there is no vector FPU.
|
|
typedef double __attribute__((vector_size(32))) v4d;
|
|
|
|
@interface X : Test
|
|
{
|
|
id f;
|
|
id g;
|
|
}
|
|
@end
|
|
@implementation X @end
|
|
|
|
@interface Vector : X
|
|
{
|
|
v4d x;
|
|
}
|
|
@end
|
|
@implementation Vector
|
|
+ (Vector*)alloc
|
|
{
|
|
Vector *v = class_createInstance(self, 0);
|
|
// The initialisation might be done with memset, but will probably be a
|
|
// vector load / store and so will likely fail if x is incorrectly aligned.
|
|
v->x = (v4d){1,2,3,4};
|
|
return v;
|
|
}
|
|
- (void)permute
|
|
{
|
|
// This will become a sequence of one or more vector operations. We must
|
|
// have the correct alignment for x, even after the instance variable
|
|
// munging, or this will break.
|
|
x *= (v4d){2,3,4,5};
|
|
}
|
|
@end
|
|
|
|
typedef int v4si __attribute__ ((vector_size (16)));
|
|
@interface Foo : Test
|
|
{
|
|
v4si var;
|
|
}
|
|
- (void)check;
|
|
@end
|
|
@implementation Foo
|
|
- (void)check
|
|
{
|
|
size_t addr = (size_t)&var;
|
|
fprintf(stderr, "self: %p Addr: %p\n", self, &var);
|
|
assert(addr % __alignof__(v4si) == 0);
|
|
}
|
|
@end
|
|
|
|
#if __has_attribute(objc_root_class)
|
|
__attribute__((objc_root_class))
|
|
#endif
|
|
@interface StringLikeTest
|
|
{
|
|
Class isa;
|
|
char* c_string;
|
|
int len;
|
|
}
|
|
@end
|
|
|
|
@implementation StringLikeTest
|
|
+ (Class)class
|
|
{
|
|
return self;
|
|
}
|
|
@end
|
|
|
|
int main(void)
|
|
{
|
|
[[Vector alloc] permute];
|
|
[[Foo new] check];
|
|
|
|
Ivar v_isa = class_getInstanceVariable([StringLikeTest class], "isa");
|
|
Ivar v_c_string = class_getInstanceVariable([StringLikeTest class], "c_string");
|
|
Ivar v_len = class_getInstanceVariable([StringLikeTest class], "len");
|
|
ptrdiff_t o_isa = ivar_getOffset(v_isa);
|
|
ptrdiff_t o_c_string = ivar_getOffset(v_c_string);
|
|
assert(o_isa == 0);
|
|
assert(o_c_string == sizeof(Class));
|
|
assert(o_isa < o_c_string);
|
|
assert(o_c_string < ivar_getOffset(v_len));
|
|
}
|