@@ -234,15 +234,20 @@ pub fn codegen_intrinsic_call<'a, 'tcx>(bx: &Builder<'a, 'tcx>,
234
234
memset_intrinsic ( bx, true , substs. type_at ( 0 ) ,
235
235
args[ 0 ] . immediate ( ) , args[ 1 ] . immediate ( ) , args[ 2 ] . immediate ( ) )
236
236
}
237
- "volatile_load" => {
237
+ "volatile_load" | "unaligned_volatile_load" => {
238
238
let tp_ty = substs. type_at ( 0 ) ;
239
239
let mut ptr = args[ 0 ] . immediate ( ) ;
240
240
if let PassMode :: Cast ( ty) = fn_ty. ret . mode {
241
241
ptr = bx. pointercast ( ptr, ty. llvm_type ( cx) . ptr_to ( ) ) ;
242
242
}
243
243
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
+ } ;
244
249
unsafe {
245
- llvm:: LLVMSetAlignment ( load, cx . align_of ( tp_ty ) . abi ( ) as u32 ) ;
250
+ llvm:: LLVMSetAlignment ( load, align ) ;
246
251
}
247
252
to_immediate ( bx, load, cx. layout_of ( tp_ty) )
248
253
} ,
@@ -251,6 +256,11 @@ pub fn codegen_intrinsic_call<'a, 'tcx>(bx: &Builder<'a, 'tcx>,
251
256
args[ 1 ] . val . volatile_store ( bx, dst) ;
252
257
return ;
253
258
} ,
259
+ "unaligned_volatile_store" => {
260
+ let dst = args[ 0 ] . deref ( bx. cx ) ;
261
+ args[ 1 ] . val . unaligned_volatile_store ( bx, dst) ;
262
+ return ;
263
+ } ,
254
264
"prefetch_read_data" | "prefetch_write_data" |
255
265
"prefetch_read_instruction" | "prefetch_write_instruction" => {
256
266
let expect = cx. get_intrinsic ( & ( "llvm.prefetch" ) ) ;
0 commit comments