@@ -354,6 +354,63 @@ impl MemoryBuilderMethods<'tcx> for Builder<'a, 'll, 'tcx> {
354
354
llvm:: LLVMBuildStructGEP ( self . llbuilder , ptr, idx as c_uint , noname ( ) )
355
355
}
356
356
}
357
+
358
+ fn memcpy ( & mut self , dst : & ' ll Value , dst_align : Align ,
359
+ src : & ' ll Value , src_align : Align ,
360
+ size : & ' ll Value , flags : MemFlags ) {
361
+ if flags. contains ( MemFlags :: NONTEMPORAL ) {
362
+ // HACK(nox): This is inefficient but there is no nontemporal memcpy.
363
+ let val = self . load ( src, src_align) ;
364
+ let ptr = self . pointercast ( dst, self . type_ptr_to ( self . val_ty ( val) ) ) ;
365
+ self . store_with_flags ( val, ptr, dst_align, flags) ;
366
+ return ;
367
+ }
368
+ let size = self . intcast ( size, self . type_isize ( ) , false ) ;
369
+ let is_volatile = flags. contains ( MemFlags :: VOLATILE ) ;
370
+ let dst = self . pointercast ( dst, self . type_i8p ( ) ) ;
371
+ let src = self . pointercast ( src, self . type_i8p ( ) ) ;
372
+ unsafe {
373
+ llvm:: LLVMRustBuildMemCpy ( self . llbuilder , dst, dst_align. bytes ( ) as c_uint ,
374
+ src, src_align. bytes ( ) as c_uint , size, is_volatile) ;
375
+ }
376
+ }
377
+
378
+ fn memmove ( & mut self , dst : & ' ll Value , dst_align : Align ,
379
+ src : & ' ll Value , src_align : Align ,
380
+ size : & ' ll Value , flags : MemFlags ) {
381
+ if flags. contains ( MemFlags :: NONTEMPORAL ) {
382
+ // HACK(nox): This is inefficient but there is no nontemporal memmove.
383
+ let val = self . load ( src, src_align) ;
384
+ let ptr = self . pointercast ( dst, self . type_ptr_to ( self . val_ty ( val) ) ) ;
385
+ self . store_with_flags ( val, ptr, dst_align, flags) ;
386
+ return ;
387
+ }
388
+ let size = self . intcast ( size, self . type_isize ( ) , false ) ;
389
+ let is_volatile = flags. contains ( MemFlags :: VOLATILE ) ;
390
+ let dst = self . pointercast ( dst, self . type_i8p ( ) ) ;
391
+ let src = self . pointercast ( src, self . type_i8p ( ) ) ;
392
+ unsafe {
393
+ llvm:: LLVMRustBuildMemMove ( self . llbuilder , dst, dst_align. bytes ( ) as c_uint ,
394
+ src, src_align. bytes ( ) as c_uint , size, is_volatile) ;
395
+ }
396
+ }
397
+
398
+ fn memset (
399
+ & mut self ,
400
+ ptr : & ' ll Value ,
401
+ fill_byte : & ' ll Value ,
402
+ size : & ' ll Value ,
403
+ align : Align ,
404
+ flags : MemFlags ,
405
+ ) {
406
+ let ptr_width = & self . sess ( ) . target . target . target_pointer_width ;
407
+ let intrinsic_key = format ! ( "llvm.memset.p0i8.i{}" , ptr_width) ;
408
+ let llintrinsicfn = self . get_intrinsic ( & intrinsic_key) ;
409
+ let ptr = self . pointercast ( ptr, self . type_i8p ( ) ) ;
410
+ let align = self . const_u32 ( align. bytes ( ) as u32 ) ;
411
+ let volatile = self . const_bool ( flags. contains ( MemFlags :: VOLATILE ) ) ;
412
+ self . call ( llintrinsicfn, & [ ptr, fill_byte, size, align, volatile] , None ) ;
413
+ }
357
414
}
358
415
359
416
impl BuilderMethods < ' a , ' tcx > for Builder < ' a , ' ll , ' tcx > {
@@ -928,63 +985,6 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
928
985
}
929
986
}
930
987
931
- fn memcpy ( & mut self , dst : & ' ll Value , dst_align : Align ,
932
- src : & ' ll Value , src_align : Align ,
933
- size : & ' ll Value , flags : MemFlags ) {
934
- if flags. contains ( MemFlags :: NONTEMPORAL ) {
935
- // HACK(nox): This is inefficient but there is no nontemporal memcpy.
936
- let val = self . load ( src, src_align) ;
937
- let ptr = self . pointercast ( dst, self . type_ptr_to ( self . val_ty ( val) ) ) ;
938
- self . store_with_flags ( val, ptr, dst_align, flags) ;
939
- return ;
940
- }
941
- let size = self . intcast ( size, self . type_isize ( ) , false ) ;
942
- let is_volatile = flags. contains ( MemFlags :: VOLATILE ) ;
943
- let dst = self . pointercast ( dst, self . type_i8p ( ) ) ;
944
- let src = self . pointercast ( src, self . type_i8p ( ) ) ;
945
- unsafe {
946
- llvm:: LLVMRustBuildMemCpy ( self . llbuilder , dst, dst_align. bytes ( ) as c_uint ,
947
- src, src_align. bytes ( ) as c_uint , size, is_volatile) ;
948
- }
949
- }
950
-
951
- fn memmove ( & mut self , dst : & ' ll Value , dst_align : Align ,
952
- src : & ' ll Value , src_align : Align ,
953
- size : & ' ll Value , flags : MemFlags ) {
954
- if flags. contains ( MemFlags :: NONTEMPORAL ) {
955
- // HACK(nox): This is inefficient but there is no nontemporal memmove.
956
- let val = self . load ( src, src_align) ;
957
- let ptr = self . pointercast ( dst, self . type_ptr_to ( self . val_ty ( val) ) ) ;
958
- self . store_with_flags ( val, ptr, dst_align, flags) ;
959
- return ;
960
- }
961
- let size = self . intcast ( size, self . type_isize ( ) , false ) ;
962
- let is_volatile = flags. contains ( MemFlags :: VOLATILE ) ;
963
- let dst = self . pointercast ( dst, self . type_i8p ( ) ) ;
964
- let src = self . pointercast ( src, self . type_i8p ( ) ) ;
965
- unsafe {
966
- llvm:: LLVMRustBuildMemMove ( self . llbuilder , dst, dst_align. bytes ( ) as c_uint ,
967
- src, src_align. bytes ( ) as c_uint , size, is_volatile) ;
968
- }
969
- }
970
-
971
- fn memset (
972
- & mut self ,
973
- ptr : & ' ll Value ,
974
- fill_byte : & ' ll Value ,
975
- size : & ' ll Value ,
976
- align : Align ,
977
- flags : MemFlags ,
978
- ) {
979
- let ptr_width = & self . sess ( ) . target . target . target_pointer_width ;
980
- let intrinsic_key = format ! ( "llvm.memset.p0i8.i{}" , ptr_width) ;
981
- let llintrinsicfn = self . get_intrinsic ( & intrinsic_key) ;
982
- let ptr = self . pointercast ( ptr, self . type_i8p ( ) ) ;
983
- let align = self . const_u32 ( align. bytes ( ) as u32 ) ;
984
- let volatile = self . const_bool ( flags. contains ( MemFlags :: VOLATILE ) ) ;
985
- self . call ( llintrinsicfn, & [ ptr, fill_byte, size, align, volatile] , None ) ;
986
- }
987
-
988
988
fn select (
989
989
& mut self , cond : & ' ll Value ,
990
990
then_val : & ' ll Value ,
0 commit comments