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,
16401640 return;
16411641 }
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
16431654 uint32_t host_int_bytes = ptr_type->data.pointer.host_int_bytes;
16441655 if (host_int_bytes == 0) {
16451656 gen_store(g, value, ptr, ptr_type);
......@@ -3414,8 +3425,6 @@ static LLVMValueRef ir_render_load_ptr(CodeGen *g, IrExecutable *executable,
34143425 ZigType *ptr_type = instruction->ptr->value.type;
34153426 assert(ptr_type->id == ZigTypeIdPointer);
34163427
3417 uint32_t host_int_bytes = ptr_type->data.pointer.host_int_bytes;
3418
34193428 ir_assert(ptr_type->data.pointer.vector_index != VECTOR_INDEX_RUNTIME, &instruction->base);
34203429 if (ptr_type->data.pointer.vector_index != VECTOR_INDEX_NONE) {
34213430 LLVMValueRef index_val = LLVMConstInt(LLVMInt32Type(),
......@@ -3424,6 +3433,7 @@ static LLVMValueRef ir_render_load_ptr(CodeGen *g, IrExecutable *executable,
34243433 return LLVMBuildExtractElement(g->builder, loaded_vector, index_val, "");
34253434 }
34263435
3436 uint32_t host_int_bytes = ptr_type->data.pointer.host_int_bytes;
34273437 if (host_int_bytes == 0)
34283438 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
36603670 ZigType *array_ptr_type = instruction->array_ptr->value.type;
36613671 assert(array_ptr_type->id == ZigTypeIdPointer);
36623672 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);
36643673 LLVMValueRef subscript_value = ir_llvm_value(g, instruction->elem_index);
36653674 assert(subscript_value);
36663675
......@@ -3672,6 +3681,7 @@ static LLVMValueRef ir_render_elem_ptr(CodeGen *g, IrExecutable *executable, IrI
36723681 if (array_type->id == ZigTypeIdArray ||
36733682 (array_type->id == ZigTypeIdPointer && array_type->data.pointer.ptr_len == PtrLenSingle))
36743683 {
3684 LLVMValueRef array_ptr = get_handle_value(g, array_ptr_ptr, array_type, array_ptr_type);
36753685 if (array_type->id == ZigTypeIdPointer) {
36763686 assert(array_type->data.pointer.child_type->id == ZigTypeIdArray);
36773687 array_type = array_type->data.pointer.child_type;
......@@ -3711,12 +3721,14 @@ static LLVMValueRef ir_render_elem_ptr(CodeGen *g, IrExecutable *executable, IrI
37113721 };
37123722 return LLVMBuildInBoundsGEP(g->builder, array_ptr, indices, 2, "");
37133723 } else if (array_type->id == ZigTypeIdPointer) {
3724 LLVMValueRef array_ptr = get_handle_value(g, array_ptr_ptr, array_type, array_ptr_type);
37143725 assert(LLVMGetTypeKind(LLVMTypeOf(array_ptr)) == LLVMPointerTypeKind);
37153726 LLVMValueRef indices[] = {
37163727 subscript_value
37173728 };
37183729 return LLVMBuildInBoundsGEP(g->builder, array_ptr, indices, 1, "");
37193730 } else if (array_type->id == ZigTypeIdStruct) {
3731 LLVMValueRef array_ptr = get_handle_value(g, array_ptr_ptr, array_type, array_ptr_type);
37203732 assert(array_type->data.structure.is_slice);
37213733
37223734 ZigType *ptr_type = instruction->base.value.type;
test/stage1/behavior/vector.zig+23
......@@ -176,3 +176,26 @@ test "load vector elements via comptime index" {
176176 S.doTheTest();
177177 comptime S.doTheTest();
178178}
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}