gnu / gcc / fba228e259dd5112851527f2dbb62c5601100985 / . / gcc / testsuite / gcc.target / aarch64 / narrow_high-intrinsics.c

/* { dg-do compile } */ | |

/* { dg-options "-O3" } */ | |

#include "arm_neon.h" | |

#define TWO(name, rettype, rmwtype, intype, fs) \ | |

rettype test_ ## name ## _ ## fs \ | |

(rmwtype a, intype b, intype c) \ | |

{ \ | |

return name ## _ ## fs (a, b, c); \ | |

} | |

TWO (vsubhn_high, int8x16_t, int8x8_t, int16x8_t, s16) | |

TWO (vsubhn_high, int16x8_t, int16x4_t, int32x4_t, s32) | |

TWO (vsubhn_high, int32x4_t, int32x2_t, int64x2_t, s64) | |

TWO (vsubhn_high, uint8x16_t, uint8x8_t, uint16x8_t, u16) | |

TWO (vsubhn_high, uint16x8_t, uint16x4_t, uint32x4_t, u32) | |

TWO (vsubhn_high, uint32x4_t, uint32x2_t, uint64x2_t, u64) | |

TWO (vaddhn_high, int8x16_t, int8x8_t, int16x8_t, s16) | |

TWO (vaddhn_high, int16x8_t, int16x4_t, int32x4_t, s32) | |

TWO (vaddhn_high, int32x4_t, int32x2_t, int64x2_t, s64) | |

TWO (vaddhn_high, uint8x16_t, uint8x8_t, uint16x8_t, u16) | |

TWO (vaddhn_high, uint16x8_t, uint16x4_t, uint32x4_t, u32) | |

TWO (vaddhn_high, uint32x4_t, uint32x2_t, uint64x2_t, u64) | |

TWO (vrsubhn_high, int8x16_t, int8x8_t, int16x8_t, s16) | |

TWO (vrsubhn_high, int16x8_t, int16x4_t, int32x4_t, s32) | |

TWO (vrsubhn_high, int32x4_t, int32x2_t, int64x2_t, s64) | |

TWO (vrsubhn_high, uint8x16_t, uint8x8_t, uint16x8_t, u16) | |

TWO (vrsubhn_high, uint16x8_t, uint16x4_t, uint32x4_t, u32) | |

TWO (vrsubhn_high, uint32x4_t, uint32x2_t, uint64x2_t, u64) | |

TWO (vraddhn_high, int8x16_t, int8x8_t, int16x8_t, s16) | |

TWO (vraddhn_high, int16x8_t, int16x4_t, int32x4_t, s32) | |

TWO (vraddhn_high, int32x4_t, int32x2_t, int64x2_t, s64) | |

TWO (vraddhn_high, uint8x16_t, uint8x8_t, uint16x8_t, u16) | |

TWO (vraddhn_high, uint16x8_t, uint16x4_t, uint32x4_t, u32) | |

TWO (vraddhn_high, uint32x4_t, uint32x2_t, uint64x2_t, u64) | |

#define TWOn(name, rettype, rmwtype, intype, fs) \ | |

rettype test_ ## name ## _ ## fs \ | |

(rmwtype a, intype b) \ | |

{ \ | |

return name ## _ ## fs (a, b, 4); \ | |

} | |

TWOn (vrshrn_high_n, int8x16_t, int8x8_t, int16x8_t, s16) | |

TWOn (vrshrn_high_n, int16x8_t, int16x4_t, int32x4_t, s32) | |

TWOn (vrshrn_high_n, int32x4_t, int32x2_t, int64x2_t, s64) | |

TWOn (vrshrn_high_n, uint8x16_t, uint8x8_t, uint16x8_t, u16) | |

TWOn (vrshrn_high_n, uint16x8_t, uint16x4_t, uint32x4_t, u32) | |

TWOn (vrshrn_high_n, uint32x4_t, uint32x2_t, uint64x2_t, u64) | |

TWOn (vshrn_high_n, int8x16_t, int8x8_t, int16x8_t, s16) | |

TWOn (vshrn_high_n, int16x8_t, int16x4_t, int32x4_t, s32) | |

TWOn (vshrn_high_n, int32x4_t, int32x2_t, int64x2_t, s64) | |

TWOn (vshrn_high_n, uint8x16_t, uint8x8_t, uint16x8_t, u16) | |

TWOn (vshrn_high_n, uint16x8_t, uint16x4_t, uint32x4_t, u32) | |

TWOn (vshrn_high_n, uint32x4_t, uint32x2_t, uint64x2_t, u64) | |

TWOn (vqshrun_high_n, uint8x16_t, uint8x8_t, int16x8_t, s16) | |

TWOn (vqshrun_high_n, uint16x8_t, uint16x4_t, int32x4_t, s32) | |

TWOn (vqshrun_high_n, uint32x4_t, uint32x2_t, int64x2_t, s64) | |

