diff options
| author | Emily Bellows <emily.a.bellows@hey.com> | 2021-10-29 21:04:54 -0400 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-10-30 16:09:55 -0400 |
| commit | 969bcb6a59eadb2ef46a9784286728a25d275c24 (patch) | |
| tree | 8fff245884c9df30a82024e1ff30baf3bf5444ed /src | |
| parent | 1de6f9a267bf9247b62b385fc793586e60f78376 (diff) | |
| download | zig-969bcb6a59eadb2ef46a9784286728a25d275c24.tar.gz zig-969bcb6a59eadb2ef46a9784286728a25d275c24.zip | |
C backend: implement signed trunc
Diffstat (limited to 'src')
| -rw-r--r-- | src/codegen/c.zig | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig index 8e046264aa..7ca56946d0 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -1390,7 +1390,14 @@ fn airTrunc(f: *Function, inst: Air.Inst.Index) !CValue { return local; }, .signed => { - return f.fail("TODO: C backend: implement trunc for signed integers", .{}); + const operand_ty = f.air.typeOf(ty_op.operand); + const c_bits = toCIntBits(operand_ty.intInfo(target).bits) orelse + return f.fail("TODO: C backend: implement integer types larger than 128 bits", .{}); + const shift_rhs = c_bits - dest_bits; + try writer.print("(int{d}_t)((uint{d}_t)", .{ c_bits, c_bits }); + try f.writeCValue(writer, operand); + try writer.print(" << {d}) >> {d};\n", .{ shift_rhs, shift_rhs }); + return local; }, } } |
