| 39 | |
| 40 | template<typename T> |
| 41 | void padBorders(Param<T> out, CParam<T> in, const dim4 lBoundPadSize, |
| 42 | const dim4 uBoundPadSize, const af::borderType btype) { |
| 43 | const dim4& oDims = out.dims(); |
| 44 | const dim4& oStrs = out.strides(); |
| 45 | const dim4& iDims = in.dims(); |
| 46 | const dim4& iStrs = in.strides(); |
| 47 | |
| 48 | T const* const src = in.get(); |
| 49 | T* dst = out.get(); |
| 50 | |
| 51 | const dim4 validRegEnds( |
| 52 | oDims[0] - uBoundPadSize[0], oDims[1] - uBoundPadSize[1], |
| 53 | oDims[2] - uBoundPadSize[2], oDims[3] - uBoundPadSize[3]); |
| 54 | const bool isInputLinear = iStrs[0] == 1; |
| 55 | |
| 56 | /* |
| 57 | * VALID REGION COPYING DOES |
| 58 | * NOT NEED ANY BOUND CHECKS |
| 59 | * */ |
| 60 | for (dim_t l = lBoundPadSize[3]; l < validRegEnds[3]; ++l) { |
| 61 | dim_t oLOff = oStrs[3] * l; |
| 62 | dim_t iLOff = iStrs[3] * (l - lBoundPadSize[3]); |
| 63 | |
| 64 | for (dim_t k = lBoundPadSize[2]; k < validRegEnds[2]; ++k) { |
| 65 | dim_t oKOff = oStrs[2] * k; |
| 66 | dim_t iKOff = iStrs[2] * (k - lBoundPadSize[2]); |
| 67 | |
| 68 | for (dim_t j = lBoundPadSize[1]; j < validRegEnds[1]; ++j) { |
| 69 | dim_t oJOff = oStrs[1] * j; |
| 70 | dim_t iJOff = iStrs[1] * (j - lBoundPadSize[1]); |
| 71 | |
| 72 | if (isInputLinear) { |
| 73 | T const* const sptr = src + iLOff + iKOff + iJOff; |
| 74 | T* dptr = dst + oLOff + oKOff + oJOff + lBoundPadSize[0]; |
| 75 | |
| 76 | std::copy(sptr, sptr + iDims[0], dptr); |
| 77 | } else { |
| 78 | for (dim_t i = lBoundPadSize[0]; i < validRegEnds[0]; ++i) { |
| 79 | dim_t oIOff = oStrs[0] * i; |
| 80 | dim_t iIOff = iStrs[0] * (i - lBoundPadSize[0]); |
| 81 | |
| 82 | dst[oLOff + oKOff + oJOff + oIOff] = |
| 83 | src[iLOff + iKOff + iJOff + iIOff]; |
| 84 | } |
| 85 | } |
| 86 | } // second dimension loop |
| 87 | } // third dimension loop |
| 88 | } // fourth dimension loop |
| 89 | |
| 90 | // If we have to do zero padding, |
| 91 | // just return as the output is filled with |
| 92 | // zeros during allocation |
| 93 | if (btype == AF_PAD_ZERO) return; |
| 94 | |
| 95 | /* |
| 96 | * PADDED REGIONS NEED BOUND |
| 97 | * CHECKS; FOLLOWING NESTED |
| 98 | * LOOPS SHALL ONLY PROCESS |
nothing calls this directly
no test coverage detected