1/* 2 * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26#ifndef __MLIB_V_IMAGECONSTLOGIC_H 27#define __MLIB_V_IMAGECONSTLOGIC_H 28 29 30#if defined ( VIS ) 31#if VIS >= 0x200 32#error This include file can be used with VIS 1.0 only 33#endif /* VIS >= 0x200 */ 34#endif /* defined ( VIS ) */ 35 36#include <mlib_image.h> 37#include <vis_proto.h> 38#include <mlib_ImageCheck.h> 39#include <mlib_ImageLogic_proto.h> 40#include <mlib_v_ImageLogic_proto.h> 41 42#ifdef __cplusplus 43extern "C" { 44#endif /* __cplusplus */ 45 46/* 47 * Macro definitions for VIS version image logical functions. 48 */ 49 50/***************************************************************/ 51 52#define VALIDATE() \ 53 mlib_u8 *sp, *sl; /* pointers for pixel and line of source */ \ 54 mlib_u8 *dp, *dl;/* pointers for pixel and line of dst */ \ 55 mlib_s32 width, height, type, nchannels; \ 56 mlib_s32 stride; /* for src */ \ 57 mlib_s32 strided; /* for dst */ \ 58 mlib_u32 c01, c02, c03, c04; \ 59 mlib_d64 dc01, dc02, dc03; \ 60 \ 61 MLIB_IMAGE_SIZE_EQUAL(dst,src); \ 62 MLIB_IMAGE_TYPE_EQUAL(dst,src); \ 63 MLIB_IMAGE_CHAN_EQUAL(dst,src); \ 64 \ 65 dp = (mlib_u8 *) mlib_ImageGetData(dst); \ 66 sp = (mlib_u8 *) mlib_ImageGetData(src); \ 67 height = mlib_ImageGetHeight(dst); \ 68 width = mlib_ImageGetWidth(dst); \ 69 stride = mlib_ImageGetStride(src); \ 70 strided = mlib_ImageGetStride(dst); \ 71 nchannels = mlib_ImageGetChannels(dst); \ 72 type = mlib_ImageGetType(dst); \ 73 \ 74 if (type == MLIB_SHORT) { \ 75 width *= (2 * nchannels); \ 76 if (nchannels == 1) { \ 77 c01 = c[0] & 0xFFFF; c01 |= (c01 << 16); \ 78 dc01 = vis_to_double_dup(c01); \ 79 } else if (nchannels == 2) { \ 80 c01 = ((c[0] & 0xFFFF) << 16) | (c[1] & 0xFFFF); \ 81 dc01 = vis_to_double_dup(c01); \ 82 } else if (nchannels == 3) { \ 83 c01 = ((c[0] & 0xFFFF) << 16) | (c[1] & 0xFFFF); \ 84 c02 = ((c[2] & 0xFFFF) << 16) | (c01 >> 16); \ 85 c03 = (c01 << 16) | (c02 >> 16); \ 86 dc01= vis_to_double(c01, c02); \ 87 dc02= vis_to_double(c03, c01); \ 88 dc03= vis_to_double(c02, c03); \ 89 } else { \ 90 c01 = ((c[0] & 0xFFFF) << 16) | (c[1] & 0xFFFF); \ 91 c02 = ((c[2] & 0xFFFF) << 16) | (c[3] & 0xFFFF); \ 92 dc01= vis_to_double(c01, c02); \ 93 } \ 94 \ 95 } else if (type == MLIB_BYTE) { \ 96 width *= nchannels; \ 97 if (nchannels == 1) { \ 98 c01 = c[0] & 0xFF; c01 |= (c01 << 8); \ 99 c01 |= (c01 << 16); \ 100 dc01 = vis_to_double_dup(c01); \ 101 } else if (nchannels == 2) { \ 102 c01 = ((c[0] & 0xFF) << 8) | (c[1] & 0xFF); \ 103 c01 |= (c01 << 16); \ 104 dc01 = vis_to_double_dup(c01); \ 105 } else if (nchannels == 3) { \ 106 c01 = ((c[0] & 0xFF) << 16) | ((c[1] & 0xFF) << 8) | \ 107 (c[2] & 0xFF); \ 108 c02 = (c01 << 16) | (c01 >> 8); \ 109 c03 = (c01 << 24) | c01; \ 110 c01 = (c01 << 8) | (c01 >> 16); \ 111 dc01= vis_to_double(c01, c02); \ 112 dc02= vis_to_double(c03, c01); \ 113 dc03= vis_to_double(c02, c03); \ 114 } else { \ 115 c01 = ((c[0] & 0xFF) << 24) | ((c[1] & 0xFF) << 16) | \ 116 ((c[2] & 0xFF) << 8) | (c[3] & 0xFF); \ 117 dc01 = vis_to_double_dup(c01); \ 118 } \ 119 } else { \ 120 width *= (4 * nchannels); \ 121 if (nchannels == 1) { \ 122 c01 = c[0] & 0xFFFFFFFF; \ 123 dc01 = vis_to_double_dup(c01); \ 124 } else if (nchannels == 2) { \ 125 c01 = c[0] & 0xFFFFFFFF; c02 = c[1] & 0xFFFFFFFF; \ 126 dc01 = vis_to_double(c01, c02); \ 127 } else if (nchannels == 3) { \ 128 c01 = c[0] & 0xFFFFFFFF; c02 = c[1] & 0xFFFFFFFF; \ 129 c03 = c[2] & 0xFFFFFFFF; \ 130 dc01= vis_to_double(c01, c02); \ 131 dc02= vis_to_double(c03, c01); \ 132 dc03= vis_to_double(c02, c03); \ 133 } else { \ 134 c01 = c[0] & 0xFFFFFFFF; c02 = c[1] & 0xFFFFFFFF; \ 135 c03 = c[2] & 0xFFFFFFFF; c04 = c[3] & 0xFFFFFFFF; \ 136 dc01= vis_to_double(c01, c02); \ 137 dc02= vis_to_double(c03, c04); \ 138 } \ 139 } \ 140 \ 141 if ((width > stride) || (width > strided)) \ 142 return MLIB_FAILURE 143 144/***************************************************************/ 145 146static mlib_status mlib_v_ImageConstLogic(mlib_image *dst, 147 mlib_image *src, 148 mlib_s32 *c) 149{ 150 mlib_s32 i, j; 151 mlib_s32 offdst, offsrc, emask; 152 mlib_d64 *dpp, *spp; 153 mlib_d64 sa1, sa2, da, sa; 154 mlib_d64 ssa, ssa1, ssa2, sa3, sa4; 155 mlib_s32 amount; 156 mlib_u8 *dend; 157 mlib_d64 c1, c2, c3; 158 159 VALIDATE(); 160 161 if (nchannels == 3) { 162 if ((width == stride) && (width == strided) && ((width - (width / 3) * 3) == 0)) { 163 164 amount = height * width; 165 dend = dp + amount - 1; 166 offdst = ((mlib_addr) dp) & 7; 167 offsrc = ((mlib_addr) sp) & 7; 168 169 if (offsrc == offdst) { 170 171 /* prepare the destination addresses */ 172 dpp = (mlib_d64 *) vis_alignaddr(dp, 0); 173 i = (mlib_u8 *) dpp - dp; 174 175 if (i != 0) { 176 vis_alignaddr((void *)(8 - offdst), 0); 177 c3 = vis_faligndata(dc03, dc01); 178 c1 = vis_faligndata(dc01, dc02); 179 c2 = vis_faligndata(dc02, dc03); 180 } 181 else { 182 c1 = dc01; 183 c2 = dc02; 184 c3 = dc03; 185 } 186 187 /* prepare the destination addresses */ 188 spp = (mlib_d64 *) vis_alignaddr(sp, 0); 189 190 if (i != 0) { 191 /* generate edge mask for the start point */ 192 emask = vis_edge8(dp, dend); 193 sa1 = *spp++; 194 da = VIS_CONSTLOGIC(c3, sa1); 195 vis_pst_8(da, dpp++, emask); 196 i += 8; 197 } 198 199#pragma pipeloop(0) 200 for (; i < amount - 24; i += 24) { 201 dpp[0] = VIS_CONSTLOGIC(c1, spp[0]); 202 dpp[1] = VIS_CONSTLOGIC(c2, spp[1]); 203 dpp[2] = VIS_CONSTLOGIC(c3, spp[2]); 204 dpp += 3; 205 spp += 3; 206 } 207 208 if (i < amount) { 209 emask = vis_edge8(dpp, dend); 210 sa1 = *spp++; 211 da = VIS_CONSTLOGIC(c1, sa1); 212 vis_pst_8(da, dpp++, emask); 213 i += 8; 214 } 215 216 if (i < amount) { 217 emask = vis_edge8(dpp, dend); 218 sa1 = *spp++; 219 da = VIS_CONSTLOGIC(c2, sa1); 220 vis_pst_8(da, dpp++, emask); 221 i += 8; 222 } 223 224 if (i < amount) { 225 emask = vis_edge8(dpp, dend); 226 sa1 = *spp++; 227 da = VIS_CONSTLOGIC(c3, sa1); 228 vis_pst_8(da, dpp, emask); 229 } 230 } 231 else { 232 /* prepare the destination addresses */ 233 dpp = (mlib_d64 *) vis_alignaddr(dp, 0); 234 i = (mlib_u8 *) dpp - dp; 235 236 if (i != 0) { 237 vis_alignaddr((void *)(8 - offdst), 0); 238 c3 = vis_faligndata(dc03, dc01); 239 c1 = vis_faligndata(dc01, dc02); 240 c2 = vis_faligndata(dc02, dc03); 241 } 242 else { 243 c1 = dc01; 244 c2 = dc02; 245 c3 = dc03; 246 } 247 248 /* prepare the destination addresses */ 249 spp = (mlib_d64 *) vis_alignaddr(sp, i); 250 251 sa1 = spp[0]; 252 253 if (i != 0) { 254 /* generate edge mask for the start point */ 255 emask = vis_edge8(dp, dend); 256 sa2 = spp[1]; 257 sa = vis_faligndata(sa1, sa2); 258 da = VIS_CONSTLOGIC(c3, sa); 259 vis_pst_8(da, dpp++, emask); 260 sa1 = sa2; 261 i += 8; 262 spp++; 263 } 264 265#pragma pipeloop(0) 266 for (; i < amount - 24; i += 24) { 267 sa2 = spp[1]; 268 ssa = vis_faligndata(sa1, sa2); 269 dpp[0] = VIS_CONSTLOGIC(c1, ssa); 270 sa3 = spp[2]; 271 ssa1 = vis_faligndata(sa2, sa3); 272 dpp[1] = VIS_CONSTLOGIC(c2, ssa1); 273 sa4 = spp[3]; 274 ssa2 = vis_faligndata(sa3, sa4); 275 dpp[2] = VIS_CONSTLOGIC(c3, ssa2); 276 sa1 = sa4; 277 dpp += 3; 278 spp += 3; 279 } 280 281 if (i < amount) { 282 emask = vis_edge8(dpp, dend); 283 sa2 = spp[1]; 284 sa = vis_faligndata(sa1, sa2); 285 da = VIS_CONSTLOGIC(c1, sa); 286 vis_pst_8(da, dpp++, emask); 287 sa1 = sa2; 288 i += 8; 289 spp++; 290 } 291 292 if (i < amount) { 293 emask = vis_edge8(dpp, dend); 294 sa2 = spp[1]; 295 sa = vis_faligndata(sa1, sa2); 296 da = VIS_CONSTLOGIC(c2, sa); 297 vis_pst_8(da, dpp++, emask); 298 sa1 = sa2; 299 i += 8; 300 spp++; 301 } 302 303 if (i < amount) { 304 emask = vis_edge8(dpp, dend); 305 sa2 = spp[1]; 306 sa = vis_faligndata(sa1, sa2); 307 da = VIS_CONSTLOGIC(c3, sa); 308 vis_pst_8(da, dpp++, emask); 309 } 310 } 311 } 312 else { 313 314 sl = sp; 315 dl = dp; 316 317 amount = width; 318 319 for (j = 0; j < height; j++) { 320 321 dend = dp + amount - 1; 322 offdst = ((mlib_addr) dp) & 7; 323 offsrc = ((mlib_addr) sp) & 7; 324 325 if (offsrc == offdst) { 326 327 /* prepare the destination addresses */ 328 dpp = (mlib_d64 *) vis_alignaddr(dp, 0); 329 i = (mlib_u8 *) dpp - dp; 330 331 if (i != 0) { 332 vis_alignaddr((void *)(8 - offdst), 0); 333 c3 = vis_faligndata(dc03, dc01); 334 c1 = vis_faligndata(dc01, dc02); 335 c2 = vis_faligndata(dc02, dc03); 336 } 337 else { 338 c1 = dc01; 339 c2 = dc02; 340 c3 = dc03; 341 } 342 343 /* prepare the destination addresses */ 344 spp = (mlib_d64 *) vis_alignaddr(sp, 0); 345 346 if (i != 0) { 347 /* generate edge mask for the start point */ 348 emask = vis_edge8(dp, dend); 349 sa1 = *spp++; 350 da = VIS_CONSTLOGIC(c3, sa1); 351 vis_pst_8(da, dpp++, emask); 352 i += 8; 353 } 354 355#pragma pipeloop(0) 356 for (; i < amount - 24; i += 24) { 357 dpp[0] = VIS_CONSTLOGIC(c1, spp[0]); 358 dpp[1] = VIS_CONSTLOGIC(c2, spp[1]); 359 dpp[2] = VIS_CONSTLOGIC(c3, spp[2]); 360 dpp += 3; 361 spp += 3; 362 } 363 364 if (i < amount) { 365 emask = vis_edge8(dpp, dend); 366 sa1 = *spp++; 367 da = VIS_CONSTLOGIC(c1, sa1); 368 vis_pst_8(da, dpp++, emask); 369 i += 8; 370 } 371 372 if (i < amount) { 373 emask = vis_edge8(dpp, dend); 374 sa1 = *spp++; 375 da = VIS_CONSTLOGIC(c2, sa1); 376 vis_pst_8(da, dpp++, emask); 377 i += 8; 378 } 379 380 if (i < amount) { 381 emask = vis_edge8(dpp, dend); 382 sa1 = *spp++; 383 da = VIS_CONSTLOGIC(c3, sa1); 384 vis_pst_8(da, dpp, emask); 385 } 386 } 387 else { 388 /* prepare the destination addresses */ 389 dpp = (mlib_d64 *) vis_alignaddr(dp, 0); 390 i = (mlib_u8 *) dpp - dp; 391 392 if (i != 0) { 393 vis_alignaddr((void *)(8 - offdst), 0); 394 c3 = vis_faligndata(dc03, dc01); 395 c1 = vis_faligndata(dc01, dc02); 396 c2 = vis_faligndata(dc02, dc03); 397 } 398 else { 399 c1 = dc01; 400 c2 = dc02; 401 c3 = dc03; 402 } 403 404 /* prepare the destination addresses */ 405 spp = (mlib_d64 *) vis_alignaddr(sp, i); 406 407 sa1 = spp[0]; 408 409 if (i != 0) { 410 /* generate edge mask for the start point */ 411 emask = vis_edge8(dp, dend); 412 sa2 = spp[1]; 413 sa = vis_faligndata(sa1, sa2); 414 da = VIS_CONSTLOGIC(c3, sa); 415 vis_pst_8(da, dpp++, emask); 416 sa1 = sa2; 417 i += 8; 418 spp++; 419 } 420 421#pragma pipeloop(0) 422 for (; i < amount - 24; i += 24) { 423 sa2 = spp[1]; 424 sa = vis_faligndata(sa1, sa2); 425 dpp[0] = VIS_CONSTLOGIC(c1, sa); 426 sa1 = spp[2]; 427 sa = vis_faligndata(sa2, sa1); 428 dpp[1] = VIS_CONSTLOGIC(c2, sa); 429 sa2 = spp[3]; 430 sa = vis_faligndata(sa1, sa2); 431 dpp[2] = VIS_CONSTLOGIC(c3, sa); 432 sa1 = sa2; 433 dpp += 3; 434 spp += 3; 435 } 436 437 if (i < amount) { 438 emask = vis_edge8(dpp, dend); 439 sa2 = spp[1]; 440 sa = vis_faligndata(sa1, sa2); 441 da = VIS_CONSTLOGIC(c1, sa); 442 vis_pst_8(da, dpp++, emask); 443 sa1 = sa2; 444 i += 8; 445 spp++; 446 } 447 448 if (i < amount) { 449 emask = vis_edge8(dpp, dend); 450 sa2 = spp[1]; 451 sa = vis_faligndata(sa1, sa2); 452 da = VIS_CONSTLOGIC(c2, sa); 453 vis_pst_8(da, dpp++, emask); 454 sa1 = sa2; 455 i += 8; 456 spp++; 457 } 458 459 if (i < amount) { 460 emask = vis_edge8(dpp, dend); 461 sa2 = spp[1]; 462 sa = vis_faligndata(sa1, sa2); 463 da = VIS_CONSTLOGIC(c3, sa); 464 vis_pst_8(da, dpp++, emask); 465 } 466 } 467 468 sp = sl += stride; 469 dp = dl += strided; 470 } 471 } 472 473 } 474 else if ((type != MLIB_INT) || (nchannels != 4)) { 475 476 if ((width == stride) && (width == strided)) { 477 478 amount = height * width; 479 dend = dp + amount - 1; 480 offdst = ((mlib_addr) dp) & 7; 481 offsrc = ((mlib_addr) sp) & 7; 482 483 if (offsrc == offdst) { 484 485 /* prepare the destination addresses */ 486 dpp = (mlib_d64 *) vis_alignaddr(dp, 0); 487 i = (mlib_u8 *) dpp - dp; 488 489 if (i != 0) { 490 vis_alignaddr((void *)(8 - offdst), 0); 491 c1 = vis_faligndata(dc01, dc01); 492 } 493 else { 494 c1 = dc01; 495 } 496 497 /* prepare the destination addresses */ 498 spp = (mlib_d64 *) vis_alignaddr(sp, 0); 499 500 if (i != 0) { 501 /* generate edge mask for the start point */ 502 emask = vis_edge8(dp, dend); 503 sa1 = *spp++; 504 da = VIS_CONSTLOGIC(c1, sa1); 505 vis_pst_8(da, dpp++, emask); 506 i += 8; 507 } 508 509#pragma pipeloop(0) 510 for (; i < amount - 8; i += 8) { 511 *dpp++ = VIS_CONSTLOGIC(c1, *spp); 512 spp++; 513 } 514 515 if (i < amount) { 516 emask = vis_edge8(dpp, dend); 517 sa1 = *spp; 518 da = VIS_CONSTLOGIC(c1, sa1); 519 vis_pst_8(da, dpp, emask); 520 } 521 } 522 else { 523 /* prepare the destination addresses */ 524 dpp = (mlib_d64 *) vis_alignaddr(dp, 0); 525 i = (mlib_u8 *) dpp - dp; 526 527 if (i != 0) { 528 vis_alignaddr((void *)(8 - offdst), 0); 529 c1 = vis_faligndata(dc01, dc01); 530 } 531 else { 532 c1 = dc01; 533 } 534 535 /* prepare the destination addresses */ 536 spp = (mlib_d64 *) vis_alignaddr(sp, i); 537 538 sa1 = spp[0]; 539 540 if (i != 0) { 541 /* generate edge mask for the start point */ 542 emask = vis_edge8(dp, dend); 543 sa2 = spp[1]; 544 sa = vis_faligndata(sa1, sa2); 545 da = VIS_CONSTLOGIC(c1, sa); 546 vis_pst_8(da, dpp++, emask); 547 sa1 = sa2; 548 i += 8; 549 spp++; 550 } 551 552#pragma pipeloop(0) 553 for (; i < amount - 8; i += 8) { 554 sa2 = spp[1]; 555 sa = vis_faligndata(sa1, sa2); 556 *dpp++ = VIS_CONSTLOGIC(c1, sa); 557 sa1 = sa2; 558 spp++; 559 } 560 561 if (i < amount) { 562 emask = vis_edge8(dpp, dend); 563 sa2 = spp[1]; 564 sa = vis_faligndata(sa1, sa2); 565 da = VIS_CONSTLOGIC(c1, sa); 566 vis_pst_8(da, dpp, emask); 567 } 568 } 569 } 570 else { 571 572 sl = sp; 573 dl = dp; 574 575 amount = width; 576 577 for (j = 0; j < height; j++) { 578 579 dend = dp + amount - 1; 580 offdst = ((mlib_addr) dp) & 7; 581 offsrc = ((mlib_addr) sp) & 7; 582 583 if (offsrc == offdst) { 584 585 /* prepare the destination addresses */ 586 dpp = (mlib_d64 *) vis_alignaddr(dp, 0); 587 i = (mlib_u8 *) dpp - dp; 588 589 if (i != 0) { 590 vis_alignaddr((void *)(8 - offdst), 0); 591 c1 = vis_faligndata(dc01, dc01); 592 } 593 else { 594 c1 = dc01; 595 } 596 597 /* prepare the destination addresses */ 598 spp = (mlib_d64 *) vis_alignaddr(sp, 0); 599 600 if (i != 0) { 601 /* generate edge mask for the start point */ 602 emask = vis_edge8(dp, dend); 603 sa1 = *spp++; 604 da = VIS_CONSTLOGIC(c1, sa1); 605 vis_pst_8(da, dpp++, emask); 606 i += 8; 607 } 608 609#pragma pipeloop(0) 610 for (; i < amount - 8; i += 8) { 611 *dpp++ = VIS_CONSTLOGIC(c1, *spp); 612 spp++; 613 } 614 615 if (i < amount) { 616 emask = vis_edge8(dpp, dend); 617 sa1 = *spp; 618 da = VIS_CONSTLOGIC(c1, sa1); 619 vis_pst_8(da, dpp, emask); 620 } 621 } 622 else { 623 /* prepare the destination addresses */ 624 dpp = (mlib_d64 *) vis_alignaddr(dp, 0); 625 i = (mlib_u8 *) dpp - dp; 626 627 if (i != 0) { 628 vis_alignaddr((void *)(8 - offdst), 0); 629 c1 = vis_faligndata(dc01, dc01); 630 } 631 else { 632 c1 = dc01; 633 } 634 635 /* prepare the destination addresses */ 636 spp = (mlib_d64 *) vis_alignaddr(sp, i); 637 638 sa1 = spp[0]; 639 640 if (i != 0) { 641 /* generate edge mask for the start point */ 642 emask = vis_edge8(dp, dend); 643 sa2 = spp[1]; 644 sa = vis_faligndata(sa1, sa2); 645 da = VIS_CONSTLOGIC(c1, sa); 646 vis_pst_8(da, dpp++, emask); 647 sa1 = sa2; 648 i += 8; 649 spp++; 650 } 651 652#pragma pipeloop(0) 653 for (; i < amount - 8; i += 8) { 654 sa2 = spp[1]; 655 sa = vis_faligndata(sa1, sa2); 656 *dpp++ = VIS_CONSTLOGIC(c1, sa); 657 sa1 = sa2; 658 spp++; 659 } 660 661 if (i < amount) { 662 emask = vis_edge8(dpp, dend); 663 sa2 = spp[1]; 664 sa = vis_faligndata(sa1, sa2); 665 da = VIS_CONSTLOGIC(c1, sa); 666 vis_pst_8(da, dpp, emask); 667 } 668 } 669 670 sp = sl += stride; 671 dp = dl += strided; 672 } 673 } 674 675 } 676 else { 677 678 if ((width == stride) && (width == strided)) { 679 680 amount = height * width; 681 dend = dp + amount - 1; 682 offdst = ((mlib_addr) dp) & 7; 683 offsrc = ((mlib_addr) sp) & 7; 684 685 if (offsrc == offdst) { 686 687 /* prepare the destination addresses */ 688 dpp = (mlib_d64 *) vis_alignaddr(dp, 0); 689 i = (mlib_u8 *) dpp - dp; 690 691 if (i != 0) { 692 vis_alignaddr((void *)(8 - offdst), 0); 693 c2 = vis_faligndata(dc02, dc01); 694 c1 = vis_faligndata(dc01, dc02); 695 } 696 else { 697 c1 = dc01; 698 c2 = dc02; 699 } 700 701 /* prepare the destination addresses */ 702 spp = (mlib_d64 *) vis_alignaddr(sp, 0); 703 704 if (i != 0) { 705 /* generate edge mask for the start point */ 706 emask = vis_edge8(dp, dend); 707 sa1 = *spp++; 708 da = VIS_CONSTLOGIC(c2, sa1); 709 vis_pst_8(da, dpp++, emask); 710 i += 8; 711 } 712 713#pragma pipeloop(0) 714 for (; i < amount - 16; i += 16) { 715 dpp[0] = VIS_CONSTLOGIC(c1, spp[0]); 716 dpp[1] = VIS_CONSTLOGIC(c2, spp[1]); 717 dpp += 2; 718 spp += 2; 719 } 720 721 if (i < amount) { 722 emask = vis_edge8(dpp, dend); 723 sa1 = *spp++; 724 da = VIS_CONSTLOGIC(c1, sa1); 725 vis_pst_8(da, dpp++, emask); 726 i += 8; 727 } 728 729 if (i < amount) { 730 emask = vis_edge8(dpp, dend); 731 sa1 = *spp; 732 da = VIS_CONSTLOGIC(c2, sa1); 733 vis_pst_8(da, dpp++, emask); 734 } 735 } 736 else { 737 /* prepare the destination addresses */ 738 dpp = (mlib_d64 *) vis_alignaddr(dp, 0); 739 i = (mlib_u8 *) dpp - dp; 740 741 if (i != 0) { 742 vis_alignaddr((void *)(8 - offdst), 0); 743 c2 = vis_faligndata(dc02, dc01); 744 c1 = vis_faligndata(dc01, dc02); 745 } 746 else { 747 c1 = dc01; 748 c2 = dc02; 749 } 750 751 /* prepare the destination addresses */ 752 spp = (mlib_d64 *) vis_alignaddr(sp, i); 753 754 sa1 = spp[0]; 755 756 if (i != 0) { 757 /* generate edge mask for the start point */ 758 emask = vis_edge8(dp, dend); 759 sa2 = spp[1]; 760 sa = vis_faligndata(sa1, sa2); 761 da = VIS_CONSTLOGIC(c2, sa); 762 vis_pst_8(da, dpp++, emask); 763 sa1 = sa2; 764 i += 8; 765 spp++; 766 } 767 768#pragma pipeloop(0) 769 for (; i < amount - 16; i += 16) { 770 sa2 = spp[1]; 771 ssa = vis_faligndata(sa1, sa2); 772 dpp[0] = VIS_CONSTLOGIC(c1, ssa); 773 sa3 = spp[2]; 774 ssa1 = vis_faligndata(sa2, sa3); 775 dpp[1] = VIS_CONSTLOGIC(c2, ssa1); 776 sa1 = sa3; 777 dpp += 2; 778 spp += 2; 779 } 780 781 if (i < amount) { 782 emask = vis_edge8(dpp, dend); 783 sa2 = spp[1]; 784 sa = vis_faligndata(sa1, sa2); 785 da = VIS_CONSTLOGIC(c1, sa); 786 vis_pst_8(da, dpp++, emask); 787 sa1 = sa2; 788 i += 8; 789 spp++; 790 } 791 792 if (i < amount) { 793 emask = vis_edge8(dpp, dend); 794 sa2 = spp[1]; 795 sa = vis_faligndata(sa1, sa2); 796 da = VIS_CONSTLOGIC(c2, sa); 797 vis_pst_8(da, dpp++, emask); 798 } 799 } 800 } 801 else { 802 803 sl = sp; 804 dl = dp; 805 806 amount = width; 807 808 for (j = 0; j < height; j++) { 809 810 dend = dp + amount - 1; 811 offdst = ((mlib_addr) dp) & 7; 812 offsrc = ((mlib_addr) sp) & 7; 813 814 if (offsrc == offdst) { 815 816 /* prepare the destination addresses */ 817 dpp = (mlib_d64 *) vis_alignaddr(dp, 0); 818 i = (mlib_u8 *) dpp - dp; 819 820 if (i != 0) { 821 vis_alignaddr((void *)(8 - offdst), 0); 822 c2 = vis_faligndata(dc02, dc01); 823 c1 = vis_faligndata(dc01, dc02); 824 } 825 else { 826 c1 = dc01; 827 c2 = dc02; 828 } 829 830 /* prepare the destination addresses */ 831 spp = (mlib_d64 *) vis_alignaddr(sp, 0); 832 833 if (i != 0) { 834 /* generate edge mask for the start point */ 835 emask = vis_edge8(dp, dend); 836 sa1 = *spp++; 837 da = VIS_CONSTLOGIC(c2, sa1); 838 vis_pst_8(da, dpp++, emask); 839 i += 8; 840 } 841 842#pragma pipeloop(0) 843 for (; i < amount - 16; i += 16) { 844 dpp[0] = VIS_CONSTLOGIC(c1, spp[0]); 845 dpp[1] = VIS_CONSTLOGIC(c2, spp[1]); 846 dpp += 2; 847 spp += 2; 848 } 849 850 if (i < amount) { 851 emask = vis_edge8(dpp, dend); 852 sa1 = *spp++; 853 da = VIS_CONSTLOGIC(c1, sa1); 854 vis_pst_8(da, dpp++, emask); 855 i += 8; 856 } 857 858 if (i < amount) { 859 emask = vis_edge8(dpp, dend); 860 sa1 = *spp; 861 da = VIS_CONSTLOGIC(c2, sa1); 862 vis_pst_8(da, dpp++, emask); 863 } 864 } 865 else { 866 /* prepare the destination addresses */ 867 dpp = (mlib_d64 *) vis_alignaddr(dp, 0); 868 i = (mlib_u8 *) dpp - dp; 869 870 if (i != 0) { 871 vis_alignaddr((void *)(8 - offdst), 0); 872 c2 = vis_faligndata(dc02, dc01); 873 c1 = vis_faligndata(dc01, dc02); 874 } 875 else { 876 c1 = dc01; 877 c2 = dc02; 878 } 879 880 /* prepare the destination addresses */ 881 spp = (mlib_d64 *) vis_alignaddr(sp, i); 882 883 sa1 = spp[0]; 884 885 if (i != 0) { 886 /* generate edge mask for the start point */ 887 emask = vis_edge8(dp, dend); 888 sa2 = spp[1]; 889 sa = vis_faligndata(sa1, sa2); 890 da = VIS_CONSTLOGIC(c2, sa); 891 vis_pst_8(da, dpp++, emask); 892 sa1 = sa2; 893 i += 8; 894 spp++; 895 } 896 897#pragma pipeloop(0) 898 for (; i < amount - 16; i += 16) { 899 sa2 = spp[1]; 900 ssa = vis_faligndata(sa1, sa2); 901 dpp[0] = VIS_CONSTLOGIC(c1, ssa); 902 sa3 = spp[2]; 903 ssa1 = vis_faligndata(sa2, sa3); 904 dpp[1] = VIS_CONSTLOGIC(c2, ssa1); 905 sa1 = sa3; 906 dpp += 2; 907 spp += 2; 908 } 909 910 if (i < amount) { 911 emask = vis_edge8(dpp, dend); 912 sa2 = spp[1]; 913 sa = vis_faligndata(sa1, sa2); 914 da = VIS_CONSTLOGIC(c1, sa); 915 vis_pst_8(da, dpp++, emask); 916 sa1 = sa2; 917 i += 8; 918 spp++; 919 } 920 921 if (i < amount) { 922 emask = vis_edge8(dpp, dend); 923 sa2 = spp[1]; 924 sa = vis_faligndata(sa1, sa2); 925 da = VIS_CONSTLOGIC(c2, sa); 926 vis_pst_8(da, dpp++, emask); 927 } 928 } 929 930 sp = sl += stride; 931 dp = dl += strided; 932 } 933 } 934 } 935 936 return MLIB_SUCCESS; 937} 938 939/***************************************************************/ 940 941#ifdef __cplusplus 942} 943#endif /* __cplusplus */ 944#endif /* __MLIB_V_IMAGECONSTLOGIC_H */ 945