@@ -234,15 +234,20 @@ pub fn codegen_intrinsic_call<'a, 'tcx>(bx: &Builder<'a, 'tcx>,
234234 memset_intrinsic ( bx, true , substs. type_at ( 0 ) ,
235235 args[ 0 ] . immediate ( ) , args[ 1 ] . immediate ( ) , args[ 2 ] . immediate ( ) )
236236 }
237- "volatile_load" => {
237+ "volatile_load" | "unaligned_volatile_load" => {
238238 let tp_ty = substs. type_at ( 0 ) ;
239239 let mut ptr = args[ 0 ] . immediate ( ) ;
240240 if let PassMode :: Cast ( ty) = fn_ty. ret . mode {
241241 ptr = bx. pointercast ( ptr, ty. llvm_type ( cx) . ptr_to ( ) ) ;
242242 }
243243 let load = bx. volatile_load ( ptr) ;
244+ let align = if name == "unaligned_volatile_load" {
245+ 1
246+ } else {
247+ cx. align_of ( tp_ty) . abi ( ) as u32
248+ } ;
244249 unsafe {
245- llvm:: LLVMSetAlignment ( load, cx . align_of ( tp_ty ) . abi ( ) as u32 ) ;
250+ llvm:: LLVMSetAlignment ( load, align ) ;
246251 }
247252 to_immediate ( bx, load, cx. layout_of ( tp_ty) )
248253 } ,
@@ -251,6 +256,11 @@ pub fn codegen_intrinsic_call<'a, 'tcx>(bx: &Builder<'a, 'tcx>,
251256 args[ 1 ] . val . volatile_store ( bx, dst) ;
252257 return ;
253258 } ,
259+ "unaligned_volatile_store" => {
260+ let dst = args[ 0 ] . deref ( bx. cx ) ;
261+ args[ 1 ] . val . unaligned_volatile_store ( bx, dst) ;
262+ return ;
263+ } ,
254264 "prefetch_read_data" | "prefetch_write_data" |
255265 "prefetch_read_instruction" | "prefetch_write_instruction" => {
256266 let expect = cx. get_intrinsic ( & ( "llvm.prefetch" ) ) ;
0 commit comments