TWOn (vqrshrun_high_n, uint8x16_t, uint8x8_t, int16x8_t, s16) | |

TWOn (vqrshrun_high_n, uint16x8_t, uint16x4_t, int32x4_t, s32) | |

TWOn (vqrshrun_high_n, uint32x4_t, uint32x2_t, int64x2_t, s64) | |

TWOn (vqshrn_high_n, int8x16_t, int8x8_t, int16x8_t, s16) | |

TWOn (vqshrn_high_n, int16x8_t, int16x4_t, int32x4_t, s32) | |

TWOn (vqshrn_high_n, int32x4_t, int32x2_t, int64x2_t, s64) | |

TWOn (vqshrn_high_n, uint8x16_t, uint8x8_t, uint16x8_t, u16) | |

TWOn (vqshrn_high_n, uint16x8_t, uint16x4_t, uint32x4_t, u32) | |

TWOn (vqshrn_high_n, uint32x4_t, uint32x2_t, uint64x2_t, u64) | |

TWOn (vqrshrn_high_n, int8x16_t, int8x8_t, int16x8_t, s16) | |

TWOn (vqrshrn_high_n, int16x8_t, int16x4_t, int32x4_t, s32) | |

TWOn (vqrshrn_high_n, int32x4_t, int32x2_t, int64x2_t, s64) | |

TWOn (vqrshrn_high_n, uint8x16_t, uint8x8_t, uint16x8_t, u16) | |

TWOn (vqrshrn_high_n, uint16x8_t, uint16x4_t, uint32x4_t, u32) | |

TWOn (vqrshrn_high_n, uint32x4_t, uint32x2_t, uint64x2_t, u64) | |

#define ONE(name, rettype, rmwtype, intype, fs) \ | |

rettype test_ ## name ## _ ## fs \ | |

(rmwtype a, intype b) \ | |

{ \ | |

return name ## _ ## fs (a, b); \ | |

} | |

ONE (vqmovn_high, int8x16_t, int8x8_t, int16x8_t, s16) | |

ONE (vqmovn_high, int16x8_t, int16x4_t, int32x4_t, s32) | |

ONE (vqmovn_high, int32x4_t, int32x2_t, int64x2_t, s64) | |

ONE (vqmovn_high, uint8x16_t, uint8x8_t, uint16x8_t, u16) | |

ONE (vqmovn_high, uint16x8_t, uint16x4_t, uint32x4_t, u32) | |

ONE (vqmovn_high, uint32x4_t, uint32x2_t, uint64x2_t, u64) | |

ONE (vqmovun_high, uint8x16_t, uint8x8_t, int16x8_t, s16) | |

ONE (vqmovun_high, uint16x8_t, uint16x4_t, int32x4_t, s32) | |

ONE (vqmovun_high, uint32x4_t, uint32x2_t, int64x2_t, s64) | |

ONE (vmovn_high, int8x16_t, int8x8_t, int16x8_t, s16) | |

ONE (vmovn_high, int16x8_t, int16x4_t, int32x4_t, s32) | |

ONE (vmovn_high, int32x4_t, int32x2_t, int64x2_t, s64) | |

ONE (vmovn_high, uint8x16_t, uint8x8_t, uint16x8_t, u16) | |

ONE (vmovn_high, uint16x8_t, uint16x4_t, uint32x4_t, u32) | |

ONE (vmovn_high, uint32x4_t, uint32x2_t, uint64x2_t, u64) | |

/* { dg-final { scan-assembler-times "\\tsubhn2\\tv" 6} } */ | |

/* { dg-final { scan-assembler-times "\\taddhn2\\tv" 6} } */ | |

/* { dg-final { scan-assembler-times "rsubhn2\\tv" 6} } */ | |

/* { dg-final { scan-assembler-times "raddhn2\\tv" 6} } */ | |

/* { dg-final { scan-assembler-times "\\trshrn2\\tv" 6} } */ | |

/* { dg-final { scan-assembler-times "\\tshrn2\\tv" 6} } */ | |

/* { dg-final { scan-assembler-times "sqshrun2\\tv" 3} } */ | |

/* { dg-final { scan-assembler-times "sqrshrun2\\tv" 3} } */ | |

/* { dg-final { scan-assembler-times "sqshrn2\\tv" 3} } */ | |

/* { dg-final { scan-assembler-times "uqshrn2\\tv" 3} } */ | |

/* { dg-final { scan-assembler-times "sqrshrn2\\tv" 3} } */ | |

/* { dg-final { scan-assembler-times "uqrshrn2\\tv" 3} } */ | |

/* { dg-final { scan-assembler-times "uqxtn2\\tv" 3} } */ | |

/* { dg-final { scan-assembler-times "sqxtn2\\tv" 3} } */ | |

/* { dg-final { scan-assembler-times "sqxtun2\\tv" 3} } */ | |

/* { dg-final { scan-assembler-times "\\txtn2\\tv" 6} } */ |