Skip to content

Commit dfb3f25

Browse files
committed
more
1 parent 2273306 commit dfb3f25

File tree

3 files changed

+65
-16
lines changed

3 files changed

+65
-16
lines changed

cranelift/codegen/src/isa/x64/lower.isle

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -111,18 +111,18 @@
111111
(let ((x_regs ValueRegs x))
112112
(iadd128 (value_regs_get_gpr x 0) (value_regs_get_gpr x 1)
113113
y (RegMemImm.Imm 0))))
114-
(rule 4 (lower (has_type $I128 (iadd (iadd (uextend a) (uextend b)) (uextend c))))
115-
(let (
116-
(a Gpr (extend_to_gpr a $I64 (ExtendKind.Zero)))
117-
(b Gpr (extend_to_gpr b $I64 (ExtendKind.Zero)))
118-
(c Gpr (extend_to_gpr c $I64 (ExtendKind.Zero)))
119-
(i0 ProducesFlags (x64_alurmi_with_flags_paired (AluRmiROpcode.Add) $I64 a b))
120-
(i0_result Gpr (produces_flags_get_reg i0))
121-
(i1 ConsumesAndProducesFlags (x64_alurmi_with_flags_chained (AluRmiROpcode.Adc) $I64 i0_result c))
122-
(i2 ConsumesFlags (x64_setcc_paired (CC.O)))
123-
(result MultiReg (with_flags_chained i0 i1 i2))
124-
)
125-
(multi_result_to_add3_result result)))
114+
;;(rule 4 (lower (has_type $I128 (iadd (iadd (uextend a) (uextend b)) (uextend c))))
115+
;; (let (
116+
;; (a Gpr (extend_to_gpr a $I64 (ExtendKind.Zero)))
117+
;; (b Gpr (extend_to_gpr b $I64 (ExtendKind.Zero)))
118+
;; (c Gpr (extend_to_gpr c $I64 (ExtendKind.Zero)))
119+
;; (i0 ProducesFlags (x64_alurmi_with_flags_paired (AluRmiROpcode.Add) $I64 a b))
120+
;; (i0_result Gpr (produces_flags_get_reg i0))
121+
;; (i1 ConsumesAndProducesFlags (x64_alurmi_with_flags_chained (AluRmiROpcode.Adc) $I64 i0_result c))
122+
;; (i2 ConsumesFlags (x64_setcc_paired (CC.O)))
123+
;; (result MultiReg (with_flags_chained i0 i1 i2))
124+
;; )
125+
;; (multi_result_to_add3_result result)))
126126

127127
(decl multi_result_to_add3_result (MultiReg) InstOutput)
128128
(rule (multi_result_to_add3_result (MultiReg.Three _add adc setb))

tests/disas/x64-wide-arithmetic.wat

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -170,11 +170,14 @@
170170
;; wasm[0]::function[9]::add3_wide_u:
171171
;; pushq %rbp
172172
;; movq %rsp, %rbp
173-
;; addq %rcx, %rdx
173+
;; movq %rcx, %rsi
174+
;; xorq %rcx, %rcx
175+
;; movq %rsi, %rdi
176+
;; addq %rdi, %rdx
177+
;; adcq $0, %rcx
174178
;; movq %rdx, %rax
175-
;; adcq %r8, %rax
176-
;; seto %r11b
177-
;; movzbq %r11b, %rcx
179+
;; addq %r8, %rax
180+
;; adcq $0, %rcx
178181
;; movq %rbp, %rsp
179182
;; popq %rbp
180183
;; retq

tests/misc_testsuite/wide-arithmetic.wast

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,24 @@
2121
local.get 0
2222
local.get 1
2323
i64.mul_wide_u)
24+
(func (export "i64.add_wide_s") (param i64 i64) (result i64 i64)
25+
local.get 0
26+
local.get 1
27+
i64.add_wide_s)
28+
(func (export "i64.add_wide_u") (param i64 i64) (result i64 i64)
29+
local.get 0
30+
local.get 1
31+
i64.add_wide_u)
32+
(func (export "i64.add3_wide_s") (param i64 i64 i64) (result i64 i64)
33+
local.get 0
34+
local.get 1
35+
local.get 2
36+
i64.add3_wide_s)
37+
(func (export "i64.add3_wide_u") (param i64 i64 i64) (result i64 i64)
38+
local.get 0
39+
local.get 1
40+
local.get 2
41+
i64.add3_wide_u)
2442
)
2543

2644
;; simple addition
@@ -75,6 +93,34 @@
7593
(assert_return (invoke "i64.mul_wide_u" (i64.const -1) (i64.const 1))
7694
(i64.const -1) (i64.const 0))
7795

96+
;; simple add_wide
97+
(assert_return (invoke "i64.add_wide_s" (i64.const 0) (i64.const 0))
98+
(i64.const 0) (i64.const 0))
99+
(assert_return (invoke "i64.add_wide_u" (i64.const 0) (i64.const 0))
100+
(i64.const 0) (i64.const 0))
101+
(assert_return (invoke "i64.add_wide_s" (i64.const 1) (i64.const 2))
102+
(i64.const 3) (i64.const 0))
103+
(assert_return (invoke "i64.add_wide_u" (i64.const 1) (i64.const 2))
104+
(i64.const 3) (i64.const 0))
105+
(assert_return (invoke "i64.add_wide_s" (i64.const -1) (i64.const 2))
106+
(i64.const 1) (i64.const 0))
107+
(assert_return (invoke "i64.add_wide_u" (i64.const -1) (i64.const 2))
108+
(i64.const 1) (i64.const 1))
109+
(assert_return (invoke "i64.add_wide_s" (i64.const 0x7fffffff_ffffffff) (i64.const 2))
110+
(i64.const 0x80000000_00000001) (i64.const 1))
111+
(assert_return (invoke "i64.add_wide_u" (i64.const 0x7fffffff_ffffffff) (i64.const 2))
112+
(i64.const 0x80000000_00000001) (i64.const 0))
113+
114+
;; simple add3_wide
115+
(assert_return (invoke "i64.add3_wide_u" (i64.const 0) (i64.const 0) (i64.const 0))
116+
(i64.const 0) (i64.const 0))
117+
(assert_return (invoke "i64.add3_wide_u" (i64.const 1) (i64.const 2) (i64.const 0))
118+
(i64.const 3) (i64.const 0))
119+
(assert_return (invoke "i64.add3_wide_u" (i64.const -1) (i64.const 2) (i64.const 0))
120+
(i64.const 1) (i64.const 1))
121+
(assert_return (invoke "i64.add3_wide_u" (i64.const 0x7fffffff_ffffffff) (i64.const 2) (i64.const 0))
122+
(i64.const 0x80000000_00000001) (i64.const 0))
123+
78124
;; 20 randomly generated test cases for i64.add128
79125
(assert_return (invoke "i64.add128"
80126
(i64.const -2418420703207364752) (i64.const -1)

0 commit comments

Comments
 (0)