llhd 0.16.0

A Low Level Hardware Description that acts as a foundation for building hardware design tools.
Documentation
; RUN: llhd-opt %s -p cf

func @shift () void {
entry:
    %a = const i8 60  ; 0b00111100
    %b = const i8 195 ; 0b11000011
    %c = const i10 195 ; 0b0011000011

    ; trivial cases
    %zero = const i8 0
    %shl_zero = shl i8 %a, i8 %b, i8 %zero
    %shr_zero = shr i8 %a, i8 %b, i8 %zero
    %shl_zero_use = add i8 %shl_zero, %zero
    %shr_zero_use = add i8 %shr_zero, %zero
    ; CHECK: %shl_zero_use = const i8 60
    ; CHECK: %shr_zero_use = const i8 60

    ; full shift-out
    %eight = const i8 8
    %ten = const i8 10
    %shl_full1 = shl i8 %a, i8 %b, i8 %eight
    %shr_full1 = shr i8 %a, i8 %b, i8 %eight
    %shl_full2 = shl i8 %a, i10 %c, i8 %eight
    %shr_full2 = shr i8 %a, i10 %c, i8 %eight
    %shl_full3 = shl i8 %a, i10 %c, i8 %ten
    %shr_full3 = shr i8 %a, i10 %c, i8 %ten
    %shl_full1_use = add i8 %shl_full1, %zero
    %shr_full1_use = add i8 %shr_full1, %zero
    %shl_full2_use = add i8 %shl_full2, %zero
    %shr_full2_use = add i8 %shr_full2, %zero
    %shl_full3_use = add i8 %shl_full3, %zero
    %shr_full3_use = add i8 %shr_full3, %zero
    ; CHECK: %shl_full1_use = const i8 195
    ; CHECK: %shr_full1_use = const i8 195
    ; CHECK: %shl_full2_use = const i8 48
    ; CHECK: %shr_full2_use = const i8 195
    ; CHECK: %shl_full3_use = const i8 195
    ; CHECK: %shr_full3_use = const i8 48

    ; partial but constant shift
    %two = const i8 2
    %four = const i8 4
    %shl_part1 = shl i8 %a, i8 %b, i8 %two
    %shr_part1 = shr i8 %a, i8 %b, i8 %two
    %shl_part2 = shl i8 %a, i8 %b, i8 %four
    %shr_part2 = shr i8 %a, i8 %b, i8 %four
    %shl_part1_use = add i8 %shl_part1, %zero
    %shr_part1_use = add i8 %shr_part1, %zero
    %shl_part2_use = add i8 %shl_part2, %zero
    %shr_part2_use = add i8 %shr_part2, %zero
    ; CHECK: %shl_part1_use = const i8 243
    ; CHECK: %shr_part1_use = const i8 207
    ; CHECK: %shl_part2_use = const i8 204
    ; CHECK: %shr_part2_use = const i8 51

    ret
}