3
3
use crate :: prelude:: * ;
4
4
5
5
use cranelift_codegen:: ir:: immediates:: Offset32 ;
6
- use cranelift_codegen:: ir:: { InstructionData , Opcode } ;
7
6
8
7
fn codegen_field < ' tcx > (
9
8
fx : & mut FunctionCx < ' _ , ' _ , ' tcx > ,
@@ -214,17 +213,7 @@ impl<'tcx> CValue<'tcx> {
214
213
) -> CValue < ' tcx > {
215
214
let layout = self . 1 ;
216
215
match self . 0 {
217
- CValueInner :: ByVal ( val) => match layout. abi {
218
- Abi :: Vector { element : _, count } => {
219
- let count = u8:: try_from ( count) . expect ( "SIMD type with more than 255 lanes???" ) ;
220
- let field = u8:: try_from ( field. index ( ) ) . unwrap ( ) ;
221
- assert ! ( field < count) ;
222
- let lane = fx. bcx . ins ( ) . extractlane ( val, field) ;
223
- let field_layout = layout. field ( & * fx, usize:: from ( field) ) ;
224
- CValue :: by_val ( lane, field_layout)
225
- }
226
- _ => unreachable ! ( "value_field for ByVal with abi {:?}" , layout. abi) ,
227
- } ,
216
+ CValueInner :: ByVal ( _) => unreachable ! ( ) ,
228
217
CValueInner :: ByValPair ( val1, val2) => match layout. abi {
229
218
Abi :: ScalarPair ( _, _) => {
230
219
let val = match field. as_u32 ( ) {
@@ -258,16 +247,7 @@ impl<'tcx> CValue<'tcx> {
258
247
let lane_layout = fx. layout_of ( lane_ty) ;
259
248
assert ! ( lane_idx < lane_count) ;
260
249
match self . 0 {
261
- CValueInner :: ByVal ( val) => match layout. abi {
262
- Abi :: Vector { element : _, count : _ } => {
263
- assert ! ( lane_count <= u8 :: MAX . into( ) , "SIMD type with more than 255 lanes???" ) ;
264
- let lane_idx = u8:: try_from ( lane_idx) . unwrap ( ) ;
265
- let lane = fx. bcx . ins ( ) . extractlane ( val, lane_idx) ;
266
- CValue :: by_val ( lane, lane_layout)
267
- }
268
- _ => unreachable ! ( "value_lane for ByVal with abi {:?}" , layout. abi) ,
269
- } ,
270
- CValueInner :: ByValPair ( _, _) => unreachable ! ( ) ,
250
+ CValueInner :: ByVal ( _) | CValueInner :: ByValPair ( _, _) => unreachable ! ( ) ,
271
251
CValueInner :: ByRef ( ptr, None ) => {
272
252
let field_offset = lane_layout. size * lane_idx;
273
253
let field_ptr = ptr. offset_i64 ( fx, i64:: try_from ( field_offset. bytes ( ) ) . unwrap ( ) ) ;
@@ -348,7 +328,6 @@ pub(crate) struct CPlace<'tcx> {
348
328
pub ( crate ) enum CPlaceInner {
349
329
Var ( Local , Variable ) ,
350
330
VarPair ( Local , Variable , Variable ) ,
351
- VarLane ( Local , Variable , u8 ) ,
352
331
Addr ( Pointer , Option < Value > ) ,
353
332
}
354
333
@@ -442,12 +421,6 @@ impl<'tcx> CPlace<'tcx> {
442
421
//fx.bcx.set_val_label(val2, cranelift_codegen::ir::ValueLabel::new(var2.index()));
443
422
CValue :: by_val_pair ( val1, val2, layout)
444
423
}
445
- CPlaceInner :: VarLane ( _local, var, lane) => {
446
- let val = fx. bcx . use_var ( var) ;
447
- //fx.bcx.set_val_label(val, cranelift_codegen::ir::ValueLabel::new(var.index()));
448
- let val = fx. bcx . ins ( ) . extractlane ( val, lane) ;
449
- CValue :: by_val ( val, layout)
450
- }
451
424
CPlaceInner :: Addr ( ptr, extra) => {
452
425
if let Some ( extra) = extra {
453
426
CValue :: by_ref_unsized ( ptr, extra, layout)
@@ -470,9 +443,9 @@ impl<'tcx> CPlace<'tcx> {
470
443
pub ( crate ) fn to_ptr_maybe_unsized ( self ) -> ( Pointer , Option < Value > ) {
471
444
match self . inner {
472
445
CPlaceInner :: Addr ( ptr, extra) => ( ptr, extra) ,
473
- CPlaceInner :: Var ( _, _)
474
- | CPlaceInner :: VarPair ( _ , _ , _ )
475
- | CPlaceInner :: VarLane ( _ , _ , _ ) => bug ! ( "Expected CPlace::Addr, found {:?}" , self ) ,
446
+ CPlaceInner :: Var ( _, _) | CPlaceInner :: VarPair ( _ , _ , _ ) => {
447
+ bug ! ( "Expected CPlace::Addr, found {:?}" , self )
448
+ }
476
449
}
477
450
}
478
451
@@ -565,26 +538,6 @@ impl<'tcx> CPlace<'tcx> {
565
538
let dst_layout = self . layout ( ) ;
566
539
let to_ptr = match self . inner {
567
540
CPlaceInner :: Var ( _local, var) => {
568
- if let ty:: Array ( element, len) = dst_layout. ty . kind ( ) {
569
- // Can only happen for vector types
570
- let len = u32:: try_from ( len. eval_target_usize ( fx. tcx , ParamEnv :: reveal_all ( ) ) )
571
- . unwrap ( ) ;
572
- let vector_ty = fx. clif_type ( * element) . unwrap ( ) . by ( len) . unwrap ( ) ;
573
-
574
- let data = match from. 0 {
575
- CValueInner :: ByRef ( ptr, None ) => {
576
- let mut flags = MemFlags :: new ( ) ;
577
- flags. set_notrap ( ) ;
578
- ptr. load ( fx, vector_ty, flags)
579
- }
580
- CValueInner :: ByVal ( _)
581
- | CValueInner :: ByValPair ( _, _)
582
- | CValueInner :: ByRef ( _, Some ( _) ) => bug ! ( "array should be ByRef" ) ,
583
- } ;
584
-
585
- fx. bcx . def_var ( var, data) ;
586
- return ;
587
- }
588
541
let data = CValue ( from. 0 , dst_layout) . load_scalar ( fx) ;
589
542
let dst_ty = fx. clif_type ( self . layout ( ) . ty ) . unwrap ( ) ;
590
543
transmute_value ( fx, var, data, dst_ty) ;
@@ -603,22 +556,6 @@ impl<'tcx> CPlace<'tcx> {
603
556
transmute_value ( fx, var2, data2, dst_ty2) ;
604
557
return ;
605
558
}
606
- CPlaceInner :: VarLane ( _local, var, lane) => {
607
- let data = from. load_scalar ( fx) ;
608
-
609
- // First get the old vector
610
- let vector = fx. bcx . use_var ( var) ;
611
- //fx.bcx.set_val_label(vector, cranelift_codegen::ir::ValueLabel::new(var.index()));
612
-
613
- // Next insert the written lane into the vector
614
- let vector = fx. bcx . ins ( ) . insertlane ( vector, data, lane) ;
615
-
616
- // Finally write the new vector
617
- //fx.bcx.set_val_label(vector, cranelift_codegen::ir::ValueLabel::new(var.index()));
618
- fx. bcx . def_var ( var, vector) ;
619
-
620
- return ;
621
- }
622
559
CPlaceInner :: Addr ( ptr, None ) => {
623
560
if dst_layout. size == Size :: ZERO || dst_layout. abi == Abi :: Uninhabited {
624
561
return ;
@@ -631,7 +568,6 @@ impl<'tcx> CPlace<'tcx> {
631
568
let mut flags = MemFlags :: new ( ) ;
632
569
flags. set_notrap ( ) ;
633
570
match from. layout ( ) . abi {
634
- // FIXME make Abi::Vector work too
635
571
Abi :: Scalar ( _) => {
636
572
let val = from. load_scalar ( fx) ;
637
573
to_ptr. store ( fx, val, flags) ;
@@ -692,39 +628,6 @@ impl<'tcx> CPlace<'tcx> {
692
628
let layout = self . layout ( ) ;
693
629
694
630
match self . inner {
695
- CPlaceInner :: Var ( local, var) => match layout. ty . kind ( ) {
696
- ty:: Array ( _, _) => {
697
- // Can only happen for vector types
698
- return CPlace {
699
- inner : CPlaceInner :: VarLane ( local, var, field. as_u32 ( ) . try_into ( ) . unwrap ( ) ) ,
700
- layout : layout. field ( fx, field. as_u32 ( ) . try_into ( ) . unwrap ( ) ) ,
701
- } ;
702
- }
703
- ty:: Adt ( adt_def, substs) if layout. ty . is_simd ( ) => {
704
- let f0_ty = adt_def. non_enum_variant ( ) . fields [ 0 ] . ty ( fx. tcx , substs) ;
705
-
706
- match f0_ty. kind ( ) {
707
- ty:: Array ( _, _) => {
708
- assert_eq ! ( field. as_u32( ) , 0 ) ;
709
- return CPlace {
710
- inner : CPlaceInner :: Var ( local, var) ,
711
- layout : layout. field ( fx, field. as_u32 ( ) . try_into ( ) . unwrap ( ) ) ,
712
- } ;
713
- }
714
- _ => {
715
- return CPlace {
716
- inner : CPlaceInner :: VarLane (
717
- local,
718
- var,
719
- field. as_u32 ( ) . try_into ( ) . unwrap ( ) ,
720
- ) ,
721
- layout : layout. field ( fx, field. as_u32 ( ) . try_into ( ) . unwrap ( ) ) ,
722
- } ;
723
- }
724
- }
725
- }
726
- _ => { }
727
- } ,
728
631
CPlaceInner :: VarPair ( local, var1, var2) => {
729
632
let layout = layout. field ( & * fx, field. index ( ) ) ;
730
633
@@ -766,15 +669,8 @@ impl<'tcx> CPlace<'tcx> {
766
669
assert ! ( lane_idx < lane_count) ;
767
670
768
671
match self . inner {
769
- CPlaceInner :: Var ( local, var) => {
770
- assert ! ( matches!( layout. abi, Abi :: Vector { .. } ) ) ;
771
- CPlace {
772
- inner : CPlaceInner :: VarLane ( local, var, lane_idx. try_into ( ) . unwrap ( ) ) ,
773
- layout : lane_layout,
774
- }
775
- }
672
+ CPlaceInner :: Var ( _, _) => unreachable ! ( ) ,
776
673
CPlaceInner :: VarPair ( _, _, _) => unreachable ! ( ) ,
777
- CPlaceInner :: VarLane ( _, _, _) => unreachable ! ( ) ,
778
674
CPlaceInner :: Addr ( ptr, None ) => {
779
675
let field_offset = lane_layout. size * lane_idx;
780
676
let field_ptr = ptr. offset_i64 ( fx, i64:: try_from ( field_offset. bytes ( ) ) . unwrap ( ) ) ;
@@ -793,32 +689,11 @@ impl<'tcx> CPlace<'tcx> {
793
689
ty:: Array ( elem_ty, _) => {
794
690
let elem_layout = fx. layout_of ( * elem_ty) ;
795
691
match self . inner {
796
- CPlaceInner :: Var ( local, var) => {
797
- // This is a hack to handle `vector_val.0[1]`. It doesn't allow dynamic
798
- // indexing.
799
- let lane_idx = match fx. bcx . func . dfg . insts
800
- [ fx. bcx . func . dfg . value_def ( index) . unwrap_inst ( ) ]
801
- {
802
- InstructionData :: UnaryImm { opcode : Opcode :: Iconst , imm } => imm,
803
- _ => bug ! (
804
- "Dynamic indexing into a vector type is not supported: {self:?}[{index}]"
805
- ) ,
806
- } ;
807
- return CPlace {
808
- inner : CPlaceInner :: VarLane (
809
- local,
810
- var,
811
- lane_idx. bits ( ) . try_into ( ) . unwrap ( ) ,
812
- ) ,
813
- layout : elem_layout,
814
- } ;
815
- }
816
692
CPlaceInner :: Addr ( addr, None ) => ( elem_layout, addr) ,
817
- CPlaceInner :: Addr ( _, Some ( _ ) )
818
- | CPlaceInner :: VarPair ( _, _ , _ )
819
- | CPlaceInner :: VarLane ( _, _, _) => bug ! ( "Can't index into {self:?}" ) ,
693
+ CPlaceInner :: Var ( _, _ )
694
+ | CPlaceInner :: Addr ( _, Some ( _ ) )
695
+ | CPlaceInner :: VarPair ( _, _, _) => bug ! ( "Can't index into {self:?}" ) ,
820
696
}
821
- // FIXME use VarLane in case of Var with simd type
822
697
}
823
698
ty:: Slice ( elem_ty) => ( fx. layout_of ( * elem_ty) , self . to_ptr_maybe_unsized ( ) . 0 ) ,
824
699
_ => bug ! ( "place_index({:?})" , self . layout( ) . ty) ,
0 commit comments