Example #1
0
	void PointStarfield::addBrightStarCatalogue (int count) {
		assert(count >= 0);
		if (count < BrightStarCatalogueSize) {
			// Only sort if we don't add everything.
			// It would be lovely if the catalogue was already sorted.
			std::vector<std::pair<Real, int> > vec;
			vec.reserve(BrightStarCatalogueSize);
			for (int i = 0; i < BrightStarCatalogueSize; ++i) {
				vec.push_back(std::make_pair(BrightStarCatalogue[i].magn, i));
			}
			sort(vec.begin(), vec.end());
			for (int i = 0; i < count; ++i) {
				addStar(BrightStarCatalogue[vec[i].second]);
			}
		} else {
			assert(count == BrightStarCatalogueSize);
			for (int i = 0; i < BrightStarCatalogueSize; ++i) {
				addStar(BrightStarCatalogue[i]);
			}
		}
        notifyStarVectorChanged ();
	}
Example #2
0
void ItemFactory::produce(float dt)
{
	//produce food when necessary
	addFood();

	//add the transfer doors
	//load from json
	//addDoor();

	//add the score apple
	addApple(dt);

	//add the speed star
	addStar(dt);

	//add the slow down ball
	addBall(dt);

	//check and remove expired item
	removeExpiredItem(dt);
}
Example #3
0
bool MapFlag::initWithLevel(int level)
{
	instance = GameManager::getInstance();
	setLevel(level);
	if (!Sprite::init())
	{
		return false;
	}
	switch (UserDefault::getInstance()->getIntegerForKey(String::createWithFormat(instance->LEVELX_STARNUM,getLevel())->getCString(),0))
	{
	case(0)://得星个数为0,为完成
		setType(0);
		flag = Sprite::createWithSpriteFrameName("mapFlag_0022.png");
		break;
	case(4)://得星个数为4
		setType(2);
		flag = Sprite::createWithSpriteFrameName("mapFlag_0112.png");
		break;
	case(5)://得星个数为5
		setType(3);
		wings = Sprite::createWithSpriteFrameName("mapFlag_wings_0015.png");
		addChild(wings);
		flag = Sprite::createWithSpriteFrameName("mapFlag_0112.png");
		break;
	default:
		setType(1);
		flag = Sprite::createWithSpriteFrameName("mapFlag_0094.png");
		break;
	}
	addChild(flag);
	initStar();
	addStar();
	auto listener = EventListenerTouchOneByOne::create();
	listener->onTouchBegan = CC_CALLBACK_2(MapFlag::onTouchBegan, this);
	listener->onTouchEnded = CC_CALLBACK_2(MapFlag::onTouchEnded, this);
	_eventDispatcher->addEventListenerWithSceneGraphPriority(listener,flag);
	
	return true;
}
Example #4
0
//生成比较的语句,结果只能为INTEGER?
void genCompare(Quad* quad, VariableMap* map) {
    fprintf(out, "\t# compare\n");
    if (quad->addr3.kind == String && getVar(quad->addr3.contents.name, map)) {
        addStar(quad->addr3.contents.name);
        quad->addr3.kind = Val;
    }
    if (quad->addr2.kind == String && getVar(quad->addr2.contents.name, map)) {
        quad->addr2.kind = Val;
        addStar(quad->addr2.contents.name);
    }
    if (quad->addr1.kind == String && getVar(quad->addr1.contents.name, map)) {
        quad->addr1.kind = Val;
        addStar(quad->addr1.contents.name);
    }
    type t1 = UNDEFINED, t2 = UNDEFINED, t=UNDEFINED;
    if (quad->addr1.kind==Val) t1 = getType(quad->addr1.contents.name+1, map); else
        switch (quad->addr1.kind) {
            case IntConst: t1 = INTEGER; break;
            case FloatConst: t1 = FLOAT; break;
            default: break;
        }
    if (quad->addr2.kind==Val) t2 = getType(quad->addr2.contents.name+1, map); else
        switch (quad->addr2.kind) {
            case IntConst: t2 = INTEGER; break;
            case FloatConst: t2 = FLOAT; break;
            default: break;
        }
    if (t1==DOUBLE || t2 == DOUBLE)
        t=DOUBLE; else
            if (t1==FLOAT || t2 == FLOAT)
                t = FLOAT; else
                    if (t1==INTEGER && t2==INTEGER)
                        t = INTEGER;
    if (t == INTEGER) { //如果 a = b op c的b和c都是整形
        if (quad->addr1.kind == IntConst) fprintf(out, "\tli $t1, %d\n", quad->addr1.contents.intVal);
        if (quad->addr1.kind == Val) {
            fprintf(out, "\tlw $t3, %s\n", quad->addr1.contents.name+1);
            fprintf(out, "\tlw $t1, 0($t3)\n");
        }
        if (quad->addr2.kind == IntConst) fprintf(out, "\tli $t2, %d\n", quad->addr2.contents.intVal);
        if (quad->addr2.kind == Val) {
            fprintf(out, "\tlw $t3, %s\n", quad->addr2.contents.name+1);
            fprintf(out, "\tlw $t2, 0($t3)\n");
        }
        if (quad->op == sm) fprintf(out, "\tslt $t3, $t1, $t2\n"); //如果c=a<b且a确实小于b则t0=1否则t0=0
        if (quad->op == gt) fprintf(out, "\tslt $t3, $t2, $t1\n");
        if (quad->op == ne) {
            fprintf(out, "\tslt $t4, $t1, $t2\n");
            fprintf(out, "\tslt $t5, $t2, $t1\n");
            fprintf(out, "\tor $t3, $t4, $t5\n");
        }
        if (quad->op == eq) {
            fprintf(out, "\tslt $t4, $t1, $t2\n");
            fprintf(out, "\tslt $t5, $t2, $t1\n");
            fprintf(out, "\tnor $t3, $t4, $t5\n");
            fprintf(out, "\tandi $t3, $t3, 1\n");
        }
    }
    if (t == FLOAT) {
        if (quad->addr1.kind == IntConst) fprintf(out, "\tli.s $f0, %d.0\n", quad->addr1.contents.intVal);
        if (quad->addr1.kind == FloatConst) fprintf(out, "\tli.s $f0, %f\n", quad->addr1.contents.floatVal);
        if (quad->addr1.kind == Val) {
            t1 = getType(quad->addr1.contents.name+1, map);
            fprintf(out, "\tlw $t3, %s\n", quad->addr1.contents.name+1);
            if (t1 == FLOAT) fprintf(out, "\tl.s $f0, 0($t3)\n");
            if (t1 == INTEGER) {
                fprintf(out, "lw $t1, 0($t3)\n");
                fprintf(out, "\tmtc1 $t1, $f0\n");
                fprintf(out, "\tcvt.s.w $f0, $f0\n");
            }
        }
        if (quad->addr2.kind == IntConst) fprintf(out, "\tli.s $f2, %d.0\n", quad->addr2.contents.intVal);
        if (quad->addr2.kind == FloatConst) fprintf(out, "\tli.s $f2, %f\n", quad->addr2.contents.floatVal);
        if (quad->addr2.kind == Val) { //要强制转换类型
            t2 = getType(quad->addr2.contents.name+1, map);
            fprintf(out, "\tlw $t3, %s\n", quad->addr2.contents.name+1);
            if (t2 == FLOAT) fprintf(out, "\tl.s $f2, 0($t3)\n");
            if (t2 == INTEGER) {
                fprintf(out, "\tlw $t2, 0($t3)\n");
                fprintf(out, "\tmtc1 $t2, $f2\n");
                fprintf(out, "\tcvt.s.w $f2, $f2\n");
            }
        }
        if (quad->op == sm) fprintf(out, "\tc.lt.s 0, $f0, $f2\n");
        if (quad->op == gt) fprintf(out, "\tc.lt.s 0, $f2, $f0\n");
        if (quad->op == eq) fprintf(out, "\tc.eq.s 0, $f0, $f2\n");
        if (quad->op == ne) fprintf(out, "\tc.neq.s 0, $f2, $f0\n");
        fprintf(out, "\tli $t5, 1\n");
        fprintf(out, "\tli, $t3, 0\n");
        fprintf(out, "\tmovt $t3, $t5, 0\n");
    }
    if (t == DOUBLE) {
        if (quad->addr1.kind == IntConst) fprintf(out, "\tli.d $f0, %d.0\n", quad->addr1.contents.intVal);
        if (quad->addr1.kind == FloatConst) fprintf(out, "\tli.d $f0, %f\n", quad->addr1.contents.floatVal);
        if (quad->addr1.kind == Val) {
            t1 = getType(quad->addr1.contents.name+1, map);
            fprintf(out, "\tlw $t3, %s\n", quad->addr1.contents.name+1);
            if (t1 == INTEGER) {
                fprintf(out, "\tlw $t1, 0($t3)\n");
                fprintf(out, "\tmtc1 $t1, $f0\n");
                fprintf(out, "\tcvt.s.w $f0, $f0\n");
                fprintf(out, "\tcvt.d.s $f0, $f0\n");
            }
            if (t1 == FLOAT) {
                fprintf(out, "\tl.s $f0, 0($t3)\n");
                fprintf(out, "\tcvt.d.s $f0, $f0\n");
            }
            if (t1 == DOUBLE) fprintf(out, "\tl.d $f0, 0($t3)\n");
        }
        if (quad->addr2.kind == IntConst) fprintf(out, "\tli.d $f2, %d.0\n", quad->addr2.contents.intVal);
        if (quad->addr2.kind == FloatConst) fprintf(out, "\tli.d $f2, %f\n", quad->addr2.contents.floatVal);
        if (quad->addr2.kind == Val) {
            t2 = getType(quad->addr2.contents.name+1, map);
            fprintf(out, "\tlw $t3, %s\n", quad->addr2.contents.name+1);
            if (t2 == INTEGER) {
                fprintf(out, "\tlw $t2, 0($t3)\n");
                fprintf(out, "\tmtc1 $t2, $f2\n");
                fprintf(out, "\tcvt.s.w $f2, $f2\n");
                fprintf(out, "\tcvt.d.s $f2, $f2\n");
            }
            if (t2 == FLOAT) {
                fprintf(out, "\tl.s $f2, 0($t3)\n");
                fprintf(out, "\tcvt.d.s $f2, $f2\n");
            }
            if (t2 == DOUBLE) fprintf(out, "\tl.d $f2, 0($t3)\n");
        }
        if (quad->op == sm) fprintf(out, "\tc.lt.d 0, $f0, $f2\n");
        if (quad->op == gt) fprintf(out, "\tc.lt.d 0, $f2, $f0\n");
        if (quad->op == eq) fprintf(out, "\tc.eq.d 0, $f0, $f2\n");
        if (quad->op == eq) fprintf(out, "\tc.neq.d 0, $f0, $f2\n");
        fprintf(out, "\tli $t5, 1\n");
        fprintf(out, "\tli, $t3, 0\n");
        fprintf(out, "\tmovt $t3, $t5, 0\n");
    }
    if (strcmp(quad->addr3.contents.name, "$t7")==0) {
        fprintf(out, "\tadd $t7, $t3, $0\n");
        return;
    }
    t = getType(quad->addr3.contents.name+1, map);
    fprintf(out, "\tlw $t2, %s\n", quad->addr3.contents.name+1);
    if (t == INTEGER) fprintf(out, "\tsw $t3, 0($t2)\n");
    if (t == FLOAT) {
        fprintf(out, "\tmtc1 $t3, $f0\n");
        fprintf(out, "\tcvt.s.w $f0, $f0\n");
        fprintf(out, "\ts.s $f0, 0($t2)");
    }
    if (t == DOUBLE) {
        fprintf(out, "\tmtc1 $t3, $f0\n");
        fprintf(out, "\tcvt.s.w $f0, $f0\n");
        fprintf(out, "\tcvt.d.s $f0, $f0\n");
        fprintf(out, "\ts.d $f0, 0($t2)\n");
    }
    if (quad->addr3.kind == Val && getVar(quad->addr3.contents.name, map)) {
        removeStar(quad->addr3.contents.name);
        quad->addr3.kind = String;
    }
    if (quad->addr2.kind == Val && getVar(quad->addr2.contents.name, map)) {
        quad->addr2.kind = String;
        removeStar(quad->addr2.contents.name);
    }
    if (quad->addr1.kind == Val && getVar(quad->addr1.contents.name, map)) {
        quad->addr1.kind = String;
        removeStar(quad->addr1.contents.name);
    }
}
Example #5
0
//将加、减、乘法的三地址码语句转化为mips(已支持浮点数)
void genCAL(Quad* quad, VariableMap* map) {
    fprintf(out, "\t# calculation\n");
    if (strcmp(quad->addr1.contents.name, "sp")==0) {
        if (quad->op == add) fprintf(out,"\taddi, $sp, $sp, %d\n", quad->addr2.contents.intVal);
        if (quad->op == sub) fprintf(out,"\taddi, $sp, $sp, -%d\n", quad->addr2.contents.intVal);
        return;
    }
    type t1 = UNDEFINED, t2 = UNDEFINED, t3 = UNDEFINED;
    if (quad->addr3.kind == String && getVar(quad->addr3.contents.name, map)) {
        addStar(quad->addr3.contents.name);
        quad->addr3.kind = Val;
    }
    if (quad->addr2.kind == String && getVar(quad->addr2.contents.name, map)) {
        quad->addr2.kind = Val;
        addStar(quad->addr2.contents.name);
    }
    if (quad->addr1.kind == String && getVar(quad->addr1.contents.name, map)) {
        quad->addr1.kind = Val;
        addStar(quad->addr1.contents.name);
    }
    if (quad->addr3.kind == String) { //关于地址的计算
        if (quad->addr1.kind == IntConst) fprintf(out, "\tli $t1, %d\n", quad->addr1.contents.intVal);
        if (quad->addr1.kind == String) fprintf(out, "\tlw $t1, %s\n", quad->addr1.contents.name);
        if (quad->addr2.kind == IntConst) fprintf(out, "\tli $t2, %d\n", quad->addr2.contents.intVal);
        if (quad->addr2.kind == String) fprintf(out, "\tlw $t2, %s\n", quad->addr2.contents.name);
        if (quad->op == add) fprintf(out, "\tadd $t1, $t1, $t2\n");
        if (quad->op == sub) fprintf(out, "\tsub $t1, $t1, $t2\n");
        fprintf(out, "\tsw $t1, %s\n", quad->addr3.contents.name);
    }
    if (quad->addr3.kind == Val) { //关于值的计算
        t3 = getType(quad->addr3.contents.name+1, map);
        if (t3 == INTEGER) {
            if (quad->addr1.kind == IntConst) fprintf(out, "\tli $t1, %d\n", quad->addr1.contents.intVal);
            if (quad->addr1.kind == Val) {
                fprintf(out, "\tlw $t3, %s\n", quad->addr1.contents.name+1);
                fprintf(out, "\tlw $t1, 0($t3)\n");
            }
            if (quad->addr2.kind == IntConst) fprintf(out, "\tli $t2, %d\n", quad->addr2.contents.intVal);
            if (quad->addr2.kind == Val) {
                fprintf(out, "\tlw $t3, %s\n", quad->addr2.contents.name+1);
                fprintf(out, "\tlw $t2, 0($t3)\n");
            }
            if (quad->op == add) fprintf(out, "\tadd $t1, $t1, $t2\n");
            if (quad->op == sub) fprintf(out, "\tsub $t1, $t1, $t2\n");
            if (quad->op == mul) fprintf(out, "\tmul $t1, $t1, $t2\n");
            if (quad->op == dvd) fprintf(out, "\tdiv $t1, $t2\n");
            if (quad->op != dvd) {
                fprintf(out, "\tlw $t3, %s\n", quad->addr3.contents.name+1);
                fprintf(out, "\tsw $t1, 0($t3)\n");
            }
            if (quad->op == dvd) {
                fprintf(out, "\tlw $t3, %s\n", quad->addr3.contents.name+1);
                fprintf(out, "\tmflo $t2\n");
                fprintf(out, "\tsw $t2 0($t3)\n");
            }
        }
        if (t3 == FLOAT) {
            if (quad->addr1.kind == IntConst) fprintf(out, "\tli.s $f1, %d.0\n", quad->addr1.contents.intVal);
            if (quad->addr1.kind == FloatConst) fprintf(out, "\tli.s $f1, %f\n", quad->addr1.contents.floatVal);
            if (quad->addr1.kind == Val) {
                t1 = getType(quad->addr1.contents.name+1, map);
                fprintf(out, "\tlw $t3, %s\n", quad->addr1.contents.name+1);
                if (t1 == FLOAT) fprintf(out, "\tl.s $f1, 0($t3)\n");
                if (t1 == INTEGER) {
                    fprintf(out, "lw $t1, 0($t3)\n");
                    fprintf(out, "\tmtc1 $t1, $f1\n");
                    fprintf(out, "\tcvt.s.w $f1, $f1\n");
                }
            }
            if (quad->addr2.kind == IntConst) fprintf(out, "\tli.s $f2, %d.0\n", quad->addr2.contents.intVal);
            if (quad->addr2.kind == FloatConst) fprintf(out, "\tli.s $f2, %f\n", quad->addr2.contents.floatVal);
            if (quad->addr2.kind == Val) { //要强制转换类型
                t2 = getType(quad->addr2.contents.name+1, map);
                fprintf(out, "\tlw $t3, %s\n", quad->addr2.contents.name+1);
                if (t2 == FLOAT) fprintf(out, "\tl.s $f2, 0($t3)\n");
                if (t2 == INTEGER) {
                    fprintf(out, "\tlw $t2, 0($t3)\n");
                    fprintf(out, "\tmtc1 $t2, $f2\n");
                    fprintf(out, "\tcvt.s.w $f2, $f2\n");
                }
            }
            if (quad->op == add) fprintf(out, "\tadd.s $f3, $f1, $f2\n");
            if (quad->op == sub) fprintf(out, "\tsub.s $f3, $f1, $f2\n");
            if (quad->op == mul) fprintf(out, "\tmul.s $f3, $f1, $f2\n");
            if (quad->op == dvd) fprintf(out, "\tdiv.s $f3, $f1, $f2\n");
            fprintf(out, "\tlw $t3, %s\n", quad->addr3.contents.name+1);
            fprintf(out, "\ts.s $f3, 0($t3)\n");
        }
        if (t3 == DOUBLE) {
            if (quad->addr1.kind == IntConst) fprintf(out, "\tli.d $f0, %d.0\n", quad->addr1.contents.intVal);
            if (quad->addr1.kind == FloatConst) fprintf(out, "\tli.d $f0, %f\n", quad->addr1.contents.floatVal);
            if (quad->addr1.kind == Val) {
                t1 = getType(quad->addr1.contents.name+1, map);
                fprintf(out, "\tlw $t3, %s\n", quad->addr1.contents.name+1);
                if (t1 == INTEGER) {
                    fprintf(out, "\tlw $t1, 0($t3)\n");
                    fprintf(out, "\tmtc1 $t1, $f0\n");
                    fprintf(out, "\tcvt.s.w $f0, $f0\n");
                    fprintf(out, "\tcvt.d.s $f0, $f0\n");
                }
                if (t1 == FLOAT) {
                    fprintf(out, "\tl.s $f0, 0($t3)\n");
                    fprintf(out, "\tcvt.d.s $f0, $f0\n");
                }
                if (t1 == DOUBLE) fprintf(out, "\tl.d $f0, 0($t3)\n");
            }
            if (quad->addr2.kind == IntConst) fprintf(out, "\tli.d $f2, %d.0\n", quad->addr2.contents.intVal);
            if (quad->addr2.kind == FloatConst) fprintf(out, "\tli.d $f2, %f\n", quad->addr2.contents.floatVal);
            if (quad->addr2.kind == Val) {
                t2 = getType(quad->addr2.contents.name+1, map);
                fprintf(out, "\tlw $t3, %s\n", quad->addr2.contents.name+1);
                if (t2 == INTEGER) {
                    fprintf(out, "\tlw $t2, 0($t3)\n");
                    fprintf(out, "\tmtc1 $t2, $f2\n");
                    fprintf(out, "\tcvt.s.w $f2, $f2\n");
                    fprintf(out, "\tcvt.d.s $f2, $f2\n");
                }
                if (t2 == FLOAT) {
                    fprintf(out, "\tl.s $f2, 0($t3)\n");
                    fprintf(out, "\tcvt.d.s $f2, $f2\n");
                }
                if (t2 == DOUBLE) fprintf(out, "\tl.d $f2, 0($t3)\n");
            }
            if (quad->op == add) fprintf(out, "\tadd.d $f4, $f0, $f2\n");
            if (quad->op == sub) fprintf(out, "\tsub.d $f4, $f0, $f2\n");
            if (quad->op == mul) fprintf(out, "\tmul.d $f4, $f0, $f2\n");
            if (quad->op == dvd) fprintf(out, "\tdiv.d $f4, $f0, $f2\n");
            fprintf(out, "\tlw $t3, %s\n", quad->addr3.contents.name+1);
            fprintf(out, "\ts.d $f4, 0($t3)\n");
        }
    }
    if (quad->addr3.kind == Val && getVar(quad->addr3.contents.name, map)) {
        removeStar(quad->addr3.contents.name);
        quad->addr3.kind = String;
    }
    if (quad->addr2.kind == Val && getVar(quad->addr2.contents.name, map)) {
        quad->addr2.kind = String;
        removeStar(quad->addr2.contents.name);
    }
    if (quad->addr1.kind == Val && getVar(quad->addr1.contents.name, map)) {
        quad->addr1.kind = String;
        removeStar(quad->addr1.contents.name);
    }
}
Example #6
0
//将赋值的三地址码语句转化为mips(已支持浮点数)
void genASN(Quad* quad, VariableMap* map) {
    fprintf(out, "\t# assign\n");
//    type t1 = UNDEFINED;
    if (quad->addr2.kind == String && getVar(quad->addr2.contents.name, map)) {
        quad->addr2.kind = Val;
        addStar(quad->addr2.contents.name);
    }
    if (quad->addr1.kind == String && getVar(quad->addr1.contents.name, map)) {
        quad->addr1.kind = Val;
        addStar(quad->addr1.contents.name);
    }
    if (strcmp(quad->addr1.contents.name, "*sp")==0) {
        type t1 = getType(quad->addr2.contents.name+1, map);
        if (t1 == INTEGER) {
            fprintf(out, "\tlw $t0, 0($sp)\n");
            fprintf(out, "\tlw $t1, %s\n", quad->addr2.contents.name+1);
            fprintf(out, "\tsw, $t0, 0($t1)\n");
        }
        if (t1 == FLOAT) {
            fprintf(out, "\tl.s $f0, 0($sp)\n");
            fprintf(out, "\tl.s $t1, %s\n", quad->addr2.contents.name+1);
            fprintf(out, "\ts.s, $f0, 0($t1)\n");
        }
        if (t1 == DOUBLE) {
            fprintf(out, "\tl.d $f0, 0($sp)\n");
            fprintf(out, "\tl.d $t1, %s\n", quad->addr2.contents.name+1);
            fprintf(out, "\ts.d, $f0, 0($t1)\n");
        }
    } else
    if (quad->addr2.kind == String) {
        if (quad->addr1.kind == IntConst) fprintf(out, "\tli $t1, %d\n", quad->addr1.contents.intVal);
        if (quad->addr1.kind == String) fprintf(out, "\tlw $t1, %s\n", quad->addr1.contents.name);
        fprintf(out, "\tsw $t1, %s\n", quad->addr2.contents.name);
    } else
    if (quad->addr2.kind == Val) {
        type t2 = getType(quad->addr2.contents.name+1, map);
        if (t2 == INTEGER) {
            if (quad->addr1.kind == IntConst) fprintf(out, "\tli $t0, %d\n", quad->addr1.contents.intVal);
            if (quad->addr1.kind == Val) {
                fprintf(out, "\tlw $t0, %s\n", quad->addr1.contents.name+1);
                fprintf(out, "\tlw $t0, 0($t0)\n");
            }
            fprintf(out, "\tlw $t1, %s\n", quad->addr2.contents.name+1);
            fprintf(out, "\tsw $t0, 0($t1)\n");
        }
        if (t2 == FLOAT) {
            if (quad->addr1.kind == IntConst) {
                fprintf(out, "\tli $t0, %d\n", quad->addr1.contents.intVal);
                fprintf(out, "\tmtc1, $t0, $f0\n");
                fprintf(out, "\tcvt.s.w $f0, $f0\n");
            }
            if (quad->addr1.kind == FloatConst) fprintf(out, "\tli.s $f0, %f\n", quad->addr1.contents.floatVal);
            if (quad->addr1.kind == Val) {
                fprintf(out, "\tlw $t0, %s\n", quad->addr1.contents.name+1);
                if (getType(quad->addr1.contents.name+1, map)==FLOAT) fprintf(out, "\tl.s $f0, 0($t0)\n");
                if (getType(quad->addr1.contents.name+1, map)==INTEGER) {
                    fprintf(out, "\tlw $t0, 0($t0)\n");
                    fprintf(out, "\tmtc1, $t0, $f0\n");
                    fprintf(out, "\tcvt.s.w $f0, $f0\n");
                }
            }
            fprintf(out, "\tlw $t0, %s\n", quad->addr2.contents.name+1);
            fprintf(out, "\ts.s $f0, 0($t0)\n");
        }
        if (t2 == DOUBLE) {
            if (quad->addr1.kind == IntConst) {
                fprintf(out, "\tli $t0, %d\n", quad->addr1.contents.intVal);
                fprintf(out, "\tmtc1, $t0, $f0\n");
                fprintf(out, "\tcvt.s.w $f0, $f0\n");
                fprintf(out, "\tcvt.d.s $f0, $f0\n");
            }
            if (quad->addr1.kind == FloatConst) {
                fprintf(out, "\tli.s $f0, %f\n", quad->addr1.contents.floatVal);
                fprintf(out, "\tcvt.d.s, $f0, $f0\n");
            }
            if (quad->addr1.kind == Val) {
                fprintf(out, "\tlw $t0, %s\n", quad->addr1.contents.name+1);
                if (getType(quad->addr1.contents.name+1, map)==FLOAT) {
                    fprintf(out, "\tl.s $f0, 0($t0)\n");
                    fprintf(out, "\tcvt.d.s, $f0, $f0");
                }
                if (getType(quad->addr1.contents.name+1, map)==INTEGER) {
                    fprintf(out, "\tlw $t0, 0($t0)\n");
                    fprintf(out, "\tmtc1 $t0, $f0\n");
                    fprintf(out, "\tcvt.s.w $f0, $f0\n");
                    fprintf(out, "\tcvt.d.s $f0, $f0\n");
                }
                if (getType(quad->addr1.contents.name+1, map)==DOUBLE) fprintf(out, "\tl.d $f0, 0($t0)\n");
            }
            fprintf(out, "\tlw $t0, %s\n", quad->addr2.contents.name+1);
            fprintf(out, "\ts.d $f0, 0($t0)\n");
        }
    }
    if (quad->addr2.kind == Val && getVar(quad->addr2.contents.name, map)) {
        quad->addr2.kind = String;
        removeStar(quad->addr2.contents.name);
    }
    if (quad->addr1.kind == Val && getVar(quad->addr1.contents.name, map)) {
        quad->addr1.kind = String;
        removeStar(quad->addr1.contents.name);
    }
}
Example #7
0
Match *Kernel::match(Nodemaster *node, Nodemaster *parent, int state, const string &input, const string &star, const string &path) {
	StringTokenizer st(input);
	
	if (st.countTokens() == 0) {
		if (node->hasTemplate()) {
			Match *m = new Match();
			m->setNode(node);
			m->addTopicStar(trim(star));
			m->setTopicPattern(trim(path));
			return m;
		}
		return NULL;
	}
	
	string word = st.nextToken();
	string uWord = toUpper(word);
	string tail = "";
	Match *m = NULL;
	
	if (st.hasMoreTokens()) {
		tail = trim(input.substr(word.length()));
	}
	
	int index = constants.find(" " + word + " ");
	
	if (index != string::npos) {
		if (node->getChild(uWord) != NULL) {
			m = match(node->getChild(uWord), node, state + 1, tail, "", "");
			if (m != NULL) {
				addStar(m, trim(star), state);
				addPath(m, trim(path), state);
			}
		}
		return m;
	}
	if (node->getChild("_") != NULL) {
		m = match(node->getChild("_"), node, state, tail, word, path + " _");
		if (m != NULL) {
			addStar(m, trim(star), state);
			return m;
		}
	}
	if (node->getChild(uWord) != NULL) {
		m = match(node->getChild(uWord), node, state, tail, star, path + " " + word);
		if (m != NULL) {
			return m;
		}
	}
	if (node->getChild("@") != NULL) {
	//	This one is a bit of a mystery to get figured out
		//Vector queries = node.getQueries();
		//for (int ix = 0; ix < queries.size(); ++ix) {
			//String type = (String)queries.elementAt(ix);
			//if (lookup(type, star.trim()) == true) {
				//m = match(node.getChild("@" + type), node, state, tail, word, path + " @" + type);
				//if (m != null) {
					//addStar(m, star.trim(), state);
					//return m;
				//}
			//}
		//}
	}
	if (node->getChild("*") != NULL) {
		m = match(node->getChild("*"), node, state, tail, word, path + " *");
		if (m != NULL) {
			addStar(m, trim(star), state);
			return m;
		}
	}
	if (node == parent->getChild("*") ||
			node == parent->getChild("_") ||
			node == parent->getChild("@")) {
		return match(node, parent, state, tail, star + " " + word, path);
	}
	return NULL;
}
Example #8
0
static void moveWormhole( struct state *st, wormhole * worm )
{

	int q;
	double dx, dy;
	/* int x1, y1, x2, y2; */
	int min_dist = 100;
	int find = 0;
	dx = Cos( worm->ang ) * worm->speed;
	dy = Sine( worm->ang ) * worm->speed;

	worm->virtualx += dx;
	worm->virtualy += dy;
	worm->actualx = (int)worm->virtualx;
	worm->actualy = (int)worm->virtualy;

	if ( worm->spiral ){

		if ( worm->spiral % 5 == 0 )
			worm->ang = (worm->ang + 1 ) % 360;
		worm->spiral--;
		if ( worm->spiral <= 0 ) find = 1;

	} else {

		if ( dist( worm->actualx, worm->actualy, worm->want_x, worm->want_y ) < 20 )
			find = 1;

		if ( rnd( 20 ) == rnd( 20 ) )
			find = 1;

		if ( worm->actualx < min_dist ){
			worm->actualx = min_dist;
			worm->virtualx = worm->actualx;
			find = 1;
		}
		if ( worm->actualy < min_dist ){
			worm->actualy = min_dist;
			worm->virtualy = worm->actualy;
			find = 1;
		}
		if ( worm->actualx > st->SCREEN_X - min_dist ){
			worm->actualx = st->SCREEN_X - min_dist;
			worm->virtualx = worm->actualx;
			find = 1;
		}
		if ( worm->actualy > st->SCREEN_Y - min_dist ){
			worm->actualy = st->SCREEN_Y - min_dist;
			worm->virtualy = worm->actualy;
			find = 1;
		}
	
		if ( rnd( 500 ) == rnd( 500 ) ) worm->spiral = rnd( 30 ) + 50;
	}

	if ( find ){
		worm->want_x = rnd( st->SCREEN_X - min_dist * 2 ) + min_dist;
		worm->want_y = rnd( st->SCREEN_Y - min_dist * 2 ) + min_dist;
		worm->ang = gang( worm->actualx, worm->actualy, worm->want_x, worm->want_y );
	}


	/* worm->ang = ( worm->ang + 360 + rnd( 30 ) - 15 ) % 360; */

	/*
	if ( worm->ang < worm->want_ang ) worm->ang++;
	if ( worm->ang > worm->want_ang ) worm->ang--;
	if ( worm->ang == worm->want_ang && rnd( 3 ) == rnd( 3 ) ) worm->want_ang = rnd( 360 );
	*/

	/*
	if ( rnd( 25 ) == rnd( 25 ) ){
		x1 = worm->actualx;
		y1 = worm->actualy;
		x2 = SCREEN_X / 2 + rnd( 20 ) - 10;
		y2 = SCREEN_Y / 2 + rnd( 20 ) - 10;
		worm->want_ang = gang(x1,y1,x2,y2);
	}
	*/

	/*
	if ( worm->actualx < min_dist || worm->actualx > SCREEN_X - min_dist || worm->actualy < min_dist || worm->actualy > SCREEN_Y - min_dist ){
		x1 = worm->actualx;
		y1 = worm->actualy;
		x2 = SCREEN_X / 2 + rnd( 20 ) - 10;
		y2 = SCREEN_Y / 2 + rnd( 20 ) - 10;
		/ * worm->ang = gang( worm->actualx, worm->actualy, SCREEN_X/2+rnd(20)-10, SCREEN_Y/2+rnd(20)-10 ); * /
		worm->ang = gang( x1, y1, x2, y2 );
		worm->want_ang = worm->ang;
		/ * printf("Angle = %d\n", worm->ang ); * /

		if ( worm->actualx < min_dist )
			worm->actualx = min_dist;
		if ( worm->actualx > SCREEN_X - min_dist )
			worm->actualx = SCREEN_X - min_dist;
		if ( worm->actualy < min_dist )
			worm->actualy = min_dist;
		if ( worm->actualy > SCREEN_Y - min_dist )
			worm->actualy = SCREEN_Y - min_dist;
		worm->virtualx = worm->actualx;
		worm->virtualy = worm->actualy;
	}
	*/

	for ( q = 0; q < worm->num_stars; q++ ){
		if ( worm->stars[q] != NULL ){
			if ( moveStar( st, worm->stars[q] ) ){
				free( worm->stars[q] );
				worm->stars[q] = NULL;
			}
		}
	}

	moveColorChanger( &worm->changer );

	if ( worm->diameter < worm->diameter_change )
		worm->diameter++;
	if ( worm->diameter > worm->diameter_change )
		worm->diameter--;
	if ( rnd( 30 ) == rnd( 30 ) )
		worm->diameter_change = rnd( 35 ) + 5;

	for ( q = 0; q < worm->addStar; q++ )
		addStar( worm );

}
Example #9
0
void Stars(struct RUNPARAMS *param, struct CPUINFO *cpu, REAL dt, REAL aexp, int level, int is){
// ----------------------------------------------------------//
/// The stars creation function.\n
/// Scan if cell is allowed to form star\n
/// If true, compute how many star are needed\n
/// and add them to the linked list\n
// ----------------------------------------------------------//

#ifdef GSLRAND
  const gsl_rng_type * T;
  gsl_rng * r;
  gsl_rng_env_setup();
  T = gsl_rng_default;
  r = gsl_rng_alloc (T);
  param->stars->rpoiss=r;
#endif

  if(cpu->rank == RANK_DISP) printf("STARS\n");
  setStarsState(param, cpu, level);

  REAL mmax = 0;
  REAL percentvol =0;

  int n_unit_stars = 0;
  int n_part_stars = 0;
  int nstarsmax_in_one_cell=0;
  int nstarsmin_in_one_cell=1e3;

  initThresh(param, aexp);
  REAL mstars_level = setmStar(param,level);

  int iOct;
  for(iOct=0; iOct<cpu->locNoct[level-1]; iOct++){
    struct OCT *curoct=cpu->octList[level-1][iOct];

    int icell;
    for(icell=0;icell<8;icell++) {
      struct CELL *curcell = &curoct->cell[icell];

      if( testCond(curcell, param, aexp, level) ) {
  REAL dx = POW(2.0,-level);
	REAL xc=curoct->x+( icell    & 1)*dx+dx*0.5;
	REAL yc=curoct->y+((icell>>1)& 1)*dx+dx*0.5;
	REAL zc=curoct->z+( icell>>2    )*dx+dx*0.5;

  percentvol += POW(dx,3);

	int N = getNstars2create(curcell, param, dt, aexp, level,mstars_level);
	nstarsmax_in_one_cell = FMAX(nstarsmax_in_one_cell,N);
	nstarsmin_in_one_cell = FMIN(nstarsmin_in_one_cell,N);

	if(N>0.2*param->npartmax){
    printf("You are about to create more stars than 20 percent of npartmax N=%d nmax=%d on proc %d\n",(int)N,param->npartmax,cpu->rank);
    if(N>param->npartmax){
      printf("You are about to create more stars than npartmax N=%d nmax=%d on proc %d--> ABORT\n",(int)N,param->npartmax,cpu->rank);
      abort();
    }
  }

	//	if(N) printf("N_Rho_Temp_Seuil_z\t%d\t%e\t%e\t%e\t%e\n", N, curcell->field.d, curcell->rfield.temp, param->stars->thresh,1.0/aexp - 1.0  );


#ifdef MULTIPLESTARS
  struct Wtype init_state=curcell->field;
	int ipart;
	for (ipart=0;ipart< N; ipart++){
    addStar(curcell, &init_state, level, xc, yc, zc, cpu, dt, param, aexp, is,n_part_stars++, mstars_level);
    n_unit_stars++;
  }
#else
#ifdef CONTINUOUSSTARS

  REAL m = getMstars2create(curcell, param, dt, aexp, level);
  //if(m>mstars_level)
  {
    addStar(curcell, &curcell->field, level, xc, yc, zc, cpu, dt, param, aexp, is,n_part_stars++, m);
    n_unit_stars++;
  }
#else
  if(N){
    addStar(curcell, &curcell->field, level, xc, yc, zc, cpu, dt, param, aexp, is,n_part_stars++, N*mstars_level);
    n_unit_stars++;
  }
#endif // CONTINUOUSSTARS
#endif // MULTIPLESTARS

/*
if (N){
printWtype(&init_state);
printWtype(&curcell->field);
}
*/
      }
      mmax = FMAX(curcell->field.d, mmax);
    }
  }

#ifdef WMPI
  MPI_Allreduce(MPI_IN_PLACE,&n_unit_stars,1,MPI_INT,MPI_SUM,cpu->comm);
  MPI_Allreduce(MPI_IN_PLACE,&n_part_stars,1,MPI_INT,MPI_SUM,cpu->comm);
  MPI_Allreduce(MPI_IN_PLACE,&mmax,1,MPI_REEL,MPI_MAX,cpu->comm);
  MPI_Allreduce(MPI_IN_PLACE,&percentvol,1,MPI_REEL,MPI_SUM,cpu->comm);
  MPI_Allreduce(MPI_IN_PLACE,&nstarsmax_in_one_cell,1,MPI_INT,MPI_MAX,cpu->comm);
  MPI_Allreduce(MPI_IN_PLACE,&nstarsmin_in_one_cell,1,MPI_INT,MPI_MIN,cpu->comm);
#endif

  param->stars->n += n_part_stars;
  if(cpu->rank==RANK_DISP) {
    printf("Mmax=%e\tthresh=%e\tvol=%e\n", mmax, param->stars->thresh, percentvol );
    if (n_unit_stars){
      printf("%d stars added in %d particles on level %d --> min=%d max=%d \n", n_unit_stars, n_part_stars, level,nstarsmin_in_one_cell,nstarsmax_in_one_cell);
      printf("%d stars particles in total\n",param->stars->n);
    }
    if(cpu->trigstar==0 && param->stars->n>0) printf("FIRST_STARS at z=%e\n",1./aexp-1.);
    if(param->stars->n>0) cpu->trigstar=1;
  }

#ifdef GSLRAND
  gsl_rng_free (r);
#endif

}