aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/spirv.zig
diff options
context:
space:
mode:
authorRobin Voetter <robin@voetter.nl>2023-10-08 01:27:20 +0200
committerRobin Voetter <robin@voetter.nl>2023-10-15 14:00:03 +0200
commitfe51ff9fc14c38337c559acb7647480188b1d154 (patch)
tree0b45bd7e8e189e7ea09a037fbf72162910d11121 /src/codegen/spirv.zig
parent15cf1315bb945f2a14a48e2cc7ee2eaf2e0536d2 (diff)
downloadzig-fe51ff9fc14c38337c559acb7647480188b1d154.tar.gz
zig-fe51ff9fc14c38337c559acb7647480188b1d154.zip
spirv: make air is_null not emit OpPtr(Not)Equal
Diffstat (limited to 'src/codegen/spirv.zig')
-rw-r--r--src/codegen/spirv.zig24
1 files changed, 8 insertions, 16 deletions
diff --git a/src/codegen/spirv.zig b/src/codegen/spirv.zig
index 41848644c4..0ab87b4df0 100644
--- a/src/codegen/spirv.zig
+++ b/src/codegen/spirv.zig
@@ -2406,8 +2406,7 @@ const DeclGen = struct {
fn cmp(
self: *DeclGen,
- comptime op: std.math.CompareOperator,
- bool_ty_id: IdRef,
+ op: std.math.CompareOperator,
ty: Type,
lhs_id: IdRef,
rhs_id: IdRef,
@@ -2415,6 +2414,7 @@ const DeclGen = struct {
const mod = self.module;
var cmp_lhs_id = lhs_id;
var cmp_rhs_id = rhs_id;
+ const bool_ty_ref = try self.resolveType(Type.bool, .direct);
const opcode: Opcode = opcode: {
const op_ty = switch (ty.zigTypeTag(mod)) {
.Int, .Bool, .Float => ty,
@@ -2497,7 +2497,7 @@ const DeclGen = struct {
const result_id = self.spv.allocId();
try self.func.body.emitRaw(self.spv.gpa, opcode, 4);
- self.func.body.writeOperand(spec.IdResultType, bool_ty_id);
+ self.func.body.writeOperand(spec.IdResultType, self.typeId(bool_ty_ref));
self.func.body.writeOperand(spec.IdResult, result_id);
self.func.body.writeOperand(spec.IdResultType, cmp_lhs_id);
self.func.body.writeOperand(spec.IdResultType, cmp_rhs_id);
@@ -2513,11 +2513,10 @@ const DeclGen = struct {
const bin_op = self.air.instructions.items(.data)[inst].bin_op;
const lhs_id = try self.resolve(bin_op.lhs);
const rhs_id = try self.resolve(bin_op.rhs);
- const bool_ty_id = try self.resolveTypeId(Type.bool);
const ty = self.typeOf(bin_op.lhs);
assert(ty.eql(self.typeOf(bin_op.rhs), self.module));
- return try self.cmp(op, bool_ty_id, ty, lhs_id, rhs_id);
+ return try self.cmp(op, ty, lhs_id, rhs_id);
}
fn bitCast(
@@ -3580,18 +3579,11 @@ const DeclGen = struct {
const payload_ty_ref = try self.resolveType(ptr_ty, .direct);
const null_id = try self.spv.constNull(payload_ty_ref);
- const result_id = self.spv.allocId();
- const operands = .{
- .id_result_type = self.typeId(bool_ty_ref),
- .id_result = result_id,
- .operand_1 = ptr_id,
- .operand_2 = null_id,
+ const op: std.math.CompareOperator = switch (pred) {
+ .is_null => .eq,
+ .is_non_null => .neq,
};
- switch (pred) {
- .is_null => try self.func.body.emit(self.spv.gpa, .OpPtrEqual, operands),
- .is_non_null => try self.func.body.emit(self.spv.gpa, .OpPtrNotEqual, operands),
- }
- return result_id;
+ return try self.cmp(op, ptr_ty, ptr_id, null_id);
}
const is_non_null_id = if (payload_ty.hasRuntimeBitsIgnoreComptime(mod))