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 > ,
@@ -166,9 +165,6 @@ impl<'tcx> CValue<'tcx> {
166
165
CValueInner :: ByRef ( ptr, None ) => {
167
166
let clif_ty = match layout. abi {
168
167
Abi :: Scalar ( scalar) => scalar_to_clif_type ( fx. tcx , scalar) ,
169
- Abi :: Vector { element, count } => scalar_to_clif_type ( fx. tcx , element)
170
- . by ( u32:: try_from ( count) . unwrap ( ) )
171
- . unwrap ( ) ,
172
168
_ => unreachable ! ( "{:?}" , layout. ty) ,
173
169
} ;
174
170
let mut flags = MemFlags :: new ( ) ;
@@ -214,17 +210,7 @@ impl<'tcx> CValue<'tcx> {
214
210
) -> CValue < ' tcx > {
215
211
let layout = self . 1 ;
216
212
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
- } ,
213
+ CValueInner :: ByVal ( _) => unreachable ! ( ) ,
228
214
CValueInner :: ByValPair ( val1, val2) => match layout. abi {
229
215
Abi :: ScalarPair ( _, _) => {
230
216
let val = match field. as_u32 ( ) {
@@ -258,16 +244,7 @@ impl<'tcx> CValue<'tcx> {
258
244
let lane_layout = fx. layout_of ( lane_ty) ;
259
245
assert ! ( lane_idx < lane_count) ;
260
246
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 ! ( ) ,
247
+ CValueInner :: ByVal ( _) | CValueInner :: ByValPair ( _, _) => unreachable ! ( ) ,
271
248
CValueInner :: ByRef ( ptr, None ) => {
272
249
let field_offset = lane_layout. size * lane_idx;
273
250
let field_ptr = ptr. offset_i64 ( fx, i64:: try_from ( field_offset. bytes ( ) ) . unwrap ( ) ) ;
@@ -348,7 +325,6 @@ pub(crate) struct CPlace<'tcx> {
348
325
pub ( crate ) enum CPlaceInner {
349
326
Var ( Local , Variable ) ,
350
327
VarPair ( Local , Variable , Variable ) ,
351
- VarLane ( Local , Variable , u8 ) ,
352
328
Addr ( Pointer , Option < Value > ) ,
353
329
}
354
330
@@ -442,12 +418,6 @@ impl<'tcx> CPlace<'tcx> {
442
418
//fx.bcx.set_val_label(val2, cranelift_codegen::ir::ValueLabel::new(var2.index()));
443
419
CValue :: by_val_pair ( val1, val2, layout)
444
420
}
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
421
CPlaceInner :: Addr ( ptr, extra) => {
452
422
if let Some ( extra) = extra {
453
423
CValue :: by_ref_unsized ( ptr, extra, layout)
@@ -470,9 +440,9 @@ impl<'tcx> CPlace<'tcx> {
470
440
pub ( crate ) fn to_ptr_maybe_unsized ( self ) -> ( Pointer , Option < Value > ) {
471
441
match self . inner {
472
442
CPlaceInner :: Addr ( ptr, extra) => ( ptr, extra) ,
473
- CPlaceInner :: Var ( _, _)
474
- | CPlaceInner :: VarPair ( _ , _ , _ )
475
- | CPlaceInner :: VarLane ( _ , _ , _ ) => bug ! ( "Expected CPlace::Addr, found {:?}" , self ) ,
443
+ CPlaceInner :: Var ( _, _) | CPlaceInner :: VarPair ( _ , _ , _ ) => {
444
+ bug ! ( "Expected CPlace::Addr, found {:?}" , self )
445
+ }
476
446
}
477
447
}
478
448
@@ -565,26 +535,6 @@ impl<'tcx> CPlace<'tcx> {
565
535
let dst_layout = self . layout ( ) ;
566
536
let to_ptr = match self . inner {
567
537
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
538
let data = CValue ( from. 0 , dst_layout) . load_scalar ( fx) ;
589
539
let dst_ty = fx. clif_type ( self . layout ( ) . ty ) . unwrap ( ) ;
590
540
transmute_value ( fx, var, data, dst_ty) ;
@@ -603,22 +553,6 @@ impl<'tcx> CPlace<'tcx> {
603
553
transmute_value ( fx, var2, data2, dst_ty2) ;
604
554
return ;
605
555
}
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
556
CPlaceInner :: Addr ( ptr, None ) => {
623
557
if dst_layout. size == Size :: ZERO || dst_layout. abi == Abi :: Uninhabited {
624
558
return ;
@@ -631,7 +565,6 @@ impl<'tcx> CPlace<'tcx> {
631
565
let mut flags = MemFlags :: new ( ) ;
632
566
flags. set_notrap ( ) ;
633
567
match from. layout ( ) . abi {
634
- // FIXME make Abi::Vector work too
635
568
Abi :: Scalar ( _) => {
636
569
let val = from. load_scalar ( fx) ;
637
570
to_ptr. store ( fx, val, flags) ;
@@ -692,39 +625,6 @@ impl<'tcx> CPlace<'tcx> {
692
625
let layout = self . layout ( ) ;
693
626
694
627
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
628
CPlaceInner :: VarPair ( local, var1, var2) => {
729
629
let layout = layout. field ( & * fx, field. index ( ) ) ;
730
630
@@ -766,15 +666,8 @@ impl<'tcx> CPlace<'tcx> {
766
666
assert ! ( lane_idx < lane_count) ;
767
667
768
668
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
- }
669
+ CPlaceInner :: Var ( _, _) => unreachable ! ( ) ,
776
670
CPlaceInner :: VarPair ( _, _, _) => unreachable ! ( ) ,
777
- CPlaceInner :: VarLane ( _, _, _) => unreachable ! ( ) ,
778
671
CPlaceInner :: Addr ( ptr, None ) => {
779
672
let field_offset = lane_layout. size * lane_idx;
780
673
let field_ptr = ptr. offset_i64 ( fx, i64:: try_from ( field_offset. bytes ( ) ) . unwrap ( ) ) ;
@@ -793,32 +686,11 @@ impl<'tcx> CPlace<'tcx> {
793
686
ty:: Array ( elem_ty, _) => {
794
687
let elem_layout = fx. layout_of ( * elem_ty) ;
795
688
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
689
CPlaceInner :: Addr ( addr, None ) => ( elem_layout, addr) ,
817
- CPlaceInner :: Addr ( _, Some ( _ ) )
818
- | CPlaceInner :: VarPair ( _, _ , _ )
819
- | CPlaceInner :: VarLane ( _, _, _) => bug ! ( "Can't index into {self:?}" ) ,
690
+ CPlaceInner :: Var ( _, _ )
691
+ | CPlaceInner :: Addr ( _, Some ( _ ) )
692
+ | CPlaceInner :: VarPair ( _, _, _) => bug ! ( "Can't index into {self:?}" ) ,
820
693
}
821
- // FIXME use VarLane in case of Var with simd type
822
694
}
823
695
ty:: Slice ( elem_ty) => ( fx. layout_of ( * elem_ty) , self . to_ptr_maybe_unsized ( ) . 0 ) ,
824
696
_ => bug ! ( "place_index({:?})" , self . layout( ) . ty) ,
0 commit comments