diff options
Diffstat (limited to 'src/codegen')
| -rw-r--r-- | src/codegen/llvm/Builder.zig | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/src/codegen/llvm/Builder.zig b/src/codegen/llvm/Builder.zig index e2fc957493..72e49738ec 100644 --- a/src/codegen/llvm/Builder.zig +++ b/src/codegen/llvm/Builder.zig @@ -130,6 +130,67 @@ pub const String = enum(u32) { }; }; +pub const BinaryOpcode = enum(u4) { + add = 0, + sub = 1, + mul = 2, + udiv = 3, + sdiv = 4, + urem = 5, + srem = 6, + shl = 7, + lshr = 8, + ashr = 9, + @"and" = 10, + @"or" = 11, + xor = 12, +}; + +pub const CastOpcode = enum(u4) { + trunc = 0, + zext = 1, + sext = 2, + fptoui = 3, + fptosi = 4, + uitofp = 5, + sitofp = 6, + fptrunc = 7, + fpext = 8, + ptrtoint = 9, + inttoptr = 10, + bitcast = 11, + addrspacecast = 12, +}; + +pub const CmpPredicate = enum(u6) { + fcmp_false = 0, + fcmp_oeq = 1, + fcmp_ogt = 2, + fcmp_oge = 3, + fcmp_olt = 4, + fcmp_ole = 5, + fcmp_one = 6, + fcmp_ord = 7, + fcmp_uno = 8, + fcmp_ueq = 9, + fcmp_ugt = 10, + fcmp_uge = 11, + fcmp_ult = 12, + fcmp_ule = 13, + fcmp_une = 14, + fcmp_true = 15, + icmp_eq = 32, + icmp_ne = 33, + icmp_ugt = 34, + icmp_uge = 35, + icmp_ult = 36, + icmp_ule = 37, + icmp_sgt = 38, + icmp_sge = 39, + icmp_slt = 40, + icmp_sle = 41, +}; + pub const StrtabString = struct { offset: usize, size: usize, @@ -4125,6 +4186,143 @@ pub const Function = struct { va_arg, xor, zext, + + pub fn toBinaryOpcode(self: Tag) BinaryOpcode { + return switch (self) { + .add, + .@"add nsw", + .@"add nuw", + .@"add nuw nsw", + .fadd, + .@"fadd fast", + => .add, + .sub, + .@"sub nsw", + .@"sub nuw", + .@"sub nuw nsw", + .fsub, + .@"fsub fast", + => .sub, + .sdiv, + .@"sdiv exact", + .fdiv, + .@"fdiv fast", + => .sdiv, + .fmul, + .@"fmul fast", + .mul, + .@"mul nsw", + .@"mul nuw", + .@"mul nuw nsw", + => .mul, + .srem, + .frem, + .@"frem fast", + => .srem, + .udiv, + .@"udiv exact", + => .udiv, + .shl, + .@"shl nsw", + .@"shl nuw", + .@"shl nuw nsw", + => .shl, + .lshr, + .@"lshr exact", + => .lshr, + .ashr, + .@"ashr exact", + => .ashr, + .@"and" => .@"and", + .@"or" => .@"or", + .xor => .xor, + .urem => .urem, + else => unreachable, + }; + } + + pub fn toCastOpcode(self: Tag) CastOpcode { + return switch (self) { + .trunc => .trunc, + .zext => .zext, + .sext => .sext, + .fptoui => .fptoui, + .fptosi => .fptosi, + .uitofp => .uitofp, + .sitofp => .sitofp, + .fptrunc => .fptrunc, + .fpext => .fpext, + .ptrtoint => .ptrtoint, + .inttoptr => .inttoptr, + .bitcast => .bitcast, + .addrspacecast => .addrspacecast, + else => unreachable, + }; + } + + pub fn toCmpPredicate(self: Tag) CmpPredicate { + return switch (self) { + .@"fcmp false", + .@"fcmp fast false", + => .fcmp_false, + .@"fcmp oeq", + .@"fcmp fast oeq", + => .fcmp_oeq, + .@"fcmp oge", + .@"fcmp fast oge", + => .fcmp_oge, + .@"fcmp ogt", + .@"fcmp fast ogt", + => .fcmp_ogt, + .@"fcmp ole", + .@"fcmp fast ole", + => .fcmp_ole, + .@"fcmp olt", + .@"fcmp fast olt", + => .fcmp_olt, + .@"fcmp one", + .@"fcmp fast one", + => .fcmp_one, + .@"fcmp ord", + .@"fcmp fast ord", + => .fcmp_ord, + .@"fcmp true", + .@"fcmp fast true", + => .fcmp_true, + .@"fcmp ueq", + .@"fcmp fast ueq", + => .fcmp_ueq, + .@"fcmp uge", + .@"fcmp fast uge", + => .fcmp_uge, + .@"fcmp ugt", + .@"fcmp fast ugt", + => .fcmp_ugt, + .@"fcmp ule", + .@"fcmp fast ule", + => .fcmp_ule, + .@"fcmp ult", + .@"fcmp fast ult", + => .fcmp_ult, + .@"fcmp une", + .@"fcmp fast une", + => .fcmp_une, + .@"fcmp uno", + .@"fcmp fast uno", + => .fcmp_uno, + .@"icmp eq" => .icmp_eq, + .@"icmp ne" => .icmp_ne, + .@"icmp sge" => .icmp_sge, + .@"icmp sgt" => .icmp_sgt, + .@"icmp sle" => .icmp_sle, + .@"icmp slt" => .icmp_slt, + .@"icmp uge" => .icmp_uge, + .@"icmp ugt" => .icmp_ugt, + .@"icmp ule" => .icmp_ule, + .@"icmp ult" => .icmp_ult, + else => unreachable, + }; + } }; pub const Index = enum(u32) { @@ -7239,6 +7437,49 @@ pub const Constant = enum(u32) { @"asm sideeffect inteldialect unwind", @"asm alignstack inteldialect unwind", @"asm sideeffect alignstack inteldialect unwind", + + pub fn toBinaryOpcode(self: Tag) BinaryOpcode { + return switch (self) { + .add, + .@"add nsw", + .@"add nuw", + => .add, + .sub, + .@"sub nsw", + .@"sub nuw", + => .sub, + .mul, + .@"mul nsw", + .@"mul nuw", + => .mul, + .shl => .shl, + .lshr => .lshr, + .ashr => .ashr, + .@"and" => .@"and", + .@"or" => .@"or", + .xor => .xor, + else => unreachable, + }; + } + + pub fn toCastOpcode(self: Tag) CastOpcode { + return switch (self) { + .trunc => .trunc, + .zext => .zext, + .sext => .sext, + .fptoui => .fptoui, + .fptosi => .fptosi, + .uitofp => .uitofp, + .sitofp => .sitofp, + .fptrunc => .fptrunc, + .fpext => .fpext, + .ptrtoint => .ptrtoint, + .inttoptr => .inttoptr, + .bitcast => .bitcast, + .addrspacecast => .addrspacecast, + else => unreachable, + }; + } }; pub const Item = struct { |
