@@ -84,6 +84,14 @@ for iter bound codes =
8484 ]
8585 ++ scoped codes
8686
87+ forRange :: Text -> (Int , Int , Int ) -> Code -> Code
88+ forRange iter (start, end, step) codes =
89+ scoped $
90+ [ [i |int #{iter};|],
91+ [i |for (#{iter} = #{start}; #{iter} <= #{end}; #{iter} += #{step})|]
92+ ]
93+ ++ scoped codes
94+
8795if_ :: Text -> Code -> Code
8896if_ condition codes = [[i |if (#{condition})|]] ++ scoped codes
8997
@@ -337,6 +345,122 @@ evaluating CSimpleCodegen {..} rootIDs =
337345 case shape of
338346 [size] -> [[I. i |dft_1d(#{size}, #{addressOf arg}, #{addressOf n}, FFTW_BACKWARD);|]]
339347 [size1, size2] -> [[I. i |dft_2d(#{size1}, #{size2}, #{addressOf arg}, #{addressOf n}, FFTW_BACKWARD);|]]
348+ Project dss arg ->
349+ case (dss, retrieveShape arg cExpressionMap) of
350+ ([ds], [size]) ->
351+ let toIndex i = [I. i |#{i} % #{size}|]
352+ in scoped $
353+ " int nxt = 0;" :
354+ ( forRange i (toRange ds size) $
355+ if et == R
356+ then
357+ [ [I. i |#{n !! "nxt"} = #{arg !! (toIndex i)};|],
358+ " nxt++;"
359+ ]
360+ else
361+ [ [I. i |#{n `reAt` "nxt"} = #{arg `reAt` (toIndex i)};|],
362+ [I. i |#{n `imAt` "nxt"} = #{arg `imAt` (toIndex i)};|],
363+ " nxt++;"
364+ ]
365+ )
366+ ([ds1, ds2], [size1, size2]) ->
367+ let toIndex i j = [I. i |(#{i} % #{size1}) * #{size2} + (#{j} % #{size2})|]
368+ in scoped $
369+ " int nxt = 0;" :
370+ ( forRange i (toRange ds1 size1) $
371+ forRange j (toRange ds2 size2) $
372+ if et == R
373+ then
374+ [ [I. i |#{n !! "nxt"} = #{arg !! (toIndex i j)};|],
375+ " nxt++;"
376+ ]
377+ else
378+ [ [I. i |#{n `reAt` "nxt"} = #{arg `reAt` (toIndex i j)};|],
379+ [I. i |#{n `imAt` "nxt"} = #{arg `imAt` (toIndex i j)};|],
380+ " nxt++;"
381+ ]
382+ )
383+ ([ds1, ds2, ds3], [size1, size2, size3]) ->
384+ let toIndex i j k = [I. i |(#{i} % #{size1}) * #{size2} * #{size3} + (#{j} % #{size2}) * #{size3} + (#{k} % #{size3})|]
385+ in scoped $
386+ " int nxt = 0;" :
387+ ( forRange i (toRange ds1 size1) $
388+ forRange j (toRange ds2 size2) $
389+ forRange k (toRange ds3 size3) $
390+ if et == R
391+ then
392+ [ [I. i |#{n !! "nxt"} = #{arg !! (toIndex i j k)};|],
393+ " nxt++;"
394+ ]
395+ else
396+ [ [I. i |#{n `reAt` "nxt"} = #{arg `reAt` (toIndex i j k)};|],
397+ [I. i |#{n `imAt` "nxt"} = #{arg `imAt` (toIndex i j k)};|],
398+ " nxt++;"
399+ ]
400+ )
401+ Inject dss sub base ->
402+ let copyBase =
403+ if et == R
404+ then for i (len n) [[I. i |#{n !! i} = #{base !! i};|]]
405+ else
406+ for i (len n) $
407+ [ [I. i |#{n `reAt` i} = #{base `reAt` i};|],
408+ [I. i |#{n `imAt` i} = #{base `imAt` i};|]
409+ ]
410+ injectSub =
411+ case (dss, retrieveShape n cExpressionMap) of
412+ ([ds], [size]) ->
413+ let toIndex i = [I. i |#{i} % #{size}|]
414+ in scoped $
415+ " int nxt = 0;" :
416+ ( forRange i (toRange ds size) $
417+ if et == R
418+ then
419+ [ [I. i |#{n !! (toIndex i)} = #{sub !! "nxt"};|],
420+ " nxt++;"
421+ ]
422+ else
423+ [ [I. i |#{n `reAt` (toIndex i)} = #{sub `reAt` "nxt"};|],
424+ [I. i |#{n `imAt` (toIndex i)} = #{sub `imAt` "nxt"};|],
425+ " nxt++;"
426+ ]
427+ )
428+ ([ds1, ds2], [size1, size2]) ->
429+ let toIndex i j = [I. i |(#{i} % #{size1}) * #{size2} + (#{j} % #{size2})|]
430+ in scoped $
431+ " int nxt = 0;" :
432+ ( forRange i (toRange ds1 size1) $
433+ forRange j (toRange ds2 size2) $
434+ if et == R
435+ then
436+ [ [I. i |#{n !! (toIndex i j)} = #{sub !! "nxt"};|],
437+ " nxt++;"
438+ ]
439+ else
440+ [ [I. i |#{n `reAt` (toIndex i j)} = #{sub `reAt` "nxt"};|],
441+ [I. i |#{n `imAt` (toIndex i j)} = #{sub `imAt` "nxt"};|],
442+ " nxt++;"
443+ ]
444+ )
445+ ([ds1, ds2, ds3], [size1, size2, size3]) ->
446+ let toIndex i j k = [I. i |(#{i} % #{size1}) * #{size2} * #{size3} + (#{j} % #{size2}) * #{size3} + (#{k} % #{size3})|]
447+ in scoped $
448+ " int nxt = 0;" :
449+ ( forRange i (toRange ds1 size1) $
450+ forRange j (toRange ds2 size2) $
451+ forRange k (toRange ds3 size3) $
452+ if et == R
453+ then
454+ [ [I. i |#{n !! (toIndex i j k)} = #{sub !! "nxt"};|],
455+ " nxt++;"
456+ ]
457+ else
458+ [ [I. i |#{n `reAt` (toIndex i j k)} = #{sub `reAt` "nxt"};|],
459+ [I. i |#{n `imAt` (toIndex i j k)} = #{sub `imAt` "nxt"};|],
460+ " nxt++;"
461+ ]
462+ )
463+ in scoped $ copyBase ++ injectSub
340464 node -> error $ " Not implemented " ++ show node
341465
342466-------------------------------------------------------------------------------
0 commit comments