@@ -1902,11 +1902,13 @@ where
1902
1902
let llty = self . emit_type_both ( mir. ty ) ?;
1903
1903
let mut fields = vec ! [ ] ;
1904
1904
for value in values. iter ( ) {
1905
- fields. push ( self . emit_mir_rvalue ( value) ?. 1 ) ;
1905
+ let emitted_value = self . emit_mir_rvalue ( value) ?. 1 ;
1906
+ fields. push ( self . cast_integer_to_sbv ( emitted_value) ) ;
1906
1907
}
1908
+ let concat = circt:: moore:: ConcatOp :: new ( self . mlir_builder , fields) . into ( ) ;
1907
1909
(
1908
1910
self . emit_zero_for_type ( & llty. 0 ) ,
1909
- circt :: moore :: ConcatOp :: new ( self . mlir_builder , fields ) . into ( ) ,
1911
+ self . cast_sbv_to_integer ( concat ) ,
1910
1912
)
1911
1913
}
1912
1914
@@ -3046,6 +3048,39 @@ where
3046
3048
}
3047
3049
}
3048
3050
3051
+ fn cast_integer_to_sbv ( & mut self , value : mlir:: Value ) -> mlir:: Value {
3052
+ assert ! ( mlir:: is_integer_type( value. ty( ) ) ) ;
3053
+ self . one_op_ucc (
3054
+ value,
3055
+ circt:: moore:: get_simple_bitvector_type (
3056
+ self . mcx ,
3057
+ false ,
3058
+ false ,
3059
+ mlir:: integer_type_width ( value. ty ( ) ) ,
3060
+ ) ,
3061
+ )
3062
+ }
3063
+
3064
+ fn cast_sbv_to_integer ( & mut self , value : mlir:: Value ) -> mlir:: Value {
3065
+ assert ! ( circt:: moore:: is_simple_bitvector_type( value. ty( ) ) ) ;
3066
+ self . one_op_ucc (
3067
+ value,
3068
+ mlir:: get_integer_type (
3069
+ self . mcx ,
3070
+ circt:: moore:: get_simple_bitvector_size ( value. ty ( ) ) ,
3071
+ ) ,
3072
+ )
3073
+ }
3074
+
3075
+ fn one_op_ucc ( & mut self , value : mlir:: Value , ty : mlir:: Type ) -> mlir:: Value {
3076
+ circt:: builtin:: UnrealizedConversionCastOp :: new (
3077
+ self . mlir_builder ,
3078
+ std:: iter:: once ( value) ,
3079
+ std:: iter:: once ( ty) ,
3080
+ )
3081
+ . result ( 0 )
3082
+ }
3083
+
3049
3084
fn mk_block ( & mut self , name : Option < & str > ) -> HybridBlock {
3050
3085
let bb = self . builder . block ( ) ;
3051
3086
if let Some ( name) = name {
@@ -3340,47 +3375,14 @@ where
3340
3375
amount : HybridValue ,
3341
3376
arithmetic : bool ,
3342
3377
) -> HybridValue {
3343
- let value_moore_type = circt:: moore:: get_simple_bitvector_type (
3344
- self . mcx ,
3345
- false ,
3346
- false ,
3347
- circt:: mlir:: integer_type_width ( value. 1 . ty ( ) ) ,
3348
- ) ;
3349
- let amount_moore_type = circt:: moore:: get_simple_bitvector_type (
3350
- self . mcx ,
3351
- false ,
3352
- false ,
3353
- circt:: mlir:: integer_type_width ( amount. 1 . ty ( ) ) ,
3354
- ) ;
3355
- let value_cast_to_moore = circt:: builtin:: UnrealizedConversionCastOp :: new (
3356
- self . mlir_builder ,
3357
- std:: iter:: once ( value. 1 ) ,
3358
- std:: iter:: once ( value_moore_type) ,
3359
- )
3360
- . result ( 0 ) ;
3361
- let amount_cast_to_moore = circt:: builtin:: UnrealizedConversionCastOp :: new (
3362
- self . mlir_builder ,
3363
- std:: iter:: once ( amount. 1 ) ,
3364
- std:: iter:: once ( amount_moore_type) ,
3365
- )
3366
- . result ( 0 ) ;
3367
- let shift = circt:: moore:: ShlOp :: new (
3368
- self . mlir_builder ,
3369
- value_cast_to_moore,
3370
- amount_cast_to_moore,
3371
- arithmetic,
3372
- )
3373
- . into ( ) ;
3374
- let cast_to_llhd = circt:: builtin:: UnrealizedConversionCastOp :: new (
3375
- self . mlir_builder ,
3376
- std:: iter:: once ( shift) ,
3377
- std:: iter:: once ( value. 1 . ty ( ) ) ,
3378
- )
3379
- . result ( 0 ) ;
3380
-
3378
+ let value_casted = self . cast_integer_to_sbv ( value. 1 ) ;
3379
+ let amount_casted = self . cast_integer_to_sbv ( amount. 1 ) ;
3380
+ let shift =
3381
+ circt:: moore:: ShlOp :: new ( self . mlir_builder , value_casted, amount_casted, arithmetic)
3382
+ . into ( ) ;
3381
3383
(
3382
3384
self . builder . ins ( ) . shl ( value. 0 , hidden. 0 , amount. 0 ) ,
3383
- cast_to_llhd ,
3385
+ self . cast_sbv_to_integer ( shift ) ,
3384
3386
)
3385
3387
}
3386
3388
@@ -3403,47 +3405,14 @@ where
3403
3405
amount : HybridValue ,
3404
3406
arithmetic : bool ,
3405
3407
) -> HybridValue {
3406
- let value_moore_type = circt:: moore:: get_simple_bitvector_type (
3407
- self . mcx ,
3408
- false ,
3409
- false ,
3410
- circt:: mlir:: integer_type_width ( value. 1 . ty ( ) ) ,
3411
- ) ;
3412
- let amount_moore_type = circt:: moore:: get_simple_bitvector_type (
3413
- self . mcx ,
3414
- false ,
3415
- false ,
3416
- circt:: mlir:: integer_type_width ( amount. 1 . ty ( ) ) ,
3417
- ) ;
3418
- let value_cast_to_moore = circt:: builtin:: UnrealizedConversionCastOp :: new (
3419
- self . mlir_builder ,
3420
- std:: iter:: once ( value. 1 ) ,
3421
- std:: iter:: once ( value_moore_type) ,
3422
- )
3423
- . result ( 0 ) ;
3424
- let amount_cast_to_moore = circt:: builtin:: UnrealizedConversionCastOp :: new (
3425
- self . mlir_builder ,
3426
- std:: iter:: once ( amount. 1 ) ,
3427
- std:: iter:: once ( amount_moore_type) ,
3428
- )
3429
- . result ( 0 ) ;
3430
- let shift = circt:: moore:: ShrOp :: new (
3431
- self . mlir_builder ,
3432
- value_cast_to_moore,
3433
- amount_cast_to_moore,
3434
- arithmetic,
3435
- )
3436
- . into ( ) ;
3437
- let cast_to_llhd = circt:: builtin:: UnrealizedConversionCastOp :: new (
3438
- self . mlir_builder ,
3439
- std:: iter:: once ( shift) ,
3440
- std:: iter:: once ( value. 1 . ty ( ) ) ,
3441
- )
3442
- . result ( 0 ) ;
3443
-
3408
+ let value_casted = self . cast_integer_to_sbv ( value. 1 ) ;
3409
+ let amount_casted = self . cast_integer_to_sbv ( amount. 1 ) ;
3410
+ let shift =
3411
+ circt:: moore:: ShrOp :: new ( self . mlir_builder , value_casted, amount_casted, arithmetic)
3412
+ . into ( ) ;
3444
3413
(
3445
3414
self . builder . ins ( ) . shr ( value. 0 , hidden. 0 , amount. 0 ) ,
3446
- cast_to_llhd ,
3415
+ self . cast_sbv_to_integer ( shift ) ,
3447
3416
)
3448
3417
}
3449
3418
0 commit comments