| Index: libvpx/source/libvpx/vp8/common/arm/loopfilter_arm.c
|
| diff --git a/libvpx/source/libvpx/vp8/common/arm/loopfilter_arm.c b/libvpx/source/libvpx/vp8/common/arm/loopfilter_arm.c
|
| index c841d455a0c6963ad01fd24c6bee3a4561db1549..3532a0356a91a355ce8eba8f057acf8b347c0662 100644
|
| --- a/libvpx/source/libvpx/vp8/common/arm/loopfilter_arm.c
|
| +++ b/libvpx/source/libvpx/vp8/common/arm/loopfilter_arm.c
|
| @@ -9,107 +9,135 @@
|
| */
|
|
|
|
|
| -#include "vpx_config.h"
|
| +#include "vpx_ports/config.h"
|
| +#include <math.h>
|
| #include "vp8/common/loopfilter.h"
|
| #include "vp8/common/onyxc_int.h"
|
|
|
| -#if HAVE_ARMV6
|
| extern prototype_loopfilter(vp8_loop_filter_horizontal_edge_armv6);
|
| extern prototype_loopfilter(vp8_loop_filter_vertical_edge_armv6);
|
| extern prototype_loopfilter(vp8_mbloop_filter_horizontal_edge_armv6);
|
| extern prototype_loopfilter(vp8_mbloop_filter_vertical_edge_armv6);
|
| -#endif
|
| +extern prototype_loopfilter(vp8_loop_filter_simple_horizontal_edge_armv6);
|
| +extern prototype_loopfilter(vp8_loop_filter_simple_vertical_edge_armv6);
|
| +
|
| +extern prototype_loopfilter(vp8_loop_filter_horizontal_edge_y_neon);
|
| +extern prototype_loopfilter(vp8_loop_filter_vertical_edge_y_neon);
|
| +extern prototype_loopfilter(vp8_mbloop_filter_horizontal_edge_y_neon);
|
| +extern prototype_loopfilter(vp8_mbloop_filter_vertical_edge_y_neon);
|
| +extern prototype_loopfilter(vp8_loop_filter_simple_horizontal_edge_neon);
|
| +extern prototype_loopfilter(vp8_loop_filter_simple_vertical_edge_neon);
|
| +
|
| +extern loop_filter_uvfunction vp8_loop_filter_horizontal_edge_uv_neon;
|
| +extern loop_filter_uvfunction vp8_loop_filter_vertical_edge_uv_neon;
|
| +extern loop_filter_uvfunction vp8_mbloop_filter_horizontal_edge_uv_neon;
|
| +extern loop_filter_uvfunction vp8_mbloop_filter_vertical_edge_uv_neon;
|
|
|
| -#if HAVE_ARMV7
|
| -typedef void loopfilter_y_neon(unsigned char *src, int pitch,
|
| - unsigned char blimit, unsigned char limit, unsigned char thresh);
|
| -typedef void loopfilter_uv_neon(unsigned char *u, int pitch,
|
| - unsigned char blimit, unsigned char limit, unsigned char thresh,
|
| - unsigned char *v);
|
| -
|
| -extern loopfilter_y_neon vp8_loop_filter_horizontal_edge_y_neon;
|
| -extern loopfilter_y_neon vp8_loop_filter_vertical_edge_y_neon;
|
| -extern loopfilter_y_neon vp8_mbloop_filter_horizontal_edge_y_neon;
|
| -extern loopfilter_y_neon vp8_mbloop_filter_vertical_edge_y_neon;
|
| -
|
| -extern loopfilter_uv_neon vp8_loop_filter_horizontal_edge_uv_neon;
|
| -extern loopfilter_uv_neon vp8_loop_filter_vertical_edge_uv_neon;
|
| -extern loopfilter_uv_neon vp8_mbloop_filter_horizontal_edge_uv_neon;
|
| -extern loopfilter_uv_neon vp8_mbloop_filter_vertical_edge_uv_neon;
|
| -#endif
|
|
|
| #if HAVE_ARMV6
|
| /*ARMV6 loopfilter functions*/
|
| /* Horizontal MB filtering */
|
| void vp8_loop_filter_mbh_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
| - int y_stride, int uv_stride, loop_filter_info *lfi)
|
| + int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
| {
|
| - vp8_mbloop_filter_horizontal_edge_armv6(y_ptr, y_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 2);
|
| + (void) simpler_lpf;
|
| + vp8_mbloop_filter_horizontal_edge_armv6(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
|
|
| if (u_ptr)
|
| - vp8_mbloop_filter_horizontal_edge_armv6(u_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1);
|
| + vp8_mbloop_filter_horizontal_edge_armv6(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1);
|
|
|
| if (v_ptr)
|
| - vp8_mbloop_filter_horizontal_edge_armv6(v_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1);
|
| + vp8_mbloop_filter_horizontal_edge_armv6(v_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1);
|
| +}
|
| +
|
| +void vp8_loop_filter_mbhs_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
| + int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
| +{
|
| + (void) u_ptr;
|
| + (void) v_ptr;
|
| + (void) uv_stride;
|
| + (void) simpler_lpf;
|
| + vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
| }
|
|
|
| /* Vertical MB Filtering */
|
| void vp8_loop_filter_mbv_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
| - int y_stride, int uv_stride, loop_filter_info *lfi)
|
| + int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
| {
|
| - vp8_mbloop_filter_vertical_edge_armv6(y_ptr, y_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 2);
|
| + (void) simpler_lpf;
|
| + vp8_mbloop_filter_vertical_edge_armv6(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
|
|
| if (u_ptr)
|
| - vp8_mbloop_filter_vertical_edge_armv6(u_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1);
|
| + vp8_mbloop_filter_vertical_edge_armv6(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1);
|
|
|
| if (v_ptr)
|
| - vp8_mbloop_filter_vertical_edge_armv6(v_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1);
|
| + vp8_mbloop_filter_vertical_edge_armv6(v_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, 1);
|
| +}
|
| +
|
| +void vp8_loop_filter_mbvs_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
| + int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
| +{
|
| + (void) u_ptr;
|
| + (void) v_ptr;
|
| + (void) uv_stride;
|
| + (void) simpler_lpf;
|
| + vp8_loop_filter_simple_vertical_edge_armv6(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
| }
|
|
|
| /* Horizontal B Filtering */
|
| void vp8_loop_filter_bh_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
| - int y_stride, int uv_stride, loop_filter_info *lfi)
|
| + int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
| {
|
| - vp8_loop_filter_horizontal_edge_armv6(y_ptr + 4 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
|
| - vp8_loop_filter_horizontal_edge_armv6(y_ptr + 8 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
|
| - vp8_loop_filter_horizontal_edge_armv6(y_ptr + 12 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
|
| + (void) simpler_lpf;
|
| + vp8_loop_filter_horizontal_edge_armv6(y_ptr + 4 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
| + vp8_loop_filter_horizontal_edge_armv6(y_ptr + 8 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
| + vp8_loop_filter_horizontal_edge_armv6(y_ptr + 12 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
|
|
| if (u_ptr)
|
| - vp8_loop_filter_horizontal_edge_armv6(u_ptr + 4 * uv_stride, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1);
|
| + vp8_loop_filter_horizontal_edge_armv6(u_ptr + 4 * uv_stride, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1);
|
|
|
| if (v_ptr)
|
| - vp8_loop_filter_horizontal_edge_armv6(v_ptr + 4 * uv_stride, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1);
|
| + vp8_loop_filter_horizontal_edge_armv6(v_ptr + 4 * uv_stride, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1);
|
| }
|
|
|
| -void vp8_loop_filter_bhs_armv6(unsigned char *y_ptr, int y_stride,
|
| - const unsigned char *blimit)
|
| +void vp8_loop_filter_bhs_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
| + int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
| {
|
| - vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr + 4 * y_stride, y_stride, blimit);
|
| - vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr + 8 * y_stride, y_stride, blimit);
|
| - vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr + 12 * y_stride, y_stride, blimit);
|
| + (void) u_ptr;
|
| + (void) v_ptr;
|
| + (void) uv_stride;
|
| + (void) simpler_lpf;
|
| + vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr + 4 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
| + vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr + 8 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
| + vp8_loop_filter_simple_horizontal_edge_armv6(y_ptr + 12 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
| }
|
|
|
| /* Vertical B Filtering */
|
| void vp8_loop_filter_bv_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
| - int y_stride, int uv_stride, loop_filter_info *lfi)
|
| + int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
| {
|
| - vp8_loop_filter_vertical_edge_armv6(y_ptr + 4, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
|
| - vp8_loop_filter_vertical_edge_armv6(y_ptr + 8, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
|
| - vp8_loop_filter_vertical_edge_armv6(y_ptr + 12, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
|
| + (void) simpler_lpf;
|
| + vp8_loop_filter_vertical_edge_armv6(y_ptr + 4, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
| + vp8_loop_filter_vertical_edge_armv6(y_ptr + 8, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
| + vp8_loop_filter_vertical_edge_armv6(y_ptr + 12, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
|
|
| if (u_ptr)
|
| - vp8_loop_filter_vertical_edge_armv6(u_ptr + 4, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1);
|
| + vp8_loop_filter_vertical_edge_armv6(u_ptr + 4, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1);
|
|
|
| if (v_ptr)
|
| - vp8_loop_filter_vertical_edge_armv6(v_ptr + 4, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1);
|
| + vp8_loop_filter_vertical_edge_armv6(v_ptr + 4, uv_stride, lfi->flim, lfi->lim, lfi->thr, 1);
|
| }
|
|
|
| -void vp8_loop_filter_bvs_armv6(unsigned char *y_ptr, int y_stride,
|
| - const unsigned char *blimit)
|
| +void vp8_loop_filter_bvs_armv6(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
| + int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
| {
|
| - vp8_loop_filter_simple_vertical_edge_armv6(y_ptr + 4, y_stride, blimit);
|
| - vp8_loop_filter_simple_vertical_edge_armv6(y_ptr + 8, y_stride, blimit);
|
| - vp8_loop_filter_simple_vertical_edge_armv6(y_ptr + 12, y_stride, blimit);
|
| + (void) u_ptr;
|
| + (void) v_ptr;
|
| + (void) uv_stride;
|
| + (void) simpler_lpf;
|
| + vp8_loop_filter_simple_vertical_edge_armv6(y_ptr + 4, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
| + vp8_loop_filter_simple_vertical_edge_armv6(y_ptr + 8, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
| + vp8_loop_filter_simple_vertical_edge_armv6(y_ptr + 12, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
| }
|
| #endif
|
|
|
| @@ -117,60 +145,93 @@ void vp8_loop_filter_bvs_armv6(unsigned char *y_ptr, int y_stride,
|
| /* NEON loopfilter functions */
|
| /* Horizontal MB filtering */
|
| void vp8_loop_filter_mbh_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
| - int y_stride, int uv_stride, loop_filter_info *lfi)
|
| + int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
| {
|
| - unsigned char mblim = *lfi->mblim;
|
| - unsigned char lim = *lfi->lim;
|
| - unsigned char hev_thr = *lfi->hev_thr;
|
| - vp8_mbloop_filter_horizontal_edge_y_neon(y_ptr, y_stride, mblim, lim, hev_thr);
|
| + (void) simpler_lpf;
|
| + vp8_mbloop_filter_horizontal_edge_y_neon(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
|
|
| if (u_ptr)
|
| - vp8_mbloop_filter_horizontal_edge_uv_neon(u_ptr, uv_stride, mblim, lim, hev_thr, v_ptr);
|
| + vp8_mbloop_filter_horizontal_edge_uv_neon(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, v_ptr);
|
| +}
|
| +
|
| +void vp8_loop_filter_mbhs_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
| + int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
| +{
|
| + (void) u_ptr;
|
| + (void) v_ptr;
|
| + (void) uv_stride;
|
| + (void) simpler_lpf;
|
| + vp8_loop_filter_simple_horizontal_edge_neon(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
| }
|
|
|
| /* Vertical MB Filtering */
|
| void vp8_loop_filter_mbv_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
| - int y_stride, int uv_stride, loop_filter_info *lfi)
|
| + int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
| {
|
| - unsigned char mblim = *lfi->mblim;
|
| - unsigned char lim = *lfi->lim;
|
| - unsigned char hev_thr = *lfi->hev_thr;
|
| -
|
| - vp8_mbloop_filter_vertical_edge_y_neon(y_ptr, y_stride, mblim, lim, hev_thr);
|
| + (void) simpler_lpf;
|
| + vp8_mbloop_filter_vertical_edge_y_neon(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
|
|
| if (u_ptr)
|
| - vp8_mbloop_filter_vertical_edge_uv_neon(u_ptr, uv_stride, mblim, lim, hev_thr, v_ptr);
|
| + vp8_mbloop_filter_vertical_edge_uv_neon(u_ptr, uv_stride, lfi->mbflim, lfi->lim, lfi->thr, v_ptr);
|
| +}
|
| +
|
| +void vp8_loop_filter_mbvs_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
| + int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
| +{
|
| + (void) u_ptr;
|
| + (void) v_ptr;
|
| + (void) uv_stride;
|
| + (void) simpler_lpf;
|
| + vp8_loop_filter_simple_vertical_edge_neon(y_ptr, y_stride, lfi->mbflim, lfi->lim, lfi->thr, 2);
|
| }
|
|
|
| /* Horizontal B Filtering */
|
| void vp8_loop_filter_bh_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
| - int y_stride, int uv_stride, loop_filter_info *lfi)
|
| + int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
| {
|
| - unsigned char blim = *lfi->blim;
|
| - unsigned char lim = *lfi->lim;
|
| - unsigned char hev_thr = *lfi->hev_thr;
|
| -
|
| - vp8_loop_filter_horizontal_edge_y_neon(y_ptr + 4 * y_stride, y_stride, blim, lim, hev_thr);
|
| - vp8_loop_filter_horizontal_edge_y_neon(y_ptr + 8 * y_stride, y_stride, blim, lim, hev_thr);
|
| - vp8_loop_filter_horizontal_edge_y_neon(y_ptr + 12 * y_stride, y_stride, blim, lim, hev_thr);
|
| + (void) simpler_lpf;
|
| + vp8_loop_filter_horizontal_edge_y_neon(y_ptr + 4 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
| + vp8_loop_filter_horizontal_edge_y_neon(y_ptr + 8 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
| + vp8_loop_filter_horizontal_edge_y_neon(y_ptr + 12 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
|
|
| if (u_ptr)
|
| - vp8_loop_filter_horizontal_edge_uv_neon(u_ptr + 4 * uv_stride, uv_stride, blim, lim, hev_thr, v_ptr + 4 * uv_stride);
|
| + vp8_loop_filter_horizontal_edge_uv_neon(u_ptr + 4 * uv_stride, uv_stride, lfi->flim, lfi->lim, lfi->thr, v_ptr + 4 * uv_stride);
|
| +}
|
| +
|
| +void vp8_loop_filter_bhs_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
| + int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
| +{
|
| + (void) u_ptr;
|
| + (void) v_ptr;
|
| + (void) uv_stride;
|
| + (void) simpler_lpf;
|
| + vp8_loop_filter_simple_horizontal_edge_neon(y_ptr + 4 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
| + vp8_loop_filter_simple_horizontal_edge_neon(y_ptr + 8 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
| + vp8_loop_filter_simple_horizontal_edge_neon(y_ptr + 12 * y_stride, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
| }
|
|
|
| /* Vertical B Filtering */
|
| void vp8_loop_filter_bv_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
| - int y_stride, int uv_stride, loop_filter_info *lfi)
|
| + int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
| {
|
| - unsigned char blim = *lfi->blim;
|
| - unsigned char lim = *lfi->lim;
|
| - unsigned char hev_thr = *lfi->hev_thr;
|
| -
|
| - vp8_loop_filter_vertical_edge_y_neon(y_ptr + 4, y_stride, blim, lim, hev_thr);
|
| - vp8_loop_filter_vertical_edge_y_neon(y_ptr + 8, y_stride, blim, lim, hev_thr);
|
| - vp8_loop_filter_vertical_edge_y_neon(y_ptr + 12, y_stride, blim, lim, hev_thr);
|
| + (void) simpler_lpf;
|
| + vp8_loop_filter_vertical_edge_y_neon(y_ptr + 4, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
| + vp8_loop_filter_vertical_edge_y_neon(y_ptr + 8, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
| + vp8_loop_filter_vertical_edge_y_neon(y_ptr + 12, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
|
|
| if (u_ptr)
|
| - vp8_loop_filter_vertical_edge_uv_neon(u_ptr + 4, uv_stride, blim, lim, hev_thr, v_ptr + 4);
|
| + vp8_loop_filter_vertical_edge_uv_neon(u_ptr + 4, uv_stride, lfi->flim, lfi->lim, lfi->thr, v_ptr + 4);
|
| +}
|
| +
|
| +void vp8_loop_filter_bvs_neon(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
|
| + int y_stride, int uv_stride, loop_filter_info *lfi, int simpler_lpf)
|
| +{
|
| + (void) u_ptr;
|
| + (void) v_ptr;
|
| + (void) uv_stride;
|
| + (void) simpler_lpf;
|
| + vp8_loop_filter_simple_vertical_edge_neon(y_ptr + 4, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
| + vp8_loop_filter_simple_vertical_edge_neon(y_ptr + 8, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
| + vp8_loop_filter_simple_vertical_edge_neon(y_ptr + 12, y_stride, lfi->flim, lfi->lim, lfi->thr, 2);
|
| }
|
| #endif
|
|
|