Skip to content

Commit c7d850d

Browse files
committed
feat(rss): add float math intrinsics
1 parent 2bd48b1 commit c7d850d

6 files changed

Lines changed: 118 additions & 2 deletions

File tree

crates/rsscript/src/reg_vm/mod.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2165,15 +2165,23 @@ enum RegIntrinsic {
21652165
MathCeil,
21662166
MathClamp,
21672167
MathClampFloat,
2168+
MathCos,
2169+
MathExp,
2170+
MathExp2,
21682171
MathFloor,
2172+
MathLog,
2173+
MathLog2,
21692174
MathMax,
21702175
MathMaxFloat,
21712176
MathMin,
21722177
MathMinFloat,
21732178
MathPow,
21742179
MathPowFloat,
21752180
MathRound,
2181+
MathSin,
21762182
MathSqrt,
2183+
MathTanh,
2184+
MathTruncFloat,
21772185
JsonArray,
21782186
JsonArrayBools,
21792187
JsonArrayContainsPrefix,
@@ -4251,15 +4259,23 @@ impl RegLowerer<'_> {
42514259
("Math", "ceil") => RegIntrinsic::MathCeil,
42524260
("Math", "clamp") => RegIntrinsic::MathClamp,
42534261
("Math", "clamp_float") => RegIntrinsic::MathClampFloat,
4262+
("Math", "cos") => RegIntrinsic::MathCos,
4263+
("Math", "exp") => RegIntrinsic::MathExp,
4264+
("Math", "exp2") => RegIntrinsic::MathExp2,
42544265
("Math", "floor") => RegIntrinsic::MathFloor,
4266+
("Math", "log") => RegIntrinsic::MathLog,
4267+
("Math", "log2") => RegIntrinsic::MathLog2,
42554268
("Math", "max") => RegIntrinsic::MathMax,
42564269
("Math", "max_float") => RegIntrinsic::MathMaxFloat,
42574270
("Math", "min") => RegIntrinsic::MathMin,
42584271
("Math", "min_float") => RegIntrinsic::MathMinFloat,
42594272
("Math", "pow") => RegIntrinsic::MathPow,
42604273
("Math", "pow_float") => RegIntrinsic::MathPowFloat,
42614274
("Math", "round") => RegIntrinsic::MathRound,
4275+
("Math", "sin") => RegIntrinsic::MathSin,
42624276
("Math", "sqrt") => RegIntrinsic::MathSqrt,
4277+
("Math", "tanh") => RegIntrinsic::MathTanh,
4278+
("Math", "trunc_float") => RegIntrinsic::MathTruncFloat,
42634279
("Json", "array") => RegIntrinsic::JsonArray,
42644280
("Json", "array_bools") => RegIntrinsic::JsonArrayBools,
42654281
("Json", "array_contains_prefix") => RegIntrinsic::JsonArrayContainsPrefix,
@@ -9970,9 +9986,24 @@ impl RegVm {
99709986
}
99719987
Ok(VmValue::Float(value.clamp(min, max)))
99729988
}
9989+
RegIntrinsic::MathCos => Ok(VmValue::Float(
9990+
expect_float_ref(intrinsic_arg(&self.stack, base, args, 0)?)?.cos(),
9991+
)),
9992+
RegIntrinsic::MathExp => Ok(VmValue::Float(
9993+
expect_float_ref(intrinsic_arg(&self.stack, base, args, 0)?)?.exp(),
9994+
)),
9995+
RegIntrinsic::MathExp2 => Ok(VmValue::Float(
9996+
expect_float_ref(intrinsic_arg(&self.stack, base, args, 0)?)?.exp2(),
9997+
)),
99739998
RegIntrinsic::MathFloor => Ok(VmValue::Int(
99749999
expect_float_ref(intrinsic_arg(&self.stack, base, args, 0)?)?.floor() as i64,
997510000
)),
10001+
RegIntrinsic::MathLog => Ok(VmValue::Float(
10002+
expect_float_ref(intrinsic_arg(&self.stack, base, args, 0)?)?.ln(),
10003+
)),
10004+
RegIntrinsic::MathLog2 => Ok(VmValue::Float(
10005+
expect_float_ref(intrinsic_arg(&self.stack, base, args, 0)?)?.log2(),
10006+
)),
997610007
RegIntrinsic::MathMax => {
997710008
let left = expect_int_ref(intrinsic_arg(&self.stack, base, args, 0)?)?;
997810009
let right = expect_int_ref(intrinsic_arg(&self.stack, base, args, 1)?)?;
@@ -10013,9 +10044,18 @@ impl RegVm {
1001310044
RegIntrinsic::MathRound => Ok(VmValue::Int(
1001410045
expect_float_ref(intrinsic_arg(&self.stack, base, args, 0)?)?.round() as i64,
1001510046
)),
10047+
RegIntrinsic::MathSin => Ok(VmValue::Float(
10048+
expect_float_ref(intrinsic_arg(&self.stack, base, args, 0)?)?.sin(),
10049+
)),
1001610050
RegIntrinsic::MathSqrt => Ok(VmValue::Float(
1001710051
expect_float_ref(intrinsic_arg(&self.stack, base, args, 0)?)?.sqrt(),
1001810052
)),
10053+
RegIntrinsic::MathTanh => Ok(VmValue::Float(
10054+
expect_float_ref(intrinsic_arg(&self.stack, base, args, 0)?)?.tanh(),
10055+
)),
10056+
RegIntrinsic::MathTruncFloat => Ok(VmValue::Float(
10057+
expect_float_ref(intrinsic_arg(&self.stack, base, args, 0)?)?.trunc(),
10058+
)),
1001910059
RegIntrinsic::JsonArray => {
1002010060
let items = expect_string_list_ref(intrinsic_arg(&self.stack, base, args, 0)?)?;
1002110061
Ok(VmValue::string(format!("[{}]", items.join(","))))

crates/rsscript/src/runtime_abi.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1350,15 +1350,23 @@ const RUNTIME_INTRINSICS: &[RuntimeIntrinsic] = &[
13501350
runtime_intrinsic("Math", "ceil", "rsscript_runtime::math_ceil"),
13511351
runtime_intrinsic("Math", "clamp", "rsscript_runtime::math_clamp"),
13521352
runtime_intrinsic("Math", "clamp_float", "rsscript_runtime::math_clamp_float"),
1353+
runtime_intrinsic("Math", "cos", "rsscript_runtime::math_cos"),
1354+
runtime_intrinsic("Math", "exp", "rsscript_runtime::math_exp"),
1355+
runtime_intrinsic("Math", "exp2", "rsscript_runtime::math_exp2"),
13531356
runtime_intrinsic("Math", "floor", "rsscript_runtime::math_floor"),
1357+
runtime_intrinsic("Math", "log", "rsscript_runtime::math_log"),
1358+
runtime_intrinsic("Math", "log2", "rsscript_runtime::math_log2"),
13541359
runtime_intrinsic("Math", "max", "rsscript_runtime::math_max"),
13551360
runtime_intrinsic("Math", "max_float", "rsscript_runtime::math_max_float"),
13561361
runtime_intrinsic("Math", "min", "rsscript_runtime::math_min"),
13571362
runtime_intrinsic("Math", "min_float", "rsscript_runtime::math_min_float"),
13581363
runtime_intrinsic("Math", "pow", "rsscript_runtime::math_pow"),
13591364
runtime_intrinsic("Math", "pow_float", "rsscript_runtime::math_pow_float"),
13601365
runtime_intrinsic("Math", "round", "rsscript_runtime::math_round"),
1366+
runtime_intrinsic("Math", "sin", "rsscript_runtime::math_sin"),
13611367
runtime_intrinsic("Math", "sqrt", "rsscript_runtime::math_sqrt"),
1368+
runtime_intrinsic("Math", "tanh", "rsscript_runtime::math_tanh"),
1369+
runtime_intrinsic("Math", "trunc_float", "rsscript_runtime::math_trunc_float"),
13621370
runtime_intrinsic("String", "after", "rsscript_runtime::string_after"),
13631371
runtime_intrinsic("String", "char_at", "rsscript_runtime::string_char_at"),
13641372
runtime_intrinsic("String", "contains", "rsscript_runtime::string_contains"),

crates/rsscript/src/rust_lower/lowerer.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2745,7 +2745,7 @@ impl<'a> RustLowerer<'a> {
27452745
lower_source_span(span)
27462746
)
27472747
} else {
2748-
format!("&{}", self.lower_expr(value))
2748+
format!("&({})", self.lower_expr(value))
27492749
}
27502750
}
27512751
DataEffect::Mut => {
@@ -3291,7 +3291,7 @@ impl<'a> RustLowerer<'a> {
32913291
// `mut`-param case just below.
32923292
rust_value_ident(name)
32933293
} else {
3294-
format!("&{}", self.lower_expr(value))
3294+
format!("&({})", self.lower_expr(value))
32953295
}
32963296
}
32973297
Expr::Effect {

crates/rsscript/tests/vm.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,10 @@ fn main() -> Unit {
317317
Log.write(message: read String.from_float(value: Math.pow_float(base: 2.0, exponent: 3.0)))
318318
Log.write(message: read String.from_float(value: Math.sqrt(value: 9.0)))
319319
Log.write(message: read Float.to_string(value: read Math.sqrt(value: 16.0)))
320+
Log.write(message: read String.from_float(value: Math.cos(value: 0.0)))
321+
Log.write(message: read String.from_float(value: Math.exp(value: 0.0)))
322+
Log.write(message: read String.from_float(value: Math.log(value: 1.0)))
323+
Log.write(message: read String.from_float(value: Math.tanh(value: 0.0)))
320324
let finite = 1.5
321325
let infinite = 1.0 / 0.0
322326
let nan = 0.0 / 0.0
@@ -371,6 +375,22 @@ fn main() -> Unit {
371375
assert_reg_vm_matches_compiled_backend("reg-vm-math-random-uuid.rss", source, []);
372376
}
373377

378+
#[test]
379+
fn compiled_backend_accepts_inline_read_copy_expression_args() {
380+
let source = r#"
381+
features: local
382+
383+
fn main() -> Unit {
384+
local xs = List.new<Int>()
385+
List.push<Int>(list: mut xs, value: read (0 - 1))
386+
Log.write(message: read String.from_int(value: List.get<Int>(list: read xs, index: 0)))
387+
return Unit
388+
}
389+
"#;
390+
391+
assert_reg_vm_matches_compiled_backend("reg-vm-inline-read-copy-expr.rss", source, []);
392+
}
393+
374394
#[test]
375395
fn reg_vm_runs_common_math_string_char_and_list_helpers_like_backend() {
376396
let source = r#"

crates/runtime/src/math.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,42 @@ pub fn math_pow_float(base: f64, exponent: f64) -> f64 {
4040
base.powf(exponent)
4141
}
4242

43+
pub fn math_exp2(value: f64) -> f64 {
44+
value.exp2()
45+
}
46+
47+
pub fn math_log2(value: f64) -> f64 {
48+
value.log2()
49+
}
50+
51+
pub fn math_sin(value: f64) -> f64 {
52+
value.sin()
53+
}
54+
55+
pub fn math_cos(value: f64) -> f64 {
56+
value.cos()
57+
}
58+
59+
pub fn math_exp(value: f64) -> f64 {
60+
value.exp()
61+
}
62+
63+
pub fn math_log(value: f64) -> f64 {
64+
value.ln()
65+
}
66+
67+
pub fn math_tanh(value: f64) -> f64 {
68+
value.tanh()
69+
}
70+
4371
pub fn math_sqrt(value: f64) -> f64 {
4472
value.sqrt()
4573
}
4674

75+
pub fn math_trunc_float(value: f64) -> f64 {
76+
value.trunc()
77+
}
78+
4779
pub fn math_floor(value: f64) -> i64 {
4880
value.floor() as i64
4981
}

stdlib/math/math.rssi

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,24 @@ pub fn Math.clamp_float(value: Float, min: Float, max: Float) -> Float
1818

1919
pub fn Math.pow_float(base: Float, exponent: Float) -> Float
2020

21+
pub fn Math.exp2(value: Float) -> Float
22+
23+
pub fn Math.log2(value: Float) -> Float
24+
25+
pub fn Math.sin(value: Float) -> Float
26+
27+
pub fn Math.cos(value: Float) -> Float
28+
29+
pub fn Math.exp(value: Float) -> Float
30+
31+
pub fn Math.log(value: Float) -> Float
32+
33+
pub fn Math.tanh(value: Float) -> Float
34+
2135
pub fn Math.sqrt(value: Float) -> Float
2236

37+
pub fn Math.trunc_float(value: Float) -> Float
38+
2339
pub fn Math.floor(value: Float) -> Int
2440

2541
pub fn Math.ceil(value: Float) -> Int

0 commit comments

Comments
 (0)