Files
c3c/test/test_suite/bitstruct/bitstruct_anon_in_struct_ok.c3t

120 lines
4.3 KiB
C

// #target: macos-x64
module foo;
import std::io;
struct Test {
ushort afff;
bitstruct : ushort @overlap {
ushort ab : 0..15;
char a : 8..15;
char b : 0..7;
bool c : 7;
bool d : 6;
bool e : 5;
bool f : 4;
}
}
fn void main() {
Test test;
test.ab = 0xAFBA;
io::printfn("%02x %02x -> %04x\n", test.a, test.b, test.ab);
io::printfn("%x %x %x %x\n", test.c, test.d, test.e, test.f);
}
/* #expect: foo.ll
define void @foo.main() #0 {
entry:
%test = alloca %Test, align 2
%varargslots = alloca [3 x %"any*"], align 16
%taddr = alloca i8, align 1
%taddr5 = alloca i8, align 1
%taddr8 = alloca i16, align 2
%retparam = alloca i64, align 8
%varargslots10 = alloca [4 x %"any*"], align 16
%taddr14 = alloca i8, align 1
%taddr18 = alloca i8, align 1
%taddr23 = alloca i8, align 1
%taddr28 = alloca i8, align 1
%retparam30 = alloca i64, align 8
store i16 0, ptr %test, align 2
%ptradd = getelementptr inbounds i8, ptr %test, i64 2
store i16 0, ptr %ptradd, align 2
%ptradd1 = getelementptr inbounds i8, ptr %test, i64 2
%0 = load i16, ptr %ptradd1, align 2
store i16 -20550, ptr %ptradd1, align 2
%ptradd2 = getelementptr inbounds i8, ptr %test, i64 2
%1 = load i16, ptr %ptradd2, align 2
%lshrl = lshr i16 %1, 8
%2 = and i16 255, %lshrl
%trunc = trunc i16 %2 to i8
store i8 %trunc, ptr %taddr, align 1
%3 = insertvalue %"any*" undef, ptr %taddr, 0
%4 = insertvalue %"any*" %3, i64 ptrtoint (ptr @"$ct.char" to i64), 1
store %"any*" %4, ptr %varargslots, align 16
%ptradd3 = getelementptr inbounds i8, ptr %test, i64 2
%5 = load i16, ptr %ptradd3, align 2
%6 = and i16 255, %5
%trunc4 = trunc i16 %6 to i8
store i8 %trunc4, ptr %taddr5, align 1
%7 = insertvalue %"any*" undef, ptr %taddr5, 0
%8 = insertvalue %"any*" %7, i64 ptrtoint (ptr @"$ct.char" to i64), 1
%ptradd6 = getelementptr inbounds i8, ptr %varargslots, i64 16
store %"any*" %8, ptr %ptradd6, align 16
%ptradd7 = getelementptr inbounds i8, ptr %test, i64 2
%9 = load i16, ptr %ptradd7, align 2
store i16 %9, ptr %taddr8, align 2
%10 = insertvalue %"any*" undef, ptr %taddr8, 0
%11 = insertvalue %"any*" %10, i64 ptrtoint (ptr @"$ct.ushort" to i64), 1
%ptradd9 = getelementptr inbounds i8, ptr %varargslots, i64 32
store %"any*" %11, ptr %ptradd9, align 16
%12 = call i64 @std.io.printfn(ptr %retparam, ptr @.str, i64 18, ptr %varargslots, i64 3)
%ptradd11 = getelementptr inbounds i8, ptr %test, i64 2
%13 = load i16, ptr %ptradd11, align 2
%lshrl12 = lshr i16 %13, 7
%14 = and i16 1, %lshrl12
%trunc13 = trunc i16 %14 to i8
store i8 %trunc13, ptr %taddr14, align 1
%15 = insertvalue %"any*" undef, ptr %taddr14, 0
%16 = insertvalue %"any*" %15, i64 ptrtoint (ptr @"$ct.bool" to i64), 1
store %"any*" %16, ptr %varargslots10, align 16
%ptradd15 = getelementptr inbounds i8, ptr %test, i64 2
%17 = load i16, ptr %ptradd15, align 2
%lshrl16 = lshr i16 %17, 6
%18 = and i16 1, %lshrl16
%trunc17 = trunc i16 %18 to i8
store i8 %trunc17, ptr %taddr18, align 1
%19 = insertvalue %"any*" undef, ptr %taddr18, 0
%20 = insertvalue %"any*" %19, i64 ptrtoint (ptr @"$ct.bool" to i64), 1
%ptradd19 = getelementptr inbounds i8, ptr %varargslots10, i64 16
store %"any*" %20, ptr %ptradd19, align 16
%ptradd20 = getelementptr inbounds i8, ptr %test, i64 2
%21 = load i16, ptr %ptradd20, align 2
%lshrl21 = lshr i16 %21, 5
%22 = and i16 1, %lshrl21
%trunc22 = trunc i16 %22 to i8
store i8 %trunc22, ptr %taddr23, align 1
%23 = insertvalue %"any*" undef, ptr %taddr23, 0
%24 = insertvalue %"any*" %23, i64 ptrtoint (ptr @"$ct.bool" to i64), 1
%ptradd24 = getelementptr inbounds i8, ptr %varargslots10, i64 32
store %"any*" %24, ptr %ptradd24, align 16
%ptradd25 = getelementptr inbounds i8, ptr %test, i64 2
%25 = load i16, ptr %ptradd25, align 2
%lshrl26 = lshr i16 %25, 4
%26 = and i16 1, %lshrl26
%trunc27 = trunc i16 %26 to i8
store i8 %trunc27, ptr %taddr28, align 1
%27 = insertvalue %"any*" undef, ptr %taddr28, 0
%28 = insertvalue %"any*" %27, i64 ptrtoint (ptr @"$ct.bool" to i64), 1
%ptradd29 = getelementptr inbounds i8, ptr %varargslots10, i64 48
store %"any*" %28, ptr %ptradd29, align 16
%29 = call i64 @std.io.printfn(ptr %retparam30, ptr @.str.1, i64 12, ptr %varargslots10, i64 4)
ret void
}