Changeset b9dae14c
- Timestamp:
- Apr 30, 2021, 9:23:12 AM (3 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- a049412, ad89296, ec1c674
- Parents:
- 63a4b92
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/containers/array.hfa
r63a4b92 rb9dae14c 5 5 6 6 // the inverse of Z(-) 7 #define z(Zn) sizeof(Zn) 8 9 // if you're expecting a Z(n), say so, by asking for a ztype, instead of dtype or otype 10 #define ztype(Zn) Zn & | sized(Zn) 7 #define z(N) sizeof(N) 11 8 12 9 forall( T & ) struct tag {}; … … 19 16 // 20 17 21 forall( ztype(Zn), ztype(S), Timmed &, Tbase & ) {18 forall( [N], [S], Timmed &, Tbase & ) { 22 19 struct arpk { 23 S strides[z( Zn)];20 S strides[z(N)]; 24 21 }; 25 22 26 Timmed & ?[?]( arpk( Zn, S, Timmed, Tbase) & a, ptrdiff_t i ) {23 Timmed & ?[?]( arpk(N, S, Timmed, Tbase) & a, ptrdiff_t i ) { 27 24 return (Timmed &) a.strides[i]; 28 25 } 29 26 30 Timmed & ?[?]( arpk( Zn, S, Timmed, Tbase) & a, int i ) {27 Timmed & ?[?]( arpk(N, S, Timmed, Tbase) & a, int i ) { 31 28 return (Timmed &) a.strides[i]; 32 29 } 33 30 34 Timmed & ?[?]( arpk( Zn, S, Timmed, Tbase) & a, size_t i ) {31 Timmed & ?[?]( arpk(N, S, Timmed, Tbase) & a, size_t i ) { 35 32 return (Timmed &) a.strides[i]; 36 33 } 37 34 38 size_t ?`len( arpk( Zn, S, Timmed, Tbase) & a ) {39 return z( Zn);35 size_t ?`len( arpk(N, S, Timmed, Tbase) & a ) { 36 return z(N); 40 37 } 41 38 42 39 // workaround #226 (and array relevance thereof demonstrated in mike102/otype-slow-ndims.cfa) 43 void ?{}( arpk( Zn, S, Timmed, Tbase) & this ) {44 void ?{}( S (&inner)[z( Zn)] ) {}40 void ?{}( arpk(N, S, Timmed, Tbase) & this ) { 41 void ?{}( S (&inner)[z(N)] ) {} 45 42 ?{}(this.strides); 46 43 } 47 void ^?{}( arpk( Zn, S, Timmed, Tbase) & this ) {48 void ^?{}( S (&inner)[z( Zn)] ) {}44 void ^?{}( arpk(N, S, Timmed, Tbase) & this ) { 45 void ^?{}( S (&inner)[z(N)] ) {} 49 46 ^?{}(this.strides); 50 47 } … … 58 55 Te mkar_( tag(Te) ) {} 59 56 60 forall( ztype(Zn), ZTags ... , Trslt &, Tatom & | { Trslt mkar_( tag(Tatom), ZTags ); } )61 arpk( Zn, Trslt, Trslt, Tatom) mkar_( tag(Tatom), tag(Zn), ZTags ) {}57 forall( [N], ZTags ... , Trslt &, Tatom & | { Trslt mkar_( tag(Tatom), ZTags ); } ) 58 arpk(N, Trslt, Trslt, Tatom) mkar_( tag(Tatom), tag(N), ZTags ) {} 62 59 63 60 // based on https://stackoverflow.com/questions/1872220/is-it-possible-to-iterate-over-arguments-in-variadic-macros … … 123 120 124 121 // Base 125 forall( ztype(Zq), ztype(Sq), Tbase & )126 tag(arpk( Zq, Sq, Tbase, Tbase)) enq_( tag(Tbase), tag(Zq), tag(Sq), tag(Tbase) ) {}122 forall( [Nq], [Sq], Tbase & ) 123 tag(arpk(Nq, Sq, Tbase, Tbase)) enq_( tag(Tbase), tag(Nq), tag(Sq), tag(Tbase) ) {} 127 124 128 125 // Rec 129 forall( ztype(Zq), ztype(Sq), ztype(Z), ztype(S), recq &, recr &, Tbase & | { tag(recr) enq_( tag(Tbase), tag(Zq), tag(Sq), tag(recq) ); } )130 tag(arpk( Z, S, recr, Tbase)) enq_( tag(Tbase), tag(Zq), tag(Sq), tag(arpk(Z, S, recq, Tbase)) ) {}126 forall( [Nq], [Sq], [N], [S], recq &, recr &, Tbase & | { tag(recr) enq_( tag(Tbase), tag(Nq), tag(Sq), tag(recq) ); } ) 127 tag(arpk(N, S, recr, Tbase)) enq_( tag(Tbase), tag(Nq), tag(Sq), tag(arpk(N, S, recq, Tbase)) ) {} 131 128 132 129 // Wrapper 133 130 struct all_t {} all; 134 forall( ztype(Z), ztype(S), Te &, result &, Tbase & | { tag(result) enq_( tag(Tbase), tag(Z), tag(S), tag(Te) ); } )135 result & ?[?]( arpk( Z, S, Te, Tbase) & this, all_t ) {131 forall( [N], [S], Te &, result &, Tbase & | { tag(result) enq_( tag(Tbase), tag(N), tag(S), tag(Te) ); } ) 132 result & ?[?]( arpk(N, S, Te, Tbase) & this, all_t ) { 136 133 return (result&) this; 137 134 } -
src/Parser/DeclarationNode.cc
r63a4b92 rb9dae14c 1076 1076 if ( variable.tyClass != TypeDecl::NUMBER_OF_KINDS ) { 1077 1077 // otype is internally converted to dtype + otype parameters 1078 static const TypeDecl::Kind kindMap[] = { TypeDecl::Dtype, TypeDecl::DStype, TypeDecl::Dtype, TypeDecl::Ftype, TypeDecl::Ttype, TypeDecl:: ALtype };1078 static const TypeDecl::Kind kindMap[] = { TypeDecl::Dtype, TypeDecl::DStype, TypeDecl::Dtype, TypeDecl::Ftype, TypeDecl::Ttype, TypeDecl::Dtype }; 1079 1079 static_assert( sizeof(kindMap) / sizeof(kindMap[0]) == TypeDecl::NUMBER_OF_KINDS, "DeclarationNode::build: kindMap is out of sync." ); 1080 1080 assertf( variable.tyClass < sizeof(kindMap)/sizeof(kindMap[0]), "Variable's tyClass is out of bounds." ); 1081 TypeDecl * ret = new TypeDecl( *name, Type::StorageClasses(), nullptr, kindMap[ variable.tyClass ], variable.tyClass == TypeDecl::Otype , variable.initializer ? variable.initializer->buildType() : nullptr );1081 TypeDecl * ret = new TypeDecl( *name, Type::StorageClasses(), nullptr, kindMap[ variable.tyClass ], variable.tyClass == TypeDecl::Otype || variable.tyClass == TypeDecl::ALtype, variable.initializer ? variable.initializer->buildType() : nullptr ); 1082 1082 buildList( variable.assertions, ret->get_assertions() ); 1083 1083 return ret; -
tests/array-container/array-basic.cfa
r63a4b92 rb9dae14c 5 5 // 6 6 7 forall( ztype(Nx), ztype(Ny), ztype(Nz))7 forall( [Nx], [Ny], [Nz] ) 8 8 void typesTest( tag(Nx), tag(Ny), tag(Nz) ) { 9 9 … … 59 59 } 60 60 61 forall( ztype(Nw), ztype(Nx), ztype(Ny), ztype(Nz))61 forall( [Nw], [Nx], [Ny], [Nz] ) 62 62 void fillHelloData( array( float, Nw, Nx, Ny, Nz ) & wxyz ) { 63 63 for (w; z(Nw)) … … 68 68 } 69 69 70 forall( ztype(Zn)70 forall( [Zn] 71 71 , S & | sized(S) 72 72 ) … … 86 86 } 87 87 88 forall( ztype(Nw), ztype(Nx), ztype(Ny), ztype(Nz))88 forall( [Nw], [Nx], [Ny], [Nz] ) 89 89 void runtimeTest( tag(Nw), tag(Nx), tag(Ny), tag(Nz) ) { 90 90 -
tests/array-container/array-md-sbscr-cases.cfa
r63a4b92 rb9dae14c 18 18 } 19 19 20 forall( ztype(Nw), ztype(Nx), ztype(Ny), ztype(Nz))20 forall( [Nw], [Nx], [Ny], [Nz] ) 21 21 void fillHelloData( array( float, Nw, Nx, Ny, Nz ) & wxyz ) { 22 22 for (w; z(Nw)) … … 27 27 } 28 28 29 forall( ztype(Zn)30 , S & | sized(S)31 )32 float total1d_low( arpk(Zn, S, float, float ) & a ) {33 float total = 0.0f;34 for (i; z(Zn))35 total += a[i];36 return total;37 }38 39 forall( A & | ar(A, float) )40 float total1d_hi( A & a ) {41 float total = 0.0f;42 for (i; a`len)43 total += a[i];44 return total;45 }46 47 29 // Tests all the ways to split dimensions into CFA-supported chunks, by the only order that C supports: coarsest to finest stride. 48 forall( ztype(Nw), ztype(Nx), ztype(Ny), ztype(Nz))30 forall( [Nw], [Nx], [Ny], [Nz] ) 49 31 void test_inOrderSplits( tag(Nw), tag(Nx), tag(Ny), tag(Nz) ) { 50 32 … … 96 78 97 79 // All orders that skip a single dimension, each in its most natural split. 98 forall( ztype(Nw), ztype(Nx), ztype(Ny), ztype(Nz))80 forall( [Nw], [Nx], [Ny], [Nz] ) 99 81 void test_skipSingle( tag(Nw), tag(Nx), tag(Ny), tag(Nz) ) { 100 82 … … 137 119 // Natural split means the arity of every -[[-,...]] tuple equals the dimensionality of its "this" operand, then that the fewest "all" subscripts are given. 138 120 // The commented-out test code shows cases that don't work. We wish all the comment-coverd cases worked. 139 forall( ztype(Nw), ztype(Nx), ztype(Ny), ztype(Nz))121 forall( [Nw], [Nx], [Ny], [Nz] ) 140 122 void test_latticeCoverage( tag(Nw), tag(Nx), tag(Ny), tag(Nz) ) { 141 123 … … 235 217 } 236 218 237 forall( ztype(Nw), ztype(Nx), ztype(Ny), ztype(Nz))219 forall( [Nw], [Nx], [Ny], [Nz] ) 238 220 void test_numSubscrTypeCompatibility( tag(Nw), tag(Nx), tag(Ny), tag(Nz) ) { 239 221 … … 282 264 test_skipSingle ( ztag(KW), ztag(KX), ztag(KY), ztag(KZ) ); 283 265 test_latticeCoverage( ztag(KW), ztag(KX), ztag(KY), ztag(KZ) ); 266 test_numSubscrTypeCompatibility( ztag(KW), ztag(KX), ztag(KY), ztag(KZ) ); 284 267 printf("done\n"); 285 268 }
Note: See TracChangeset
for help on using the changeset viewer.