Files
c3c/test/test_suite/bitstruct/bitstruct_be.c3t
Christoffer Lerno 63d9853bd3 Fixes to bitstruct.
2022-08-14 18:25:47 +02:00

364 lines
17 KiB
C

// #target: macos-x64
module test;
import std::io;
bitstruct Test : int @bigendian
{
ushort a : 0..15;
ushort b : 16..31;
}
bitstruct Test2 : char[4] @bigendian
{
ushort a : 0..15;
ushort b : 16..31;
}
fn void main()
{
IntBE x;
x.val = 123;
io::printf("BE 123 => %d (%d)\n", (int)x, x.val);
Test abc = { .a = 0x1234, .b = 0x5678 };
Test2 abc2 = { .a = 0x1234, .b = 0x5678 };
char[4]* z = (char[4]*)&abc;
char[4]* z2 = (char[4]*)&abc2;
foreach (d : z2) io::printf(" %x", d);
io::println("");
foreach (d : z) io::printf(" %x", d);
io::println("");
io::printfln("abc.a = %x", abc.a);
abc.a = 0x1234;
abc.b = 0x5678;
io::printfln("->abc.a = %x", abc.a);
foreach (d : z) io::printf(" %x", d);
io::println("");
IntLE y;
y.val = 123;
io::printf("LE 123 => %d (%d)\n", (int)y, y.val);
}
/* #expect: test.ll
%0 = load i32, i32* %x, align 4
%1 = call i32 @llvm.bswap.i32(i32 %0)
store i32 2063597568, i32* %x, align 4
store %"char[]" { i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str, i32 0, i32 0), i64 18 }, %"char[]"* %taddr, align 8
%2 = bitcast %"char[]"* %taddr to { i8*, i64 }*
%3 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %2, i32 0, i32 0
%lo = load i8*, i8** %3, align 8
%4 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %2, i32 0, i32 1
%hi = load i64, i64* %4, align 8
%5 = bitcast i32* %x to i8*
%6 = insertvalue %variant undef, i8* %5, 0
%7 = insertvalue %variant %6, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1
%8 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 0
store %variant %7, %variant* %8, align 16
%9 = load i32, i32* %x, align 4
%10 = call i32 @llvm.bswap.i32(i32 %9)
store i32 %10, i32* %taddr1, align 4
%11 = bitcast i32* %taddr1 to i8*
%12 = insertvalue %variant undef, i8* %11, 0
%13 = insertvalue %variant %12, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1
%14 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 1
store %variant %13, %variant* %14, align 16
%15 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg, i32 0, i32 1
store i64 2, i64* %15, align 8
%16 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg, i32 0, i32 0
%17 = bitcast [2 x %variant]* %varargslots to %variant*
store %variant* %17, %variant** %16, align 8
%18 = bitcast %"variant[]"* %vararg to { i8*, i64 }*
%19 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %18, i32 0, i32 0
%lo2 = load i8*, i8** %19, align 8
%20 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %18, i32 0, i32 1
%hi3 = load i64, i64* %20, align 8
%21 = call i64 @std_io_printf(i64* %retparam, i8* %lo, i64 %hi, i8* %lo2, i64 %hi3)
%not_err = icmp eq i64 %21, 0
br i1 %not_err, label %after_check, label %voiderr
after_check: ; preds = %entry
br label %voiderr
voiderr: ; preds = %after_check, %entry
store i32 873625686, i32* %abc, align 4
store [4 x i8] c"\124Vx", [4 x i8]* %abc2, align 1
%ptrptr = bitcast i32* %abc to [4 x i8]*
store [4 x i8]* %ptrptr, [4 x i8]** %z, align 8
store [4 x i8]* %abc2, [4 x i8]** %z2, align 8
%22 = load [4 x i8]*, [4 x i8]** %z2, align 8
store [4 x i8]* %22, [4 x i8]** %.anon, align 8
store i64 0, i64* %.anon4, align 8
br label %loop.cond
loop.cond: ; preds = %voiderr15, %voiderr
%23 = load i64, i64* %.anon4, align 8
%gt = icmp ugt i64 4, %23
br i1 %gt, label %loop.body, label %loop.exit
loop.body: ; preds = %loop.cond
%24 = load [4 x i8]*, [4 x i8]** %.anon, align 8
%25 = load i64, i64* %.anon4, align 8
%26 = getelementptr inbounds [4 x i8], [4 x i8]* %24, i64 0, i64 %25
%27 = load i8, i8* %26, align 1
store i8 %27, i8* %d, align 1
store %"char[]" { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i64 3 }, %"char[]"* %taddr6, align 8
%28 = bitcast %"char[]"* %taddr6 to { i8*, i64 }*
%29 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %28, i32 0, i32 0
%lo7 = load i8*, i8** %29, align 8
%30 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %28, i32 0, i32 1
%hi8 = load i64, i64* %30, align 8
%31 = insertvalue %variant undef, i8* %d, 0
%32 = insertvalue %variant %31, i64 ptrtoint (%.introspect* @"ct$char" to i64), 1
%33 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots10, i64 0, i64 0
store %variant %32, %variant* %33, align 16
%34 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg9, i32 0, i32 1
store i64 1, i64* %34, align 8
%35 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg9, i32 0, i32 0
%36 = bitcast [1 x %variant]* %varargslots10 to %variant*
store %variant* %36, %variant** %35, align 8
%37 = bitcast %"variant[]"* %vararg9 to { i8*, i64 }*
%38 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %37, i32 0, i32 0
%lo11 = load i8*, i8** %38, align 8
%39 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %37, i32 0, i32 1
%hi12 = load i64, i64* %39, align 8
%40 = call i64 @std_io_printf(i64* %retparam5, i8* %lo7, i64 %hi8, i8* %lo11, i64 %hi12)
%not_err13 = icmp eq i64 %40, 0
br i1 %not_err13, label %after_check14, label %voiderr15
after_check14: ; preds = %loop.body
br label %voiderr15
voiderr15: ; preds = %after_check14, %loop.body
%41 = load i64, i64* %.anon4, align 8
%add = add i64 %41, 1
store i64 %add, i64* %.anon4, align 8
br label %loop.cond
loop.exit: ; preds = %loop.cond
%42 = call i32 @std_io_println(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.2, i32 0, i32 0)) #2
%43 = load [4 x i8]*, [4 x i8]** %z, align 8
store [4 x i8]* %43, [4 x i8]** %.anon16, align 8
store i64 0, i64* %.anon17, align 8
br label %loop.cond18
loop.cond18: ; preds = %voiderr32, %loop.exit
%44 = load i64, i64* %.anon17, align 8
%gt19 = icmp ugt i64 4, %44
br i1 %gt19, label %loop.body20, label %loop.exit34
loop.body20: ; preds = %loop.cond18
%45 = load [4 x i8]*, [4 x i8]** %.anon16, align 8
%46 = load i64, i64* %.anon17, align 8
%47 = getelementptr inbounds [4 x i8], [4 x i8]* %45, i64 0, i64 %46
%48 = load i8, i8* %47, align 1
store i8 %48, i8* %d21, align 1
store %"char[]" { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.3, i32 0, i32 0), i64 3 }, %"char[]"* %taddr23, align 8
%49 = bitcast %"char[]"* %taddr23 to { i8*, i64 }*
%50 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %49, i32 0, i32 0
%lo24 = load i8*, i8** %50, align 8
%51 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %49, i32 0, i32 1
%hi25 = load i64, i64* %51, align 8
%52 = insertvalue %variant undef, i8* %d21, 0
%53 = insertvalue %variant %52, i64 ptrtoint (%.introspect* @"ct$char" to i64), 1
%54 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots27, i64 0, i64 0
store %variant %53, %variant* %54, align 16
%55 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg26, i32 0, i32 1
store i64 1, i64* %55, align 8
%56 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg26, i32 0, i32 0
%57 = bitcast [1 x %variant]* %varargslots27 to %variant*
store %variant* %57, %variant** %56, align 8
%58 = bitcast %"variant[]"* %vararg26 to { i8*, i64 }*
%59 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %58, i32 0, i32 0
%lo28 = load i8*, i8** %59, align 8
%60 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %58, i32 0, i32 1
%hi29 = load i64, i64* %60, align 8
%61 = call i64 @std_io_printf(i64* %retparam22, i8* %lo24, i64 %hi25, i8* %lo28, i64 %hi29)
%not_err30 = icmp eq i64 %61, 0
br i1 %not_err30, label %after_check31, label %voiderr32
after_check31: ; preds = %loop.body20
br label %voiderr32
voiderr32: ; preds = %after_check31, %loop.body20
%62 = load i64, i64* %.anon17, align 8
%add33 = add i64 %62, 1
store i64 %add33, i64* %.anon17, align 8
br label %loop.cond18
loop.exit34: ; preds = %loop.cond18
%63 = call i32 @std_io_println(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.4, i32 0, i32 0)) #2
store %"char[]" { i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.5, i32 0, i32 0), i64 10 }, %"char[]"* %taddr36, align 8
%64 = bitcast %"char[]"* %taddr36 to { i8*, i64 }*
%65 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %64, i32 0, i32 0
%lo37 = load i8*, i8** %65, align 8
%66 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %64, i32 0, i32 1
%hi38 = load i64, i64* %66, align 8
%67 = load i32, i32* %abc, align 4
%68 = call i32 @llvm.bswap.i32(i32 %67)
%69 = and i32 65535, %68
%ztrunc = trunc i32 %69 to i16
store i16 %ztrunc, i16* %taddr41, align 2
%70 = bitcast i16* %taddr41 to i8*
%71 = insertvalue %variant undef, i8* %70, 0
%72 = insertvalue %variant %71, i64 ptrtoint (%.introspect* @"ct$ushort" to i64), 1
%73 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots40, i64 0, i64 0
store %variant %72, %variant* %73, align 16
%74 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg39, i32 0, i32 1
store i64 1, i64* %74, align 8
%75 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg39, i32 0, i32 0
%76 = bitcast [1 x %variant]* %varargslots40 to %variant*
store %variant* %76, %variant** %75, align 8
%77 = bitcast %"variant[]"* %vararg39 to { i8*, i64 }*
%78 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %77, i32 0, i32 0
%lo42 = load i8*, i8** %78, align 8
%79 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %77, i32 0, i32 1
%hi43 = load i64, i64* %79, align 8
%80 = call i64 @std_io_printfln(i64* %retparam35, i8* %lo37, i64 %hi38, i8* %lo42, i64 %hi43)
%not_err44 = icmp eq i64 %80, 0
br i1 %not_err44, label %after_check45, label %voiderr46
after_check45: ; preds = %loop.exit34
br label %voiderr46
voiderr46: ; preds = %after_check45, %loop.exit34
%81 = load i32, i32* %abc, align 4
%82 = call i32 @llvm.bswap.i32(i32 %81)
%83 = and i32 %82, -65536
%84 = or i32 %83, 4660
%85 = call i32 @llvm.bswap.i32(i32 %84)
store i32 %85, i32* %abc, align 4
%86 = load i32, i32* %abc, align 4
%87 = call i32 @llvm.bswap.i32(i32 %86)
%88 = and i32 %87, 65535
%89 = or i32 %88, 1450704896
%90 = call i32 @llvm.bswap.i32(i32 %89)
store i32 %90, i32* %abc, align 4
store %"char[]" { i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.6, i32 0, i32 0), i64 12 }, %"char[]"* %taddr48, align 8
%91 = bitcast %"char[]"* %taddr48 to { i8*, i64 }*
%92 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %91, i32 0, i32 0
%lo49 = load i8*, i8** %92, align 8
%93 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %91, i32 0, i32 1
%hi50 = load i64, i64* %93, align 8
%94 = load i32, i32* %abc, align 4
%95 = call i32 @llvm.bswap.i32(i32 %94)
%96 = and i32 65535, %95
%ztrunc53 = trunc i32 %96 to i16
store i16 %ztrunc53, i16* %taddr54, align 2
%97 = bitcast i16* %taddr54 to i8*
%98 = insertvalue %variant undef, i8* %97, 0
%99 = insertvalue %variant %98, i64 ptrtoint (%.introspect* @"ct$ushort" to i64), 1
%100 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots52, i64 0, i64 0
store %variant %99, %variant* %100, align 16
%101 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg51, i32 0, i32 1
store i64 1, i64* %101, align 8
%102 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg51, i32 0, i32 0
%103 = bitcast [1 x %variant]* %varargslots52 to %variant*
store %variant* %103, %variant** %102, align 8
%104 = bitcast %"variant[]"* %vararg51 to { i8*, i64 }*
%105 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %104, i32 0, i32 0
%lo55 = load i8*, i8** %105, align 8
%106 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %104, i32 0, i32 1
%hi56 = load i64, i64* %106, align 8
%107 = call i64 @std_io_printfln(i64* %retparam47, i8* %lo49, i64 %hi50, i8* %lo55, i64 %hi56)
%not_err57 = icmp eq i64 %107, 0
br i1 %not_err57, label %after_check58, label %voiderr59
after_check58: ; preds = %voiderr46
br label %voiderr59
voiderr59: ; preds = %after_check58, %voiderr46
%108 = load [4 x i8]*, [4 x i8]** %z, align 8
store [4 x i8]* %108, [4 x i8]** %.anon60, align 8
store i64 0, i64* %.anon61, align 8
br label %loop.cond62
loop.cond62: ; preds = %voiderr76, %voiderr59
%109 = load i64, i64* %.anon61, align 8
%gt63 = icmp ugt i64 4, %109
br i1 %gt63, label %loop.body64, label %loop.exit78
loop.body64: ; preds = %loop.cond62
%110 = load [4 x i8]*, [4 x i8]** %.anon60, align 8
%111 = load i64, i64* %.anon61, align 8
%112 = getelementptr inbounds [4 x i8], [4 x i8]* %110, i64 0, i64 %111
%113 = load i8, i8* %112, align 1
store i8 %113, i8* %d65, align 1
store %"char[]" { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.7, i32 0, i32 0), i64 3 }, %"char[]"* %taddr67, align 8
%114 = bitcast %"char[]"* %taddr67 to { i8*, i64 }*
%115 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %114, i32 0, i32 0
%lo68 = load i8*, i8** %115, align 8
%116 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %114, i32 0, i32 1
%hi69 = load i64, i64* %116, align 8
%117 = insertvalue %variant undef, i8* %d65, 0
%118 = insertvalue %variant %117, i64 ptrtoint (%.introspect* @"ct$char" to i64), 1
%119 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots71, i64 0, i64 0
store %variant %118, %variant* %119, align 16
%120 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg70, i32 0, i32 1
store i64 1, i64* %120, align 8
%121 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg70, i32 0, i32 0
%122 = bitcast [1 x %variant]* %varargslots71 to %variant*
store %variant* %122, %variant** %121, align 8
%123 = bitcast %"variant[]"* %vararg70 to { i8*, i64 }*
%124 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %123, i32 0, i32 0
%lo72 = load i8*, i8** %124, align 8
%125 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %123, i32 0, i32 1
%hi73 = load i64, i64* %125, align 8
%126 = call i64 @std_io_printf(i64* %retparam66, i8* %lo68, i64 %hi69, i8* %lo72, i64 %hi73)
%not_err74 = icmp eq i64 %126, 0
br i1 %not_err74, label %after_check75, label %voiderr76
after_check75: ; preds = %loop.body64
br label %voiderr76
voiderr76: ; preds = %after_check75, %loop.body64
%127 = load i64, i64* %.anon61, align 8
%add77 = add i64 %127, 1
store i64 %add77, i64* %.anon61, align 8
br label %loop.cond62
loop.exit78: ; preds = %loop.cond62
%128 = call i32 @std_io_println(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.8, i32 0, i32 0)) #2
store i32 0, i32* %y, align 4
%129 = load i32, i32* %y, align 4
store i32 123, i32* %y, align 4
store %"char[]" { i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.9, i32 0, i32 0), i64 18 }, %"char[]"* %taddr80, align 8
%130 = bitcast %"char[]"* %taddr80 to { i8*, i64 }*
%131 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %130, i32 0, i32 0
%lo81 = load i8*, i8** %131, align 8
%132 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %130, i32 0, i32 1
%hi82 = load i64, i64* %132, align 8
%133 = bitcast i32* %y to i8*
%134 = insertvalue %variant undef, i8* %133, 0
%135 = insertvalue %variant %134, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1
%136 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots84, i64 0, i64 0
store %variant %135, %variant* %136, align 16
%137 = load i32, i32* %y, align 4
store i32 %137, i32* %taddr85, align 4
%138 = bitcast i32* %taddr85 to i8*
%139 = insertvalue %variant undef, i8* %138, 0
%140 = insertvalue %variant %139, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1
%141 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots84, i64 0, i64 1
store %variant %140, %variant* %141, align 16
%142 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg83, i32 0, i32 1
store i64 2, i64* %142, align 8
%143 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg83, i32 0, i32 0
%144 = bitcast [2 x %variant]* %varargslots84 to %variant*
store %variant* %144, %variant** %143, align 8
%145 = bitcast %"variant[]"* %vararg83 to { i8*, i64 }*
%146 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %145, i32 0, i32 0
%lo86 = load i8*, i8** %146, align 8
%147 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %145, i32 0, i32 1
%hi87 = load i64, i64* %147, align 8
%148 = call i64 @std_io_printf(i64* %retparam79, i8* %lo81, i64 %hi82, i8* %lo86, i64 %hi87)
%not_err88 = icmp eq i64 %148, 0
br i1 %not_err88, label %after_check89, label %voiderr90
after_check89: ; preds = %loop.exit78
br label %voiderr90
voiderr90: ; preds = %after_check89, %loop.exit78
ret void
}