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 @exts_i8 () void {
entry:
    %a = const i8 60 ; 0b00111100

    %ext1 = exts i4, i8 %a, 0, 4
    %ext2 = exts i4, i8 %a, 2, 4
    %ext3 = exts i4, i8 %a, 4, 4
    ; CHECK: %ext1 = const i4 12
    ; CHECK: %ext2 = const i4 15
    ; CHECK: %ext3 = const i4 3

    ret
}

func @extf_array () void {
entry:
    %v0 = const i8 42
    %v1 = const i8 43
    %v2 = const i8 44
    %v3 = const i8 45
    %a = [4 x i8 %v0]
    %b = [i8 %v0, %v1, %v2, %v3]

    %zero = const i8 0
    %uniform1 = extf i8, [4 x i8] %a, 0
    %uniform2 = extf i8, [4 x i8] %a, 1
    %uniform3 = extf i8, [4 x i8] %a, 2
    %uniform4 = extf i8, [4 x i8] %a, 3
    %uniform1_use = add i8 %uniform1, %zero
    %uniform2_use = add i8 %uniform2, %zero
    %uniform3_use = add i8 %uniform3, %zero
    %uniform4_use = add i8 %uniform4, %zero
    ; CHECK: %uniform1_use = const i8 42
    ; CHECK: %uniform2_use = const i8 42
    ; CHECK: %uniform3_use = const i8 42
    ; CHECK: %uniform4_use = const i8 42

    %var1 = extf i8, [4 x i8] %b, 0
    %var2 = extf i8, [4 x i8] %b, 1
    %var3 = extf i8, [4 x i8] %b, 2
    %var4 = extf i8, [4 x i8] %b, 3
    %var1_use = add i8 %var1, %zero
    %var2_use = add i8 %var2, %zero
    %var3_use = add i8 %var3, %zero
    %var4_use = add i8 %var4, %zero
    ; CHECK: %var1_use = const i8 42
    ; CHECK: %var2_use = const i8 43
    ; CHECK: %var3_use = const i8 44
    ; CHECK: %var4_use = const i8 45

    ret
}

func @extf_struct () void {
entry:
    %v0 = const i8 42
    %v1 = const i16 1337
    %a = {i8 %v0, i16 %v1}

    %zero8 = const i8 0
    %zero16 = const i16 0
    %ext1 = extf i8, {i8, i16} %a, 0
    %ext2 = extf i16, {i8, i16} %a, 1
    %ext1_use = add i8 %ext1, %zero8
    %ext2_use = add i16 %ext2, %zero16
    ; CHECK: %ext1_use = const i8 42
    ; CHECK: %ext2_use = const i16 1337

    ret
}