- Timestamp:
- Nov 26, 2019, 1:08:55 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/ipp-20191011/Ohana/src/opihi/lib.shell/stack_math.c
r41137 r41141 34 34 case '?': SSS_FUNC(M1 ? M2: M3); 35 35 default: 36 snprintf (line, 512, "error: op %c not defined !", op[0]);36 snprintf (line, 512, "error: op %c not defined as scalar trinary op!", op[0]); 37 37 push_error (line); 38 38 return (FALSE); … … 162 162 case '?': VVV_FUNC(*M1 ? *M2: *M3); 163 163 default: 164 snprintf (line, 512, "error: op %c not defined !", op[0]);164 snprintf (line, 512, "error: op %c not defined as vector trinary op!", op[0]); 165 165 push_error (line); 166 166 return (FALSE); … … 227 227 case '?': MMM_FUNC(*M1 ? *M2: *M3); 228 228 default: 229 snprintf (line, 512, "error: op %c not defined !", op[0]);229 snprintf (line, 512, "error: op %c not defined as matrix trinary op!", op[0]); 230 230 push_error (line); 231 231 return (FALSE); … … 358 358 case 'O': VV_FUNC(ST_SCALAR_INT, (*M1 || *M2) ? 1 : 0); 359 359 360 // for the bitshift operators, we have to treat the INT and FLT values differently 361 // this makes the operator incompatible with the macros used above 360 362 case 'l': { 363 CopyVector (OUT[0].vector, V1[0].vector); 361 364 if ((V1->vector->type == OPIHI_FLT) || (V2->vector->type == OPIHI_FLT)) { 362 365 // bitshift is not valid with float valuess 363 CopyVector (OUT[0].vector, V1[0].vector);364 366 for (i = 0; i < Nx; i++) { 365 367 OUT[0].vector[0].elements.Flt[i] = NAN; … … 378 380 379 381 case 'r': { 382 CopyVector (OUT[0].vector, V1[0].vector); 380 383 if ((V1->vector->type == OPIHI_FLT) || (V2->vector->type == OPIHI_FLT)) { 381 384 // bitshift is not valid with float valuess … … 397 400 398 401 default: 399 snprintf (line, 512, "error: op %c not defined !", op[0]);402 snprintf (line, 512, "error: op %c not defined for (vector OP vector)!", op[0]); 400 403 push_error (line); 401 404 return (FALSE); … … 509 512 case 'O': SV_FUNC(ST_SCALAR_INT, (M1 || *M2) ? 1 : 0); 510 513 514 // for the bitshift operators, we have to treat the INT and FLT values differently 515 // this makes the operator incompatible with the macros used above 511 516 case 'l': { 512 if (V2->vector->type == OPIHI_FLT) { 517 CopyVector (OUT[0].vector, V2[0].vector); 518 if ((V1->type == ST_SCALAR_FLT) || (V2->vector->type == OPIHI_FLT)) { 513 519 // bitshift is not valid with float valuess 514 CopyVector (OUT[0].vector, V2[0].vector);515 520 for (i = 0; i < Nx; i++) { 516 521 OUT[0].vector[0].elements.Flt[i] = NAN; … … 528 533 529 534 case 'r': { 530 if (V2->vector->type == OPIHI_FLT) { 535 CopyVector (OUT[0].vector, V2[0].vector); 536 if ((V1->type == ST_SCALAR_FLT) || (V2->vector->type == OPIHI_FLT)) { 531 537 // bitshift is not valid with float valuess 532 CopyVector (OUT[0].vector, V2[0].vector);533 538 for (i = 0; i < Nx; i++) { 534 539 OUT[0].vector[0].elements.Flt[i] = NAN; … … 546 551 547 552 default: 548 snprintf (line, 512, "error: op %c not defined !", op[0]);553 snprintf (line, 512, "error: op %c not defined for (scalar OP vector)!", op[0]); 549 554 push_error (line); 550 555 return (FALSE); … … 655 660 656 661 case 'l': { 657 if (V1->vector->type == OPIHI_FLT) { 662 CopyVector (OUT[0].vector, V1[0].vector); 663 if ((V1->vector->type == OPIHI_FLT) || (V2->type == ST_SCALAR_FLT)) { 658 664 // bitshift is not valid with float valuess 659 CopyVector (OUT[0].vector, V1[0].vector);660 665 for (i = 0; i < Nx; i++) { 661 666 OUT[0].vector[0].elements.Flt[i] = NAN; … … 673 678 674 679 case 'r': { 675 if (V1->vector->type == OPIHI_FLT) { 680 CopyVector (OUT[0].vector, V1[0].vector); 681 if ((V1->vector->type == OPIHI_FLT) || (V2->type == ST_SCALAR_FLT)) { 676 682 // bitshift is not valid with float valuess 677 683 CopyVector (OUT[0].vector, V1[0].vector); … … 691 697 692 698 default: 693 snprintf (line, 512, "error: op %c not defined !", op[0]);699 snprintf (line, 512, "error: op %c not defined for (vector OP scalar)!", op[0]); 694 700 push_error (line); 695 701 return (FALSE); … … 784 790 case 'O': MV_FUNC((*M1 || *M2) ? 1 : 0); 785 791 786 case 'l': {787 if (V1->vector->type == OPIHI_FLT) {788 // bitshift is not valid with float valuess789 CopyVector (OUT[0].vector, V1[0].vector);790 for (i = 0; i < Nx; i++) {791 OUT[0].vector[0].elements.Flt[i] = NAN;792 }793 break;794 }795 opihi_int *M1 = V1[0].vector[0].elements.Int;796 opihi_int M2 = V2[0].IntValue; \797 opihi_int *out = OUT[0].vector[0].elements.Int;798 for (i = 0; i < Nx; i++, out++, M1++) {799 *out = *M1 << M2;800 }801 break;802 }803 804 case 'r': {805 if (V1->vector->type == OPIHI_FLT) {806 // bitshift is not valid with float valuess807 CopyVector (OUT[0].vector, V1[0].vector);808 for (i = 0; i < Nx; i++) {809 OUT[0].vector[0].elements.Flt[i] = NAN;810 }811 break;812 }813 opihi_int *M1 = V1[0].vector[0].elements.Int;814 opihi_int M2 = V2[0].IntValue; \815 opihi_int *out = OUT[0].vector[0].elements.Int;816 for (i = 0; i < Nx; i++, out++, M1++) {817 *out = *M1 >> M2;818 }819 break;820 }821 822 792 default: 823 snprintf (line, 512, "error: op %c not defined !", op[0]);793 snprintf (line, 512, "error: op %c not defined for (matrix OP vector)!", op[0]); 824 794 push_error (line); 825 795 return (FALSE); … … 918 888 case 'O': VM_FUNC((*M1 || *M2) ? 1 : 0); 919 889 default: 920 snprintf (line, 512, "error: op %c not defined !", op[0]);890 snprintf (line, 512, "error: op %c not defined for (vector OP matrix)!", op[0]); 921 891 push_error (line); 922 892 return (FALSE); … … 999 969 case 'O': MM_FUNC((*M1 || *M2) ? 1 : 0); 1000 970 default: 1001 snprintf (line, 512, "error: op %c not defined !", op[0]);971 snprintf (line, 512, "error: op %c not defined for (matrix OP matrix)!", op[0]); 1002 972 push_error (line); 1003 973 return (FALSE); … … 1085 1055 case 'O': MS_FUNC((*M1 || M2) ? 1 : 0); 1086 1056 default: 1087 snprintf (line, 512, "error: op %c not defined !", op[0]);1057 snprintf (line, 512, "error: op %c not defined for (matrix OP scalar)!", op[0]); 1088 1058 push_error (line); 1089 1059 return (FALSE); … … 1162 1132 case 'O': SM_FUNC((M1 || *M2) ? 1 : 0); 1163 1133 default: 1164 snprintf (line, 512, "error: op %c not defined !", op[0]);1134 snprintf (line, 512, "error: op %c not defined for (scalar OP matrix)!", op[0]); 1165 1135 push_error (line); 1166 1136 return (FALSE); … … 1244 1214 case 'A': SS_FUNC(ST_SCALAR_INT, (M1 && M2) ? 1 : 0); 1245 1215 case 'O': SS_FUNC(ST_SCALAR_INT, (M1 || M2) ? 1 : 0); 1216 1217 // for the bitshift operators, we have to treat the INT and FLT values differently 1218 // this makes the operator incompatible with the macros used above 1219 case 'l': { 1220 if ((V1->type == ST_SCALAR_FLT) || (V2->type == ST_SCALAR_FLT)) { 1221 // bitshift is not valid with float valuess 1222 OUT[0].type = ST_SCALAR_FLT; 1223 OUT[0].FltValue = NAN; 1224 break; 1225 } 1226 opihi_int M1 = V1[0].IntValue; 1227 opihi_int M2 = V2[0].IntValue; 1228 OUT[0].type = ST_SCALAR_INT; 1229 OUT[0].IntValue = M1 << M2; 1230 break; 1231 } 1232 1233 case 'r': { 1234 if ((V1->type == ST_SCALAR_FLT) || (V2->type == ST_SCALAR_FLT)) { 1235 // bitshift is not valid with float valuess 1236 OUT[0].type = ST_SCALAR_FLT; 1237 OUT[0].FltValue = NAN; 1238 break; 1239 } 1240 opihi_int M1 = V1[0].IntValue; 1241 opihi_int M2 = V2[0].IntValue; 1242 OUT[0].type = ST_SCALAR_INT; 1243 OUT[0].IntValue = M1 >> M2; 1244 break; 1245 } 1246 1246 1247 default: 1247 snprintf (line, 512, "error: op %c not defined !", op[0]);1248 snprintf (line, 512, "error: op %c not defined for (scalar OP scalar)!", op[0]); 1248 1249 push_error (line); 1249 1250 return (FALSE); … … 1318 1319 int S_unary (StackVar *OUT, StackVar *V1, char *op) { 1319 1320 1320 char line[512]; // this is only used to report an error1321 1322 1321 # define S_FUNC(OP,FTYPE) { \ 1323 1322 if (V1->type == ST_SCALAR_FLT) { \ … … 1360 1359 if (!strcmp (op, "asinh")) S_FUNC(asinh (M1), ST_SCALAR_FLT); 1361 1360 if (!strcmp (op, "acosh")) S_FUNC(acosh (M1), ST_SCALAR_FLT); 1362 if (!strcmp (op, "lgamma")) S_FUNC(lgamma (M1), ST_SCALAR_FLT);1363 1361 if (!strcmp (op, "sin")) S_FUNC(sin (M1), ST_SCALAR_FLT); 1364 1362 if (!strcmp (op, "cos")) S_FUNC(cos (M1), ST_SCALAR_FLT); … … 1373 1371 if (!strcmp (op, "dacos")) S_FUNC(acos (M1)*DEG_RAD, ST_SCALAR_FLT); 1374 1372 if (!strcmp (op, "datan")) S_FUNC(atan (M1)*DEG_RAD, ST_SCALAR_FLT); 1373 if (!strcmp (op, "lgamma")) S_FUNC(lgamma (M1), ST_SCALAR_FLT); 1375 1374 if (!strcmp (op, "rnd")) S_FUNC(0.0*M1 + drand48(), ST_SCALAR_FLT); 1376 1375 if (!strcmp (op, "drnd")) S_FUNC(0.0*M1 + drand48(), ST_SCALAR_FLT); … … 1385 1384 1386 1385 clear_stack (V1); 1387 snprintf (line, 512, "error: op %s not defined!", op); 1386 1387 char line[512]; // this is only used to report an error 1388 snprintf (line, 512, "error: op %s not defined as unary scalar op!", op); 1388 1389 push_error (line); 1389 1390 return (FALSE); 1390 1391 1391 } 1392 1392 … … 1445 1445 if (!strcmp (op, "asinh")) V_FUNC(asinh(*M1), ST_SCALAR_FLT); 1446 1446 if (!strcmp (op, "acosh")) V_FUNC(acosh(*M1), ST_SCALAR_FLT); 1447 if (!strcmp (op, "lgamma")) V_FUNC(lgamma(*M1), ST_SCALAR_FLT);1448 1447 if (!strcmp (op, "sin")) V_FUNC(sin(*M1), ST_SCALAR_FLT); 1449 1448 if (!strcmp (op, "cos")) V_FUNC(cos(*M1), ST_SCALAR_FLT); … … 1458 1457 if (!strcmp (op, "dacos")) V_FUNC(acos(*M1)*DEG_RAD, ST_SCALAR_FLT); 1459 1458 if (!strcmp (op, "datan")) V_FUNC(atan(*M1)*DEG_RAD, ST_SCALAR_FLT); 1459 if (!strcmp (op, "lgamma")) V_FUNC(lgamma(*M1), ST_SCALAR_FLT); 1460 1460 if (!strcmp (op, "rnd")) V_FUNC(drand48(), ST_SCALAR_FLT); 1461 1461 if (!strcmp (op, "drnd")) V_FUNC(drand48(), ST_SCALAR_FLT); 1462 1462 if (!strcmp (op, "lrnd")) V_FUNC(lrand48(), ST_SCALAR_INT); 1463 1463 if (!strcmp (op, "mrnd")) V_FUNC(mrand48(), ST_SCALAR_INT); 1464 if (!strcmp (op, "ramp")) V_FUNC(i, ST_SCALAR_INT);1465 if (!strcmp (op, "zero")) V_FUNC(0, ST_SCALAR_INT);1466 1464 if (!strcmp (op, "not")) V_FUNC(!(*M1), ST_SCALAR_INT); 1467 1465 if (!strcmp (op, "--")) V_FUNC(-1*(*M1), ST_SCALAR_INT); // NOTE: opihi_int is signed 1468 1466 if (!strcmp (op, "isinf")) V_FUNC(!finite(*M1), ST_SCALAR_FLT); 1469 1467 if (!strcmp (op, "isnan")) V_FUNC(isnan((opihi_flt)(*M1)), ST_SCALAR_FLT); 1468 if (!strcmp (op, "ramp")) V_FUNC(i, ST_SCALAR_INT); 1470 1469 if (!strcmp (op, "xramp")) V_FUNC(i, ST_SCALAR_INT); 1471 1470 if (!strcmp (op, "yramp")) V_FUNC(0, ST_SCALAR_INT); 1472 1471 if (!strcmp (op, "zramp")) V_FUNC(0, ST_SCALAR_INT); 1472 if (!strcmp (op, "zero")) V_FUNC(0, ST_SCALAR_INT); 1473 1473 /* xramp, yramp, zramp above only make sense for matrices. for vectors, xramp = ramp, yramp = zero */ 1474 1474 1475 1475 # undef V_FUNC 1476 1476 1477 escape: 1478 1477 // free the temp vector if needed 1479 1478 if (V1[0].type == ST_VECTOR_TMP) { 1480 1479 free (V1[0].vector[0].elements.Ptr); … … 1484 1483 1485 1484 clear_stack (V1); 1485 1486 char line[512]; // this is only used to report an error 1487 snprintf (line, 512, "error: op %s not defined as unary vector op!", op); 1488 push_error (line); 1489 return (FALSE); 1490 1491 escape: 1492 1493 if (V1[0].type == ST_VECTOR_TMP) { 1494 free (V1[0].vector[0].elements.Ptr); 1495 free (V1[0].vector); 1496 V1[0].vector = NULL; 1497 } 1498 1499 clear_stack (V1); 1486 1500 return (TRUE); 1487 1501 1488 1502 } 1489 1503 1490 # define M_FUNC(OP) { for (i = 0; i < Npix; i++, out++, M1++) { *out = (OP); } }1504 # define M_FUNC(OP) { for (i = 0; i < Npix; i++, out++, M1++) { *out = (OP); } goto escape; } 1491 1505 1492 1506 int M_unary (StackVar *OUT, StackVar *V1, char *op) { … … 1510 1524 // if (!strcmp (op, "rint")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = nearbyint (*M1); }} 1511 1525 1512 if (!strcmp (op, "=")) {}1526 if (!strcmp (op, "=")) { goto escape; } 1513 1527 if (!strcmp (op, "abs")) M_FUNC(fabs(*M1)); 1514 1528 if (!strcmp (op, "int")) M_FUNC((opihi_flt)(long long)(*M1)); … … 1525 1539 if (!strcmp (op, "asinh")) M_FUNC(asinh(*M1)); 1526 1540 if (!strcmp (op, "acosh")) M_FUNC(acosh(*M1)); 1527 if (!strcmp (op, "lgamma")) M_FUNC(lgamma(*M1));1528 1541 if (!strcmp (op, "sin")) M_FUNC(sin(*M1)); 1529 1542 if (!strcmp (op, "cos")) M_FUNC(cos(*M1)); … … 1538 1551 if (!strcmp (op, "dacos")) M_FUNC(acos(*M1)*DEG_RAD); 1539 1552 if (!strcmp (op, "datan")) M_FUNC(atan(*M1)*DEG_RAD); 1540 if (!strcmp (op, "not")) M_FUNC(!(*M1)); 1541 if (!strcmp (op, "--")) M_FUNC(-(*M1)); 1553 if (!strcmp (op, "lgamma")) M_FUNC(lgamma(*M1)); 1542 1554 if (!strcmp (op, "rnd")) M_FUNC(drand48()); 1543 1555 if (!strcmp (op, "drnd")) M_FUNC(drand48()); 1544 1556 if (!strcmp (op, "lrnd")) M_FUNC(lrand48()); 1545 1557 if (!strcmp (op, "mrnd")) M_FUNC(mrand48()); 1558 if (!strcmp (op, "not")) M_FUNC(!(*M1)); 1559 if (!strcmp (op, "--")) M_FUNC(-(*M1)); 1546 1560 if (!strcmp (op, "ramp")) M_FUNC(i); 1547 if (!strcmp (op, "zero")) M_FUNC(0);1548 1561 if (!strcmp (op, "isinf")) M_FUNC(!finite(*M1)); 1549 1562 if (!strcmp (op, "isnan")) M_FUNC(isnan(*M1)); 1563 if (!strcmp (op, "zero")) M_FUNC(0); 1550 1564 1551 1565 /* xrm and yrm only make sense for 2D matrices. see special meaning for vectors */ … … 1561 1575 } 1562 1576 } 1577 goto escape; 1563 1578 } 1564 1579 if (!strcmp (op, "yramp")) { … … 1573 1588 } 1574 1589 } 1590 goto escape; 1575 1591 } 1576 1592 if (!strcmp (op, "zramp")) { … … 1585 1601 } 1586 1602 } 1587 } 1588 1603 goto escape; 1604 } 1605 1606 if (V1[0].type == ST_MATRIX_TMP) { 1607 free (V1[0].buffer[0].header.buffer); 1608 free (V1[0].buffer[0].matrix.buffer); 1609 free (V1[0].buffer); 1610 } 1611 1612 clear_stack (V1); 1613 1614 char line[512]; // this is only used to report an error 1615 snprintf (line, 512, "error: op %s not defined as unary matrix op!", op); 1616 push_error (line); 1617 return (FALSE); 1618 1619 escape: 1620 1589 1621 if (V1[0].type == ST_MATRIX_TMP) { 1590 1622 free (V1[0].buffer[0].header.buffer);
Note:
See TracChangeset
for help on using the changeset viewer.
