@@ -17,6 +17,14 @@ pub(crate) fn codegen_aarch64_llvm_intrinsic_call<'tcx>(
17
17
fx. bcx . ins ( ) . fence ( ) ;
18
18
}
19
19
20
+ "llvm.aarch64.neon.ld1x4.v16i8.p0i8" => {
21
+ intrinsic_args ! ( fx, args => ( ptr) ; intrinsic) ;
22
+
23
+ let ptr = ptr. load_scalar ( fx) ;
24
+ let val = CPlace :: for_ptr ( Pointer :: new ( ptr) , ret. layout ( ) ) . to_cvalue ( fx) ;
25
+ ret. write_cvalue ( fx, val) ;
26
+ }
27
+
20
28
_ if intrinsic. starts_with ( "llvm.aarch64.neon.abs.v" ) => {
21
29
intrinsic_args ! ( fx, args => ( a) ; intrinsic) ;
22
30
@@ -115,6 +123,22 @@ pub(crate) fn codegen_aarch64_llvm_intrinsic_call<'tcx>(
115
123
) ;
116
124
}
117
125
126
+ "llvm.aarch64.neon.uaddlv.i32.v16i8" => {
127
+ intrinsic_args ! ( fx, args => ( v) ; intrinsic) ;
128
+
129
+ let mut res_val = fx. bcx . ins ( ) . iconst ( types:: I16 , 0 ) ;
130
+ for lane_idx in 0 ..16 {
131
+ let lane = v. value_lane ( fx, lane_idx) . load_scalar ( fx) ;
132
+ let lane = fx. bcx . ins ( ) . uextend ( types:: I16 , lane) ;
133
+ res_val = fx. bcx . ins ( ) . iadd ( res_val, lane) ;
134
+ }
135
+ let res = CValue :: by_val (
136
+ fx. bcx . ins ( ) . uextend ( types:: I32 , res_val) ,
137
+ fx. layout_of ( fx. tcx . types . u32 ) ,
138
+ ) ;
139
+ ret. write_cvalue ( fx, res) ;
140
+ }
141
+
118
142
_ if intrinsic. starts_with ( "llvm.aarch64.neon.faddv.f32.v" ) => {
119
143
intrinsic_args ! ( fx, args => ( v) ; intrinsic) ;
120
144
0 commit comments