|
|
|
|
@@ -28,17 +28,6 @@
|
|
|
|
|
#include "module.h"
|
|
|
|
|
#include "init.h"
|
|
|
|
|
|
|
|
|
|
// FIXME
|
|
|
|
|
int binary(const char *p , const char **tab, int high)
|
|
|
|
|
{
|
|
|
|
|
assert(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**************************************
|
|
|
|
|
* Hash table of array op functions already generated or known about.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
StringTable arrayfuncs;
|
|
|
|
|
|
|
|
|
|
/***********************************
|
|
|
|
|
* Construct the array operation expression.
|
|
|
|
|
@@ -46,10 +35,6 @@ StringTable arrayfuncs;
|
|
|
|
|
|
|
|
|
|
Expression *BinExp::arrayOp(Scope *sc)
|
|
|
|
|
{
|
|
|
|
|
// FIXME
|
|
|
|
|
error("array operations not yet implemented");
|
|
|
|
|
fatal();
|
|
|
|
|
|
|
|
|
|
Expressions *arguments = new Expressions();
|
|
|
|
|
|
|
|
|
|
/* The expression to generate an array operation for is mangled
|
|
|
|
|
@@ -75,243 +60,247 @@ Expression *BinExp::arrayOp(Scope *sc)
|
|
|
|
|
|
|
|
|
|
/* Look up name in hash table
|
|
|
|
|
*/
|
|
|
|
|
StringValue *sv = arrayfuncs.update(name, namelen);
|
|
|
|
|
StringValue *sv = sc->module->arrayfuncs.update(name, namelen);
|
|
|
|
|
FuncDeclaration *fd = (FuncDeclaration *)sv->ptrvalue;
|
|
|
|
|
if (!fd)
|
|
|
|
|
{
|
|
|
|
|
/* Some of the array op functions are written as library functions,
|
|
|
|
|
* presumably to optimize them with special CPU vector instructions.
|
|
|
|
|
* List those library functions here, in alpha order.
|
|
|
|
|
*/
|
|
|
|
|
static const char *libArrayopFuncs[] =
|
|
|
|
|
{
|
|
|
|
|
"_arrayExpSliceAddass_a",
|
|
|
|
|
"_arrayExpSliceAddass_d", // T[]+=T
|
|
|
|
|
"_arrayExpSliceAddass_f", // T[]+=T
|
|
|
|
|
"_arrayExpSliceAddass_g",
|
|
|
|
|
"_arrayExpSliceAddass_h",
|
|
|
|
|
"_arrayExpSliceAddass_i",
|
|
|
|
|
"_arrayExpSliceAddass_k",
|
|
|
|
|
"_arrayExpSliceAddass_s",
|
|
|
|
|
"_arrayExpSliceAddass_t",
|
|
|
|
|
"_arrayExpSliceAddass_u",
|
|
|
|
|
"_arrayExpSliceAddass_w",
|
|
|
|
|
// /* Some of the array op functions are written as library functions,
|
|
|
|
|
// * presumably to optimize them with special CPU vector instructions.
|
|
|
|
|
// * List those library functions here, in alpha order.
|
|
|
|
|
// */
|
|
|
|
|
// static const char *libArrayopFuncs[] =
|
|
|
|
|
// {
|
|
|
|
|
// "_arrayExpSliceAddass_a",
|
|
|
|
|
// "_arrayExpSliceAddass_d", // T[]+=T
|
|
|
|
|
// "_arrayExpSliceAddass_f", // T[]+=T
|
|
|
|
|
// "_arrayExpSliceAddass_g",
|
|
|
|
|
// "_arrayExpSliceAddass_h",
|
|
|
|
|
// "_arrayExpSliceAddass_i",
|
|
|
|
|
// "_arrayExpSliceAddass_k",
|
|
|
|
|
// "_arrayExpSliceAddass_s",
|
|
|
|
|
// "_arrayExpSliceAddass_t",
|
|
|
|
|
// "_arrayExpSliceAddass_u",
|
|
|
|
|
// "_arrayExpSliceAddass_w",
|
|
|
|
|
//
|
|
|
|
|
// "_arrayExpSliceDivass_d", // T[]/=T
|
|
|
|
|
// "_arrayExpSliceDivass_f", // T[]/=T
|
|
|
|
|
//
|
|
|
|
|
// "_arrayExpSliceMinSliceAssign_a",
|
|
|
|
|
// "_arrayExpSliceMinSliceAssign_d", // T[]=T-T[]
|
|
|
|
|
// "_arrayExpSliceMinSliceAssign_f", // T[]=T-T[]
|
|
|
|
|
// "_arrayExpSliceMinSliceAssign_g",
|
|
|
|
|
// "_arrayExpSliceMinSliceAssign_h",
|
|
|
|
|
// "_arrayExpSliceMinSliceAssign_i",
|
|
|
|
|
// "_arrayExpSliceMinSliceAssign_k",
|
|
|
|
|
// "_arrayExpSliceMinSliceAssign_s",
|
|
|
|
|
// "_arrayExpSliceMinSliceAssign_t",
|
|
|
|
|
// "_arrayExpSliceMinSliceAssign_u",
|
|
|
|
|
// "_arrayExpSliceMinSliceAssign_w",
|
|
|
|
|
//
|
|
|
|
|
// "_arrayExpSliceMinass_a",
|
|
|
|
|
// "_arrayExpSliceMinass_d", // T[]-=T
|
|
|
|
|
// "_arrayExpSliceMinass_f", // T[]-=T
|
|
|
|
|
// "_arrayExpSliceMinass_g",
|
|
|
|
|
// "_arrayExpSliceMinass_h",
|
|
|
|
|
// "_arrayExpSliceMinass_i",
|
|
|
|
|
// "_arrayExpSliceMinass_k",
|
|
|
|
|
// "_arrayExpSliceMinass_s",
|
|
|
|
|
// "_arrayExpSliceMinass_t",
|
|
|
|
|
// "_arrayExpSliceMinass_u",
|
|
|
|
|
// "_arrayExpSliceMinass_w",
|
|
|
|
|
//
|
|
|
|
|
// "_arrayExpSliceMulass_d", // T[]*=T
|
|
|
|
|
// "_arrayExpSliceMulass_f", // T[]*=T
|
|
|
|
|
// "_arrayExpSliceMulass_i",
|
|
|
|
|
// "_arrayExpSliceMulass_k",
|
|
|
|
|
// "_arrayExpSliceMulass_s",
|
|
|
|
|
// "_arrayExpSliceMulass_t",
|
|
|
|
|
// "_arrayExpSliceMulass_u",
|
|
|
|
|
// "_arrayExpSliceMulass_w",
|
|
|
|
|
//
|
|
|
|
|
// "_arraySliceExpAddSliceAssign_a",
|
|
|
|
|
// "_arraySliceExpAddSliceAssign_d", // T[]=T[]+T
|
|
|
|
|
// "_arraySliceExpAddSliceAssign_f", // T[]=T[]+T
|
|
|
|
|
// "_arraySliceExpAddSliceAssign_g",
|
|
|
|
|
// "_arraySliceExpAddSliceAssign_h",
|
|
|
|
|
// "_arraySliceExpAddSliceAssign_i",
|
|
|
|
|
// "_arraySliceExpAddSliceAssign_k",
|
|
|
|
|
// "_arraySliceExpAddSliceAssign_s",
|
|
|
|
|
// "_arraySliceExpAddSliceAssign_t",
|
|
|
|
|
// "_arraySliceExpAddSliceAssign_u",
|
|
|
|
|
// "_arraySliceExpAddSliceAssign_w",
|
|
|
|
|
//
|
|
|
|
|
// "_arraySliceExpDivSliceAssign_d", // T[]=T[]/T
|
|
|
|
|
// "_arraySliceExpDivSliceAssign_f", // T[]=T[]/T
|
|
|
|
|
//
|
|
|
|
|
// "_arraySliceExpMinSliceAssign_a",
|
|
|
|
|
// "_arraySliceExpMinSliceAssign_d", // T[]=T[]-T
|
|
|
|
|
// "_arraySliceExpMinSliceAssign_f", // T[]=T[]-T
|
|
|
|
|
// "_arraySliceExpMinSliceAssign_g",
|
|
|
|
|
// "_arraySliceExpMinSliceAssign_h",
|
|
|
|
|
// "_arraySliceExpMinSliceAssign_i",
|
|
|
|
|
// "_arraySliceExpMinSliceAssign_k",
|
|
|
|
|
// "_arraySliceExpMinSliceAssign_s",
|
|
|
|
|
// "_arraySliceExpMinSliceAssign_t",
|
|
|
|
|
// "_arraySliceExpMinSliceAssign_u",
|
|
|
|
|
// "_arraySliceExpMinSliceAssign_w",
|
|
|
|
|
//
|
|
|
|
|
// "_arraySliceExpMulSliceAddass_d", // T[] += T[]*T
|
|
|
|
|
// "_arraySliceExpMulSliceAddass_f",
|
|
|
|
|
// "_arraySliceExpMulSliceAddass_r",
|
|
|
|
|
//
|
|
|
|
|
// "_arraySliceExpMulSliceAssign_d", // T[]=T[]*T
|
|
|
|
|
// "_arraySliceExpMulSliceAssign_f", // T[]=T[]*T
|
|
|
|
|
// "_arraySliceExpMulSliceAssign_i",
|
|
|
|
|
// "_arraySliceExpMulSliceAssign_k",
|
|
|
|
|
// "_arraySliceExpMulSliceAssign_s",
|
|
|
|
|
// "_arraySliceExpMulSliceAssign_t",
|
|
|
|
|
// "_arraySliceExpMulSliceAssign_u",
|
|
|
|
|
// "_arraySliceExpMulSliceAssign_w",
|
|
|
|
|
//
|
|
|
|
|
// "_arraySliceExpMulSliceMinass_d", // T[] -= T[]*T
|
|
|
|
|
// "_arraySliceExpMulSliceMinass_f",
|
|
|
|
|
// "_arraySliceExpMulSliceMinass_r",
|
|
|
|
|
//
|
|
|
|
|
// "_arraySliceSliceAddSliceAssign_a",
|
|
|
|
|
// "_arraySliceSliceAddSliceAssign_d", // T[]=T[]+T[]
|
|
|
|
|
// "_arraySliceSliceAddSliceAssign_f", // T[]=T[]+T[]
|
|
|
|
|
// "_arraySliceSliceAddSliceAssign_g",
|
|
|
|
|
// "_arraySliceSliceAddSliceAssign_h",
|
|
|
|
|
// "_arraySliceSliceAddSliceAssign_i",
|
|
|
|
|
// "_arraySliceSliceAddSliceAssign_k",
|
|
|
|
|
// "_arraySliceSliceAddSliceAssign_r", // T[]=T[]+T[]
|
|
|
|
|
// "_arraySliceSliceAddSliceAssign_s",
|
|
|
|
|
// "_arraySliceSliceAddSliceAssign_t",
|
|
|
|
|
// "_arraySliceSliceAddSliceAssign_u",
|
|
|
|
|
// "_arraySliceSliceAddSliceAssign_w",
|
|
|
|
|
//
|
|
|
|
|
// "_arraySliceSliceAddass_a",
|
|
|
|
|
// "_arraySliceSliceAddass_d", // T[]+=T[]
|
|
|
|
|
// "_arraySliceSliceAddass_f", // T[]+=T[]
|
|
|
|
|
// "_arraySliceSliceAddass_g",
|
|
|
|
|
// "_arraySliceSliceAddass_h",
|
|
|
|
|
// "_arraySliceSliceAddass_i",
|
|
|
|
|
// "_arraySliceSliceAddass_k",
|
|
|
|
|
// "_arraySliceSliceAddass_s",
|
|
|
|
|
// "_arraySliceSliceAddass_t",
|
|
|
|
|
// "_arraySliceSliceAddass_u",
|
|
|
|
|
// "_arraySliceSliceAddass_w",
|
|
|
|
|
//
|
|
|
|
|
// "_arraySliceSliceMinSliceAssign_a",
|
|
|
|
|
// "_arraySliceSliceMinSliceAssign_d", // T[]=T[]-T[]
|
|
|
|
|
// "_arraySliceSliceMinSliceAssign_f", // T[]=T[]-T[]
|
|
|
|
|
// "_arraySliceSliceMinSliceAssign_g",
|
|
|
|
|
// "_arraySliceSliceMinSliceAssign_h",
|
|
|
|
|
// "_arraySliceSliceMinSliceAssign_i",
|
|
|
|
|
// "_arraySliceSliceMinSliceAssign_k",
|
|
|
|
|
// "_arraySliceSliceMinSliceAssign_r", // T[]=T[]-T[]
|
|
|
|
|
// "_arraySliceSliceMinSliceAssign_s",
|
|
|
|
|
// "_arraySliceSliceMinSliceAssign_t",
|
|
|
|
|
// "_arraySliceSliceMinSliceAssign_u",
|
|
|
|
|
// "_arraySliceSliceMinSliceAssign_w",
|
|
|
|
|
//
|
|
|
|
|
// "_arraySliceSliceMinass_a",
|
|
|
|
|
// "_arraySliceSliceMinass_d", // T[]-=T[]
|
|
|
|
|
// "_arraySliceSliceMinass_f", // T[]-=T[]
|
|
|
|
|
// "_arraySliceSliceMinass_g",
|
|
|
|
|
// "_arraySliceSliceMinass_h",
|
|
|
|
|
// "_arraySliceSliceMinass_i",
|
|
|
|
|
// "_arraySliceSliceMinass_k",
|
|
|
|
|
// "_arraySliceSliceMinass_s",
|
|
|
|
|
// "_arraySliceSliceMinass_t",
|
|
|
|
|
// "_arraySliceSliceMinass_u",
|
|
|
|
|
// "_arraySliceSliceMinass_w",
|
|
|
|
|
//
|
|
|
|
|
// "_arraySliceSliceMulSliceAssign_d", // T[]=T[]*T[]
|
|
|
|
|
// "_arraySliceSliceMulSliceAssign_f", // T[]=T[]*T[]
|
|
|
|
|
// "_arraySliceSliceMulSliceAssign_i",
|
|
|
|
|
// "_arraySliceSliceMulSliceAssign_k",
|
|
|
|
|
// "_arraySliceSliceMulSliceAssign_s",
|
|
|
|
|
// "_arraySliceSliceMulSliceAssign_t",
|
|
|
|
|
// "_arraySliceSliceMulSliceAssign_u",
|
|
|
|
|
// "_arraySliceSliceMulSliceAssign_w",
|
|
|
|
|
//
|
|
|
|
|
// "_arraySliceSliceMulass_d", // T[]*=T[]
|
|
|
|
|
// "_arraySliceSliceMulass_f", // T[]*=T[]
|
|
|
|
|
// "_arraySliceSliceMulass_i",
|
|
|
|
|
// "_arraySliceSliceMulass_k",
|
|
|
|
|
// "_arraySliceSliceMulass_s",
|
|
|
|
|
// "_arraySliceSliceMulass_t",
|
|
|
|
|
// "_arraySliceSliceMulass_u",
|
|
|
|
|
// "_arraySliceSliceMulass_w",
|
|
|
|
|
// };
|
|
|
|
|
//
|
|
|
|
|
// int i = binary(name, libArrayopFuncs, sizeof(libArrayopFuncs) / sizeof(char *));
|
|
|
|
|
// if (i == -1)
|
|
|
|
|
// {
|
|
|
|
|
// #ifdef DEBUG // Make sure our array is alphabetized
|
|
|
|
|
// for (i = 0; i < sizeof(libArrayopFuncs) / sizeof(char *); i++)
|
|
|
|
|
// {
|
|
|
|
|
// if (strcmp(name, libArrayopFuncs[i]) == 0)
|
|
|
|
|
// assert(0);
|
|
|
|
|
// }
|
|
|
|
|
// #endif
|
|
|
|
|
|
|
|
|
|
"_arrayExpSliceDivass_d", // T[]/=T
|
|
|
|
|
"_arrayExpSliceDivass_f", // T[]/=T
|
|
|
|
|
/* Not in library, so generate it.
|
|
|
|
|
* Construct the function body:
|
|
|
|
|
* foreach (i; 0 .. p.length) for (size_t i = 0; i < p.length; i++)
|
|
|
|
|
* loopbody;
|
|
|
|
|
* return p;
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
"_arrayExpSliceMinSliceAssign_a",
|
|
|
|
|
"_arrayExpSliceMinSliceAssign_d", // T[]=T-T[]
|
|
|
|
|
"_arrayExpSliceMinSliceAssign_f", // T[]=T-T[]
|
|
|
|
|
"_arrayExpSliceMinSliceAssign_g",
|
|
|
|
|
"_arrayExpSliceMinSliceAssign_h",
|
|
|
|
|
"_arrayExpSliceMinSliceAssign_i",
|
|
|
|
|
"_arrayExpSliceMinSliceAssign_k",
|
|
|
|
|
"_arrayExpSliceMinSliceAssign_s",
|
|
|
|
|
"_arrayExpSliceMinSliceAssign_t",
|
|
|
|
|
"_arrayExpSliceMinSliceAssign_u",
|
|
|
|
|
"_arrayExpSliceMinSliceAssign_w",
|
|
|
|
|
|
|
|
|
|
"_arrayExpSliceMinass_a",
|
|
|
|
|
"_arrayExpSliceMinass_d", // T[]-=T
|
|
|
|
|
"_arrayExpSliceMinass_f", // T[]-=T
|
|
|
|
|
"_arrayExpSliceMinass_g",
|
|
|
|
|
"_arrayExpSliceMinass_h",
|
|
|
|
|
"_arrayExpSliceMinass_i",
|
|
|
|
|
"_arrayExpSliceMinass_k",
|
|
|
|
|
"_arrayExpSliceMinass_s",
|
|
|
|
|
"_arrayExpSliceMinass_t",
|
|
|
|
|
"_arrayExpSliceMinass_u",
|
|
|
|
|
"_arrayExpSliceMinass_w",
|
|
|
|
|
|
|
|
|
|
"_arrayExpSliceMulass_d", // T[]*=T
|
|
|
|
|
"_arrayExpSliceMulass_f", // T[]*=T
|
|
|
|
|
"_arrayExpSliceMulass_i",
|
|
|
|
|
"_arrayExpSliceMulass_k",
|
|
|
|
|
"_arrayExpSliceMulass_s",
|
|
|
|
|
"_arrayExpSliceMulass_t",
|
|
|
|
|
"_arrayExpSliceMulass_u",
|
|
|
|
|
"_arrayExpSliceMulass_w",
|
|
|
|
|
|
|
|
|
|
"_arraySliceExpAddSliceAssign_a",
|
|
|
|
|
"_arraySliceExpAddSliceAssign_d", // T[]=T[]+T
|
|
|
|
|
"_arraySliceExpAddSliceAssign_f", // T[]=T[]+T
|
|
|
|
|
"_arraySliceExpAddSliceAssign_g",
|
|
|
|
|
"_arraySliceExpAddSliceAssign_h",
|
|
|
|
|
"_arraySliceExpAddSliceAssign_i",
|
|
|
|
|
"_arraySliceExpAddSliceAssign_k",
|
|
|
|
|
"_arraySliceExpAddSliceAssign_s",
|
|
|
|
|
"_arraySliceExpAddSliceAssign_t",
|
|
|
|
|
"_arraySliceExpAddSliceAssign_u",
|
|
|
|
|
"_arraySliceExpAddSliceAssign_w",
|
|
|
|
|
|
|
|
|
|
"_arraySliceExpDivSliceAssign_d", // T[]=T[]/T
|
|
|
|
|
"_arraySliceExpDivSliceAssign_f", // T[]=T[]/T
|
|
|
|
|
|
|
|
|
|
"_arraySliceExpMinSliceAssign_a",
|
|
|
|
|
"_arraySliceExpMinSliceAssign_d", // T[]=T[]-T
|
|
|
|
|
"_arraySliceExpMinSliceAssign_f", // T[]=T[]-T
|
|
|
|
|
"_arraySliceExpMinSliceAssign_g",
|
|
|
|
|
"_arraySliceExpMinSliceAssign_h",
|
|
|
|
|
"_arraySliceExpMinSliceAssign_i",
|
|
|
|
|
"_arraySliceExpMinSliceAssign_k",
|
|
|
|
|
"_arraySliceExpMinSliceAssign_s",
|
|
|
|
|
"_arraySliceExpMinSliceAssign_t",
|
|
|
|
|
"_arraySliceExpMinSliceAssign_u",
|
|
|
|
|
"_arraySliceExpMinSliceAssign_w",
|
|
|
|
|
|
|
|
|
|
"_arraySliceExpMulSliceAddass_d", // T[] += T[]*T
|
|
|
|
|
"_arraySliceExpMulSliceAddass_f",
|
|
|
|
|
"_arraySliceExpMulSliceAddass_r",
|
|
|
|
|
|
|
|
|
|
"_arraySliceExpMulSliceAssign_d", // T[]=T[]*T
|
|
|
|
|
"_arraySliceExpMulSliceAssign_f", // T[]=T[]*T
|
|
|
|
|
"_arraySliceExpMulSliceAssign_i",
|
|
|
|
|
"_arraySliceExpMulSliceAssign_k",
|
|
|
|
|
"_arraySliceExpMulSliceAssign_s",
|
|
|
|
|
"_arraySliceExpMulSliceAssign_t",
|
|
|
|
|
"_arraySliceExpMulSliceAssign_u",
|
|
|
|
|
"_arraySliceExpMulSliceAssign_w",
|
|
|
|
|
|
|
|
|
|
"_arraySliceExpMulSliceMinass_d", // T[] -= T[]*T
|
|
|
|
|
"_arraySliceExpMulSliceMinass_f",
|
|
|
|
|
"_arraySliceExpMulSliceMinass_r",
|
|
|
|
|
|
|
|
|
|
"_arraySliceSliceAddSliceAssign_a",
|
|
|
|
|
"_arraySliceSliceAddSliceAssign_d", // T[]=T[]+T[]
|
|
|
|
|
"_arraySliceSliceAddSliceAssign_f", // T[]=T[]+T[]
|
|
|
|
|
"_arraySliceSliceAddSliceAssign_g",
|
|
|
|
|
"_arraySliceSliceAddSliceAssign_h",
|
|
|
|
|
"_arraySliceSliceAddSliceAssign_i",
|
|
|
|
|
"_arraySliceSliceAddSliceAssign_k",
|
|
|
|
|
"_arraySliceSliceAddSliceAssign_r", // T[]=T[]+T[]
|
|
|
|
|
"_arraySliceSliceAddSliceAssign_s",
|
|
|
|
|
"_arraySliceSliceAddSliceAssign_t",
|
|
|
|
|
"_arraySliceSliceAddSliceAssign_u",
|
|
|
|
|
"_arraySliceSliceAddSliceAssign_w",
|
|
|
|
|
|
|
|
|
|
"_arraySliceSliceAddass_a",
|
|
|
|
|
"_arraySliceSliceAddass_d", // T[]+=T[]
|
|
|
|
|
"_arraySliceSliceAddass_f", // T[]+=T[]
|
|
|
|
|
"_arraySliceSliceAddass_g",
|
|
|
|
|
"_arraySliceSliceAddass_h",
|
|
|
|
|
"_arraySliceSliceAddass_i",
|
|
|
|
|
"_arraySliceSliceAddass_k",
|
|
|
|
|
"_arraySliceSliceAddass_s",
|
|
|
|
|
"_arraySliceSliceAddass_t",
|
|
|
|
|
"_arraySliceSliceAddass_u",
|
|
|
|
|
"_arraySliceSliceAddass_w",
|
|
|
|
|
|
|
|
|
|
"_arraySliceSliceMinSliceAssign_a",
|
|
|
|
|
"_arraySliceSliceMinSliceAssign_d", // T[]=T[]-T[]
|
|
|
|
|
"_arraySliceSliceMinSliceAssign_f", // T[]=T[]-T[]
|
|
|
|
|
"_arraySliceSliceMinSliceAssign_g",
|
|
|
|
|
"_arraySliceSliceMinSliceAssign_h",
|
|
|
|
|
"_arraySliceSliceMinSliceAssign_i",
|
|
|
|
|
"_arraySliceSliceMinSliceAssign_k",
|
|
|
|
|
"_arraySliceSliceMinSliceAssign_r", // T[]=T[]-T[]
|
|
|
|
|
"_arraySliceSliceMinSliceAssign_s",
|
|
|
|
|
"_arraySliceSliceMinSliceAssign_t",
|
|
|
|
|
"_arraySliceSliceMinSliceAssign_u",
|
|
|
|
|
"_arraySliceSliceMinSliceAssign_w",
|
|
|
|
|
|
|
|
|
|
"_arraySliceSliceMinass_a",
|
|
|
|
|
"_arraySliceSliceMinass_d", // T[]-=T[]
|
|
|
|
|
"_arraySliceSliceMinass_f", // T[]-=T[]
|
|
|
|
|
"_arraySliceSliceMinass_g",
|
|
|
|
|
"_arraySliceSliceMinass_h",
|
|
|
|
|
"_arraySliceSliceMinass_i",
|
|
|
|
|
"_arraySliceSliceMinass_k",
|
|
|
|
|
"_arraySliceSliceMinass_s",
|
|
|
|
|
"_arraySliceSliceMinass_t",
|
|
|
|
|
"_arraySliceSliceMinass_u",
|
|
|
|
|
"_arraySliceSliceMinass_w",
|
|
|
|
|
|
|
|
|
|
"_arraySliceSliceMulSliceAssign_d", // T[]=T[]*T[]
|
|
|
|
|
"_arraySliceSliceMulSliceAssign_f", // T[]=T[]*T[]
|
|
|
|
|
"_arraySliceSliceMulSliceAssign_i",
|
|
|
|
|
"_arraySliceSliceMulSliceAssign_k",
|
|
|
|
|
"_arraySliceSliceMulSliceAssign_s",
|
|
|
|
|
"_arraySliceSliceMulSliceAssign_t",
|
|
|
|
|
"_arraySliceSliceMulSliceAssign_u",
|
|
|
|
|
"_arraySliceSliceMulSliceAssign_w",
|
|
|
|
|
|
|
|
|
|
"_arraySliceSliceMulass_d", // T[]*=T[]
|
|
|
|
|
"_arraySliceSliceMulass_f", // T[]*=T[]
|
|
|
|
|
"_arraySliceSliceMulass_i",
|
|
|
|
|
"_arraySliceSliceMulass_k",
|
|
|
|
|
"_arraySliceSliceMulass_s",
|
|
|
|
|
"_arraySliceSliceMulass_t",
|
|
|
|
|
"_arraySliceSliceMulass_u",
|
|
|
|
|
"_arraySliceSliceMulass_w",
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
int i = binary(name, libArrayopFuncs, sizeof(libArrayopFuncs) / sizeof(char *));
|
|
|
|
|
if (i == -1)
|
|
|
|
|
{
|
|
|
|
|
#ifdef DEBUG // Make sure our array is alphabetized
|
|
|
|
|
for (i = 0; i < sizeof(libArrayopFuncs) / sizeof(char *); i++)
|
|
|
|
|
{
|
|
|
|
|
if (strcmp(name, libArrayopFuncs[i]) == 0)
|
|
|
|
|
assert(0);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
/* Not in library, so generate it.
|
|
|
|
|
* Construct the function body:
|
|
|
|
|
* foreach (i; 0 .. p.length) for (size_t i = 0; i < p.length; i++)
|
|
|
|
|
* loopbody;
|
|
|
|
|
* return p;
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
Arguments *fparams = new Arguments();
|
|
|
|
|
Expression *loopbody = buildArrayLoop(fparams);
|
|
|
|
|
Argument *p = (Argument *)fparams->data[0 /*fparams->dim - 1*/];
|
|
|
|
|
Arguments *fparams = new Arguments();
|
|
|
|
|
Expression *loopbody = buildArrayLoop(fparams);
|
|
|
|
|
Argument *p = (Argument *)fparams->data[0 /*fparams->dim - 1*/];
|
|
|
|
|
#if DMDV1
|
|
|
|
|
// for (size_t i = 0; i < p.length; i++)
|
|
|
|
|
Initializer *init = new ExpInitializer(0, new IntegerExp(0, 0, Type::tsize_t));
|
|
|
|
|
Dsymbol *d = new VarDeclaration(0, Type::tsize_t, Id::p, init);
|
|
|
|
|
Statement *s1 = new ForStatement(0,
|
|
|
|
|
new DeclarationStatement(0, d),
|
|
|
|
|
new CmpExp(TOKlt, 0, new IdentifierExp(0, Id::p), new ArrayLengthExp(0, new IdentifierExp(0, p->ident))),
|
|
|
|
|
new PostExp(TOKplusplus, 0, new IdentifierExp(0, Id::p)),
|
|
|
|
|
new ExpStatement(0, loopbody));
|
|
|
|
|
// for (size_t i = 0; i < p.length; i++)
|
|
|
|
|
Initializer *init = new ExpInitializer(0, new IntegerExp(0, 0, Type::tsize_t));
|
|
|
|
|
Dsymbol *d = new VarDeclaration(0, Type::tsize_t, Id::p, init);
|
|
|
|
|
Statement *s1 = new ForStatement(0,
|
|
|
|
|
new DeclarationStatement(0, d),
|
|
|
|
|
new CmpExp(TOKlt, 0, new IdentifierExp(0, Id::p), new ArrayLengthExp(0, new IdentifierExp(0, p->ident))),
|
|
|
|
|
new PostExp(TOKplusplus, 0, new IdentifierExp(0, Id::p)),
|
|
|
|
|
new ExpStatement(0, loopbody));
|
|
|
|
|
#else
|
|
|
|
|
// foreach (i; 0 .. p.length)
|
|
|
|
|
Statement *s1 = new ForeachRangeStatement(0, TOKforeach,
|
|
|
|
|
new Argument(0, NULL, Id::p, NULL),
|
|
|
|
|
new IntegerExp(0, 0, Type::tint32),
|
|
|
|
|
new ArrayLengthExp(0, new IdentifierExp(0, p->ident)),
|
|
|
|
|
new ExpStatement(0, loopbody));
|
|
|
|
|
// foreach (i; 0 .. p.length)
|
|
|
|
|
Statement *s1 = new ForeachRangeStatement(0, TOKforeach,
|
|
|
|
|
new Argument(0, NULL, Id::p, NULL),
|
|
|
|
|
new IntegerExp(0, 0, Type::tint32),
|
|
|
|
|
new ArrayLengthExp(0, new IdentifierExp(0, p->ident)),
|
|
|
|
|
new ExpStatement(0, loopbody));
|
|
|
|
|
#endif
|
|
|
|
|
Statement *s2 = new ReturnStatement(0, new IdentifierExp(0, p->ident));
|
|
|
|
|
//printf("s2: %s\n", s2->toChars());
|
|
|
|
|
Statement *fbody = new CompoundStatement(0, s1, s2);
|
|
|
|
|
Statement *s2 = new ReturnStatement(0, new IdentifierExp(0, p->ident));
|
|
|
|
|
//printf("s2: %s\n", s2->toChars());
|
|
|
|
|
Statement *fbody = new CompoundStatement(0, s1, s2);
|
|
|
|
|
|
|
|
|
|
/* Construct the function
|
|
|
|
|
*/
|
|
|
|
|
TypeFunction *ftype = new TypeFunction(fparams, type, 0, LINKc);
|
|
|
|
|
//printf("ftype: %s\n", ftype->toChars());
|
|
|
|
|
fd = new FuncDeclaration(0, 0, Lexer::idPool(name), STCundefined, ftype);
|
|
|
|
|
fd->fbody = fbody;
|
|
|
|
|
fd->protection = PROTpublic;
|
|
|
|
|
fd->linkage = LINKc;
|
|
|
|
|
/* Construct the function
|
|
|
|
|
*/
|
|
|
|
|
TypeFunction *ftype = new TypeFunction(fparams, type, 0, LINKc);
|
|
|
|
|
//printf("ftype: %s\n", ftype->toChars());
|
|
|
|
|
fd = new FuncDeclaration(0, 0, Lexer::idPool(name), STCundefined, ftype);
|
|
|
|
|
fd->fbody = fbody;
|
|
|
|
|
fd->protection = PROTprotected;
|
|
|
|
|
fd->linkage = LINKd;
|
|
|
|
|
|
|
|
|
|
sc->module->importedFrom->members->push(fd);
|
|
|
|
|
// special attention for array ops
|
|
|
|
|
fd->isArrayOp = true;
|
|
|
|
|
|
|
|
|
|
sc = sc->push();
|
|
|
|
|
sc->parent = sc->module->importedFrom;
|
|
|
|
|
sc->stc = 0;
|
|
|
|
|
sc->linkage = LINKc;
|
|
|
|
|
fd->semantic(sc);
|
|
|
|
|
sc->pop();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{ /* In library, refer to it.
|
|
|
|
|
*/
|
|
|
|
|
// LDC FIXME
|
|
|
|
|
fd = FuncDeclaration::genCfunc(NULL, type, name);
|
|
|
|
|
}
|
|
|
|
|
sv->ptrvalue = fd; // cache symbol in hash table
|
|
|
|
|
sc->module->members->push(fd);
|
|
|
|
|
|
|
|
|
|
sc = sc->push();
|
|
|
|
|
sc->parent = sc->module;
|
|
|
|
|
sc->stc = 0;
|
|
|
|
|
sc->linkage = LINKd;
|
|
|
|
|
fd->semantic(sc);
|
|
|
|
|
sc->pop();
|
|
|
|
|
// }
|
|
|
|
|
// else
|
|
|
|
|
// { /* In library, refer to it.
|
|
|
|
|
// */
|
|
|
|
|
// // FIXME
|
|
|
|
|
// fd = FuncDeclaration::genCfunc(NULL, type, name);
|
|
|
|
|
// }
|
|
|
|
|
sv->ptrvalue = fd; // cache symbol in hash table
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Call the function fd(arguments)
|
|
|
|
|
|