AInt *sub_aryNew(int n)
{
AInt *p = malloc(n * sizeof (AInt));
memset((char *) p, 0, n * sizeof (AInt));
return p;
}
void sub_aryInit(AInt *a, AInt *ip, int n)
{
memcpy((char *) a, (char *) ip, n * sizeof (AInt));
} } else if (phrCmp(70, "[!!**0]=", epc) && priority >= 15) {
e1 = i;
e0 = expr(0);
epc = ppc1;
i = exprSub(15);
! putIcX86("8b_%2m0; 8b_%0m2; 8b_%1m1; 89_04_8a;", &var[e1], &var[e0], &var[i], 0);
} else if (phrCmp(71, "[!!**0]", epc)) {
e1 = i;
i = tmpAlloc();
e0 = expr(0);
! putIcX86("8b_%0m2; 8b_%1m1; 8b_04_8a; 89_%2m0;", &var[e1], &var[e0], &var[i], 0);
epc = ppc1; } else if (phrCmp(21, "int !!*0[!!**2];", pc)) {
e2 = expr(2);
! putIcX86("8b_%1m0; 89_44_24_00; e8_%2r; 89_%0m0;", &var[tc[wpc[0]]], &var[e2], (IntP) sub_aryNew, 0);
} else if (phrCmp(22, "int !!*0[!!**2] = {", pc)) {
e2 = expr(2);
! putIcX86("8b_%1m0; 89_44_24_00; e8_%2r; 89_%0m0;", &var[tc[wpc[0]]], &var[e2], (IntP) sub_aryNew, 0);
j = 0;
for (i = ppc1; i < pc1; i++) { // コンマ以外のトークンを数える.
if (tc[i] == TcCrBrCls) break;
if (tc[i] != TcComma) {
j++;
}
}
if (i >= pc1) goto err;
AInt *ip = malloc(j * sizeof (AInt));
j = 0;
for (i = ppc1; tc[i] != TcCrBrCls; i++) {
if (tc[i] == TcCrBrCls) break;
if (tc[i] != TcComma) {
ip[j] = var[tc[i]];
j++;
}
}
! putIcX86("8b_%0m0; 89_44_24_00; b8_%1i; 89_44_24_04; b8_%2i; 89_44_24_08; e8_%3r;", &var[tc[wpc[0]]], (IntP) ip, (IntP) j, (IntP) sub_aryInit);
ppc1 = i + 2; // } と ; の分.enum { OpCpy = 0, OpCeq, OpCne, OpClt, OpCge, OpCle, OpCgt, OpAdd, OpSub, OpMul, OpDiv, OpMod, OpAnd, OpShr,
OpAdd1, OpNeg, OpGoto, OpJeq, OpJne, OpJlt, OpJge, OpJle, OpJgt, OpLop, OpPrint, OpTime, OpEnd,
OpPrints, OpAryNew, OpAryInit, OpArySet, OpAryGet, OpOpnWin, OpSetPix0, OpM64s, OpRgb8, OpWait,
OpXorShift, OpGetPix, OpFilRct0, OpPrm, OpF16Sin, OpF16Cos, OpInkey, OpDrwStr0, OpGprDec, OpBitBlt };void putIc(int op, IntP p0, IntP p1, IntP p2, IntP p3) // 移行中の間だけ、以下の形で残しておく.
{
printf("putIc: error\n");
exit(1);
}int phrCmpPutIc(int pid, String phr, int pc, int *pi, int lenExpr, int op, int *err) // 移行中の間だけ、以下の形で残しておく.
{
if (phrCmp(pid, phr, pc)) {
printf("phrCmpPutIc: error\n");
exit(1);
}
return 0;
}putIcX86("8b_%2m0; 8b_%0m2; 8b_%1m1; 89_04_8a;", &var[e1], &var[e0], &var[i], 0);
8b_%2m0 EAX = [x]; // EAXはレジスタ番号0
8b_%0m2 EDX = [a]; // EDXはレジスタ番号2
8b_%1m1 ECX = [i]; // ECXはレジスタ番号1
89_04_8a [EDX+ECX*4] = EAX;putIcX86("8b_%0m2; 8b_%1m1; 8b_04_8a; 89_%2m0;", &var[e1], &var[e0], &var[i], 0);
8b_%0m2 EDX = [a]; // EDXはレジスタ番号2
8b_%1m1 ECX = [i]; // ECXはレジスタ番号1
8b_04_8a EAX = [EDX+ECX*4];
89_%2m0 [x] = EAX; // EAXはレジスタ番号0| コメント | お名前 | NameLink | |