Name Strings

    cl_amd_media_ops2

    #pragma OPENCL EXTENSION cl_amd_media_ops2 : enable

Contributors


Version

    

Number

    OpenCL Extension #15

Status

    ?

Extension Type

    OpenCL compiler directive for extensions

Dependencies

    None

Overview

    The directive when enabled adds the following built-in functions to
    the OpenCL language.

    Note: typen denote open scalar type { n = 1 } and vector types
          { n = 2, 4, 8, 16 }.

    Build-in Function  
      uintn  amd_msad (uintn src0, uintn src1, uintn src2)  
    Description
      uchar4 src0u8 = as_uchar4(src0.s0);
      uchar4 src1u8 = as_uchar4(src1.s0);
      dst.s0 = src2.s0 + 
               ((src1u8.s0 == 0) ? 0 : abs(src0u8.s0 - src1u8.s0)) +
               ((src1u8.s1 == 0) ? 0 : abs(src0u8.s1 - src1u8.s1)) +
               ((src1u8.s2 == 0) ? 0 : abs(src0u8.s2 - src1u8.s2)) +
               ((src1u8.s3 == 0) ? 0 : abs(src0u8.s3 - src1u8.s3));
      similar operation applied to other components of the vectors

    Build-in Function  
      ulongn amd_qsad (ulongn src0, uintn src1, ulongn src2)  
    Description
      uchar8 src0u8 = as_uchar8(src0.s0);
      ushort4 src2u16 = as_ushort4(src2.s0);
      ushort4 dstu16;
      dstu16.s0 = amd_sad(as_uint(src0u8.s0123), src1.s0, src2u16.s0);
      dstu16.s1 = amd_sad(as_uint(src0u8.s1234), src1.s0, src2u16.s1);
      dstu16.s2 = amd_sad(as_uint(src0u8.s2345), src1.s0, src2u16.s2);
      dstu16.s3 = amd_sad(as_uint(src0u8.s3456), src1.s0, src2u16.s3);
      dst.s0 = as_uint2(dstu16);
      similar operation applied to other components of the vectors

    Build-in Function  
      ulongn amd_mqsad (ulongn src0, uintn src1, ulongn src2)  
    Description
      uchar8 src0u8 = as_uchar8(src0.s0);
      ushort4 src2u16 = as_ushort4(src2.s0);
      ushort4 dstu16;
      dstu16.s0 = amd_msad(as_uint(src0u8.s0123), src1.s0, src2u16.s0);
      dstu16.s1 = amd_msad(as_uint(src0u8.s1234), src1.s0, src2u16.s1);
      dstu16.s2 = amd_msad(as_uint(src0u8.s2345), src1.s0, src2u16.s2);
      dstu16.s3 = amd_msad(as_uint(src0u8.s3456), src1.s0, src2u16.s3);
      dst.s0 = as_uint2(dstu16);
      similar operation applied to other components of the vectors

    Build-in Function  
      uintn  amd_sadw (uintn src0, uintn src1, uintn src2)  
    Description
      ushort2 src0u16 = as_ushort2(src0.s0);
      ushort2 src1u16 = as_ushort2(src1.s0);
      dst.s0 = src2.s0 + 
               abs(src0u16.s0 - src1u16.s0) +
               abs(src0u16.s1 - src1u16.s1);
      similar operation applied to other components of the vectors

    Build-in Function  
      uintn  amd_sadd (uintn src0, uintn src1, uintn src2)  
    Description
      dst.s0 = src2.s0 +  abs(src0.s0 - src1.s0);
      similar operation applied to other components of the vectors

    Built-in Function:
      uintn amd_bfm (uintn src0, uintn src1) 
    Description
      dst.s0 = ((1 << (src0.s0 & 0x1f)) - 1) << (src1.s0 & 0x1f);
      similar operation applied to other components of the vectors

    Built-in Function:
      uintn amd_bfe (uintn src0, uintn src1, uintn src2) 
    Description
      NOTE: operator >> below represent logical right shift
      offset = src1.s0 & 31;
      width = src2.s0 & 31;
      if width = 0
          dst.s0 = 0;
      else if (offset + width) < 32
          dst.s0 = (src0.s0 << (32 - offset - width)) >> (32 - width);
      else
          dst.s0 = src0.s0 >> offset;
      similar operation applied to other components of the vectors

    Built-in Function:
       intn amd_bfe (intn src0, uintn src1, uintn src2) 
    Description
      NOTE: operator >> below represent arithmetic right shift
      offset = src1.s0 & 31;
      width = src2.s0 & 31;
      if width = 0
          dst.s0 = 0;
      else if (offset + width) < 32
          dst.s0 = src0.s0 << (32-offset-width) >> 32-width;
      else
          dst.s0 = src0.s0 >> offset;
      similar operation applied to other components of the vectors

    Built-in Function:
       intn amd_median3 (intn src0, intn src1, intn src2) 
       uintn amd_median3 (uintn src0, uintn src1, uintn src2) 
       floatn amd_median3 (floatn src0, floatn src1, floattn src2) 
    Description
       returns median of src0, src1, and src2

    Built-in Function:
       intn amd_min3 (intn src0, intn src1, intn src2) 
       uintn amd_min3 (uintn src0, uintn src1, uintn src2) 
       floatn amd_min3 (floatn src0, floatn src1, floattn src2) 
    Description
       returns min of src0, src1, and src2

    Built-in Function:
       intn amd_max3 (intn src0, intn src1, intn src2) 
       uintn amd_max3 (uintn src0, uintn src1, uintn src2) 
       floatn amd_max3 (floatn src0, floatn src1, floattn src2) 
    Description
       returns max of src0, src1, and src2

Header File

    None

New Types

    None

New Procedures and Functions

    None
