/src/test/codegen/simd-intrinsic/simd-intrinsic-generic-arithmetic-saturating.rs

https://gitlab.com/rust-lang/rust · Rust · 692 lines · 418 code · 104 blank · 170 comment · 0 complexity · 1b2dfb3ef7eb16365565f8dde462f81d MD5 · raw file

  1. // compile-flags: -C no-prepopulate-passes
  2. //
  3. #![crate_type = "lib"]
  4. #![feature(repr_simd, platform_intrinsics)]
  5. #![allow(non_camel_case_types)]
  6. #![deny(unused)]
  7. // signed integer types
  8. #[repr(simd)] #[derive(Copy, Clone)] pub struct i8x2(i8, i8);
  9. #[repr(simd)] #[derive(Copy, Clone)] pub struct i8x4(i8, i8, i8, i8);
  10. #[repr(simd)] #[derive(Copy, Clone)] pub struct i8x8(
  11. i8, i8, i8, i8, i8, i8, i8, i8,
  12. );
  13. #[repr(simd)] #[derive(Copy, Clone)] pub struct i8x16(
  14. i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8,
  15. );
  16. #[repr(simd)] #[derive(Copy, Clone)] pub struct i8x32(
  17. i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8,
  18. i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8,
  19. );
  20. #[repr(simd)] #[derive(Copy, Clone)] pub struct i8x64(
  21. i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8,
  22. i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8,
  23. i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8,
  24. i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8,
  25. );
  26. #[repr(simd)] #[derive(Copy, Clone)] pub struct i16x2(i16, i16);
  27. #[repr(simd)] #[derive(Copy, Clone)] pub struct i16x4(i16, i16, i16, i16);
  28. #[repr(simd)] #[derive(Copy, Clone)] pub struct i16x8(
  29. i16, i16, i16, i16, i16, i16, i16, i16,
  30. );
  31. #[repr(simd)] #[derive(Copy, Clone)] pub struct i16x16(
  32. i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16,
  33. );
  34. #[repr(simd)] #[derive(Copy, Clone)] pub struct i16x32(
  35. i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16,
  36. i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16,
  37. );
  38. #[repr(simd)] #[derive(Copy, Clone)] pub struct i32x2(i32, i32);
  39. #[repr(simd)] #[derive(Copy, Clone)] pub struct i32x4(i32, i32, i32, i32);
  40. #[repr(simd)] #[derive(Copy, Clone)] pub struct i32x8(
  41. i32, i32, i32, i32, i32, i32, i32, i32,
  42. );
  43. #[repr(simd)] #[derive(Copy, Clone)] pub struct i32x16(
  44. i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32,
  45. );
  46. #[repr(simd)] #[derive(Copy, Clone)] pub struct i64x2(i64, i64);
  47. #[repr(simd)] #[derive(Copy, Clone)] pub struct i64x4(i64, i64, i64, i64);
  48. #[repr(simd)] #[derive(Copy, Clone)] pub struct i64x8(
  49. i64, i64, i64, i64, i64, i64, i64, i64,
  50. );
  51. #[repr(simd)] #[derive(Copy, Clone)] pub struct i128x2(i128, i128);
  52. #[repr(simd)] #[derive(Copy, Clone)] pub struct i128x4(i128, i128, i128, i128);
  53. // unsigned integer types
  54. #[repr(simd)] #[derive(Copy, Clone)] pub struct u8x2(u8, u8);
  55. #[repr(simd)] #[derive(Copy, Clone)] pub struct u8x4(u8, u8, u8, u8);
  56. #[repr(simd)] #[derive(Copy, Clone)] pub struct u8x8(
  57. u8, u8, u8, u8, u8, u8, u8, u8,
  58. );
  59. #[repr(simd)] #[derive(Copy, Clone)] pub struct u8x16(
  60. u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8,
  61. );
  62. #[repr(simd)] #[derive(Copy, Clone)] pub struct u8x32(
  63. u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8,
  64. u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8,
  65. );
  66. #[repr(simd)] #[derive(Copy, Clone)] pub struct u8x64(
  67. u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8,
  68. u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8,
  69. u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8,
  70. u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8,
  71. );
  72. #[repr(simd)] #[derive(Copy, Clone)] pub struct u16x2(u16, u16);
  73. #[repr(simd)] #[derive(Copy, Clone)] pub struct u16x4(u16, u16, u16, u16);
  74. #[repr(simd)] #[derive(Copy, Clone)] pub struct u16x8(
  75. u16, u16, u16, u16, u16, u16, u16, u16,
  76. );
  77. #[repr(simd)] #[derive(Copy, Clone)] pub struct u16x16(
  78. u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16,
  79. );
  80. #[repr(simd)] #[derive(Copy, Clone)] pub struct u16x32(
  81. u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16,
  82. u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16,
  83. );
  84. #[repr(simd)] #[derive(Copy, Clone)] pub struct u32x2(u32, u32);
  85. #[repr(simd)] #[derive(Copy, Clone)] pub struct u32x4(u32, u32, u32, u32);
  86. #[repr(simd)] #[derive(Copy, Clone)] pub struct u32x8(
  87. u32, u32, u32, u32, u32, u32, u32, u32,
  88. );
  89. #[repr(simd)] #[derive(Copy, Clone)] pub struct u32x16(
  90. u32, u32, u32, u32, u32, u32, u32, u32, u32, u32, u32, u32, u32, u32, u32, u32,
  91. );
  92. #[repr(simd)] #[derive(Copy, Clone)] pub struct u64x2(u64, u64);
  93. #[repr(simd)] #[derive(Copy, Clone)] pub struct u64x4(u64, u64, u64, u64);
  94. #[repr(simd)] #[derive(Copy, Clone)] pub struct u64x8(
  95. u64, u64, u64, u64, u64, u64, u64, u64,
  96. );
  97. #[repr(simd)] #[derive(Copy, Clone)] pub struct u128x2(u128, u128);
  98. #[repr(simd)] #[derive(Copy, Clone)] pub struct u128x4(u128, u128, u128, u128);
  99. extern "platform-intrinsic" {
  100. fn simd_saturating_add<T>(x: T, y: T) -> T;
  101. fn simd_saturating_sub<T>(x: T, y: T) -> T;
  102. }
  103. // NOTE(eddyb) `%{{x|_3}}` is used because on some targets (e.g. WASM)
  104. // SIMD vectors are passed directly, resulting in `%x` being a vector,
  105. // while on others they're passed indirectly, resulting in `%x` being
  106. // a pointer to a vector, and `%_3` a vector loaded from that pointer.
  107. // This is controlled by the target spec option `simd_types_indirect`.
  108. // The same applies to `%{{y|_4}}` as well.
  109. // CHECK-LABEL: @sadd_i8x2
  110. #[no_mangle]
  111. pub unsafe fn sadd_i8x2(x: i8x2, y: i8x2) -> i8x2 {
  112. // CHECK: %{{[0-9]+}} = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> %{{x|_3}}, <2 x i8> %{{y|_4}})
  113. simd_saturating_add(x, y)
  114. }
  115. // CHECK-LABEL: @sadd_i8x4
  116. #[no_mangle]
  117. pub unsafe fn sadd_i8x4(x: i8x4, y: i8x4) -> i8x4 {
  118. // CHECK: %{{[0-9]+}} = call <4 x i8> @llvm.sadd.sat.v4i8(<4 x i8> %{{x|_3}}, <4 x i8> %{{y|_4}})
  119. simd_saturating_add(x, y)
  120. }
  121. // CHECK-LABEL: @sadd_i8x8
  122. #[no_mangle]
  123. pub unsafe fn sadd_i8x8(x: i8x8, y: i8x8) -> i8x8 {
  124. // CHECK: %{{[0-9]+}} = call <8 x i8> @llvm.sadd.sat.v8i8(<8 x i8> %{{x|_3}}, <8 x i8> %{{y|_4}})
  125. simd_saturating_add(x, y)
  126. }
  127. // CHECK-LABEL: @sadd_i8x16
  128. #[no_mangle]
  129. pub unsafe fn sadd_i8x16(x: i8x16, y: i8x16) -> i8x16 {
  130. // CHECK: %{{[0-9]+}} = call <16 x i8> @llvm.sadd.sat.v16i8(<16 x i8> %{{x|_3}}, <16 x i8> %{{y|_4}})
  131. simd_saturating_add(x, y)
  132. }
  133. // CHECK-LABEL: @sadd_i8x32
  134. #[no_mangle]
  135. pub unsafe fn sadd_i8x32(x: i8x32, y: i8x32) -> i8x32 {
  136. // CHECK: %{{[0-9]+}} = call <32 x i8> @llvm.sadd.sat.v32i8(<32 x i8> %{{x|_3}}, <32 x i8> %{{y|_4}})
  137. simd_saturating_add(x, y)
  138. }
  139. // CHECK-LABEL: @sadd_i8x64
  140. #[no_mangle]
  141. pub unsafe fn sadd_i8x64(x: i8x64, y: i8x64) -> i8x64 {
  142. // CHECK: %{{[0-9]+}} = call <64 x i8> @llvm.sadd.sat.v64i8(<64 x i8> %{{x|_3}}, <64 x i8> %{{y|_4}})
  143. simd_saturating_add(x, y)
  144. }
  145. // CHECK-LABEL: @sadd_i16x2
  146. #[no_mangle]
  147. pub unsafe fn sadd_i16x2(x: i16x2, y: i16x2) -> i16x2 {
  148. // CHECK: %{{[0-9]+}} = call <2 x i16> @llvm.sadd.sat.v2i16(<2 x i16> %{{x|_3}}, <2 x i16> %{{y|_4}})
  149. simd_saturating_add(x, y)
  150. }
  151. // CHECK-LABEL: @sadd_i16x4
  152. #[no_mangle]
  153. pub unsafe fn sadd_i16x4(x: i16x4, y: i16x4) -> i16x4 {
  154. // CHECK: %{{[0-9]+}} = call <4 x i16> @llvm.sadd.sat.v4i16(<4 x i16> %{{x|_3}}, <4 x i16> %{{y|_4}})
  155. simd_saturating_add(x, y)
  156. }
  157. // CHECK-LABEL: @sadd_i16x8
  158. #[no_mangle]
  159. pub unsafe fn sadd_i16x8(x: i16x8, y: i16x8) -> i16x8 {
  160. // CHECK: %{{[0-9]+}} = call <8 x i16> @llvm.sadd.sat.v8i16(<8 x i16> %{{x|_3}}, <8 x i16> %{{y|_4}})
  161. simd_saturating_add(x, y)
  162. }
  163. // CHECK-LABEL: @sadd_i16x16
  164. #[no_mangle]
  165. pub unsafe fn sadd_i16x16(x: i16x16, y: i16x16) -> i16x16 {
  166. // CHECK: %{{[0-9]+}} = call <16 x i16> @llvm.sadd.sat.v16i16(<16 x i16> %{{x|_3}}, <16 x i16> %{{y|_4}})
  167. simd_saturating_add(x, y)
  168. }
  169. // CHECK-LABEL: @sadd_i16x32
  170. #[no_mangle]
  171. pub unsafe fn sadd_i16x32(x: i16x32, y: i16x32) -> i16x32 {
  172. // CHECK: %{{[0-9]+}} = call <32 x i16> @llvm.sadd.sat.v32i16(<32 x i16> %{{x|_3}}, <32 x i16> %{{y|_4}})
  173. simd_saturating_add(x, y)
  174. }
  175. // CHECK-LABEL: @sadd_i32x2
  176. #[no_mangle]
  177. pub unsafe fn sadd_i32x2(x: i32x2, y: i32x2) -> i32x2 {
  178. // CHECK: %{{[0-9]+}} = call <2 x i32> @llvm.sadd.sat.v2i32(<2 x i32> %{{x|_3}}, <2 x i32> %{{y|_4}})
  179. simd_saturating_add(x, y)
  180. }
  181. // CHECK-LABEL: @sadd_i32x4
  182. #[no_mangle]
  183. pub unsafe fn sadd_i32x4(x: i32x4, y: i32x4) -> i32x4 {
  184. // CHECK: %{{[0-9]+}} = call <4 x i32> @llvm.sadd.sat.v4i32(<4 x i32> %{{x|_3}}, <4 x i32> %{{y|_4}})
  185. simd_saturating_add(x, y)
  186. }
  187. // CHECK-LABEL: @sadd_i32x8
  188. #[no_mangle]
  189. pub unsafe fn sadd_i32x8(x: i32x8, y: i32x8) -> i32x8 {
  190. // CHECK: %{{[0-9]+}} = call <8 x i32> @llvm.sadd.sat.v8i32(<8 x i32> %{{x|_3}}, <8 x i32> %{{y|_4}})
  191. simd_saturating_add(x, y)
  192. }
  193. // CHECK-LABEL: @sadd_i32x16
  194. #[no_mangle]
  195. pub unsafe fn sadd_i32x16(x: i32x16, y: i32x16) -> i32x16 {
  196. // CHECK: %{{[0-9]+}} = call <16 x i32> @llvm.sadd.sat.v16i32(<16 x i32> %{{x|_3}}, <16 x i32> %{{y|_4}})
  197. simd_saturating_add(x, y)
  198. }
  199. // CHECK-LABEL: @sadd_i64x2
  200. #[no_mangle]
  201. pub unsafe fn sadd_i64x2(x: i64x2, y: i64x2) -> i64x2 {
  202. // CHECK: %{{[0-9]+}} = call <2 x i64> @llvm.sadd.sat.v2i64(<2 x i64> %{{x|_3}}, <2 x i64> %{{y|_4}})
  203. simd_saturating_add(x, y)
  204. }
  205. // CHECK-LABEL: @sadd_i64x4
  206. #[no_mangle]
  207. pub unsafe fn sadd_i64x4(x: i64x4, y: i64x4) -> i64x4 {
  208. // CHECK: %{{[0-9]+}} = call <4 x i64> @llvm.sadd.sat.v4i64(<4 x i64> %{{x|_3}}, <4 x i64> %{{y|_4}})
  209. simd_saturating_add(x, y)
  210. }
  211. // CHECK-LABEL: @sadd_i64x8
  212. #[no_mangle]
  213. pub unsafe fn sadd_i64x8(x: i64x8, y: i64x8) -> i64x8 {
  214. // CHECK: %{{[0-9]+}} = call <8 x i64> @llvm.sadd.sat.v8i64(<8 x i64> %{{x|_3}}, <8 x i64> %{{y|_4}})
  215. simd_saturating_add(x, y)
  216. }
  217. // CHECK-LABEL: @sadd_i128x2
  218. #[no_mangle]
  219. pub unsafe fn sadd_i128x2(x: i128x2, y: i128x2) -> i128x2 {
  220. // CHECK: %{{[0-9]+}} = call <2 x i128> @llvm.sadd.sat.v2i128(<2 x i128> %{{x|_3}}, <2 x i128> %{{y|_4}})
  221. simd_saturating_add(x, y)
  222. }
  223. // CHECK-LABEL: @sadd_i128x4
  224. #[no_mangle]
  225. pub unsafe fn sadd_i128x4(x: i128x4, y: i128x4) -> i128x4 {
  226. // CHECK: %{{[0-9]+}} = call <4 x i128> @llvm.sadd.sat.v4i128(<4 x i128> %{{x|_3}}, <4 x i128> %{{y|_4}})
  227. simd_saturating_add(x, y)
  228. }
  229. // CHECK-LABEL: @uadd_u8x2
  230. #[no_mangle]
  231. pub unsafe fn uadd_u8x2(x: u8x2, y: u8x2) -> u8x2 {
  232. // CHECK: %{{[0-9]+}} = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> %{{x|_3}}, <2 x i8> %{{y|_4}})
  233. simd_saturating_add(x, y)
  234. }
  235. // CHECK-LABEL: @uadd_u8x4
  236. #[no_mangle]
  237. pub unsafe fn uadd_u8x4(x: u8x4, y: u8x4) -> u8x4 {
  238. // CHECK: %{{[0-9]+}} = call <4 x i8> @llvm.uadd.sat.v4i8(<4 x i8> %{{x|_3}}, <4 x i8> %{{y|_4}})
  239. simd_saturating_add(x, y)
  240. }
  241. // CHECK-LABEL: @uadd_u8x8
  242. #[no_mangle]
  243. pub unsafe fn uadd_u8x8(x: u8x8, y: u8x8) -> u8x8 {
  244. // CHECK: %{{[0-9]+}} = call <8 x i8> @llvm.uadd.sat.v8i8(<8 x i8> %{{x|_3}}, <8 x i8> %{{y|_4}})
  245. simd_saturating_add(x, y)
  246. }
  247. // CHECK-LABEL: @uadd_u8x16
  248. #[no_mangle]
  249. pub unsafe fn uadd_u8x16(x: u8x16, y: u8x16) -> u8x16 {
  250. // CHECK: %{{[0-9]+}} = call <16 x i8> @llvm.uadd.sat.v16i8(<16 x i8> %{{x|_3}}, <16 x i8> %{{y|_4}})
  251. simd_saturating_add(x, y)
  252. }
  253. // CHECK-LABEL: @uadd_u8x32
  254. #[no_mangle]
  255. pub unsafe fn uadd_u8x32(x: u8x32, y: u8x32) -> u8x32 {
  256. // CHECK: %{{[0-9]+}} = call <32 x i8> @llvm.uadd.sat.v32i8(<32 x i8> %{{x|_3}}, <32 x i8> %{{y|_4}})
  257. simd_saturating_add(x, y)
  258. }
  259. // CHECK-LABEL: @uadd_u8x64
  260. #[no_mangle]
  261. pub unsafe fn uadd_u8x64(x: u8x64, y: u8x64) -> u8x64 {
  262. // CHECK: %{{[0-9]+}} = call <64 x i8> @llvm.uadd.sat.v64i8(<64 x i8> %{{x|_3}}, <64 x i8> %{{y|_4}})
  263. simd_saturating_add(x, y)
  264. }
  265. // CHECK-LABEL: @uadd_u16x2
  266. #[no_mangle]
  267. pub unsafe fn uadd_u16x2(x: u16x2, y: u16x2) -> u16x2 {
  268. // CHECK: %{{[0-9]+}} = call <2 x i16> @llvm.uadd.sat.v2i16(<2 x i16> %{{x|_3}}, <2 x i16> %{{y|_4}})
  269. simd_saturating_add(x, y)
  270. }
  271. // CHECK-LABEL: @uadd_u16x4
  272. #[no_mangle]
  273. pub unsafe fn uadd_u16x4(x: u16x4, y: u16x4) -> u16x4 {
  274. // CHECK: %{{[0-9]+}} = call <4 x i16> @llvm.uadd.sat.v4i16(<4 x i16> %{{x|_3}}, <4 x i16> %{{y|_4}})
  275. simd_saturating_add(x, y)
  276. }
  277. // CHECK-LABEL: @uadd_u16x8
  278. #[no_mangle]
  279. pub unsafe fn uadd_u16x8(x: u16x8, y: u16x8) -> u16x8 {
  280. // CHECK: %{{[0-9]+}} = call <8 x i16> @llvm.uadd.sat.v8i16(<8 x i16> %{{x|_3}}, <8 x i16> %{{y|_4}})
  281. simd_saturating_add(x, y)
  282. }
  283. // CHECK-LABEL: @uadd_u16x16
  284. #[no_mangle]
  285. pub unsafe fn uadd_u16x16(x: u16x16, y: u16x16) -> u16x16 {
  286. // CHECK: %{{[0-9]+}} = call <16 x i16> @llvm.uadd.sat.v16i16(<16 x i16> %{{x|_3}}, <16 x i16> %{{y|_4}})
  287. simd_saturating_add(x, y)
  288. }
  289. // CHECK-LABEL: @uadd_u16x32
  290. #[no_mangle]
  291. pub unsafe fn uadd_u16x32(x: u16x32, y: u16x32) -> u16x32 {
  292. // CHECK: %{{[0-9]+}} = call <32 x i16> @llvm.uadd.sat.v32i16(<32 x i16> %{{x|_3}}, <32 x i16> %{{y|_4}})
  293. simd_saturating_add(x, y)
  294. }
  295. // CHECK-LABEL: @uadd_u32x2
  296. #[no_mangle]
  297. pub unsafe fn uadd_u32x2(x: u32x2, y: u32x2) -> u32x2 {
  298. // CHECK: %{{[0-9]+}} = call <2 x i32> @llvm.uadd.sat.v2i32(<2 x i32> %{{x|_3}}, <2 x i32> %{{y|_4}})
  299. simd_saturating_add(x, y)
  300. }
  301. // CHECK-LABEL: @uadd_u32x4
  302. #[no_mangle]
  303. pub unsafe fn uadd_u32x4(x: u32x4, y: u32x4) -> u32x4 {
  304. // CHECK: %{{[0-9]+}} = call <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32> %{{x|_3}}, <4 x i32> %{{y|_4}})
  305. simd_saturating_add(x, y)
  306. }
  307. // CHECK-LABEL: @uadd_u32x8
  308. #[no_mangle]
  309. pub unsafe fn uadd_u32x8(x: u32x8, y: u32x8) -> u32x8 {
  310. // CHECK: %{{[0-9]+}} = call <8 x i32> @llvm.uadd.sat.v8i32(<8 x i32> %{{x|_3}}, <8 x i32> %{{y|_4}})
  311. simd_saturating_add(x, y)
  312. }
  313. // CHECK-LABEL: @uadd_u32x16
  314. #[no_mangle]
  315. pub unsafe fn uadd_u32x16(x: u32x16, y: u32x16) -> u32x16 {
  316. // CHECK: %{{[0-9]+}} = call <16 x i32> @llvm.uadd.sat.v16i32(<16 x i32> %{{x|_3}}, <16 x i32> %{{y|_4}})
  317. simd_saturating_add(x, y)
  318. }
  319. // CHECK-LABEL: @uadd_u64x2
  320. #[no_mangle]
  321. pub unsafe fn uadd_u64x2(x: u64x2, y: u64x2) -> u64x2 {
  322. // CHECK: %{{[0-9]+}} = call <2 x i64> @llvm.uadd.sat.v2i64(<2 x i64> %{{x|_3}}, <2 x i64> %{{y|_4}})
  323. simd_saturating_add(x, y)
  324. }
  325. // CHECK-LABEL: @uadd_u64x4
  326. #[no_mangle]
  327. pub unsafe fn uadd_u64x4(x: u64x4, y: u64x4) -> u64x4 {
  328. // CHECK: %{{[0-9]+}} = call <4 x i64> @llvm.uadd.sat.v4i64(<4 x i64> %{{x|_3}}, <4 x i64> %{{y|_4}})
  329. simd_saturating_add(x, y)
  330. }
  331. // CHECK-LABEL: @uadd_u64x8
  332. #[no_mangle]
  333. pub unsafe fn uadd_u64x8(x: u64x8, y: u64x8) -> u64x8 {
  334. // CHECK: %{{[0-9]+}} = call <8 x i64> @llvm.uadd.sat.v8i64(<8 x i64> %{{x|_3}}, <8 x i64> %{{y|_4}})
  335. simd_saturating_add(x, y)
  336. }
  337. // CHECK-LABEL: @uadd_u128x2
  338. #[no_mangle]
  339. pub unsafe fn uadd_u128x2(x: u128x2, y: u128x2) -> u128x2 {
  340. // CHECK: %{{[0-9]+}} = call <2 x i128> @llvm.uadd.sat.v2i128(<2 x i128> %{{x|_3}}, <2 x i128> %{{y|_4}})
  341. simd_saturating_add(x, y)
  342. }
  343. // CHECK-LABEL: @uadd_u128x4
  344. #[no_mangle]
  345. pub unsafe fn uadd_u128x4(x: u128x4, y: u128x4) -> u128x4 {
  346. // CHECK: %{{[0-9]+}} = call <4 x i128> @llvm.uadd.sat.v4i128(<4 x i128> %{{x|_3}}, <4 x i128> %{{y|_4}})
  347. simd_saturating_add(x, y)
  348. }
  349. // CHECK-LABEL: @ssub_i8x2
  350. #[no_mangle]
  351. pub unsafe fn ssub_i8x2(x: i8x2, y: i8x2) -> i8x2 {
  352. // CHECK: %{{[0-9]+}} = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %{{x|_3}}, <2 x i8> %{{y|_4}})
  353. simd_saturating_sub(x, y)
  354. }
  355. // CHECK-LABEL: @ssub_i8x4
  356. #[no_mangle]
  357. pub unsafe fn ssub_i8x4(x: i8x4, y: i8x4) -> i8x4 {
  358. // CHECK: %{{[0-9]+}} = call <4 x i8> @llvm.ssub.sat.v4i8(<4 x i8> %{{x|_3}}, <4 x i8> %{{y|_4}})
  359. simd_saturating_sub(x, y)
  360. }
  361. // CHECK-LABEL: @ssub_i8x8
  362. #[no_mangle]
  363. pub unsafe fn ssub_i8x8(x: i8x8, y: i8x8) -> i8x8 {
  364. // CHECK: %{{[0-9]+}} = call <8 x i8> @llvm.ssub.sat.v8i8(<8 x i8> %{{x|_3}}, <8 x i8> %{{y|_4}})
  365. simd_saturating_sub(x, y)
  366. }
  367. // CHECK-LABEL: @ssub_i8x16
  368. #[no_mangle]
  369. pub unsafe fn ssub_i8x16(x: i8x16, y: i8x16) -> i8x16 {
  370. // CHECK: %{{[0-9]+}} = call <16 x i8> @llvm.ssub.sat.v16i8(<16 x i8> %{{x|_3}}, <16 x i8> %{{y|_4}})
  371. simd_saturating_sub(x, y)
  372. }
  373. // CHECK-LABEL: @ssub_i8x32
  374. #[no_mangle]
  375. pub unsafe fn ssub_i8x32(x: i8x32, y: i8x32) -> i8x32 {
  376. // CHECK: %{{[0-9]+}} = call <32 x i8> @llvm.ssub.sat.v32i8(<32 x i8> %{{x|_3}}, <32 x i8> %{{y|_4}})
  377. simd_saturating_sub(x, y)
  378. }
  379. // CHECK-LABEL: @ssub_i8x64
  380. #[no_mangle]
  381. pub unsafe fn ssub_i8x64(x: i8x64, y: i8x64) -> i8x64 {
  382. // CHECK: %{{[0-9]+}} = call <64 x i8> @llvm.ssub.sat.v64i8(<64 x i8> %{{x|_3}}, <64 x i8> %{{y|_4}})
  383. simd_saturating_sub(x, y)
  384. }
  385. // CHECK-LABEL: @ssub_i16x2
  386. #[no_mangle]
  387. pub unsafe fn ssub_i16x2(x: i16x2, y: i16x2) -> i16x2 {
  388. // CHECK: %{{[0-9]+}} = call <2 x i16> @llvm.ssub.sat.v2i16(<2 x i16> %{{x|_3}}, <2 x i16> %{{y|_4}})
  389. simd_saturating_sub(x, y)
  390. }
  391. // CHECK-LABEL: @ssub_i16x4
  392. #[no_mangle]
  393. pub unsafe fn ssub_i16x4(x: i16x4, y: i16x4) -> i16x4 {
  394. // CHECK: %{{[0-9]+}} = call <4 x i16> @llvm.ssub.sat.v4i16(<4 x i16> %{{x|_3}}, <4 x i16> %{{y|_4}})
  395. simd_saturating_sub(x, y)
  396. }
  397. // CHECK-LABEL: @ssub_i16x8
  398. #[no_mangle]
  399. pub unsafe fn ssub_i16x8(x: i16x8, y: i16x8) -> i16x8 {
  400. // CHECK: %{{[0-9]+}} = call <8 x i16> @llvm.ssub.sat.v8i16(<8 x i16> %{{x|_3}}, <8 x i16> %{{y|_4}})
  401. simd_saturating_sub(x, y)
  402. }
  403. // CHECK-LABEL: @ssub_i16x16
  404. #[no_mangle]
  405. pub unsafe fn ssub_i16x16(x: i16x16, y: i16x16) -> i16x16 {
  406. // CHECK: %{{[0-9]+}} = call <16 x i16> @llvm.ssub.sat.v16i16(<16 x i16> %{{x|_3}}, <16 x i16> %{{y|_4}})
  407. simd_saturating_sub(x, y)
  408. }
  409. // CHECK-LABEL: @ssub_i16x32
  410. #[no_mangle]
  411. pub unsafe fn ssub_i16x32(x: i16x32, y: i16x32) -> i16x32 {
  412. // CHECK: %{{[0-9]+}} = call <32 x i16> @llvm.ssub.sat.v32i16(<32 x i16> %{{x|_3}}, <32 x i16> %{{y|_4}})
  413. simd_saturating_sub(x, y)
  414. }
  415. // CHECK-LABEL: @ssub_i32x2
  416. #[no_mangle]
  417. pub unsafe fn ssub_i32x2(x: i32x2, y: i32x2) -> i32x2 {
  418. // CHECK: %{{[0-9]+}} = call <2 x i32> @llvm.ssub.sat.v2i32(<2 x i32> %{{x|_3}}, <2 x i32> %{{y|_4}})
  419. simd_saturating_sub(x, y)
  420. }
  421. // CHECK-LABEL: @ssub_i32x4
  422. #[no_mangle]
  423. pub unsafe fn ssub_i32x4(x: i32x4, y: i32x4) -> i32x4 {
  424. // CHECK: %{{[0-9]+}} = call <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32> %{{x|_3}}, <4 x i32> %{{y|_4}})
  425. simd_saturating_sub(x, y)
  426. }
  427. // CHECK-LABEL: @ssub_i32x8
  428. #[no_mangle]
  429. pub unsafe fn ssub_i32x8(x: i32x8, y: i32x8) -> i32x8 {
  430. // CHECK: %{{[0-9]+}} = call <8 x i32> @llvm.ssub.sat.v8i32(<8 x i32> %{{x|_3}}, <8 x i32> %{{y|_4}})
  431. simd_saturating_sub(x, y)
  432. }
  433. // CHECK-LABEL: @ssub_i32x16
  434. #[no_mangle]
  435. pub unsafe fn ssub_i32x16(x: i32x16, y: i32x16) -> i32x16 {
  436. // CHECK: %{{[0-9]+}} = call <16 x i32> @llvm.ssub.sat.v16i32(<16 x i32> %{{x|_3}}, <16 x i32> %{{y|_4}})
  437. simd_saturating_sub(x, y)
  438. }
  439. // CHECK-LABEL: @ssub_i64x2
  440. #[no_mangle]
  441. pub unsafe fn ssub_i64x2(x: i64x2, y: i64x2) -> i64x2 {
  442. // CHECK: %{{[0-9]+}} = call <2 x i64> @llvm.ssub.sat.v2i64(<2 x i64> %{{x|_3}}, <2 x i64> %{{y|_4}})
  443. simd_saturating_sub(x, y)
  444. }
  445. // CHECK-LABEL: @ssub_i64x4
  446. #[no_mangle]
  447. pub unsafe fn ssub_i64x4(x: i64x4, y: i64x4) -> i64x4 {
  448. // CHECK: %{{[0-9]+}} = call <4 x i64> @llvm.ssub.sat.v4i64(<4 x i64> %{{x|_3}}, <4 x i64> %{{y|_4}})
  449. simd_saturating_sub(x, y)
  450. }
  451. // CHECK-LABEL: @ssub_i64x8
  452. #[no_mangle]
  453. pub unsafe fn ssub_i64x8(x: i64x8, y: i64x8) -> i64x8 {
  454. // CHECK: %{{[0-9]+}} = call <8 x i64> @llvm.ssub.sat.v8i64(<8 x i64> %{{x|_3}}, <8 x i64> %{{y|_4}})
  455. simd_saturating_sub(x, y)
  456. }
  457. // CHECK-LABEL: @ssub_i128x2
  458. #[no_mangle]
  459. pub unsafe fn ssub_i128x2(x: i128x2, y: i128x2) -> i128x2 {
  460. // CHECK: %{{[0-9]+}} = call <2 x i128> @llvm.ssub.sat.v2i128(<2 x i128> %{{x|_3}}, <2 x i128> %{{y|_4}})
  461. simd_saturating_sub(x, y)
  462. }
  463. // CHECK-LABEL: @ssub_i128x4
  464. #[no_mangle]
  465. pub unsafe fn ssub_i128x4(x: i128x4, y: i128x4) -> i128x4 {
  466. // CHECK: %{{[0-9]+}} = call <4 x i128> @llvm.ssub.sat.v4i128(<4 x i128> %{{x|_3}}, <4 x i128> %{{y|_4}})
  467. simd_saturating_sub(x, y)
  468. }
  469. // CHECK-LABEL: @usub_u8x2
  470. #[no_mangle]
  471. pub unsafe fn usub_u8x2(x: u8x2, y: u8x2) -> u8x2 {
  472. // CHECK: %{{[0-9]+}} = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> %{{x|_3}}, <2 x i8> %{{y|_4}})
  473. simd_saturating_sub(x, y)
  474. }
  475. // CHECK-LABEL: @usub_u8x4
  476. #[no_mangle]
  477. pub unsafe fn usub_u8x4(x: u8x4, y: u8x4) -> u8x4 {
  478. // CHECK: %{{[0-9]+}} = call <4 x i8> @llvm.usub.sat.v4i8(<4 x i8> %{{x|_3}}, <4 x i8> %{{y|_4}})
  479. simd_saturating_sub(x, y)
  480. }
  481. // CHECK-LABEL: @usub_u8x8
  482. #[no_mangle]
  483. pub unsafe fn usub_u8x8(x: u8x8, y: u8x8) -> u8x8 {
  484. // CHECK: %{{[0-9]+}} = call <8 x i8> @llvm.usub.sat.v8i8(<8 x i8> %{{x|_3}}, <8 x i8> %{{y|_4}})
  485. simd_saturating_sub(x, y)
  486. }
  487. // CHECK-LABEL: @usub_u8x16
  488. #[no_mangle]
  489. pub unsafe fn usub_u8x16(x: u8x16, y: u8x16) -> u8x16 {
  490. // CHECK: %{{[0-9]+}} = call <16 x i8> @llvm.usub.sat.v16i8(<16 x i8> %{{x|_3}}, <16 x i8> %{{y|_4}})
  491. simd_saturating_sub(x, y)
  492. }
  493. // CHECK-LABEL: @usub_u8x32
  494. #[no_mangle]
  495. pub unsafe fn usub_u8x32(x: u8x32, y: u8x32) -> u8x32 {
  496. // CHECK: %{{[0-9]+}} = call <32 x i8> @llvm.usub.sat.v32i8(<32 x i8> %{{x|_3}}, <32 x i8> %{{y|_4}})
  497. simd_saturating_sub(x, y)
  498. }
  499. // CHECK-LABEL: @usub_u8x64
  500. #[no_mangle]
  501. pub unsafe fn usub_u8x64(x: u8x64, y: u8x64) -> u8x64 {
  502. // CHECK: %{{[0-9]+}} = call <64 x i8> @llvm.usub.sat.v64i8(<64 x i8> %{{x|_3}}, <64 x i8> %{{y|_4}})
  503. simd_saturating_sub(x, y)
  504. }
  505. // CHECK-LABEL: @usub_u16x2
  506. #[no_mangle]
  507. pub unsafe fn usub_u16x2(x: u16x2, y: u16x2) -> u16x2 {
  508. // CHECK: %{{[0-9]+}} = call <2 x i16> @llvm.usub.sat.v2i16(<2 x i16> %{{x|_3}}, <2 x i16> %{{y|_4}})
  509. simd_saturating_sub(x, y)
  510. }
  511. // CHECK-LABEL: @usub_u16x4
  512. #[no_mangle]
  513. pub unsafe fn usub_u16x4(x: u16x4, y: u16x4) -> u16x4 {
  514. // CHECK: %{{[0-9]+}} = call <4 x i16> @llvm.usub.sat.v4i16(<4 x i16> %{{x|_3}}, <4 x i16> %{{y|_4}})
  515. simd_saturating_sub(x, y)
  516. }
  517. // CHECK-LABEL: @usub_u16x8
  518. #[no_mangle]
  519. pub unsafe fn usub_u16x8(x: u16x8, y: u16x8) -> u16x8 {
  520. // CHECK: %{{[0-9]+}} = call <8 x i16> @llvm.usub.sat.v8i16(<8 x i16> %{{x|_3}}, <8 x i16> %{{y|_4}})
  521. simd_saturating_sub(x, y)
  522. }
  523. // CHECK-LABEL: @usub_u16x16
  524. #[no_mangle]
  525. pub unsafe fn usub_u16x16(x: u16x16, y: u16x16) -> u16x16 {
  526. // CHECK: %{{[0-9]+}} = call <16 x i16> @llvm.usub.sat.v16i16(<16 x i16> %{{x|_3}}, <16 x i16> %{{y|_4}})
  527. simd_saturating_sub(x, y)
  528. }
  529. // CHECK-LABEL: @usub_u16x32
  530. #[no_mangle]
  531. pub unsafe fn usub_u16x32(x: u16x32, y: u16x32) -> u16x32 {
  532. // CHECK: %{{[0-9]+}} = call <32 x i16> @llvm.usub.sat.v32i16(<32 x i16> %{{x|_3}}, <32 x i16> %{{y|_4}})
  533. simd_saturating_sub(x, y)
  534. }
  535. // CHECK-LABEL: @usub_u32x2
  536. #[no_mangle]
  537. pub unsafe fn usub_u32x2(x: u32x2, y: u32x2) -> u32x2 {
  538. // CHECK: %{{[0-9]+}} = call <2 x i32> @llvm.usub.sat.v2i32(<2 x i32> %{{x|_3}}, <2 x i32> %{{y|_4}})
  539. simd_saturating_sub(x, y)
  540. }
  541. // CHECK-LABEL: @usub_u32x4
  542. #[no_mangle]
  543. pub unsafe fn usub_u32x4(x: u32x4, y: u32x4) -> u32x4 {
  544. // CHECK: %{{[0-9]+}} = call <4 x i32> @llvm.usub.sat.v4i32(<4 x i32> %{{x|_3}}, <4 x i32> %{{y|_4}})
  545. simd_saturating_sub(x, y)
  546. }
  547. // CHECK-LABEL: @usub_u32x8
  548. #[no_mangle]
  549. pub unsafe fn usub_u32x8(x: u32x8, y: u32x8) -> u32x8 {
  550. // CHECK: %{{[0-9]+}} = call <8 x i32> @llvm.usub.sat.v8i32(<8 x i32> %{{x|_3}}, <8 x i32> %{{y|_4}})
  551. simd_saturating_sub(x, y)
  552. }
  553. // CHECK-LABEL: @usub_u32x16
  554. #[no_mangle]
  555. pub unsafe fn usub_u32x16(x: u32x16, y: u32x16) -> u32x16 {
  556. // CHECK: %{{[0-9]+}} = call <16 x i32> @llvm.usub.sat.v16i32(<16 x i32> %{{x|_3}}, <16 x i32> %{{y|_4}})
  557. simd_saturating_sub(x, y)
  558. }
  559. // CHECK-LABEL: @usub_u64x2
  560. #[no_mangle]
  561. pub unsafe fn usub_u64x2(x: u64x2, y: u64x2) -> u64x2 {
  562. // CHECK: %{{[0-9]+}} = call <2 x i64> @llvm.usub.sat.v2i64(<2 x i64> %{{x|_3}}, <2 x i64> %{{y|_4}})
  563. simd_saturating_sub(x, y)
  564. }
  565. // CHECK-LABEL: @usub_u64x4
  566. #[no_mangle]
  567. pub unsafe fn usub_u64x4(x: u64x4, y: u64x4) -> u64x4 {
  568. // CHECK: %{{[0-9]+}} = call <4 x i64> @llvm.usub.sat.v4i64(<4 x i64> %{{x|_3}}, <4 x i64> %{{y|_4}})
  569. simd_saturating_sub(x, y)
  570. }
  571. // CHECK-LABEL: @usub_u64x8
  572. #[no_mangle]
  573. pub unsafe fn usub_u64x8(x: u64x8, y: u64x8) -> u64x8 {
  574. // CHECK: %{{[0-9]+}} = call <8 x i64> @llvm.usub.sat.v8i64(<8 x i64> %{{x|_3}}, <8 x i64> %{{y|_4}})
  575. simd_saturating_sub(x, y)
  576. }
  577. // CHECK-LABEL: @usub_u128x2
  578. #[no_mangle]
  579. pub unsafe fn usub_u128x2(x: u128x2, y: u128x2) -> u128x2 {
  580. // CHECK: %{{[0-9]+}} = call <2 x i128> @llvm.usub.sat.v2i128(<2 x i128> %{{x|_3}}, <2 x i128> %{{y|_4}})
  581. simd_saturating_sub(x, y)
  582. }
  583. // CHECK-LABEL: @usub_u128x4
  584. #[no_mangle]
  585. pub unsafe fn usub_u128x4(x: u128x4, y: u128x4) -> u128x4 {
  586. // CHECK: %{{[0-9]+}} = call <4 x i128> @llvm.usub.sat.v4i128(<4 x i128> %{{x|_3}}, <4 x i128> %{{y|_4}})
  587. simd_saturating_sub(x, y)
  588. }