Fork of daniellemaywood.uk/gleam — Wasm codegen work
2

Configure Feed

Select the types of activity you want to include in your feed.

Add floats and more binary operations

author
Danielle Maywood
committer
nandi
date (Jul 26, 2026, 12:11 PM -0700) commit 46c18ca2 parent 5e69ae7b change-id zzvszmtv
+299 -36
+173 -36
compiler-core/src/cranelift/mir.rs
··· 58 58 value: BigInt, 59 59 }, 60 60 61 + Float { 62 + value: EcoString, 63 + }, 64 + 61 65 Equals { 62 66 lhs: Box<Expression>, 63 67 rhs: Box<Expression>, ··· 69 73 }, 70 74 71 75 IntSub { 76 + lhs: Box<Expression>, 77 + rhs: Box<Expression>, 78 + }, 79 + 80 + IntMul { 81 + lhs: Box<Expression>, 82 + rhs: Box<Expression>, 83 + }, 84 + 85 + IntDiv { 86 + lhs: Box<Expression>, 87 + rhs: Box<Expression>, 88 + }, 89 + 90 + FloatAdd { 91 + lhs: Box<Expression>, 92 + rhs: Box<Expression>, 93 + }, 94 + 95 + FloatSub { 96 + lhs: Box<Expression>, 97 + rhs: Box<Expression>, 98 + }, 99 + 100 + FloatMul { 101 + lhs: Box<Expression>, 102 + rhs: Box<Expression>, 103 + }, 104 + 105 + FloatDiv { 72 106 lhs: Box<Expression>, 73 107 rhs: Box<Expression>, 74 108 }, ··· 182 216 Expression::Var { .. } 183 217 | Expression::FunctionRef { .. } 184 218 | Expression::Int { .. } 219 + | Expression::Float { .. } 185 220 | Expression::Equals { .. } 186 221 | Expression::IntAdd { .. } 187 222 | Expression::IntSub { .. } 223 + | Expression::IntMul { .. } 224 + | Expression::IntDiv { .. } 225 + | Expression::FloatAdd { .. } 226 + | Expression::FloatSub { .. } 227 + | Expression::FloatMul { .. } 228 + | Expression::FloatDiv { .. } 188 229 | Expression::Set { .. } 189 230 | Expression::If { .. } 190 231 | Expression::Call { .. } => block.push(expression), ··· 199 240 Expression::FunctionRef { module, name } => Expression::FunctionRef { module, name }, 200 241 Expression::Var(var) => Expression::Var(var), 201 242 Expression::Int { value } => Expression::Int { value }, 243 + Expression::Float { value } => Expression::Float { value }, 202 244 Expression::Equals { lhs, rhs } => Expression::Equals { 203 245 lhs: Box::new(Self::flatten_expression(*lhs)), 204 246 rhs: Box::new(Self::flatten_expression(*rhs)), ··· 211 253 lhs: Box::new(Self::flatten_expression(*lhs)), 212 254 rhs: Box::new(Self::flatten_expression(*rhs)), 213 255 }, 256 + Expression::IntMul { lhs, rhs } => Expression::IntMul { 257 + lhs: Box::new(Self::flatten_expression(*lhs)), 258 + rhs: Box::new(Self::flatten_expression(*rhs)), 259 + }, 260 + Expression::IntDiv { lhs, rhs } => Expression::IntDiv { 261 + lhs: Box::new(Self::flatten_expression(*lhs)), 262 + rhs: Box::new(Self::flatten_expression(*rhs)), 263 + }, 264 + Expression::FloatAdd { lhs, rhs } => Expression::FloatAdd { 265 + lhs: Box::new(Self::flatten_expression(*lhs)), 266 + rhs: Box::new(Self::flatten_expression(*rhs)), 267 + }, 268 + Expression::FloatSub { lhs, rhs } => Expression::FloatSub { 269 + lhs: Box::new(Self::flatten_expression(*lhs)), 270 + rhs: Box::new(Self::flatten_expression(*rhs)), 271 + }, 272 + Expression::FloatMul { lhs, rhs } => Expression::FloatMul { 273 + lhs: Box::new(Self::flatten_expression(*lhs)), 274 + rhs: Box::new(Self::flatten_expression(*rhs)), 275 + }, 276 + Expression::FloatDiv { lhs, rhs } => Expression::FloatDiv { 277 + lhs: Box::new(Self::flatten_expression(*lhs)), 278 + rhs: Box::new(Self::flatten_expression(*rhs)), 279 + }, 214 280 Expression::Set { name, value } => Expression::Set { 215 281 name, 216 282 value: Box::new(Self::flatten_expression(*value)), ··· 245 311 | Expression::FunctionRef { .. } 246 312 | Expression::Var { .. } 247 313 | Expression::Int { .. } 314 + | Expression::Float { .. } 248 315 | Expression::Equals { .. } 249 316 | Expression::IntAdd { .. } 250 317 | Expression::IntSub { .. } 318 + | Expression::IntMul { .. } 319 + | Expression::IntDiv { .. } 320 + | Expression::FloatAdd { .. } 321 + | Expression::FloatSub { .. } 322 + | Expression::FloatMul { .. } 323 + | Expression::FloatDiv { .. } 251 324 | Expression::Set { .. } 252 325 | Expression::If { .. } 253 326 | Expression::Call { .. } => block.push(expression), ··· 262 335 Expression::FunctionRef { module, name } => Expression::FunctionRef { module, name }, 263 336 Expression::Var(var) => Expression::Var(var), 264 337 Expression::Int { value } => Expression::Int { value }, 338 + Expression::Float { value } => Expression::Float { value }, 265 339 Expression::Equals { lhs, rhs } => Expression::Equals { 266 340 lhs: Box::new(Self::remove_unused_code(*lhs)), 267 341 rhs: Box::new(Self::remove_unused_code(*rhs)), ··· 274 348 lhs: Box::new(Self::remove_unused_code(*lhs)), 275 349 rhs: Box::new(Self::remove_unused_code(*rhs)), 276 350 }, 351 + Expression::IntMul { lhs, rhs } => Expression::IntMul { 352 + lhs: Box::new(Self::remove_unused_code(*lhs)), 353 + rhs: Box::new(Self::remove_unused_code(*rhs)), 354 + }, 355 + Expression::IntDiv { lhs, rhs } => Expression::IntDiv { 356 + lhs: Box::new(Self::remove_unused_code(*lhs)), 357 + rhs: Box::new(Self::remove_unused_code(*rhs)), 358 + }, 359 + Expression::FloatAdd { lhs, rhs } => Expression::FloatAdd { 360 + lhs: Box::new(Self::remove_unused_code(*lhs)), 361 + rhs: Box::new(Self::remove_unused_code(*rhs)), 362 + }, 363 + Expression::FloatSub { lhs, rhs } => Expression::FloatSub { 364 + lhs: Box::new(Self::remove_unused_code(*lhs)), 365 + rhs: Box::new(Self::remove_unused_code(*rhs)), 366 + }, 367 + Expression::FloatMul { lhs, rhs } => Expression::FloatMul { 368 + lhs: Box::new(Self::remove_unused_code(*lhs)), 369 + rhs: Box::new(Self::remove_unused_code(*rhs)), 370 + }, 371 + Expression::FloatDiv { lhs, rhs } => Expression::FloatDiv { 372 + lhs: Box::new(Self::remove_unused_code(*lhs)), 373 + rhs: Box::new(Self::remove_unused_code(*rhs)), 374 + }, 277 375 Expression::Set { name, value } => Expression::Set { 278 376 name, 279 377 value: Box::new(Self::remove_unused_code(*value)), ··· 366 464 ast::TypedExpr::Float { 367 465 location: _, 368 466 type_: _, 369 - value: _, 370 - } => todo!(), 467 + value, 468 + } => Expression::Float { 469 + value: value.clone(), 470 + }, 371 471 ast::TypedExpr::String { 372 472 location: _, 373 473 type_: _, ··· 486 586 ast::BinOp::GtEqFloat => todo!(), 487 587 ast::BinOp::GtFloat => todo!(), 488 588 ast::BinOp::AddInt => Expression::IntAdd { lhs, rhs }, 489 - ast::BinOp::AddFloat => todo!(), 589 + ast::BinOp::AddFloat => Expression::FloatAdd { lhs, rhs }, 490 590 ast::BinOp::SubInt => Expression::IntSub { lhs, rhs }, 491 - ast::BinOp::SubFloat => todo!(), 492 - ast::BinOp::MultInt => todo!(), 493 - ast::BinOp::MultFloat => todo!(), 494 - ast::BinOp::DivInt => todo!(), 495 - ast::BinOp::DivFloat => todo!(), 591 + ast::BinOp::SubFloat => Expression::FloatSub { lhs, rhs }, 592 + ast::BinOp::MultInt => Expression::IntMul { lhs, rhs }, 593 + ast::BinOp::MultFloat => Expression::FloatMul { lhs, rhs }, 594 + ast::BinOp::DivInt => Expression::IntDiv { lhs, rhs }, 595 + ast::BinOp::DivFloat => Expression::FloatDiv { lhs, rhs }, 496 596 ast::BinOp::RemainderInt => todo!(), 497 597 ast::BinOp::Concatenate => todo!(), 498 598 } ··· 784 884 } => todo!(), 785 885 ast::ClauseGuard::AddInt { 786 886 location: _, 787 - left: _, 788 - right: _, 789 - } => todo!(), 887 + left, 888 + right, 889 + } => Expression::IntAdd { 890 + lhs: Box::new(self.translate_guard(left)), 891 + rhs: Box::new(self.translate_guard(right)), 892 + }, 790 893 ast::ClauseGuard::AddFloat { 791 894 location: _, 792 - left: _, 793 - right: _, 794 - } => todo!(), 895 + left, 896 + right, 897 + } => Expression::FloatAdd { 898 + lhs: Box::new(self.translate_guard(left)), 899 + rhs: Box::new(self.translate_guard(right)), 900 + }, 795 901 ast::ClauseGuard::SubInt { 796 902 location: _, 797 - left: _, 798 - right: _, 799 - } => todo!(), 903 + left, 904 + right, 905 + } => Expression::IntSub { 906 + lhs: Box::new(self.translate_guard(left)), 907 + rhs: Box::new(self.translate_guard(right)), 908 + }, 800 909 ast::ClauseGuard::SubFloat { 801 910 location: _, 802 - left: _, 803 - right: _, 804 - } => todo!(), 911 + left, 912 + right, 913 + } => Expression::FloatSub { 914 + lhs: Box::new(self.translate_guard(left)), 915 + rhs: Box::new(self.translate_guard(right)), 916 + }, 805 917 ast::ClauseGuard::MultInt { 806 918 location: _, 807 - left: _, 808 - right: _, 809 - } => todo!(), 919 + left, 920 + right, 921 + } => Expression::IntMul { 922 + lhs: Box::new(self.translate_guard(left)), 923 + rhs: Box::new(self.translate_guard(right)), 924 + }, 810 925 ast::ClauseGuard::MultFloat { 811 926 location: _, 812 - left: _, 813 - right: _, 814 - } => todo!(), 927 + left, 928 + right, 929 + } => Expression::FloatMul { 930 + lhs: Box::new(self.translate_guard(left)), 931 + rhs: Box::new(self.translate_guard(right)), 932 + }, 815 933 ast::ClauseGuard::DivInt { 816 934 location: _, 817 - left: _, 818 - right: _, 819 - } => todo!(), 935 + left, 936 + right, 937 + } => Expression::IntDiv { 938 + lhs: Box::new(self.translate_guard(left)), 939 + rhs: Box::new(self.translate_guard(right)), 940 + }, 820 941 ast::ClauseGuard::DivFloat { 821 942 location: _, 822 - left: _, 823 - right: _, 824 - } => todo!(), 943 + left, 944 + right, 945 + } => Expression::FloatDiv { 946 + lhs: Box::new(self.translate_guard(left)), 947 + rhs: Box::new(self.translate_guard(right)), 948 + }, 825 949 ast::ClauseGuard::RemainderInt { 826 950 location: _, 827 951 left: _, ··· 881 1005 } => Expression::Int { 882 1006 value: int_value.clone(), 883 1007 }, 884 - ast::Constant::Float { 885 - location: _, 886 - value: _, 887 - } => todo!(), 1008 + ast::Constant::Float { location: _, value } => Expression::Float { 1009 + value: value.clone(), 1010 + }, 888 1011 ast::Constant::String { 889 1012 location: _, 890 1013 value: _, ··· 1075 1198 1 -> 1 1076 1199 _ -> fib(n - 1) + fib(n - 2) 1077 1200 } 1201 + }"# 1202 + )); 1203 + 1204 + insta::assert_debug_snapshot!(translate( 1205 + r#"pub fn maths() { 1206 + let _ = 1 + 0 1207 + let _ = 2 - 1 1208 + let _ = 3 * 2 1209 + let _ = 4 / 3 1210 + 1211 + let _ = 1.0 +. 0.0 1212 + let _ = 2.0 -. 1.0 1213 + let _ = 3.0 *. 2.0 1214 + let _ = 4.0 /. 3.0 1078 1215 }"# 1079 1216 )); 1080 1217 }
+126
compiler-core/src/cranelift/snapshots/gleam_core__cranelift__mir__tests__translates_samples-5.snap
··· 1 + --- 2 + source: compiler-core/src/cranelift/mir.rs 3 + expression: "translate(r#\"pub fn maths() {\n let _ = 1 + 0\n let _ = 2 - 1\n let _ = 3 * 2\n let _ = 4 / 3\n\n let _ = 1.0 +. 0.0\n let _ = 2.0 -. 1.0\n let _ = 3.0 *. 2.0\n let _ = 4.0 /. 3.0\n }\"#)" 4 + --- 5 + Module { 6 + functions: [ 7 + Function { 8 + name: "maths", 9 + return_type: Float, 10 + parameters: [], 11 + body: Block( 12 + [ 13 + Set { 14 + name: Var { 15 + name: "_tmp$1", 16 + }, 17 + value: IntAdd { 18 + lhs: Int { 19 + value: 1, 20 + }, 21 + rhs: Int { 22 + value: 0, 23 + }, 24 + }, 25 + }, 26 + Set { 27 + name: Var { 28 + name: "_tmp$2", 29 + }, 30 + value: IntSub { 31 + lhs: Int { 32 + value: 2, 33 + }, 34 + rhs: Int { 35 + value: 1, 36 + }, 37 + }, 38 + }, 39 + Set { 40 + name: Var { 41 + name: "_tmp$3", 42 + }, 43 + value: IntMul { 44 + lhs: Int { 45 + value: 3, 46 + }, 47 + rhs: Int { 48 + value: 2, 49 + }, 50 + }, 51 + }, 52 + Set { 53 + name: Var { 54 + name: "_tmp$4", 55 + }, 56 + value: IntDiv { 57 + lhs: Int { 58 + value: 4, 59 + }, 60 + rhs: Int { 61 + value: 3, 62 + }, 63 + }, 64 + }, 65 + Set { 66 + name: Var { 67 + name: "_tmp$5", 68 + }, 69 + value: FloatAdd { 70 + lhs: Float { 71 + value: "1.0", 72 + }, 73 + rhs: Float { 74 + value: "0.0", 75 + }, 76 + }, 77 + }, 78 + Set { 79 + name: Var { 80 + name: "_tmp$6", 81 + }, 82 + value: FloatSub { 83 + lhs: Float { 84 + value: "2.0", 85 + }, 86 + rhs: Float { 87 + value: "1.0", 88 + }, 89 + }, 90 + }, 91 + Set { 92 + name: Var { 93 + name: "_tmp$7", 94 + }, 95 + value: FloatMul { 96 + lhs: Float { 97 + value: "3.0", 98 + }, 99 + rhs: Float { 100 + value: "2.0", 101 + }, 102 + }, 103 + }, 104 + Set { 105 + name: Var { 106 + name: "_tmp$8", 107 + }, 108 + value: FloatDiv { 109 + lhs: Float { 110 + value: "4.0", 111 + }, 112 + rhs: Float { 113 + value: "3.0", 114 + }, 115 + }, 116 + }, 117 + Var( 118 + Var { 119 + name: "_tmp$8", 120 + }, 121 + ), 122 + ], 123 + ), 124 + }, 125 + ], 126 + }