@@ -1838,6 +1838,24 @@ fn trans_unary(@block_ctxt cx, ast.unop op,
1838
1838
fail;
1839
1839
}
1840
1840
1841
+ // FIXME: implement proper structural comparison.
1842
+
1843
+ fn trans_compare( @block_ctxt cx, ast. binop op,
1844
+ ValueRef lhs, ValueRef rhs) -> ValueRef {
1845
+ auto cmp = lib. llvm. LLVMIntEQ ;
1846
+ alt ( op) {
1847
+ case ( ast. eq) { cmp = lib. llvm. LLVMIntEQ ; }
1848
+ case ( ast. ne) { cmp = lib. llvm. LLVMIntNE ; }
1849
+
1850
+ // FIXME (issue #57): switch by signedness.
1851
+ case ( ast. lt) { cmp = lib. llvm. LLVMIntSLT ; }
1852
+ case ( ast. le) { cmp = lib. llvm. LLVMIntSLE ; }
1853
+ case ( ast. ge) { cmp = lib. llvm. LLVMIntSGE ; }
1854
+ case ( ast. gt) { cmp = lib. llvm. LLVMIntSGT ; }
1855
+ }
1856
+ ret cx. build. ICmp ( cmp, lhs, rhs) ;
1857
+ }
1858
+
1841
1859
fn trans_eager_binop( @block_ctxt cx, ast. binop op,
1842
1860
ValueRef lhs, ValueRef rhs) -> ValueRef {
1843
1861
@@ -1857,18 +1875,7 @@ fn trans_eager_binop(@block_ctxt cx, ast.binop op,
1857
1875
case ( ast. lsr) { ret cx. build. LShr ( lhs, rhs) ; }
1858
1876
case ( ast. asr) { ret cx. build. AShr ( lhs, rhs) ; }
1859
1877
case ( _) {
1860
- auto cmp = lib. llvm. LLVMIntEQ ;
1861
- alt ( op) {
1862
- case ( ast. eq) { cmp = lib. llvm. LLVMIntEQ ; }
1863
- case ( ast. ne) { cmp = lib. llvm. LLVMIntNE ; }
1864
-
1865
- // FIXME (issue #57): switch by signedness.
1866
- case ( ast. lt) { cmp = lib. llvm. LLVMIntSLT ; }
1867
- case ( ast. le) { cmp = lib. llvm. LLVMIntSLE ; }
1868
- case ( ast. ge) { cmp = lib. llvm. LLVMIntSGE ; }
1869
- case ( ast. gt) { cmp = lib. llvm. LLVMIntSGT ; }
1870
- }
1871
- ret cx. build. ICmp ( cmp, lhs, rhs) ;
1878
+ ret trans_compare( cx, op, lhs, rhs) ;
1872
1879
}
1873
1880
}
1874
1881
fail;
@@ -2132,6 +2139,16 @@ fn trans_pat_match(@block_ctxt cx, @ast.pat pat, ValueRef llval,
2132
2139
alt ( pat. node) {
2133
2140
case ( ast. pat_wild( _) ) { ret res( cx, llval) ; }
2134
2141
case ( ast. pat_bind( _, _, _) ) { ret res( cx, llval) ; }
2142
+
2143
+ case ( ast. pat_lit( ?lt, ?ann) ) {
2144
+ auto lllit = trans_lit( cx. fcx. ccx, * lt, ann) ;
2145
+ auto lleq = trans_compare( cx, ast. eq, llval, lllit) ;
2146
+
2147
+ auto matched_cx = new_sub_block_ctxt( cx, "matched_cx" ) ;
2148
+ cx. build. CondBr ( lleq, matched_cx. llbb, next_cx. llbb) ;
2149
+ ret res( matched_cx, llval) ;
2150
+ }
2151
+
2135
2152
case ( ast. pat_tag( ?id, ?subpats, ?vdef_opt, ?ann) ) {
2136
2153
auto lltagptr = cx. build. GEP ( llval, vec( C_int ( 0 ) , C_int ( 0 ) ) ) ;
2137
2154
auto lltag = cx. build. Load ( lltagptr) ;
@@ -2184,6 +2201,7 @@ fn trans_pat_binding(@block_ctxt cx, @ast.pat pat, ValueRef llval)
2184
2201
-> result {
2185
2202
alt ( pat. node) {
2186
2203
case ( ast. pat_wild( _) ) { ret res( cx, llval) ; }
2204
+ case ( ast. pat_lit( _, _) ) { ret res( cx, llval) ; }
2187
2205
case ( ast. pat_bind( ?id, ?def_id, ?ann) ) {
2188
2206
auto ty = node_ann_type( cx. fcx. ccx, ann) ;
2189
2207
auto llty = type_of( cx. fcx. ccx, ty) ;
0 commit comments