authorgravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2023-05-18 19:06:48+02:00
committergravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2023-05-20 17:30:21+02:00
log3c14438a937eb5b470f7f6191d850030aa7a4a06
treed5a9d4b82281b4556b230e3a60e269ba0fcd0ed0
parent6c055570720197af242b4c5538dd784d2e3a58f7
signaturelock-open Commit is signed but in an unrecognized format.

spirv: use extractField more

reduce some code duplication

1 files changed, 15 insertions(+), 47 deletions(-)

src/codegen/spirv.zig+15-47
...@@ -1630,7 +1630,6 @@ pub const DeclGen = struct {...@@ -1630,7 +1630,6 @@ pub const DeclGen = struct {
1630 /// Convert representation from indirect (in memory) to direct (in 'register')1630 /// Convert representation from indirect (in memory) to direct (in 'register')
1631 /// This converts the argument type from resolveType(ty, .indirect) to resolveType(ty, .direct).1631 /// This converts the argument type from resolveType(ty, .indirect) to resolveType(ty, .direct).
1632 fn convertToDirect(self: *DeclGen, ty: Type, operand_id: IdRef) !IdRef {1632 fn convertToDirect(self: *DeclGen, ty: Type, operand_id: IdRef) !IdRef {
1633 // const direct_ty_ref = try self.resolveType(ty, .direct);
1634 return switch (ty.zigTypeTag()) {1633 return switch (ty.zigTypeTag()) {
1635 .Bool => blk: {1634 .Bool => blk: {
1636 const direct_bool_ty_ref = try self.resolveType(ty, .direct);1635 const direct_bool_ty_ref = try self.resolveType(ty, .direct);
...@@ -2370,11 +2369,7 @@ pub const DeclGen = struct {...@@ -2370,11 +2369,7 @@ pub const DeclGen = struct {
2370 const ty_op = self.air.instructions.items(.data)[inst].ty_op;2369 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
2371 const field_ty = self.air.typeOfIndex(inst);2370 const field_ty = self.air.typeOfIndex(inst);
2372 const operand_id = try self.resolve(ty_op.operand);2371 const operand_id = try self.resolve(ty_op.operand);
2373 return try self.extractField(2372 return try self.extractField(field_ty, operand_id, field);
2374 field_ty,
2375 operand_id,
2376 field,
2377 );
2378 }2373 }
23792374
2380 fn airSliceElemPtr(self: *DeclGen, inst: Air.Inst.Index) !?IdRef {2375 fn airSliceElemPtr(self: *DeclGen, inst: Air.Inst.Index) !?IdRef {
...@@ -2382,23 +2377,14 @@ pub const DeclGen = struct {...@@ -2382,23 +2377,14 @@ pub const DeclGen = struct {
2382 const slice_ty = self.air.typeOf(bin_op.lhs);2377 const slice_ty = self.air.typeOf(bin_op.lhs);
2383 if (!slice_ty.isVolatilePtr() and self.liveness.isUnused(inst)) return null;2378 if (!slice_ty.isVolatilePtr() and self.liveness.isUnused(inst)) return null;
23842379
2385 const slice = try self.resolve(bin_op.lhs);2380 const slice_id = try self.resolve(bin_op.lhs);
2386 const index = try self.resolve(bin_op.rhs);2381 const index_id = try self.resolve(bin_op.rhs);
23872382
2388 const ptr_ty_ref = try self.resolveType(self.air.typeOfIndex(inst), .direct);2383 const ptr_ty = self.air.typeOfIndex(inst);
23892384 const ptr_ty_ref = try self.resolveType(ptr_ty, .direct);
2390 const slice_ptr = blk: {
2391 const result_id = self.spv.allocId();
2392 try self.func.body.emit(self.spv.gpa, .OpCompositeExtract, .{
2393 .id_result_type = self.typeId(ptr_ty_ref),
2394 .id_result = result_id,
2395 .composite = slice,
2396 .indexes = &.{0},
2397 });
2398 break :blk result_id;
2399 };
24002385
2401 return try self.ptrAccessChain(ptr_ty_ref, slice_ptr, index, &.{});2386 const slice_ptr = try self.extractField(ptr_ty, slice_id, 0);
2387 return try self.ptrAccessChain(ptr_ty_ref, slice_ptr, index_id, &.{});
2402 }2388 }
24032389
2404 fn airSliceElemVal(self: *DeclGen, inst: Air.Inst.Index) !?IdRef {2390 fn airSliceElemVal(self: *DeclGen, inst: Air.Inst.Index) !?IdRef {
...@@ -2406,24 +2392,15 @@ pub const DeclGen = struct {...@@ -2406,24 +2392,15 @@ pub const DeclGen = struct {
2406 const slice_ty = self.air.typeOf(bin_op.lhs);2392 const slice_ty = self.air.typeOf(bin_op.lhs);
2407 if (!slice_ty.isVolatilePtr() and self.liveness.isUnused(inst)) return null;2393 if (!slice_ty.isVolatilePtr() and self.liveness.isUnused(inst)) return null;
24082394
2409 const slice = try self.resolve(bin_op.lhs);2395 const slice_id = try self.resolve(bin_op.lhs);
2410 const index = try self.resolve(bin_op.rhs);2396 const index_id = try self.resolve(bin_op.rhs);
24112397
2412 var slice_buf: Type.SlicePtrFieldTypeBuffer = undefined;2398 var slice_buf: Type.SlicePtrFieldTypeBuffer = undefined;
2413 const ptr_ty_ref = try self.resolveType(slice_ty.slicePtrFieldType(&slice_buf), .direct);2399 const ptr_ty = slice_ty.slicePtrFieldType(&slice_buf);
24142400 const ptr_ty_ref = try self.resolveType(ptr_ty, .direct);
2415 const slice_ptr = blk: {
2416 const result_id = self.spv.allocId();
2417 try self.func.body.emit(self.spv.gpa, .OpCompositeExtract, .{
2418 .id_result_type = self.typeId(ptr_ty_ref),
2419 .id_result = result_id,
2420 .composite = slice,
2421 .indexes = &.{0},
2422 });
2423 break :blk result_id;
2424 };
24252401
2426 const elem_ptr = try self.ptrAccessChain(ptr_ty_ref, slice_ptr, index, &.{});2402 const slice_ptr = try self.extractField(ptr_ty, slice_id, 0);
2403 const elem_ptr = try self.ptrAccessChain(ptr_ty_ref, slice_ptr, index_id, &.{});
2427 return try self.load(slice_ty, elem_ptr);2404 return try self.load(slice_ty, elem_ptr);
2428 }2405 }
24292406
...@@ -2459,24 +2436,15 @@ pub const DeclGen = struct {...@@ -2459,24 +2436,15 @@ pub const DeclGen = struct {
2459 const struct_field = self.air.extraData(Air.StructField, ty_pl.payload).data;2436 const struct_field = self.air.extraData(Air.StructField, ty_pl.payload).data;
24602437
2461 const struct_ty = self.air.typeOf(struct_field.struct_operand);2438 const struct_ty = self.air.typeOf(struct_field.struct_operand);
2462 const object = try self.resolve(struct_field.struct_operand);2439 const object_id = try self.resolve(struct_field.struct_operand);
2463 const field_index = struct_field.field_index;2440 const field_index = struct_field.field_index;
2464 const field_ty = struct_ty.structFieldType(field_index);2441 const field_ty = struct_ty.structFieldType(field_index);
2465 const field_ty_id = try self.resolveTypeId(field_ty);
24662442
2467 if (!field_ty.hasRuntimeBitsIgnoreComptime()) return null;2443 if (!field_ty.hasRuntimeBitsIgnoreComptime()) return null;
24682444
2469 assert(struct_ty.zigTypeTag() == .Struct); // Cannot do unions yet.2445 assert(struct_ty.zigTypeTag() == .Struct); // Cannot do unions yet.
24702446
2471 const result_id = self.spv.allocId();2447 return try self.extractField(field_ty, object_id, field_index);
2472 const indexes = [_]u32{field_index};
2473 try self.func.body.emit(self.spv.gpa, .OpCompositeExtract, .{
2474 .id_result_type = field_ty_id,
2475 .id_result = result_id,
2476 .composite = object,
2477 .indexes = &indexes,
2478 });
2479 return result_id;
2480 }2448 }
24812449
2482 fn structFieldPtr(2450 fn structFieldPtr(