Binary Binary::operator |(const Binary& B) { Binary _or(i | B.getInt()); if(B.getBitSize() > _or.bitSize) _or.setBitSize(B.getBitSize()); return _or; }
static float expression(void) { token operator = T_PLUS; if (sym == T_PLUS || sym == T_MINUS) { operator = sym; get_sym(); } float t1 = term(); if (operator == T_MINUS) { t1 = -1 * t1; } while ( sym == T_PLUS || sym == T_MINUS || sym == T_OP_OR ) { operator = sym; get_sym(); float t2 = term(); switch(operator) { case T_PLUS: t1 = t1 + t2; break; case T_MINUS: t1 = t1 - t2; break; case T_OP_OR: t1 = _or( t1, t2 ); break; default: error("expression: oops"); } } return t1; }
RegNodePtr _or() { auto r = _concat(); if (tryConsume('|')) { r.reset(new RegNode_Or(r, _or())); } return r; }
char float_or( floatnum dest, cfloatnum x, cfloatnum y) { t_longint lx, ly; if(!_cvtlogic(&lx, x) || !_cvtlogic(&ly, y)) return _setnan(dest); _or(&lx, &ly); _logic2floatnum(dest, &lx); return 1; }
//----------------------------------------------------------------------------- // // 命令コマンドを解釈してバイナリに変換 // //----------------------------------------------------------------------------- bool encode(char* instName, char* buffer, map<uint32_t, string>& labelNames, uint32_t currentLine, uint32_t& code, bool& useLabel) { uint32_t rs = 0; uint32_t rt = 0; uint32_t rd = 0; uint32_t imm = 0; double d = 0; char label[MAX_LINE_SIZE]; char dummy[MAX_LINE_SIZE]; if (eq(instName, "add")) { int n = sscanf(buffer, formRRR, dummy, &rd, &rs, &rt); if (n == 4) { code = _add(rs, rt, rd); return true; } } if (eq(instName, "sub")) { int n = sscanf(buffer, formRRR, dummy, &rd, &rs, &rt); if (n == 4) { code = _sub(rs, rt, rd); return true; } } if (eq(instName, "mul")) { int n = sscanf(buffer, formRRR, dummy, &rd, &rs, &rt); if (n == 4) { code = _mul(rs, rt, rd); return true; } } if (eq(instName, "and")) { int n = sscanf(buffer, formRRR, dummy, &rd, &rs, &rt); if (n == 4) { code = _and(rs, rt, rd); return true; } } if (eq(instName, "or")) { int n = sscanf(buffer, formRRR, dummy, &rd, &rs, &rt); if (n == 4) { code = _or(rs, rt, rd); return true; } } if (eq(instName, "nor")) { int n = sscanf(buffer, formRRR, dummy, &rd, &rs, &rt); if (n == 4) { code = _nor(rs, rt, rd); return true; } } if (eq(instName, "xor")) { int n = sscanf(buffer, formRRR, dummy, &rd, &rs, &rt); if (n == 4) { code = _xor(rs, rt, rd); return true; } } if (eq(instName, "addi")) { int n = sscanf(buffer, formRRI, dummy, &rt, &rs, &imm); if (n == 4) { code = _addi(rs, rt, imm); return true; } } if (eq(instName, "subi")) { int n = sscanf(buffer, formRRI, dummy, &rt, &rs, &imm); if (n == 4) { code = _subi(rs, rt, imm); return true; } } if (eq(instName, "muli")) { int n = sscanf(buffer, formRRI, dummy, &rt, &rs, &imm); if (n == 4) { code = _muli(rs, rt, imm); return true; } } if (eq(instName, "slli")) { int n = sscanf(buffer, formRRI, dummy, &rt, &rs, &imm); if (n == 4) { code = _slli(rs, rt, imm); return true; } } if (eq(instName, "srai")) { int n = sscanf(buffer, formRRI, dummy, &rt, &rs, &imm); if (n == 4) { code = _srai(rs, rt, imm); return true; } } if (eq(instName, "andi")) { int n = sscanf(buffer, formRRI, dummy, &rt, &rs, &imm); if (n == 4) { code = _andi(rs, rt, imm); return true; } } if (eq(instName, "ori")) { int n = sscanf(buffer, formRRI, dummy, &rt, &rs, &imm); if (n == 4) { code = _ori(rs, rt, imm); return true; } } if (eq(instName, "nori")) { int n = sscanf(buffer, formRRI, dummy, &rt, &rs, &imm); if (n == 4) { code = _nori(rs, rt, imm); return true; } } if (eq(instName, "xori")) { int n = sscanf(buffer, formRRI, dummy, &rt, &rs, &imm); if (n == 4) { code = _xori(rs, rt, imm); return true; } } if (eq(instName, "fadd")) { int n = sscanf(buffer, formFFF, dummy, &rd, &rs, &rt); if (n == 4) { code = _fadd(rs, rt, rd); return true; } } if (eq(instName, "fsub")) { int n = sscanf(buffer, formFFF, dummy, &rd, &rs, &rt); if (n == 4) { code = _fsub(rs, rt, rd); return true; } } if (eq(instName, "fmul")) { int n = sscanf(buffer, formFFF, dummy, &rd, &rs, &rt); if (n == 4) { code = _fmul(rs, rt, rd); return true; } } if (eq(instName, "fmuln")) { int n = sscanf(buffer, formFFF, dummy, &rd, &rs, &rt); if (n == 4) { code = _fmuln(rs, rt, rd); return true; } } if (eq(instName, "finv")) { int n = sscanf(buffer, formFF, dummy, &rd, &rs); if (n == 3) { code = _finv(rs, rt, rd); return true; } } if (eq(instName, "fsqrt")) { int n = sscanf(buffer, formFF, dummy, &rd, &rs); if (n == 3) { code = _fsqrt(rs, rt, rd); return true; } } if (eq(instName, "fmov")) { int n = sscanf(buffer, formFF, dummy, &rd, &rs); if (n == 3) { code = _fmov(rs, rt, rd); return true; } } if (eq(instName, "fneg")) { int n = sscanf(buffer, formFF, dummy, &rd, &rs); if (n == 3) { code = _fneg(rs, rt, rd); return true; } } if (eq(instName, "imovf")) { int n = sscanf(buffer, formFR, dummy, &rt, &rs); if (n == 3) { code = _imovf(rs, rt, rd); return true; } } if (eq(instName, "fmovi")) { int n = sscanf(buffer, formRF, dummy, &rt, &rs); if (n == 3) { code = _fmovi(rs, rt, rd); return true; } } // to use ALU if (eq(instName, "mvlo")) { int n = sscanf(buffer, formRI, dummy, &rt, &imm); if (n == 3) { code = _mvlo(rt, rt, imm); return true; } } if (eq(instName, "mvhi")) { int n = sscanf(buffer, formRI, dummy, &rt, &imm); if (n == 3) { code = _mvhi(rt, rt, imm); return true; } } if (eq(instName, "fmvlo")) { int n = sscanf(buffer, formFI, dummy, &rt, &imm); if (n == 3) { code = _fmvlo(rt, rt, imm); return true; } } if (eq(instName, "fmvhi")) { int n = sscanf(buffer, formFI, dummy, &rt, &imm); if (n == 3) { code = _fmvhi(rt, rt, imm); return true; } } if (eq(instName, "j")) { int n = sscanf(buffer, formL, dummy, label); if (n == 2) { labelNames[currentLine] = string(label); // cerr << "assigned (" << currentLine << ", " << string(label) << ") in labelNames" << endl; useLabel = true; code = _j(0); return true; } } if (eq(instName, "beq")) { int n = sscanf(buffer, formRRL, dummy, &rs, &rt, label); if (n == 4) { labelNames[currentLine] = string(label); // cerr << "assigned (" << currentLine << ", " << string(label) << ") in labelNames" << endl; useLabel = true; code = _beq(rs, rt, imm); return true; } } if (eq(instName, "blt")) { int n = sscanf(buffer, formRRL, dummy, &rs, &rt, label); if (n == 4) { labelNames[currentLine] = string(label); // cerr << "assigned (" << currentLine << ", " << string(label) << ") in labelNames" << endl; useLabel = true; code = _blt(rs, rt, imm); return true; } } if (eq(instName, "ble")) { int n = sscanf(buffer, formRRL, dummy, &rs, &rt, label); if (n == 4) { labelNames[currentLine] = string(label); // cerr << "assigned (" << currentLine << ", " << string(label) << ") in labelNames" << endl; useLabel = true; code = _ble(rs, rt, imm); return true; } } if (eq(instName, "fbeq")) { int n = sscanf(buffer, formFFL, dummy, &rs, &rt, label); if (n == 4) { labelNames[currentLine] = string(label); // cerr << "assigned (" << currentLine << ", " << string(label) << ") in labelNames" << endl; useLabel = true; code = _fbeq(rs, rt, imm); return true; } } if (eq(instName, "fblt")) { int n = sscanf(buffer, formFFL, dummy, &rs, &rt, label); if (n == 4) { labelNames[currentLine] = string(label); // cerr << "assigned (" << currentLine << ", " << string(label) << ") in labelNames" << endl; useLabel = true; code = _fblt(rs, rt, imm); return true; } } if (eq(instName, "fble")) { int n = sscanf(buffer, formFFL, dummy, &rs, &rt, label); if (n == 4) { labelNames[currentLine] = string(label); // cerr << "assigned (" << currentLine << ", " << string(label) << ") in labelNames" << endl; useLabel = true; code = _fble(rs, rt, imm); return true; } } if (eq(instName, "jr")) { int n = sscanf(buffer, formR, dummy, &rs); if (n == 2) { code = _jr(rs, rt, rd); return true; } } if (eq(instName, "call")) { int n = sscanf(buffer, formL, dummy, label); if (n == 2) { labelNames[currentLine] = string(label); // cerr << "assigned (" << currentLine << ", " << string(label) << ") in labelNames" << endl; useLabel = true; code = _call(0); return true; } } if (eq(instName, "callr")) { int n = sscanf(buffer, formR, dummy, &rs); if (n == 2) { code = _callr(rs, rt, rd); return true; } } if (eq(instName, "return")) { int n = sscanf(buffer, form, dummy); if (n == 1) { code = _return(rs, rt, rd); return true; } } if (eq(instName, "ldr")) { int n = sscanf(buffer, formRRR, dummy, &rd, &rs, &rt); if (n == 4) { code = _ldr(rs, rt, rd); return true; } } if (eq(instName, "fldr")) { int n = sscanf(buffer, formFRR, dummy, &rd, &rs, &rt); if (n == 4) { code = _fldr(rs, rt, rd); return true; } } if (eq(instName, "sti")) { int n = sscanf(buffer, formRRI, dummy, &rt, &rs, &imm); if (n == 4) { code = _sti(rs, rt, imm); return true; } } if (eq(instName, "ldi")) { int n = sscanf(buffer, formRRI, dummy, &rt, &rs, &imm); if (n == 4) { code = _ldi(rs, rt, imm); return true; } } if (eq(instName, "fsti")) { int n = sscanf(buffer, formFRI, dummy, &rt, &rs, &imm); if (n == 4) { code = _fsti(rs, rt, imm); return true; } } if (eq(instName, "fldi")) { int n = sscanf(buffer, formFRI, dummy, &rt, &rs, &imm); if (n == 4) { code = _fldi(rs, rt, imm); return true; } } if (eq(instName, "inputb")) { int n = sscanf(buffer, formR, dummy, &rt); if (n == 2) { code = _inputb(rs, rt, rd); return true; } } if (eq(instName, "outputb")) { int n = sscanf(buffer, formR, dummy, &rt); if (n == 2) { code = _outputb(rs, rt, rd); return true; } } if (eq(instName, "halt")) { int n = sscanf(buffer, form, dummy); if (n == 1) { code = _halt(rs, rt, rd); return true; } } if (eq(instName, "dump")) { int n = sscanf(buffer, form, dummy); if (n == 1) { code = _dump(rs, rt, rd); return true; } } return false; }
RegNodePtr _reg() { return _or(); }
Matrix& LASSO::train(Matrix& X, Matrix& Y, Options& options) { int p = size(X, 2); int ny = size(Y, 2); double epsilon = options.epsilon; int maxIter = options.maxIter; double lambda = options.lambda; bool calc_OV = options.calc_OV; bool verbose = options.verbose; /*XNX = [X, -X]; H_G = XNX' * XNX; D = repmat(diag(H_G), [1, n_y]); XNXTY = XNX' * Y; A = (X' * X + lambda * eye(p)) \ (X' * Y);*/ Matrix& XNX = horzcat(2, &X, &uminus(X)); Matrix& H_G = XNX.transpose().mtimes(XNX); double* Q = new double[size(H_G, 1)]; for (int i = 0; i < size(H_G, 1); i++) { Q[i] = H_G.getEntry(i, i); } Matrix& XNXTY = XNX.transpose().mtimes(Y); Matrix& A = mldivide( plus(X.transpose().mtimes(X), times(lambda, eye(p))), X.transpose().mtimes(Y) ); /*AA = [subplus(A); subplus(-A)]; C = -XNXTY + lambda; Grad = C + H_G * AA; tol = epsilon * norm(Grad); PGrad = zeros(size(Grad));*/ Matrix& AA = vertcat(2, &subplus(A), &subplus(uminus(A))); Matrix& C = plus(uminus(XNXTY), lambda); Matrix& Grad = plus(C, mtimes(H_G, AA)); double tol = epsilon * norm(Grad); Matrix& PGrad = zeros(size(Grad)); std::list<double> J; double fval = 0; // J(1) = sum(sum((Y - X * A).^2)) / 2 + lambda * sum(sum(abs(A))); if (calc_OV) { fval = sum(sum(pow(minus(Y, mtimes(X, A)), 2))) / 2 + lambda * sum(sum(abs(A))); J.push_back(fval); } Matrix& I_k = Grad.copy(); double d = 0; int k = 0; DenseVector& SFPlusCi = *new DenseVector(AA.getColumnDimension()); Matrix& S = H_G; Vector** SRows = null; if (typeid(H_G) == typeid(DenseMatrix)) SRows = denseMatrix2DenseRowVectors(S); else SRows = sparseMatrix2SparseRowVectors(S); Vector** CRows = null; if (typeid(C) == typeid(DenseMatrix)) CRows = denseMatrix2DenseRowVectors(C); else CRows = sparseMatrix2SparseRowVectors(C); double** FData = ((DenseMatrix&) AA).getData(); double* FRow = null; double* pr = null; int K = 2 * p; while (true) { /*I_k = Grad < 0 | AA > 0; I_k_com = not(I_k); PGrad(I_k) = Grad(I_k); PGrad(I_k_com) = 0;*/ _or(I_k, lt(Grad, 0), gt(AA, 0)); Matrix& I_k_com = _not(I_k); assign(PGrad, Grad); logicalIndexingAssignment(PGrad, I_k_com, 0); d = norm(PGrad, inf); if (d < tol) { if (verbose) println("Converge successfully!"); break; } /*for i = 1:2*p AA(i, :) = max(AA(i, :) - (C(i, :) + H_G(i, :) * AA) ./ (D(i, :)), 0); end A = AA(1:p,:) - AA(p+1:end,:);*/ for (int i = 0; i < K; i++) { // SFPlusCi = SRows[i].operate(AA); operate(SFPlusCi, *SRows[i], AA); plusAssign(SFPlusCi, *CRows[i]); timesAssign(SFPlusCi, 1 / Q[i]); pr = SFPlusCi.getPr(); // F(i, :) = max(F(i, :) - (S(i, :) * F + C(i, :)) / D[i]), 0); // F(i, :) = max(F(i, :) - SFPlusCi, 0) FRow = FData[i]; for (int j = 0; j < AA.getColumnDimension(); j++) { FRow[j] = max(FRow[j] - pr[j], 0); } } // Grad = plus(C, mtimes(H_G, AA)); plus(Grad, C, mtimes(H_G, AA)); k = k + 1; if (k > maxIter) { if (verbose) println("Maximal iterations"); break; } if (calc_OV) { fval = sum(sum(pow(minus(Y, mtimes(XNX, AA)), 2))) / 2 + lambda * sum(sum(abs(AA))); J.push_back(fval); } if (k % 10 == 0 && verbose) { if (calc_OV) fprintf("Iter %d - ||PGrad||: %f, ofv: %f\n", k, d, J.back()); else fprintf("Iter %d - ||PGrad||: %f\n", k, d); } } Matrix& res = minus( AA.getSubMatrix(0, p - 1, 0, ny - 1), AA.getSubMatrix(p, 2 * p - 1, 0, ny - 1) ); return res; }
int encode_op(char *opcode, char *op_data) { int rd,rs,rt,imm,funct,shaft,target; char tmp[256]; const char *fi = "%s %d"; const char *fg = "%s %%g%d"; const char *ff = "%s %%f%d"; const char *fl = "%s %s"; const char *fgi = "%s %%g%d, %d"; const char *fgl = "%s %%g%d, %s"; const char *fgg = "%s %%g%d, %%g%d"; const char *fggl = "%s %%g%d, %%g%d, %s"; const char *fggi = "%s %%g%d, %%g%d, %d"; const char *fggg = "%s %%g%d, %%g%d, %%g%d"; const char *fff = "%s %%f%d, %%f%d"; const char *fgf = "%s %%g%d, %%f%d"; const char *ffg = "%s %%f%d, %%g%d"; const char *fffl = "%s %%f%d, %%f%d, %s"; const char *ffff = "%s %%f%d, %%f%d, %%f%d"; const char *ffgi = "%s %%f%d, %%g%d, %d"; const char *ffgg = "%s %%f%d, %%g%d, %%g%d"; char lname[256]; shaft = funct = target = 0; if(strcmp(opcode, "mvhi") == 0){ if(sscanf(op_data, fgi, tmp, &rs, &imm) == 3) return mvhi(rs,0,imm); } if(strcmp(opcode, "mvlo") == 0){ if(sscanf(op_data, fgi, tmp, &rs, &imm) == 3) return mvlo(rs,0,imm); } if(strcmp(opcode, "add") == 0){ if(sscanf(op_data, fggg, tmp, &rd, &rs,&rt) == 4) return add(rs,rt,rd,0); } if(strcmp(opcode, "nor") == 0){ if(sscanf(op_data, fggg, tmp, &rd, &rs,&rt) == 4) return nor(rs,rt,rd,0); } if(strcmp(opcode, "sub") == 0){ if(sscanf(op_data, fggg, tmp, &rd, &rs,&rt) == 4) return sub(rs,rt,rd,0); } if(strcmp(opcode, "mul") == 0){ if(sscanf(op_data, fggg, tmp, &rd, &rs,&rt) == 4) return mul(rs,rt,rd,0); } if(strcmp(opcode, "addi") == 0){ if(sscanf(op_data, fggi, tmp, &rt, &rs, &imm) == 4) return addi(rs,rt,imm); } if(strcmp(opcode, "subi") == 0){ if(sscanf(op_data, fggi, tmp, &rt, &rs, &imm) == 4) return subi(rs,rt,imm); } if(strcmp(opcode, "muli") == 0){ if(sscanf(op_data, fggi, tmp, &rt, &rs, &imm) == 4) return muli(rs,rt,imm); } if(strcmp(opcode, "input") == 0){ if(sscanf(op_data, fg, tmp, &rd) == 2) return input(0,0,rd,0); } if(strcmp(opcode, "inputw") == 0){ if(sscanf(op_data, fg, tmp, &rd) == 2) return inputw(0,0,rd,0); } if(strcmp(opcode, "inputf") == 0){ if(sscanf(op_data, ff, tmp, &rd) == 2) return inputf(0,0,rd,0); } if(strcmp(opcode, "output") == 0){ if(sscanf(op_data, fg, tmp, &rs) == 2) return output(rs,0,0,0); } if(strcmp(opcode, "outputw") == 0){ if(sscanf(op_data, fg, tmp, &rs) == 2) return outputw(rs,0,0,0); } if(strcmp(opcode, "outputf") == 0){ if(sscanf(op_data, ff, tmp, &rs) == 2) return outputf(rs,0,0,0); } if(strcmp(opcode, "and") == 0){ if(sscanf(op_data, fggg, tmp, &rd, &rs,&rt) == 4) return _and(rs,rt,rd,0); } if(strcmp(opcode, "or") == 0){ if(sscanf(op_data, fggg, tmp, &rd, &rs,&rt) == 4) return _or(rs,rt,rd,0); } if(strcmp(opcode, "sll") == 0){ if(sscanf(op_data, fggg, tmp, &rd, &rs,&rt) == 4) return sll(rs,rt,rd,0); } if(strcmp(opcode, "srl") == 0){ if(sscanf(op_data, fggg, tmp, &rd, &rs,&rt) == 4) return srl(rs,rt,rd,0); } if(strcmp(opcode, "slli") == 0){ if(sscanf(op_data, fggi, tmp, &rt, &rs, &imm) == 4) return slli(rs,rt,imm); } if(strcmp(opcode, "srli") == 0){ if(sscanf(op_data, fggi, tmp, &rt, &rs, &imm) == 4) return srli(rs,rt,imm); } if(strcmp(opcode, "b") == 0){ if(sscanf(op_data, fg, tmp, &rs) == 2) return b(rs,0,0,0); } if(strcmp(opcode, "jmp") == 0){ if(sscanf(op_data, fl, tmp, lname) == 2) { strcpy(label_name[label_cnt],lname); return jmp(label_cnt++); } } if(strcmp(opcode, "jeq") == 0){ if(sscanf(op_data, fggl, tmp, &rs, &rt, lname) == 4) { strcpy(label_name[label_cnt],lname); return jeq(rs,rt,label_cnt++); } } if(strcmp(opcode, "jne") == 0){ if(sscanf(op_data, fggl, tmp, &rs, &rt, lname) == 4) { strcpy(label_name[label_cnt],lname); return jne(rs,rt,label_cnt++); } } if(strcmp(opcode, "jlt") == 0){ if(sscanf(op_data, fggl, tmp, &rs, &rt, lname) == 4) { strcpy(label_name[label_cnt],lname); return jlt(rs,rt,label_cnt++); } } if(strcmp(opcode, "jle") == 0){ if(sscanf(op_data, fggl, tmp, &rs, &rt, lname) == 4) { strcpy(label_name[label_cnt],lname); return jle(rs,rt,label_cnt++); } } if(strcmp(opcode, "call") == 0){ if(sscanf(op_data, fl, tmp, lname) == 2) { strcpy(label_name[label_cnt],lname); return call(label_cnt++); } } if(strcmp(opcode, "callR") == 0){ if(sscanf(op_data, fg, tmp, &rs) == 2) return callr(rs,0,0,0); } if(strcmp(opcode, "return") == 0){ return _return(0); } if(strcmp(opcode, "ld") == 0){ if(sscanf(op_data, fggg, tmp, &rd, &rs,&rt) == 4) return ld(rs,rt,rd,0); } if(strcmp(opcode, "ldi") == 0){ if(sscanf(op_data, fggi, tmp, &rt, &rs, &imm) == 4) return ldi(rs,rt,imm); } if(strcmp(opcode, "ldlr") == 0){ if(sscanf(op_data, fgi, tmp, &rs, &imm) == 3) return ldlr(rs,0,imm); } if(strcmp(opcode, "fld") == 0){ if(sscanf(op_data, ffgg, tmp, &rd, &rs,&rt) == 4) return fld(rs,rt,rd,0); } if(strcmp(opcode, "st") == 0){ if(sscanf(op_data, fggg, tmp, &rd, &rs,&rt) == 4) return st(rs,rt,rd,0); } if(strcmp(opcode, "sti") == 0){ if(sscanf(op_data, fggi, tmp, &rt, &rs, &imm) == 4) return sti(rs,rt,imm); } if(strcmp(opcode, "stlr") == 0){ if(sscanf(op_data, fgi, tmp, &rs, &imm) == 3) return stlr(rs,0,imm); } if(strcmp(opcode, "fst") == 0){ if(sscanf(op_data, ffgg, tmp, &rd, &rs,&rt) == 4) return fst(rs,rt,rd,0); } if(strcmp(opcode, "fadd") == 0){ if(sscanf(op_data, ffff, tmp, &rd, &rs, &rt) == 4) return fadd(rs,rt,rd,0); } if(strcmp(opcode, "fsub") == 0){ if(sscanf(op_data, ffff, tmp, &rd, &rs, &rt) == 4) return fsub(rs,rt,rd,0); } if(strcmp(opcode, "fmul") == 0){ if(sscanf(op_data, ffff, tmp, &rd, &rs, &rt) == 4) return fmul(rs,rt,rd,0); } if(strcmp(opcode, "fdiv") == 0){ if(sscanf(op_data, ffff, tmp, &rd, &rs, &rt) == 4) return fdiv(rs,rt,rd,0); } if(strcmp(opcode, "fsqrt") == 0){ if(sscanf(op_data, fff, tmp, &rd, &rs) == 3) return fsqrt(rs,0,rd,0); } if(strcmp(opcode, "fabs") == 0){ if(sscanf(op_data, fff, tmp, &rd, &rs) == 3) return _fabs(rs,0,rd,0); } if(strcmp(opcode, "fmov") == 0){ if(sscanf(op_data, fff, tmp, &rd, &rs) == 3) return fmov(rs,0,rd,0); } if(strcmp(opcode, "fneg") == 0){ if(sscanf(op_data, fff, tmp, &rd, &rs) == 3) return fneg(rs,0,rd,0); } if(strcmp(opcode, "fldi") == 0){ if(sscanf(op_data, ffgi, tmp, &rt, &rs, &imm) == 4) return fldi(rs,rt,imm); } if(strcmp(opcode, "fsti") == 0){ if(sscanf(op_data, ffgi, tmp, &rt, &rs, &imm) == 4) return fsti(rs,rt,imm); } if(strcmp(opcode, "fjeq") == 0){ if(sscanf(op_data, fffl, tmp, &rs, &rt, lname) == 4) { strcpy(label_name[label_cnt],lname); return fjeq(rs,rt,label_cnt++); } } if(strcmp(opcode, "fjlt") == 0){ if(sscanf(op_data, fffl, tmp, &rs, &rt, lname) == 4) { strcpy(label_name[label_cnt],lname); return fjlt(rs,rt,label_cnt++); } } if(strcmp(opcode, "halt") == 0){ return halt(0,0,0,0); } if(strcmp(opcode, "setL") == 0){ if(sscanf(op_data, fgl, tmp, &rd, lname) == 3) { strcpy(label_name[label_cnt],lname); return setl(0,rd,label_cnt++); } } if(strcmp(opcode, "padd") == 0){ if(sscanf(op_data, fgi, tmp, &rt, &imm) == 3) { return padd(0,rt,imm); } } if(strcmp(opcode, "link") == 0){ if(sscanf(op_data, fi, tmp, &imm) == 2) { return link(0,0,imm); } } if(strcmp(opcode, "movlr") == 0){ return movlr(0,0,0,0); } if(strcmp(opcode, "btmplr") == 0){ return btmplr(0,0,0,0); } /* if(strcmp(opcode, "padd") == 0){ if(sscanf(op_data, fgg, tmp, &rd, &rt) == 3) { return padd(0,rt,d,0); } } */ return -1; }