core/stdarch/crates/core_arch/src/riscv_shared/
p.rs

1//! RISC-V Packed SIMD intrinsics; shared part.
2//!
3//! RV64 only part is placed in riscv64 folder.
4use crate::arch::asm;
5#[cfg(test)]
6use stdarch_test::assert_instr;
7
8// FIXME: Currently the P extension is still unratified, so there is no support
9// for it in the upstream LLVM for now, and thus no LLVM built-in functions or
10// serialization of instructions are provided.
11//
12// We add `assert_instr(unknown)` to each function so that we can at least make
13// sure they compile. Since there is no serialization yet, we can only write
14// "unknown" here, so that if LLVM upstream provides support for the P extension
15// at some point in the future, we can know in time and then update our
16// implementation.
17
18/// Adds packed 16-bit signed numbers, discarding overflow bits
19#[inline]
20#[cfg_attr(test, assert_instr(unknown))]
21#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
22pub fn add16(a: usize, b: usize) -> usize {
23    let value: usize;
24    unsafe {
25        asm!(".insn r 0x77, 0x0, 0x20, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
26    }
27    value
28}
29
30/// Halves the sum of packed 16-bit signed numbers, dropping least bits
31#[inline]
32#[cfg_attr(test, assert_instr(unknown))]
33#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
34pub fn radd16(a: usize, b: usize) -> usize {
35    let value: usize;
36    unsafe {
37        asm!(".insn r 0x77, 0x0, 0x00, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
38    }
39    value
40}
41
42/// Halves the sum of packed 16-bit unsigned numbers, dropping least bits
43#[inline]
44#[cfg_attr(test, assert_instr(unknown))]
45#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
46pub fn uradd16(a: usize, b: usize) -> usize {
47    let value: usize;
48    unsafe {
49        asm!(".insn r 0x77, 0x0, 0x10, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
50    }
51    value
52}
53
54/// Adds packed 16-bit signed numbers, saturating at the numeric bounds
55#[inline]
56#[cfg_attr(test, assert_instr(unknown))]
57#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
58pub fn kadd16(a: usize, b: usize) -> usize {
59    let value: usize;
60    unsafe {
61        asm!(".insn r 0x77, 0x0, 0x08, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
62    }
63    value
64}
65
66/// Adds packed 16-bit unsigned numbers, saturating at the numeric bounds
67#[inline]
68#[cfg_attr(test, assert_instr(unknown))]
69#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
70pub fn ukadd16(a: usize, b: usize) -> usize {
71    let value: usize;
72    unsafe {
73        asm!(".insn r 0x77, 0x0, 0x18, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
74    }
75    value
76}
77
78/// Subtracts packed 16-bit signed numbers, discarding overflow bits
79#[inline]
80#[cfg_attr(test, assert_instr(unknown))]
81#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
82pub fn sub16(a: usize, b: usize) -> usize {
83    let value: usize;
84    unsafe {
85        asm!(".insn r 0x77, 0x0, 0x21, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
86    }
87    value
88}
89
90/// Halves the subtraction result of packed 16-bit signed numbers, dropping least bits
91#[inline]
92#[cfg_attr(test, assert_instr(unknown))]
93#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
94pub fn rsub16(a: usize, b: usize) -> usize {
95    let value: usize;
96    unsafe {
97        asm!(".insn r 0x77, 0x0, 0x01, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
98    }
99    value
100}
101
102/// Halves the subtraction result of packed 16-bit unsigned numbers, dropping least bits
103#[inline]
104#[cfg_attr(test, assert_instr(unknown))]
105#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
106pub fn ursub16(a: usize, b: usize) -> usize {
107    let value: usize;
108    unsafe {
109        asm!(".insn r 0x77, 0x0, 0x11, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
110    }
111    value
112}
113
114/// Subtracts packed 16-bit signed numbers, saturating at the numeric bounds
115#[inline]
116#[cfg_attr(test, assert_instr(unknown))]
117#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
118pub fn ksub16(a: usize, b: usize) -> usize {
119    let value: usize;
120    unsafe {
121        asm!(".insn r 0x77, 0x0, 0x09, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
122    }
123    value
124}
125
126/// Subtracts packed 16-bit unsigned numbers, saturating at the numeric bounds
127#[inline]
128#[cfg_attr(test, assert_instr(unknown))]
129#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
130pub fn uksub16(a: usize, b: usize) -> usize {
131    let value: usize;
132    unsafe {
133        asm!(".insn r 0x77, 0x0, 0x19, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
134    }
135    value
136}
137
138/// Cross adds and subtracts packed 16-bit signed numbers, discarding overflow bits
139#[inline]
140#[cfg_attr(test, assert_instr(unknown))]
141#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
142pub fn cras16(a: usize, b: usize) -> usize {
143    let value: usize;
144    unsafe {
145        asm!(".insn r 0x77, 0x0, 0x22, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
146    }
147    value
148}
149
150/// Cross halves of adds and subtracts packed 16-bit signed numbers, dropping least bits
151#[inline]
152#[cfg_attr(test, assert_instr(unknown))]
153#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
154pub fn rcras16(a: usize, b: usize) -> usize {
155    let value: usize;
156    unsafe {
157        asm!(".insn r 0x77, 0x0, 0x02, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
158    }
159    value
160}
161
162/// Cross halves of adds and subtracts packed 16-bit unsigned numbers, dropping least bits
163#[inline]
164#[cfg_attr(test, assert_instr(unknown))]
165#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
166pub fn urcras16(a: usize, b: usize) -> usize {
167    let value: usize;
168    unsafe {
169        asm!(".insn r 0x77, 0x0, 0x12, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
170    }
171    value
172}
173
174/// Cross adds and subtracts packed 16-bit signed numbers, saturating at the numeric bounds
175#[inline]
176#[cfg_attr(test, assert_instr(unknown))]
177#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
178pub fn kcras16(a: usize, b: usize) -> usize {
179    let value: usize;
180    unsafe {
181        asm!(".insn r 0x77, 0x0, 0x0A, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
182    }
183    value
184}
185
186/// Cross adds and subtracts packed 16-bit unsigned numbers, saturating at the numeric bounds
187#[inline]
188#[cfg_attr(test, assert_instr(unknown))]
189#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
190pub fn ukcras16(a: usize, b: usize) -> usize {
191    let value: usize;
192    unsafe {
193        asm!(".insn r 0x77, 0x0, 0x1A, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
194    }
195    value
196}
197
198/// Cross subtracts and adds packed 16-bit signed numbers, discarding overflow bits
199#[inline]
200#[cfg_attr(test, assert_instr(unknown))]
201#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
202pub fn crsa16(a: usize, b: usize) -> usize {
203    let value: usize;
204    unsafe {
205        asm!(".insn r 0x77, 0x0, 0x23, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
206    }
207    value
208}
209
210/// Cross halves of subtracts and adds packed 16-bit signed numbers, dropping least bits
211#[inline]
212#[cfg_attr(test, assert_instr(unknown))]
213#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
214pub fn rcrsa16(a: usize, b: usize) -> usize {
215    let value: usize;
216    unsafe {
217        asm!(".insn r 0x77, 0x0, 0x03, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
218    }
219    value
220}
221
222/// Cross halves of subtracts and adds packed 16-bit unsigned numbers, dropping least bits
223#[inline]
224#[cfg_attr(test, assert_instr(unknown))]
225#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
226pub fn urcrsa16(a: usize, b: usize) -> usize {
227    let value: usize;
228    unsafe {
229        asm!(".insn r 0x77, 0x0, 0x13, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
230    }
231    value
232}
233
234/// Cross subtracts and adds packed 16-bit signed numbers, saturating at the numeric bounds
235#[inline]
236#[cfg_attr(test, assert_instr(unknown))]
237#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
238pub fn kcrsa16(a: usize, b: usize) -> usize {
239    let value: usize;
240    unsafe {
241        asm!(".insn r 0x77, 0x0, 0x0B, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
242    }
243    value
244}
245
246/// Cross subtracts and adds packed 16-bit unsigned numbers, saturating at the numeric bounds
247#[inline]
248#[cfg_attr(test, assert_instr(unknown))]
249#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
250pub fn ukcrsa16(a: usize, b: usize) -> usize {
251    let value: usize;
252    unsafe {
253        asm!(".insn r 0x77, 0x0, 0x1B, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
254    }
255    value
256}
257
258/// Straight adds and subtracts packed 16-bit signed numbers, discarding overflow bits
259#[inline]
260#[cfg_attr(test, assert_instr(unknown))]
261#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
262pub fn stas16(a: usize, b: usize) -> usize {
263    let value: usize;
264    unsafe {
265        asm!(".insn r 0x77, 0x0, 0x7A, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
266    }
267    value
268}
269
270/// Straight halves of adds and subtracts packed 16-bit signed numbers, dropping least bits
271#[inline]
272#[cfg_attr(test, assert_instr(unknown))]
273#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
274pub fn rstas16(a: usize, b: usize) -> usize {
275    let value: usize;
276    unsafe {
277        asm!(".insn r 0x77, 0x0, 0x5A, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
278    }
279    value
280}
281
282/// Straight halves of adds and subtracts packed 16-bit unsigned numbers, dropping least bits
283#[inline]
284#[cfg_attr(test, assert_instr(unknown))]
285#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
286pub fn urstas16(a: usize, b: usize) -> usize {
287    let value: usize;
288    unsafe {
289        asm!(".insn r 0x77, 0x0, 0x6A, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
290    }
291    value
292}
293
294/// Straight adds and subtracts packed 16-bit signed numbers, saturating at the numeric bounds
295#[inline]
296#[cfg_attr(test, assert_instr(unknown))]
297#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
298pub fn kstas16(a: usize, b: usize) -> usize {
299    let value: usize;
300    unsafe {
301        asm!(".insn r 0x77, 0x0, 0x62, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
302    }
303    value
304}
305
306/// Straight adds and subtracts packed 16-bit unsigned numbers, saturating at the numeric bounds
307#[inline]
308#[cfg_attr(test, assert_instr(unknown))]
309#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
310pub fn ukstas16(a: usize, b: usize) -> usize {
311    let value: usize;
312    unsafe {
313        asm!(".insn r 0x77, 0x0, 0x72, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
314    }
315    value
316}
317
318/// Straight subtracts and adds packed 16-bit signed numbers, discarding overflow bits
319#[inline]
320#[cfg_attr(test, assert_instr(unknown))]
321#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
322pub fn stsa16(a: usize, b: usize) -> usize {
323    let value: usize;
324    unsafe {
325        asm!(".insn r 0x77, 0x0, 0x7B, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
326    }
327    value
328}
329
330/// Straight halves of subtracts and adds packed 16-bit signed numbers, dropping least bits
331#[inline]
332#[cfg_attr(test, assert_instr(unknown))]
333#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
334pub fn rstsa16(a: usize, b: usize) -> usize {
335    let value: usize;
336    unsafe {
337        asm!(".insn r 0x77, 0x0, 0x5B, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
338    }
339    value
340}
341
342/// Straight halves of subtracts and adds packed 16-bit unsigned numbers, dropping least bits
343#[inline]
344#[cfg_attr(test, assert_instr(unknown))]
345#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
346pub fn urstsa16(a: usize, b: usize) -> usize {
347    let value: usize;
348    unsafe {
349        asm!(".insn r 0x77, 0x0, 0x6B, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
350    }
351    value
352}
353
354/// Straight subtracts and adds packed 16-bit signed numbers, saturating at the numeric bounds
355#[inline]
356#[cfg_attr(test, assert_instr(unknown))]
357#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
358pub fn kstsa16(a: usize, b: usize) -> usize {
359    let value: usize;
360    unsafe {
361        asm!(".insn r 0x77, 0x0, 0x63, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
362    }
363    value
364}
365
366/// Straight subtracts and adds packed 16-bit unsigned numbers, saturating at the numeric bounds
367#[inline]
368#[cfg_attr(test, assert_instr(unknown))]
369#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
370pub fn ukstsa16(a: usize, b: usize) -> usize {
371    let value: usize;
372    unsafe {
373        asm!(".insn r 0x77, 0x0, 0x73, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
374    }
375    value
376}
377
378/// Adds packed 8-bit signed numbers, discarding overflow bits
379#[inline]
380#[cfg_attr(test, assert_instr(unknown))]
381#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
382pub fn add8(a: usize, b: usize) -> usize {
383    let value: usize;
384    unsafe {
385        asm!(".insn r 0x77, 0x0, 0x24, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
386    }
387    value
388}
389
390/// Halves the sum of packed 8-bit signed numbers, dropping least bits
391#[inline]
392#[cfg_attr(test, assert_instr(unknown))]
393#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
394pub fn radd8(a: usize, b: usize) -> usize {
395    let value: usize;
396    unsafe {
397        asm!(".insn r 0x77, 0x0, 0x04, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
398    }
399    value
400}
401
402/// Halves the sum of packed 8-bit unsigned numbers, dropping least bits
403#[inline]
404#[cfg_attr(test, assert_instr(unknown))]
405#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
406pub fn uradd8(a: usize, b: usize) -> usize {
407    let value: usize;
408    unsafe {
409        asm!(".insn r 0x77, 0x0, 0x14, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
410    }
411    value
412}
413
414/// Adds packed 8-bit signed numbers, saturating at the numeric bounds
415#[inline]
416#[cfg_attr(test, assert_instr(unknown))]
417#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
418pub fn kadd8(a: usize, b: usize) -> usize {
419    let value: usize;
420    unsafe {
421        asm!(".insn r 0x77, 0x0, 0x0C, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
422    }
423    value
424}
425
426/// Adds packed 8-bit unsigned numbers, saturating at the numeric bounds
427#[inline]
428#[cfg_attr(test, assert_instr(unknown))]
429#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
430pub fn ukadd8(a: usize, b: usize) -> usize {
431    let value: usize;
432    unsafe {
433        asm!(".insn r 0x77, 0x0, 0x1C, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
434    }
435    value
436}
437
438/// Subtracts packed 8-bit signed numbers, discarding overflow bits
439#[inline]
440#[cfg_attr(test, assert_instr(unknown))]
441#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
442pub fn sub8(a: usize, b: usize) -> usize {
443    let value: usize;
444    unsafe {
445        asm!(".insn r 0x77, 0x0, 0x25, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
446    }
447    value
448}
449
450/// Halves the subtraction result of packed 8-bit signed numbers, dropping least bits
451#[inline]
452#[cfg_attr(test, assert_instr(unknown))]
453#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
454pub fn rsub8(a: usize, b: usize) -> usize {
455    let value: usize;
456    unsafe {
457        asm!(".insn r 0x77, 0x0, 0x05, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
458    }
459    value
460}
461
462/// Halves the subtraction result of packed 8-bit unsigned numbers, dropping least bits
463#[inline]
464#[cfg_attr(test, assert_instr(unknown))]
465#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
466pub fn ursub8(a: usize, b: usize) -> usize {
467    let value: usize;
468    unsafe {
469        asm!(".insn r 0x77, 0x0, 0x15, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
470    }
471    value
472}
473
474/// Subtracts packed 8-bit signed numbers, saturating at the numeric bounds
475#[inline]
476#[cfg_attr(test, assert_instr(unknown))]
477#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
478pub fn ksub8(a: usize, b: usize) -> usize {
479    let value: usize;
480    unsafe {
481        asm!(".insn r 0x77, 0x0, 0x0D, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
482    }
483    value
484}
485
486/// Subtracts packed 8-bit unsigned numbers, saturating at the numeric bounds
487#[inline]
488#[cfg_attr(test, assert_instr(unknown))]
489#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
490pub fn uksub8(a: usize, b: usize) -> usize {
491    let value: usize;
492    unsafe {
493        asm!(".insn r 0x77, 0x0, 0x1D, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
494    }
495    value
496}
497
498/// Arithmetic right shift packed 16-bit elements without rounding up
499#[inline]
500#[cfg_attr(test, assert_instr(unknown))]
501#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
502pub fn sra16(a: usize, b: u32) -> usize {
503    let value: usize;
504    unsafe {
505        asm!(".insn r 0x77, 0x0, 0x28, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
506    }
507    value
508}
509
510/// Arithmetic right shift packed 16-bit elements with rounding up
511#[inline]
512#[cfg_attr(test, assert_instr(unknown))]
513#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
514pub fn sra16u(a: usize, b: u32) -> usize {
515    let value: usize;
516    unsafe {
517        asm!(".insn r 0x77, 0x0, 0x30, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
518    }
519    value
520}
521
522/// Logical right shift packed 16-bit elements without rounding up
523#[inline]
524#[cfg_attr(test, assert_instr(unknown))]
525#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
526pub fn srl16(a: usize, b: u32) -> usize {
527    let value: usize;
528    unsafe {
529        asm!(".insn r 0x77, 0x0, 0x29, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
530    }
531    value
532}
533
534/// Logical right shift packed 16-bit elements with rounding up
535#[inline]
536#[cfg_attr(test, assert_instr(unknown))]
537#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
538pub fn srl16u(a: usize, b: u32) -> usize {
539    let value: usize;
540    unsafe {
541        asm!(".insn r 0x77, 0x0, 0x31, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
542    }
543    value
544}
545
546/// Logical left shift packed 16-bit elements, discarding overflow bits
547#[inline]
548#[cfg_attr(test, assert_instr(unknown))]
549#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
550pub fn sll16(a: usize, b: u32) -> usize {
551    let value: usize;
552    unsafe {
553        asm!(".insn r 0x77, 0x0, 0x2A, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
554    }
555    value
556}
557
558/// Logical left shift packed 16-bit elements, saturating at the numeric bounds
559#[inline]
560#[cfg_attr(test, assert_instr(unknown))]
561#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
562pub fn ksll16(a: usize, b: u32) -> usize {
563    let value: usize;
564    unsafe {
565        asm!(".insn r 0x77, 0x0, 0x32, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
566    }
567    value
568}
569
570/// Logical saturating left then arithmetic right shift packed 16-bit elements
571#[inline]
572#[cfg_attr(test, assert_instr(unknown))]
573#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
574pub fn kslra16(a: usize, b: i32) -> usize {
575    let value: usize;
576    unsafe {
577        asm!(".insn r 0x77, 0x0, 0x2B, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
578    }
579    value
580}
581
582/// Logical saturating left then arithmetic right shift packed 16-bit elements
583#[inline]
584#[cfg_attr(test, assert_instr(unknown))]
585#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
586pub fn kslra16u(a: usize, b: i32) -> usize {
587    let value: usize;
588    unsafe {
589        asm!(".insn r 0x77, 0x0, 0x33, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
590    }
591    value
592}
593
594/// Arithmetic right shift packed 8-bit elements without rounding up
595#[inline]
596#[cfg_attr(test, assert_instr(unknown))]
597#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
598pub fn sra8(a: usize, b: u32) -> usize {
599    let value: usize;
600    unsafe {
601        asm!(".insn r 0x77, 0x0, 0x2C, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
602    }
603    value
604}
605
606/// Arithmetic right shift packed 8-bit elements with rounding up
607#[inline]
608#[cfg_attr(test, assert_instr(unknown))]
609#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
610pub fn sra8u(a: usize, b: u32) -> usize {
611    let value: usize;
612    unsafe {
613        asm!(".insn r 0x77, 0x0, 0x34, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
614    }
615    value
616}
617
618/// Logical right shift packed 8-bit elements without rounding up
619#[inline]
620#[cfg_attr(test, assert_instr(unknown))]
621#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
622pub fn srl8(a: usize, b: u32) -> usize {
623    let value: usize;
624    unsafe {
625        asm!(".insn r 0x77, 0x0, 0x2D, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
626    }
627    value
628}
629
630/// Logical right shift packed 8-bit elements with rounding up
631#[inline]
632#[cfg_attr(test, assert_instr(unknown))]
633#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
634pub fn srl8u(a: usize, b: u32) -> usize {
635    let value: usize;
636    unsafe {
637        asm!(".insn r 0x77, 0x0, 0x35, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
638    }
639    value
640}
641
642/// Logical left shift packed 8-bit elements, discarding overflow bits
643#[inline]
644#[cfg_attr(test, assert_instr(unknown))]
645#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
646pub fn sll8(a: usize, b: u32) -> usize {
647    let value: usize;
648    unsafe {
649        asm!(".insn r 0x77, 0x0, 0x2E, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
650    }
651    value
652}
653
654/// Logical left shift packed 8-bit elements, saturating at the numeric bounds
655#[inline]
656#[cfg_attr(test, assert_instr(unknown))]
657#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
658pub fn ksll8(a: usize, b: u32) -> usize {
659    let value: usize;
660    unsafe {
661        asm!(".insn r 0x77, 0x0, 0x36, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
662    }
663    value
664}
665
666/// Logical saturating left then arithmetic right shift packed 8-bit elements
667#[inline]
668#[cfg_attr(test, assert_instr(unknown))]
669#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
670pub fn kslra8(a: usize, b: i32) -> usize {
671    let value: usize;
672    unsafe {
673        asm!(".insn r 0x77, 0x0, 0x2F, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
674    }
675    value
676}
677
678/// Logical saturating left then arithmetic right shift packed 8-bit elements
679#[inline]
680#[cfg_attr(test, assert_instr(unknown))]
681#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
682pub fn kslra8u(a: usize, b: i32) -> usize {
683    let value: usize;
684    unsafe {
685        asm!(".insn r 0x77, 0x0, 0x37, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
686    }
687    value
688}
689
690/// Compare equality for packed 16-bit elements
691#[inline]
692#[cfg_attr(test, assert_instr(unknown))]
693#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
694pub fn cmpeq16(a: usize, b: usize) -> usize {
695    let value: usize;
696    unsafe {
697        asm!(".insn r 0x77, 0x0, 0x26, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
698    }
699    value
700}
701
702/// Compare whether 16-bit packed signed integers are less than the others
703#[inline]
704#[cfg_attr(test, assert_instr(unknown))]
705#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
706pub fn scmplt16(a: usize, b: usize) -> usize {
707    let value: usize;
708    unsafe {
709        asm!(".insn r 0x77, 0x0, 0x06, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
710    }
711    value
712}
713
714/// Compare whether 16-bit packed signed integers are less than or equal to the others
715#[inline]
716#[cfg_attr(test, assert_instr(unknown))]
717#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
718pub fn scmple16(a: usize, b: usize) -> usize {
719    let value: usize;
720    unsafe {
721        asm!(".insn r 0x77, 0x0, 0x0E, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
722    }
723    value
724}
725
726/// Compare whether 16-bit packed unsigned integers are less than the others
727#[inline]
728#[cfg_attr(test, assert_instr(unknown))]
729#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
730pub fn ucmplt16(a: usize, b: usize) -> usize {
731    let value: usize;
732    unsafe {
733        asm!(".insn r 0x77, 0x0, 0x16, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
734    }
735    value
736}
737
738/// Compare whether 16-bit packed unsigned integers are less than or equal to the others
739#[inline]
740#[cfg_attr(test, assert_instr(unknown))]
741#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
742pub fn ucmple16(a: usize, b: usize) -> usize {
743    let value: usize;
744    unsafe {
745        asm!(".insn r 0x77, 0x0, 0x1E, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
746    }
747    value
748}
749
750/// Compare equality for packed 8-bit elements
751#[inline]
752#[cfg_attr(test, assert_instr(unknown))]
753#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
754pub fn cmpeq8(a: usize, b: usize) -> usize {
755    let value: usize;
756    unsafe {
757        asm!(".insn r 0x77, 0x0, 0x27, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
758    }
759    value
760}
761
762/// Compare whether 8-bit packed signed integers are less than the others
763#[inline]
764#[cfg_attr(test, assert_instr(unknown))]
765#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
766pub fn scmplt8(a: usize, b: usize) -> usize {
767    let value: usize;
768    unsafe {
769        asm!(".insn r 0x77, 0x0, 0x07, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
770    }
771    value
772}
773
774/// Compare whether 8-bit packed signed integers are less than or equal to the others
775#[inline]
776#[cfg_attr(test, assert_instr(unknown))]
777#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
778pub fn scmple8(a: usize, b: usize) -> usize {
779    let value: usize;
780    unsafe {
781        asm!(".insn r 0x77, 0x0, 0x0F, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
782    }
783    value
784}
785
786/// Compare whether 8-bit packed unsigned integers are less than the others
787#[inline]
788#[cfg_attr(test, assert_instr(unknown))]
789#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
790pub fn ucmplt8(a: usize, b: usize) -> usize {
791    let value: usize;
792    unsafe {
793        asm!(".insn r 0x77, 0x0, 0x17, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
794    }
795    value
796}
797
798/// Compare whether 8-bit packed unsigned integers are less than or equal to the others
799#[inline]
800#[cfg_attr(test, assert_instr(unknown))]
801#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
802pub fn ucmple8(a: usize, b: usize) -> usize {
803    let value: usize;
804    unsafe {
805        asm!(".insn r 0x77, 0x0, 0x1F, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
806    }
807    value
808}
809
810/// Get minimum values from 16-bit packed signed integers
811#[inline]
812#[cfg_attr(test, assert_instr(unknown))]
813#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
814pub fn smin16(a: usize, b: usize) -> usize {
815    let value: usize;
816    unsafe {
817        asm!(".insn r 0x77, 0x0, 0x40, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
818    }
819    value
820}
821
822/// Get minimum values from 16-bit packed unsigned integers
823#[inline]
824#[cfg_attr(test, assert_instr(unknown))]
825#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
826pub fn umin16(a: usize, b: usize) -> usize {
827    let value: usize;
828    unsafe {
829        asm!(".insn r 0x77, 0x0, 0x48, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
830    }
831    value
832}
833
834/// Get maximum values from 16-bit packed signed integers
835#[inline]
836#[cfg_attr(test, assert_instr(unknown))]
837#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
838pub fn smax16(a: usize, b: usize) -> usize {
839    let value: usize;
840    unsafe {
841        asm!(".insn r 0x77, 0x0, 0x41, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
842    }
843    value
844}
845
846/// Get maximum values from 16-bit packed unsigned integers
847#[inline]
848#[cfg_attr(test, assert_instr(unknown))]
849#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
850pub fn umax16(a: usize, b: usize) -> usize {
851    let value: usize;
852    unsafe {
853        asm!(".insn r 0x77, 0x0, 0x49, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
854    }
855    value
856}
857
858/* todo: sclip16, uclip16 */
859
860/// Compute the absolute value of packed 16-bit signed integers
861#[inline]
862#[cfg_attr(test, assert_instr(unknown))]
863#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
864pub fn kabs16(a: usize) -> usize {
865    let value: usize;
866    unsafe {
867        asm!(".insn i 0x77, 0x0, {}, {}, %lo(0xAD1)", lateout(reg) value, in(reg) a, options(pure, nomem, nostack))
868    }
869    value
870}
871
872/// Count the number of redundant sign bits of the packed 16-bit elements
873#[inline]
874#[cfg_attr(test, assert_instr(unknown))]
875#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
876pub fn clrs16(a: usize) -> usize {
877    let value: usize;
878    unsafe {
879        asm!(".insn i 0x77, 0x0, {}, {}, %lo(0xAE8)", lateout(reg) value, in(reg) a, options(pure, nomem, nostack))
880    }
881    value
882}
883
884/// Count the number of leading zero bits of the packed 16-bit elements
885#[inline]
886#[cfg_attr(test, assert_instr(unknown))]
887#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
888pub fn clz16(a: usize) -> usize {
889    let value: usize;
890    unsafe {
891        asm!(".insn i 0x77, 0x0, {}, {}, %lo(0xAE9)", lateout(reg) value, in(reg) a, options(pure, nomem, nostack))
892    }
893    value
894}
895
896/// Swap the 16-bit halfwords within each 32-bit word of a register
897#[inline]
898#[cfg_attr(test, assert_instr(unknown))]
899#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
900pub fn swap16(a: usize) -> usize {
901    let value: usize;
902    // this instruction is an alias for `pkbt rd, rs1, rs1`.
903    unsafe {
904        asm!(".insn r 0x77, 0x0, 0x0F, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) a, options(pure, nomem, nostack))
905    }
906    value
907}
908
909/// Get minimum values from 8-bit packed signed integers
910#[inline]
911#[cfg_attr(test, assert_instr(unknown))]
912#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
913pub fn smin8(a: usize, b: usize) -> usize {
914    let value: usize;
915    unsafe {
916        asm!(".insn r 0x77, 0x0, 0x44, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
917    }
918    value
919}
920
921/// Get minimum values from 8-bit packed unsigned integers
922#[inline]
923#[cfg_attr(test, assert_instr(unknown))]
924#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
925pub fn umin8(a: usize, b: usize) -> usize {
926    let value: usize;
927    unsafe {
928        asm!(".insn r 0x77, 0x0, 0x4C, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
929    }
930    value
931}
932
933/// Get maximum values from 8-bit packed signed integers
934#[inline]
935#[cfg_attr(test, assert_instr(unknown))]
936#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
937pub fn smax8(a: usize, b: usize) -> usize {
938    let value: usize;
939    unsafe {
940        asm!(".insn r 0x77, 0x0, 0x45, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
941    }
942    value
943}
944
945/// Get maximum values from 8-bit packed unsigned integers
946#[inline]
947#[cfg_attr(test, assert_instr(unknown))]
948#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
949pub fn umax8(a: usize, b: usize) -> usize {
950    let value: usize;
951    unsafe {
952        asm!(".insn r 0x77, 0x0, 0x4D, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
953    }
954    value
955}
956
957/* todo: sclip8, uclip8 */
958
959/// Compute the absolute value of packed 8-bit signed integers
960#[inline]
961#[cfg_attr(test, assert_instr(unknown))]
962#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
963pub fn kabs8(a: usize) -> usize {
964    let value: usize;
965    unsafe {
966        asm!(".insn i 0x77, 0x0, {}, {}, %lo(0xAD0)", lateout(reg) value, in(reg) a, options(pure, nomem, nostack))
967    }
968    value
969}
970
971/// Count the number of redundant sign bits of the packed 8-bit elements
972#[inline]
973#[cfg_attr(test, assert_instr(unknown))]
974#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
975pub fn clrs8(a: usize) -> usize {
976    let value: usize;
977    unsafe {
978        asm!(".insn i 0x77, 0x0, {}, {}, %lo(0xAE0)", lateout(reg) value, in(reg) a, options(pure, nomem, nostack))
979    }
980    value
981}
982
983/// Count the number of leading zero bits of the packed 8-bit elements
984#[inline]
985#[cfg_attr(test, assert_instr(unknown))]
986#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
987pub fn clz8(a: usize) -> usize {
988    let value: usize;
989    unsafe {
990        asm!(".insn i 0x77, 0x0, {}, {}, %lo(0xAE1)", lateout(reg) value, in(reg) a, options(pure, nomem, nostack))
991    }
992    value
993}
994
995/// Swap the 8-bit bytes within each 16-bit halfword of a register.
996#[inline]
997#[cfg_attr(test, assert_instr(unknown))]
998#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
999pub fn swap8(a: usize) -> usize {
1000    let value: usize;
1001    unsafe {
1002        asm!(".insn i 0x77, 0x0, {}, {}, %lo(0xAD8)", lateout(reg) value, in(reg) a, options(pure, nomem, nostack))
1003    }
1004    value
1005}
1006
1007/// Unpack first and zeroth into two 16-bit signed halfwords in each 32-bit chunk
1008#[inline]
1009#[cfg_attr(test, assert_instr(unknown))]
1010#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
1011pub fn sunpkd810(a: usize) -> usize {
1012    let value: usize;
1013    unsafe {
1014        asm!(".insn i 0x77, 0x0, {}, {}, %lo(0xAC8)", lateout(reg) value, in(reg) a, options(pure, nomem, nostack))
1015    }
1016    value
1017}
1018
1019/// Unpack second and zeroth into two 16-bit signed halfwords in each 32-bit chunk
1020#[inline]
1021#[cfg_attr(test, assert_instr(unknown))]
1022#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
1023pub fn sunpkd820(a: usize) -> usize {
1024    let value: usize;
1025    unsafe {
1026        asm!(".insn i 0x77, 0x0, {}, {}, %lo(0xAC9)", lateout(reg) value, in(reg) a, options(pure, nomem, nostack))
1027    }
1028    value
1029}
1030
1031/// Unpack third and zeroth into two 16-bit signed halfwords in each 32-bit chunk
1032#[inline]
1033#[cfg_attr(test, assert_instr(unknown))]
1034#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
1035pub fn sunpkd830(a: usize) -> usize {
1036    let value: usize;
1037    unsafe {
1038        asm!(".insn i 0x77, 0x0, {}, {}, %lo(0xACA)", lateout(reg) value, in(reg) a, options(pure, nomem, nostack))
1039    }
1040    value
1041}
1042
1043/// Unpack third and first into two 16-bit signed halfwords in each 32-bit chunk
1044#[inline]
1045#[cfg_attr(test, assert_instr(unknown))]
1046#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
1047pub fn sunpkd831(a: usize) -> usize {
1048    let value: usize;
1049    unsafe {
1050        asm!(".insn i 0x77, 0x0, {}, {}, %lo(0xACB)", lateout(reg) value, in(reg) a, options(pure, nomem, nostack))
1051    }
1052    value
1053}
1054
1055/// Unpack third and second into two 16-bit signed halfwords in each 32-bit chunk
1056#[inline]
1057#[cfg_attr(test, assert_instr(unknown))]
1058#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
1059pub fn sunpkd832(a: usize) -> usize {
1060    let value: usize;
1061    unsafe {
1062        asm!(".insn i 0x77, 0x0, {}, {}, %lo(0xAD3)", lateout(reg) value, in(reg) a, options(pure, nomem, nostack))
1063    }
1064    value
1065}
1066
1067/// Unpack first and zeroth into two 16-bit unsigned halfwords in each 32-bit chunk
1068#[inline]
1069#[cfg_attr(test, assert_instr(unknown))]
1070#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
1071pub fn zunpkd810(a: usize) -> usize {
1072    let value: usize;
1073    unsafe {
1074        asm!(".insn i 0x77, 0x0, {}, {}, %lo(0xACC)", lateout(reg) value, in(reg) a, options(pure, nomem, nostack))
1075    }
1076    value
1077}
1078
1079/// Unpack second and zeroth into two 16-bit unsigned halfwords in each 32-bit chunk
1080#[inline]
1081#[cfg_attr(test, assert_instr(unknown))]
1082#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
1083pub fn zunpkd820(a: usize) -> usize {
1084    let value: usize;
1085    unsafe {
1086        asm!(".insn i 0x77, 0x0, {}, {}, %lo(0xACD)", lateout(reg) value, in(reg) a, options(pure, nomem, nostack))
1087    }
1088    value
1089}
1090
1091/// Unpack third and zeroth into two 16-bit unsigned halfwords in each 32-bit chunk
1092#[inline]
1093#[cfg_attr(test, assert_instr(unknown))]
1094#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
1095pub fn zunpkd830(a: usize) -> usize {
1096    let value: usize;
1097    unsafe {
1098        asm!(".insn i 0x77, 0x0, {}, {}, %lo(0xACE)", lateout(reg) value, in(reg) a, options(pure, nomem, nostack))
1099    }
1100    value
1101}
1102
1103/// Unpack third and first into two 16-bit unsigned halfwords in each 32-bit chunk
1104#[inline]
1105#[cfg_attr(test, assert_instr(unknown))]
1106#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
1107pub fn zunpkd831(a: usize) -> usize {
1108    let value: usize;
1109    unsafe {
1110        asm!(".insn i 0x77, 0x0, {}, {}, %lo(0xACF)", lateout(reg) value, in(reg) a, options(pure, nomem, nostack))
1111    }
1112    value
1113}
1114
1115/// Unpack third and second into two 16-bit unsigned halfwords in each 32-bit chunk
1116#[inline]
1117#[cfg_attr(test, assert_instr(unknown))]
1118#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
1119pub fn zunpkd832(a: usize) -> usize {
1120    let value: usize;
1121    unsafe {
1122        asm!(".insn i 0x77, 0x0, {}, {}, %lo(0xAD7)", lateout(reg) value, in(reg) a, options(pure, nomem, nostack))
1123    }
1124    value
1125}
1126
1127// todo: pkbb16, pktt16
1128
1129/// Pack two 16-bit data from bottom and top half from 32-bit chunks
1130#[inline]
1131#[cfg_attr(test, assert_instr(unknown))]
1132#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
1133pub fn pkbt16(a: usize, b: usize) -> usize {
1134    let value: usize;
1135    unsafe {
1136        asm!(".insn r 0x77, 0x1, 0x0F, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
1137    }
1138    value
1139}
1140
1141/// Pack two 16-bit data from top and bottom half from 32-bit chunks
1142#[inline]
1143#[cfg_attr(test, assert_instr(unknown))]
1144#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
1145pub fn pktb16(a: usize, b: usize) -> usize {
1146    let value: usize;
1147    unsafe {
1148        asm!(".insn r 0x77, 0x1, 0x1F, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
1149    }
1150    value
1151}
1152
1153/// Count the number of redundant sign bits of the packed 32-bit elements
1154#[inline]
1155#[cfg_attr(test, assert_instr(unknown))]
1156#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
1157pub fn clrs32(a: usize) -> usize {
1158    let value: usize;
1159    unsafe {
1160        asm!(".insn i 0x77, 0x0, {}, {}, %lo(0xAF8)", lateout(reg) value, in(reg) a, options(pure, nomem, nostack))
1161    }
1162    value
1163}
1164
1165/// Count the number of leading zero bits of the packed 32-bit elements
1166#[inline]
1167#[cfg_attr(test, assert_instr(unknown))]
1168#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
1169pub fn clz32(a: usize) -> usize {
1170    let value: usize;
1171    unsafe {
1172        asm!(".insn i 0x77, 0x0, {}, {}, %lo(0xAF9)", lateout(reg) value, in(reg) a, options(pure, nomem, nostack))
1173    }
1174    value
1175}
1176
1177/// Calculate the sum of absolute difference of unsigned 8-bit data elements
1178#[inline]
1179#[cfg_attr(test, assert_instr(unknown))]
1180#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
1181pub fn pbsad(a: usize, b: usize) -> usize {
1182    let value: usize;
1183    unsafe {
1184        asm!(".insn r 0x77, 0x0, 0x7E, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
1185    }
1186    value
1187}
1188
1189/// Calculate and accumulate the sum of absolute difference of unsigned 8-bit data elements
1190#[inline]
1191#[cfg_attr(test, assert_instr(unknown))]
1192#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
1193pub fn pbsada(t: usize, a: usize, b: usize) -> usize {
1194    let mut value: usize;
1195    unsafe {
1196        asm!(".insn r 0x77, 0x0, 0x7F, {}, {}, {}", inlateout(reg) t => value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
1197    }
1198    value
1199}
1200
1201/// Multiply signed 8-bit elements and add 16-bit elements on results for packed 32-bit chunks
1202#[inline]
1203#[cfg_attr(test, assert_instr(unknown))]
1204#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
1205pub fn smaqa(t: usize, a: usize, b: usize) -> usize {
1206    let mut value: usize;
1207    unsafe {
1208        asm!(".insn r 0x77, 0x0, 0x64, {}, {}, {}", inlateout(reg) t => value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
1209    }
1210    value
1211}
1212
1213/// Multiply unsigned 8-bit elements and add 16-bit elements on results for packed 32-bit chunks
1214#[inline]
1215#[cfg_attr(test, assert_instr(unknown))]
1216#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
1217pub fn umaqa(t: usize, a: usize, b: usize) -> usize {
1218    let mut value: usize;
1219    unsafe {
1220        asm!(".insn r 0x77, 0x0, 0x66, {}, {}, {}", inlateout(reg) t => value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
1221    }
1222    value
1223}
1224
1225/// Multiply signed to unsigned 8-bit and add 16-bit elements on results for packed 32-bit chunks
1226#[inline]
1227#[cfg_attr(test, assert_instr(unknown))]
1228#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
1229pub fn smaqasu(t: usize, a: usize, b: usize) -> usize {
1230    let mut value: usize;
1231    unsafe {
1232        asm!(".insn r 0x77, 0x0, 0x65, {}, {}, {}", inlateout(reg) t => value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
1233    }
1234    value
1235}
1236
1237/// Adds signed lower 16-bit content of two registers with Q15 saturation
1238#[inline]
1239#[cfg_attr(test, assert_instr(unknown))]
1240#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
1241pub fn kaddh(a: usize, b: usize) -> usize {
1242    let value: usize;
1243    unsafe {
1244        asm!(".insn r 0x77, 0x1, 0x02, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
1245    }
1246    value
1247}
1248
1249/// Subtracts signed lower 16-bit content of two registers with Q15 saturation
1250#[inline]
1251#[cfg_attr(test, assert_instr(unknown))]
1252#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
1253pub fn ksubh(a: usize, b: usize) -> usize {
1254    let value: usize;
1255    unsafe {
1256        asm!(".insn r 0x77, 0x1, 0x03, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
1257    }
1258    value
1259}
1260
1261/// Adds signed lower 16-bit content of two registers with U16 saturation
1262#[inline]
1263#[cfg_attr(test, assert_instr(unknown))]
1264#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
1265pub fn ukaddh(a: usize, b: usize) -> usize {
1266    let value: usize;
1267    unsafe {
1268        asm!(".insn r 0x77, 0x1, 0x0A, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
1269    }
1270    value
1271}
1272
1273/// Subtracts signed lower 16-bit content of two registers with U16 saturation
1274#[inline]
1275#[cfg_attr(test, assert_instr(unknown))]
1276#[unstable(feature = "riscv_ext_intrinsics", issue = "114544")]
1277pub fn uksubh(a: usize, b: usize) -> usize {
1278    let value: usize;
1279    unsafe {
1280        asm!(".insn r 0x77, 0x1, 0x0B, {}, {}, {}", lateout(reg) value, in(reg) a, in(reg) b, options(pure, nomem, nostack))
1281    }
1282    value
1283}