| ... | @@ -21828,6 +21828,7 @@ fn zirMemcpy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void | ... | @@ -21828,6 +21828,7 @@ fn zirMemcpy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void |
| 21828 | const src_ptr = try sema.resolveInst(extra.rhs); | 21828 | const src_ptr = try sema.resolveInst(extra.rhs); |
| 21829 | const dest_len = try indexablePtrLenOrNone(sema, block, dest_src, dest_ptr); | 21829 | const dest_len = try indexablePtrLenOrNone(sema, block, dest_src, dest_ptr); |
| 21830 | const src_len = try indexablePtrLenOrNone(sema, block, src_src, src_ptr); | 21830 | const src_len = try indexablePtrLenOrNone(sema, block, src_src, src_ptr); |
| | 21831 | const target = sema.mod.getTarget(); |
| 21831 | | 21832 | |
| 21832 | if (dest_len == .none and src_len == .none) { | 21833 | if (dest_len == .none and src_len == .none) { |
| 21833 | const msg = msg: { | 21834 | const msg = msg: { |
| ... | @@ -21879,9 +21880,41 @@ fn zirMemcpy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void | ... | @@ -21879,9 +21880,41 @@ fn zirMemcpy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void |
| 21879 | | 21880 | |
| 21880 | const runtime_src = if (try sema.resolveDefinedValue(block, dest_src, dest_ptr)) |dest_ptr_val| rs: { | 21881 | const runtime_src = if (try sema.resolveDefinedValue(block, dest_src, dest_ptr)) |dest_ptr_val| rs: { |
| 21881 | if (!dest_ptr_val.isComptimeMutablePtr()) break :rs dest_src; | 21882 | if (!dest_ptr_val.isComptimeMutablePtr()) break :rs dest_src; |
| 21882 | if (try sema.resolveDefinedValue(block, src_src, src_ptr)) |src_ptr_val| { | 21883 | if (try sema.resolveDefinedValue(block, src_src, src_ptr)) |_| { |
| 21883 | _ = src_ptr_val; | 21884 | const len_u64 = (try len_val.?.getUnsignedIntAdvanced(target, sema)).?; |
| 21884 | return sema.fail(block, src, "TODO: @memcpy at comptime", .{}); | 21885 | const len = try sema.usizeCast(block, dest_src, len_u64); |
| | 21886 | for (0..len) |i| { |
| | 21887 | const elem_index = try sema.addIntUnsigned(Type.usize, i); |
| | 21888 | const dest_elem_ptr = try sema.elemPtr( |
| | 21889 | block, |
| | 21890 | src, |
| | 21891 | dest_ptr, |
| | 21892 | elem_index, |
| | 21893 | src, |
| | 21894 | true, // init |
| | 21895 | false, // oob_safety |
| | 21896 | ); |
| | 21897 | const src_elem_ptr = try sema.elemPtr( |
| | 21898 | block, |
| | 21899 | src, |
| | 21900 | src_ptr, |
| | 21901 | elem_index, |
| | 21902 | src, |
| | 21903 | false, // init |
| | 21904 | false, // oob_safety |
| | 21905 | ); |
| | 21906 | const uncoerced_elem = try sema.analyzeLoad(block, src, src_elem_ptr, src_src); |
| | 21907 | try sema.storePtr2( |
| | 21908 | block, |
| | 21909 | src, |
| | 21910 | dest_elem_ptr, |
| | 21911 | dest_src, |
| | 21912 | uncoerced_elem, |
| | 21913 | src_src, |
| | 21914 | .store, |
| | 21915 | ); |
| | 21916 | } |
| | 21917 | return; |
| 21885 | } else break :rs src_src; | 21918 | } else break :rs src_src; |
| 21886 | } else dest_src; | 21919 | } else dest_src; |
| 21887 | | 21920 | |
| ... | @@ -21902,7 +21935,6 @@ fn zirMemcpy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void | ... | @@ -21902,7 +21935,6 @@ fn zirMemcpy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void |
| 21902 | | 21935 | |
| 21903 | const dest_elem_ty = dest_ty.elemType2(); | 21936 | const dest_elem_ty = dest_ty.elemType2(); |
| 21904 | const src_elem_ty = src_ty.elemType2(); | 21937 | const src_elem_ty = src_ty.elemType2(); |
| 21905 | const target = sema.mod.getTarget(); | | |
| 21906 | if (.ok != try sema.coerceInMemoryAllowed(block, dest_elem_ty, src_elem_ty, true, target, dest_src, src_src)) { | 21938 | if (.ok != try sema.coerceInMemoryAllowed(block, dest_elem_ty, src_elem_ty, true, target, dest_src, src_src)) { |
| 21907 | return sema.fail(block, src, "TODO: lower @memcpy to a for loop because the element types have different ABI sizes", .{}); | 21939 | return sema.fail(block, src, "TODO: lower @memcpy to a for loop because the element types have different ABI sizes", .{}); |
| 21908 | } | 21940 | } |