authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-11-01 18:50:33-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-11-05 12:11:18-05:00
log76d188551eb3f742c2feb086c8c51c6b0815184d
tree88d460dd9bdd944c74e277f8b224362454ebef84
parentece8d6c2fa8ec5e851a00efdc1f407ecfc663f11
signaturelock-open Commit is signed but in an unrecognized format.

implement store of vector element with comptime index


2 files changed, 38 insertions(+), 3 deletions(-)

src/codegen.cpp+15-3
...@@ -1640,6 +1640,17 @@ static void gen_assign_raw(CodeGen *g, LLVMValueRef ptr, ZigType *ptr_type,...@@ -1640,6 +1640,17 @@ static void gen_assign_raw(CodeGen *g, LLVMValueRef ptr, ZigType *ptr_type,
1640 return;1640 return;
1641 }1641 }
16421642
1643 assert(ptr_type->data.pointer.vector_index != VECTOR_INDEX_RUNTIME);
1644 if (ptr_type->data.pointer.vector_index != VECTOR_INDEX_NONE) {
1645 LLVMValueRef index_val = LLVMConstInt(LLVMInt32Type(),
1646 ptr_type->data.pointer.vector_index, false);
1647 LLVMValueRef loaded_vector = gen_load(g, ptr, ptr_type, "");
1648 LLVMValueRef new_vector = LLVMBuildInsertElement(g->builder, loaded_vector, value,
1649 index_val, "");
1650 gen_store(g, new_vector, ptr, ptr_type);
1651 return;
1652 }
1653
1643 uint32_t host_int_bytes = ptr_type->data.pointer.host_int_bytes;1654 uint32_t host_int_bytes = ptr_type->data.pointer.host_int_bytes;
1644 if (host_int_bytes == 0) {1655 if (host_int_bytes == 0) {
1645 gen_store(g, value, ptr, ptr_type);1656 gen_store(g, value, ptr, ptr_type);
...@@ -3414,8 +3425,6 @@ static LLVMValueRef ir_render_load_ptr(CodeGen *g, IrExecutable *executable,...@@ -3414,8 +3425,6 @@ static LLVMValueRef ir_render_load_ptr(CodeGen *g, IrExecutable *executable,
3414 ZigType *ptr_type = instruction->ptr->value.type;3425 ZigType *ptr_type = instruction->ptr->value.type;
3415 assert(ptr_type->id == ZigTypeIdPointer);3426 assert(ptr_type->id == ZigTypeIdPointer);
34163427
3417 uint32_t host_int_bytes = ptr_type->data.pointer.host_int_bytes;
3418
3419 ir_assert(ptr_type->data.pointer.vector_index != VECTOR_INDEX_RUNTIME, &instruction->base);3428 ir_assert(ptr_type->data.pointer.vector_index != VECTOR_INDEX_RUNTIME, &instruction->base);
3420 if (ptr_type->data.pointer.vector_index != VECTOR_INDEX_NONE) {3429 if (ptr_type->data.pointer.vector_index != VECTOR_INDEX_NONE) {
3421 LLVMValueRef index_val = LLVMConstInt(LLVMInt32Type(),3430 LLVMValueRef index_val = LLVMConstInt(LLVMInt32Type(),
...@@ -3424,6 +3433,7 @@ static LLVMValueRef ir_render_load_ptr(CodeGen *g, IrExecutable *executable,...@@ -3424,6 +3433,7 @@ static LLVMValueRef ir_render_load_ptr(CodeGen *g, IrExecutable *executable,
3424 return LLVMBuildExtractElement(g->builder, loaded_vector, index_val, "");3433 return LLVMBuildExtractElement(g->builder, loaded_vector, index_val, "");
3425 }3434 }
34263435
3436 uint32_t host_int_bytes = ptr_type->data.pointer.host_int_bytes;
3427 if (host_int_bytes == 0)3437 if (host_int_bytes == 0)
3428 return get_handle_value(g, ptr, child_type, ptr_type);3438 return get_handle_value(g, ptr, child_type, ptr_type);
34293439
...@@ -3660,7 +3670,6 @@ static LLVMValueRef ir_render_elem_ptr(CodeGen *g, IrExecutable *executable, IrI...@@ -3660,7 +3670,6 @@ static LLVMValueRef ir_render_elem_ptr(CodeGen *g, IrExecutable *executable, IrI
3660 ZigType *array_ptr_type = instruction->array_ptr->value.type;3670 ZigType *array_ptr_type = instruction->array_ptr->value.type;
3661 assert(array_ptr_type->id == ZigTypeIdPointer);3671 assert(array_ptr_type->id == ZigTypeIdPointer);
3662 ZigType *array_type = array_ptr_type->data.pointer.child_type;3672 ZigType *array_type = array_ptr_type->data.pointer.child_type;
3663 LLVMValueRef array_ptr = get_handle_value(g, array_ptr_ptr, array_type, array_ptr_type);
3664 LLVMValueRef subscript_value = ir_llvm_value(g, instruction->elem_index);3673 LLVMValueRef subscript_value = ir_llvm_value(g, instruction->elem_index);
3665 assert(subscript_value);3674 assert(subscript_value);
36663675
...@@ -3672,6 +3681,7 @@ static LLVMValueRef ir_render_elem_ptr(CodeGen *g, IrExecutable *executable, IrI...@@ -3672,6 +3681,7 @@ static LLVMValueRef ir_render_elem_ptr(CodeGen *g, IrExecutable *executable, IrI
3672 if (array_type->id == ZigTypeIdArray ||3681 if (array_type->id == ZigTypeIdArray ||
3673 (array_type->id == ZigTypeIdPointer && array_type->data.pointer.ptr_len == PtrLenSingle))3682 (array_type->id == ZigTypeIdPointer && array_type->data.pointer.ptr_len == PtrLenSingle))
3674 {3683 {
3684 LLVMValueRef array_ptr = get_handle_value(g, array_ptr_ptr, array_type, array_ptr_type);
3675 if (array_type->id == ZigTypeIdPointer) {3685 if (array_type->id == ZigTypeIdPointer) {
3676 assert(array_type->data.pointer.child_type->id == ZigTypeIdArray);3686 assert(array_type->data.pointer.child_type->id == ZigTypeIdArray);
3677 array_type = array_type->data.pointer.child_type;3687 array_type = array_type->data.pointer.child_type;
...@@ -3711,12 +3721,14 @@ static LLVMValueRef ir_render_elem_ptr(CodeGen *g, IrExecutable *executable, IrI...@@ -3711,12 +3721,14 @@ static LLVMValueRef ir_render_elem_ptr(CodeGen *g, IrExecutable *executable, IrI
3711 };3721 };
3712 return LLVMBuildInBoundsGEP(g->builder, array_ptr, indices, 2, "");3722 return LLVMBuildInBoundsGEP(g->builder, array_ptr, indices, 2, "");
3713 } else if (array_type->id == ZigTypeIdPointer) {3723 } else if (array_type->id == ZigTypeIdPointer) {
3724 LLVMValueRef array_ptr = get_handle_value(g, array_ptr_ptr, array_type, array_ptr_type);
3714 assert(LLVMGetTypeKind(LLVMTypeOf(array_ptr)) == LLVMPointerTypeKind);3725 assert(LLVMGetTypeKind(LLVMTypeOf(array_ptr)) == LLVMPointerTypeKind);
3715 LLVMValueRef indices[] = {3726 LLVMValueRef indices[] = {
3716 subscript_value3727 subscript_value
3717 };3728 };
3718 return LLVMBuildInBoundsGEP(g->builder, array_ptr, indices, 1, "");3729 return LLVMBuildInBoundsGEP(g->builder, array_ptr, indices, 1, "");
3719 } else if (array_type->id == ZigTypeIdStruct) {3730 } else if (array_type->id == ZigTypeIdStruct) {
3731 LLVMValueRef array_ptr = get_handle_value(g, array_ptr_ptr, array_type, array_ptr_type);
3720 assert(array_type->data.structure.is_slice);3732 assert(array_type->data.structure.is_slice);
37213733
3722 ZigType *ptr_type = instruction->base.value.type;3734 ZigType *ptr_type = instruction->base.value.type;
test/stage1/behavior/vector.zig+23
...@@ -176,3 +176,26 @@ test "load vector elements via comptime index" {...@@ -176,3 +176,26 @@ test "load vector elements via comptime index" {
176 S.doTheTest();176 S.doTheTest();
177 comptime S.doTheTest();177 comptime S.doTheTest();
178}178}
179
180test "store vector elements via comptime index" {
181 const S = struct {
182 fn doTheTest() void {
183 var v: @Vector(4, i32) = [_]i32{ 1, 5, 3, undefined };
184
185 v[2] = 42;
186 expect(v[1] == 5);
187 v[3] = -364;
188 expect(v[2] == 42);
189 expect(-364 == v[3]);
190
191 storev(&v[0], 100);
192 expect(v[0] == 100);
193 }
194 fn storev(ptr: var, x: i32) void {
195 ptr.* = x;
196 }
197 };
198
199 S.doTheTest();
200 comptime S.doTheTest();
201}