mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 20:11:17 +00:00
123 lines
4.4 KiB
C
123 lines
4.4 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
|
|
%retparam = alloca i64, align 8
|
|
%varargslots = alloca [3 x %any], align 16
|
|
%taddr = alloca i8, align 1
|
|
%taddr2 = alloca i8, align 1
|
|
%taddr3 = alloca i16, align 2
|
|
%retparam4 = alloca i64, align 8
|
|
%varargslots5 = alloca [4 x %any], align 16
|
|
%taddr8 = alloca i8, align 1
|
|
%taddr11 = alloca i8, align 1
|
|
%taddr14 = alloca i8, align 1
|
|
%taddr17 = alloca i8, align 1
|
|
%0 = getelementptr inbounds %Test, ptr %test, i32 0, i32 0
|
|
store i16 0, ptr %0, align 2
|
|
%1 = getelementptr inbounds %Test, ptr %test, i32 0, i32 1
|
|
store i16 0, ptr %1, align 2
|
|
%2 = getelementptr inbounds %Test, ptr %test, i32 0, i32 1
|
|
%3 = load i16, ptr %2, align 2
|
|
store i16 -20550, ptr %2, align 2
|
|
%4 = getelementptr inbounds %Test, ptr %test, i32 0, i32 1
|
|
%5 = load i16, ptr %4, align 2
|
|
%lshrl = lshr i16 %5, 8
|
|
%6 = and i16 255, %lshrl
|
|
%trunc = trunc i16 %6 to i8
|
|
store i8 %trunc, ptr %taddr, align 1
|
|
%7 = insertvalue %any undef, ptr %taddr, 0
|
|
%8 = insertvalue %any %7, i64 ptrtoint (ptr @"$ct.char" to i64), 1
|
|
%9 = getelementptr inbounds [3 x %any], ptr %varargslots, i64 0, i64 0
|
|
store %any %8, ptr %9, align 16
|
|
%10 = getelementptr inbounds %Test, ptr %test, i32 0, i32 1
|
|
%11 = load i16, ptr %10, align 2
|
|
%12 = and i16 255, %11
|
|
%trunc1 = trunc i16 %12 to i8
|
|
store i8 %trunc1, ptr %taddr2, align 1
|
|
%13 = insertvalue %any undef, ptr %taddr2, 0
|
|
%14 = insertvalue %any %13, i64 ptrtoint (ptr @"$ct.char" to i64), 1
|
|
%15 = getelementptr inbounds [3 x %any], ptr %varargslots, i64 0, i64 1
|
|
store %any %14, ptr %15, align 16
|
|
%16 = getelementptr inbounds %Test, ptr %test, i32 0, i32 1
|
|
%17 = load i16, ptr %16, align 2
|
|
store i16 %17, ptr %taddr3, align 2
|
|
%18 = insertvalue %any undef, ptr %taddr3, 0
|
|
%19 = insertvalue %any %18, i64 ptrtoint (ptr @"$ct.ushort" to i64), 1
|
|
%20 = getelementptr inbounds [3 x %any], ptr %varargslots, i64 0, i64 2
|
|
store %any %19, ptr %20, align 16
|
|
%21 = call i64 @std.io.printfn(ptr %retparam, ptr @.str, i64 18, ptr %varargslots, i64 3)
|
|
%22 = getelementptr inbounds %Test, ptr %test, i32 0, i32 1
|
|
%23 = load i16, ptr %22, align 2
|
|
%lshrl6 = lshr i16 %23, 7
|
|
%24 = and i16 1, %lshrl6
|
|
%trunc7 = trunc i16 %24 to i8
|
|
store i8 %trunc7, ptr %taddr8, align 1
|
|
%25 = insertvalue %any undef, ptr %taddr8, 0
|
|
%26 = insertvalue %any %25, i64 ptrtoint (ptr @"$ct.bool" to i64), 1
|
|
%27 = getelementptr inbounds [4 x %any], ptr %varargslots5, i64 0, i64 0
|
|
store %any %26, ptr %27, align 16
|
|
%28 = getelementptr inbounds %Test, ptr %test, i32 0, i32 1
|
|
%29 = load i16, ptr %28, align 2
|
|
%lshrl9 = lshr i16 %29, 6
|
|
%30 = and i16 1, %lshrl9
|
|
%trunc10 = trunc i16 %30 to i8
|
|
store i8 %trunc10, ptr %taddr11, align 1
|
|
%31 = insertvalue %any undef, ptr %taddr11, 0
|
|
%32 = insertvalue %any %31, i64 ptrtoint (ptr @"$ct.bool" to i64), 1
|
|
%33 = getelementptr inbounds [4 x %any], ptr %varargslots5, i64 0, i64 1
|
|
store %any %32, ptr %33, align 16
|
|
%34 = getelementptr inbounds %Test, ptr %test, i32 0, i32 1
|
|
%35 = load i16, ptr %34, align 2
|
|
%lshrl12 = lshr i16 %35, 5
|
|
%36 = and i16 1, %lshrl12
|
|
%trunc13 = trunc i16 %36 to i8
|
|
store i8 %trunc13, ptr %taddr14, align 1
|
|
%37 = insertvalue %any undef, ptr %taddr14, 0
|
|
%38 = insertvalue %any %37, i64 ptrtoint (ptr @"$ct.bool" to i64), 1
|
|
%39 = getelementptr inbounds [4 x %any], ptr %varargslots5, i64 0, i64 2
|
|
store %any %38, ptr %39, align 16
|
|
%40 = getelementptr inbounds %Test, ptr %test, i32 0, i32 1
|
|
%41 = load i16, ptr %40, align 2
|
|
%lshrl15 = lshr i16 %41, 4
|
|
%42 = and i16 1, %lshrl15
|
|
%trunc16 = trunc i16 %42 to i8
|
|
store i8 %trunc16, ptr %taddr17, align 1
|
|
%43 = insertvalue %any undef, ptr %taddr17, 0
|
|
%44 = insertvalue %any %43, i64 ptrtoint (ptr @"$ct.bool" to i64), 1
|
|
%45 = getelementptr inbounds [4 x %any], ptr %varargslots5, i64 0, i64 3
|
|
store %any %44, ptr %45, align 16
|
|
%46 = call i64 @std.io.printfn(ptr %retparam4, ptr @.str.1, i64 12, ptr %varargslots5, i64 4)
|
|
ret void
|
|
}
|
|
|