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 {
16301630 /// Convert representation from indirect (in memory) to direct (in 'register')
16311631 /// This converts the argument type from resolveType(ty, .indirect) to resolveType(ty, .direct).
16321632 fn convertToDirect(self: *DeclGen, ty: Type, operand_id: IdRef) !IdRef {
1633 // const direct_ty_ref = try self.resolveType(ty, .direct);
16341633 return switch (ty.zigTypeTag()) {
16351634 .Bool => blk: {
16361635 const direct_bool_ty_ref = try self.resolveType(ty, .direct);
......@@ -2370,11 +2369,7 @@ pub const DeclGen = struct {
23702369 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
23712370 const field_ty = self.air.typeOfIndex(inst);
23722371 const operand_id = try self.resolve(ty_op.operand);
2373 return try self.extractField(
2374 field_ty,
2375 operand_id,
2376 field,
2377 );
2372 return try self.extractField(field_ty, operand_id, field);
23782373 }
23792374
23802375 fn airSliceElemPtr(self: *DeclGen, inst: Air.Inst.Index) !?IdRef {
......@@ -2382,23 +2377,14 @@ pub const DeclGen = struct {
23822377 const slice_ty = self.air.typeOf(bin_op.lhs);
23832378 if (!slice_ty.isVolatilePtr() and self.liveness.isUnused(inst)) return null;
23842379
2385 const slice = try self.resolve(bin_op.lhs);
2386 const index = try self.resolve(bin_op.rhs);
2380 const slice_id = try self.resolve(bin_op.lhs);
2381 const index_id = try self.resolve(bin_op.rhs);
23872382
2388 const ptr_ty_ref = try self.resolveType(self.air.typeOfIndex(inst), .direct);
2389
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 };
2383 const ptr_ty = self.air.typeOfIndex(inst);
2384 const ptr_ty_ref = try self.resolveType(ptr_ty, .direct);
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, &.{});
24022388 }
24032389
24042390 fn airSliceElemVal(self: *DeclGen, inst: Air.Inst.Index) !?IdRef {
......@@ -2406,24 +2392,15 @@ pub const DeclGen = struct {
24062392 const slice_ty = self.air.typeOf(bin_op.lhs);
24072393 if (!slice_ty.isVolatilePtr() and self.liveness.isUnused(inst)) return null;
24082394
2409 const slice = try self.resolve(bin_op.lhs);
2410 const index = try self.resolve(bin_op.rhs);
2395 const slice_id = try self.resolve(bin_op.lhs);
2396 const index_id = try self.resolve(bin_op.rhs);
24112397
24122398 var slice_buf: Type.SlicePtrFieldTypeBuffer = undefined;
2413 const ptr_ty_ref = try self.resolveType(slice_ty.slicePtrFieldType(&slice_buf), .direct);
2414
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 };
2399 const ptr_ty = slice_ty.slicePtrFieldType(&slice_buf);
2400 const ptr_ty_ref = try self.resolveType(ptr_ty, .direct);
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, &.{});
24272404 return try self.load(slice_ty, elem_ptr);
24282405 }
24292406
......@@ -2459,24 +2436,15 @@ pub const DeclGen = struct {
24592436 const struct_field = self.air.extraData(Air.StructField, ty_pl.payload).data;
24602437
24612438 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);
24632440 const field_index = struct_field.field_index;
24642441 const field_ty = struct_ty.structFieldType(field_index);
2465 const field_ty_id = try self.resolveTypeId(field_ty);
24662442
24672443 if (!field_ty.hasRuntimeBitsIgnoreComptime()) return null;
24682444
24692445 assert(struct_ty.zigTypeTag() == .Struct); // Cannot do unions yet.
24702446
2471 const result_id = self.spv.allocId();
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;
2447 return try self.extractField(field_ty, object_id, field_index);
24802448 }
24812449
24822450 fn structFieldPtr(