diff options
| author | Meghan Denny <hello@nektro.net> | 2021-08-30 00:31:40 -0700 |
|---|---|---|
| committer | Meghan Denny <hello@nektro.net> | 2021-08-30 00:31:40 -0700 |
| commit | e878a6633f2447666217a5f9247af7c34507dca0 (patch) | |
| tree | 86c3c8bb4e817ef9c09ca353c6b7481f73e0bf61 /src/codegen/llvm.zig | |
| parent | 56845082bc6fb88a27c18cc3403216f93dc8ba42 (diff) | |
| download | zig-e878a6633f2447666217a5f9247af7c34507dca0.tar.gz zig-e878a6633f2447666217a5f9247af7c34507dca0.zip | |
stage2: implement runtime `%` and `@rem`
Diffstat (limited to 'src/codegen/llvm.zig')
| -rw-r--r-- | src/codegen/llvm.zig | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index d7aa2d45b3..5d20e380b4 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -985,6 +985,7 @@ pub const FuncGen = struct { .mul => try self.airMul(inst, false), .mulwrap => try self.airMul(inst, true), .div => try self.airDiv(inst), + .rem => try self.airRem(inst), .ptr_add => try self.airPtrAdd(inst), .ptr_sub => try self.airPtrSub(inst), @@ -1727,6 +1728,19 @@ pub const FuncGen = struct { return self.builder.buildUDiv(lhs, rhs, ""); } + fn airRem(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { + if (self.liveness.isUnused(inst)) return null; + + const bin_op = self.air.instructions.items(.data)[inst].bin_op; + const lhs = try self.resolveInst(bin_op.lhs); + const rhs = try self.resolveInst(bin_op.rhs); + const inst_ty = self.air.typeOfIndex(inst); + + if (inst_ty.isFloat()) return self.builder.buildFRem(lhs, rhs, ""); + if (inst_ty.isSignedInt()) return self.builder.buildSRem(lhs, rhs, ""); + return self.builder.buildURem(lhs, rhs, ""); + } + fn airPtrAdd(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { if (self.liveness.isUnused(inst)) return null; |
