Skip to content

Commit dd41b7b

Browse files
committed
---
yaml --- r: 1506 b: refs/heads/master c: b4a85c7 h: refs/heads/master v: v3
1 parent b94f6e7 commit dd41b7b

File tree

2 files changed

+81
-31
lines changed

2 files changed

+81
-31
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 04a0a6fbef0cc7c3c89fbbbeff68ab2c999d9592
2+
refs/heads/master: b4a85c7b583b75eade31d698ad9862f5f98e8857

trunk/src/comp/middle/trans.rs

Lines changed: 80 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1770,6 +1770,81 @@ fn iter_structural_ty_full(@block_ctxt cx,
17701770
ret r;
17711771
}
17721772

1773+
// Iterates through a pair of sequences, until the src* hits the src_lim*.
1774+
fn iter_sequence_pair_inner(@block_ctxt cx,
1775+
ValueRef dst, // elt*
1776+
ValueRef src, // elt*
1777+
ValueRef src_lim, // elt*
1778+
@ty.t elt_ty,
1779+
val_pair_and_ty_fn f) -> result {
1780+
1781+
auto bcx = cx;
1782+
1783+
auto llunit_ty = type_of(cx.fcx.ccx, elt_ty);
1784+
auto unit_sz = size_of(bcx, elt_ty);
1785+
bcx = unit_sz.bcx;
1786+
1787+
let ValueRef src_int = vp2i(bcx, src);
1788+
let ValueRef src_lim_int = vp2i(bcx, src_lim);
1789+
let ValueRef dst_int = vp2i(bcx, dst);
1790+
1791+
auto cond_cx = new_scope_block_ctxt(cx, "sequence-iter cond");
1792+
auto body_cx = new_scope_block_ctxt(cx, "sequence-iter body");
1793+
auto next_cx = new_sub_block_ctxt(cx, "next");
1794+
1795+
bcx.build.Br(cond_cx.llbb);
1796+
1797+
let ValueRef src_curr = cond_cx.build.Phi(T_int(),
1798+
vec(src_int), vec(bcx.llbb));
1799+
let ValueRef dst_curr = cond_cx.build.Phi(T_int(),
1800+
vec(dst_int), vec(bcx.llbb));
1801+
1802+
auto end_test = cond_cx.build.ICmp(lib.llvm.LLVMIntNE,
1803+
src_curr, src_lim_int);
1804+
1805+
cond_cx.build.CondBr(end_test, body_cx.llbb, next_cx.llbb);
1806+
1807+
auto src_curr_ptr = vi2p(body_cx, src_curr, T_ptr(llunit_ty));
1808+
auto dst_curr_ptr = vi2p(body_cx, dst_curr, T_ptr(llunit_ty));
1809+
1810+
auto body_res = f(body_cx,
1811+
dst_curr_ptr,
1812+
load_scalar_or_boxed(body_cx, src_curr_ptr, elt_ty),
1813+
elt_ty);
1814+
body_cx = body_res.bcx;
1815+
1816+
auto src_next = body_cx.build.Add(src_curr, unit_sz.val);
1817+
auto dst_next = body_cx.build.Add(dst_curr, unit_sz.val);
1818+
body_cx.build.Br(cond_cx.llbb);
1819+
1820+
cond_cx.build.AddIncomingToPhi(src_curr, vec(src_next),
1821+
vec(body_cx.llbb));
1822+
1823+
cond_cx.build.AddIncomingToPhi(dst_curr, vec(dst_next),
1824+
vec(body_cx.llbb));
1825+
1826+
ret res(next_cx, C_nil());
1827+
}
1828+
1829+
1830+
fn iter_sequence_inner(@block_ctxt cx,
1831+
ValueRef src, // elt*
1832+
ValueRef src_lim, // elt*
1833+
@ty.t elt_ty,
1834+
val_and_ty_fn f) -> result {
1835+
fn adaptor_fn(val_and_ty_fn f,
1836+
@block_ctxt cx,
1837+
ValueRef av,
1838+
ValueRef bv,
1839+
@ty.t t) -> result {
1840+
ret f(cx, bv, t);
1841+
}
1842+
1843+
be iter_sequence_pair_inner(cx, src, src, src_lim, elt_ty,
1844+
bind adaptor_fn(f, _, _, _, _));
1845+
}
1846+
1847+
17731848
// Iterates through the elements of a vec or str.
17741849
fn iter_sequence(@block_ctxt cx,
17751850
ValueRef v,
@@ -1789,43 +1864,18 @@ fn iter_sequence(@block_ctxt cx,
17891864

17901865
auto llunit_ty = type_of(cx.fcx.ccx, elt_ty);
17911866
auto bcx = cx;
1792-
auto unit_sz = size_of(bcx, elt_ty);
1793-
bcx = unit_sz.bcx;
17941867

17951868
auto len = bcx.build.Load(lenptr);
17961869
if (trailing_null) {
1870+
auto unit_sz = size_of(bcx, elt_ty);
1871+
bcx = unit_sz.bcx;
17971872
len = bcx.build.Sub(len, unit_sz.val);
17981873
}
17991874

1800-
auto cond_cx = new_scope_block_ctxt(cx, "sequence-iter cond");
1801-
auto body_cx = new_scope_block_ctxt(cx, "sequence-iter body");
1802-
auto next_cx = new_sub_block_ctxt(cx, "next");
1803-
1804-
bcx.build.Br(cond_cx.llbb);
1805-
1806-
auto ix = cond_cx.build.Phi(T_int(), vec(C_int(0)), vec(cx.llbb));
1807-
auto scaled_ix = cond_cx.build.Phi(T_int(),
1808-
vec(C_int(0)), vec(cx.llbb));
1809-
1810-
auto end_test = cond_cx.build.ICmp(lib.llvm.LLVMIntNE,
1811-
scaled_ix, len);
1812-
cond_cx.build.CondBr(end_test, body_cx.llbb, next_cx.llbb);
1875+
auto p1 = vi2p(bcx, bcx.build.Add(vp2i(bcx, p0), len),
1876+
T_ptr(llunit_ty));
18131877

1814-
auto elt = body_cx.build.GEP(p0, vec(C_int(0), ix));
1815-
auto body_res = f(body_cx,
1816-
load_scalar_or_boxed(body_cx, elt, elt_ty),
1817-
elt_ty);
1818-
auto next_ix = body_res.bcx.build.Add(ix, C_int(1));
1819-
auto next_scaled_ix = body_res.bcx.build.Add(scaled_ix, unit_sz.val);
1820-
1821-
cond_cx.build.AddIncomingToPhi(ix, vec(next_ix),
1822-
vec(body_res.bcx.llbb));
1823-
1824-
cond_cx.build.AddIncomingToPhi(scaled_ix, vec(next_scaled_ix),
1825-
vec(body_res.bcx.llbb));
1826-
1827-
body_res.bcx.build.Br(cond_cx.llbb);
1828-
ret res(next_cx, C_nil());
1878+
ret iter_sequence_inner(cx, p0, p1, elt_ty, f);
18291879
}
18301880

18311881
alt (t.struct) {

0 commit comments

Comments
 (0)