diff options
Diffstat (limited to 'src/llvm.cff')
| -rw-r--r-- | src/llvm.cff | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/llvm.cff b/src/llvm.cff index b4ef10e..5bb39c5 100644 --- a/src/llvm.cff +++ b/src/llvm.cff @@ -1478,6 +1478,27 @@ fn gendata(ty *const Type, ex *Expr) void { } } return; + + case BitFIni ini; + if act == :type { + gen("%t", ex.ty); + return; + } + + let acc u64 = 0; + foreach (fld, i, ini.flds) { + let ex = &ini.exs[i]; + if !fold(ex) { + assert(#f, "er"); + } + assert(ex.u.#tag == :BoolLit or ex.u.#tag == :IntLit, "bit field tag"); + let n u64 = ex.u.#tag == :BoolLit ? as(u64)ex.u.BoolLit : ex.u.IntLit.u; + let mask = fld.size == 64 ? ~0u64 : ((1u64 << fld.size) - 1); + acc &= ~(mask << fld.off); + acc |= (n & mask) << fld.off; + } + gen("%I", acc); + return; case else assert(#f, "nyi static %d", ex.u.#tag); |