Browse Source
* riscv64: Implement SIMD `fvpromote_low`/`fvdemote` * riscv64: Implement SIMD `fcvt_from_{u,s}int` * riscv64: Implement SIMD `fcvt_to_{u,s}int_sat` * riscv64: Use `i8_to_imm5` constructorpull/6941/head
Afonso Bordado
1 year ago
committed by
GitHub
17 changed files with 477 additions and 108 deletions
@ -0,0 +1,43 @@ |
|||
test compile precise-output |
|||
set unwind_info=false |
|||
target riscv64 has_v |
|||
|
|||
function %fcvt_from_sint(i32x4) -> f32x4 { |
|||
block0(v0: i32x4): |
|||
v1 = fcvt_from_sint.f32x4 v0 |
|||
return v1 |
|||
} |
|||
|
|||
; VCode: |
|||
; add sp,-16 |
|||
; sd ra,8(sp) |
|||
; sd fp,0(sp) |
|||
; mv fp,sp |
|||
; block0: |
|||
; vle8.v v1,16(fp) #avl=16, #vtype=(e8, m1, ta, ma) |
|||
; vfcvt.f.x.v v4,v1 #avl=4, #vtype=(e32, m1, ta, ma) |
|||
; vse8.v v4,0(a0) #avl=16, #vtype=(e8, m1, ta, ma) |
|||
; ld ra,8(sp) |
|||
; ld fp,0(sp) |
|||
; add sp,+16 |
|||
; ret |
|||
; |
|||
; Disassembled: |
|||
; block0: ; offset 0x0 |
|||
; addi sp, sp, -0x10 |
|||
; sd ra, 8(sp) |
|||
; sd s0, 0(sp) |
|||
; ori s0, sp, 0 |
|||
; block1: ; offset 0x10 |
|||
; .byte 0x57, 0x70, 0x08, 0xcc |
|||
; addi t6, s0, 0x10 |
|||
; .byte 0x87, 0x80, 0x0f, 0x02 |
|||
; .byte 0x57, 0x70, 0x02, 0xcd |
|||
; .byte 0x57, 0x92, 0x11, 0x4a |
|||
; .byte 0x57, 0x70, 0x08, 0xcc |
|||
; .byte 0x27, 0x02, 0x05, 0x02 |
|||
; ld ra, 8(sp) |
|||
; ld s0, 0(sp) |
|||
; addi sp, sp, 0x10 |
|||
; ret |
|||
|
@ -0,0 +1,43 @@ |
|||
test compile precise-output |
|||
set unwind_info=false |
|||
target riscv64 has_v |
|||
|
|||
function %fcvt_from_uint(i32x4) -> f32x4 { |
|||
block0(v0: i32x4): |
|||
v1 = fcvt_from_uint.f32x4 v0 |
|||
return v1 |
|||
} |
|||
|
|||
; VCode: |
|||
; add sp,-16 |
|||
; sd ra,8(sp) |
|||
; sd fp,0(sp) |
|||
; mv fp,sp |
|||
; block0: |
|||
; vle8.v v1,16(fp) #avl=16, #vtype=(e8, m1, ta, ma) |
|||
; vfcvt.f.xu.v v4,v1 #avl=4, #vtype=(e32, m1, ta, ma) |
|||
; vse8.v v4,0(a0) #avl=16, #vtype=(e8, m1, ta, ma) |
|||
; ld ra,8(sp) |
|||
; ld fp,0(sp) |
|||
; add sp,+16 |
|||
; ret |
|||
; |
|||
; Disassembled: |
|||
; block0: ; offset 0x0 |
|||
; addi sp, sp, -0x10 |
|||
; sd ra, 8(sp) |
|||
; sd s0, 0(sp) |
|||
; ori s0, sp, 0 |
|||
; block1: ; offset 0x10 |
|||
; .byte 0x57, 0x70, 0x08, 0xcc |
|||
; addi t6, s0, 0x10 |
|||
; .byte 0x87, 0x80, 0x0f, 0x02 |
|||
; .byte 0x57, 0x70, 0x02, 0xcd |
|||
; .byte 0x57, 0x12, 0x11, 0x4a |
|||
; .byte 0x57, 0x70, 0x08, 0xcc |
|||
; .byte 0x27, 0x02, 0x05, 0x02 |
|||
; ld ra, 8(sp) |
|||
; ld s0, 0(sp) |
|||
; addi sp, sp, 0x10 |
|||
; ret |
|||
|
@ -0,0 +1,47 @@ |
|||
test compile precise-output |
|||
set unwind_info=false |
|||
target riscv64 has_v |
|||
|
|||
function %fcvt_to_sint_sat(f32x4) -> i32x4 { |
|||
block0(v0:f32x4): |
|||
v1 = fcvt_to_sint_sat.i32x4 v0 |
|||
return v1 |
|||
} |
|||
|
|||
; VCode: |
|||
; add sp,-16 |
|||
; sd ra,8(sp) |
|||
; sd fp,0(sp) |
|||
; mv fp,sp |
|||
; block0: |
|||
; vle8.v v1,16(fp) #avl=16, #vtype=(e8, m1, ta, ma) |
|||
; vmfne.vv v0,v1,v1 #avl=4, #vtype=(e32, m1, ta, ma) |
|||
; vfcvt.rtz.x.f.v v6,v1 #avl=4, #vtype=(e32, m1, ta, ma) |
|||
; vmerge.vim v8,v6,0,v0.t #avl=4, #vtype=(e32, m1, ta, ma) |
|||
; vse8.v v8,0(a0) #avl=16, #vtype=(e8, m1, ta, ma) |
|||
; ld ra,8(sp) |
|||
; ld fp,0(sp) |
|||
; add sp,+16 |
|||
; ret |
|||
; |
|||
; Disassembled: |
|||
; block0: ; offset 0x0 |
|||
; addi sp, sp, -0x10 |
|||
; sd ra, 8(sp) |
|||
; sd s0, 0(sp) |
|||
; ori s0, sp, 0 |
|||
; block1: ; offset 0x10 |
|||
; .byte 0x57, 0x70, 0x08, 0xcc |
|||
; addi t6, s0, 0x10 |
|||
; .byte 0x87, 0x80, 0x0f, 0x02 |
|||
; .byte 0x57, 0x70, 0x02, 0xcd |
|||
; .byte 0x57, 0x90, 0x10, 0x72 |
|||
; .byte 0x57, 0x93, 0x13, 0x4a |
|||
; .byte 0x57, 0x34, 0x60, 0x5c |
|||
; .byte 0x57, 0x70, 0x08, 0xcc |
|||
; .byte 0x27, 0x04, 0x05, 0x02 |
|||
; ld ra, 8(sp) |
|||
; ld s0, 0(sp) |
|||
; addi sp, sp, 0x10 |
|||
; ret |
|||
|
@ -0,0 +1,47 @@ |
|||
test compile precise-output |
|||
set unwind_info=false |
|||
target riscv64 has_v |
|||
|
|||
function %fcvt_to_uint_sat(f32x4) -> i32x4 { |
|||
block0(v0:f32x4): |
|||
v1 = fcvt_to_uint_sat.i32x4 v0 |
|||
return v1 |
|||
} |
|||
|
|||
; VCode: |
|||
; add sp,-16 |
|||
; sd ra,8(sp) |
|||
; sd fp,0(sp) |
|||
; mv fp,sp |
|||
; block0: |
|||
; vle8.v v1,16(fp) #avl=16, #vtype=(e8, m1, ta, ma) |
|||
; vmfne.vv v0,v1,v1 #avl=4, #vtype=(e32, m1, ta, ma) |
|||
; vfcvt.rtz.xu.f.v v6,v1 #avl=4, #vtype=(e32, m1, ta, ma) |
|||
; vmerge.vim v8,v6,0,v0.t #avl=4, #vtype=(e32, m1, ta, ma) |
|||
; vse8.v v8,0(a0) #avl=16, #vtype=(e8, m1, ta, ma) |
|||
; ld ra,8(sp) |
|||
; ld fp,0(sp) |
|||
; add sp,+16 |
|||
; ret |
|||
; |
|||
; Disassembled: |
|||
; block0: ; offset 0x0 |
|||
; addi sp, sp, -0x10 |
|||
; sd ra, 8(sp) |
|||
; sd s0, 0(sp) |
|||
; ori s0, sp, 0 |
|||
; block1: ; offset 0x10 |
|||
; .byte 0x57, 0x70, 0x08, 0xcc |
|||
; addi t6, s0, 0x10 |
|||
; .byte 0x87, 0x80, 0x0f, 0x02 |
|||
; .byte 0x57, 0x70, 0x02, 0xcd |
|||
; .byte 0x57, 0x90, 0x10, 0x72 |
|||
; .byte 0x57, 0x13, 0x13, 0x4a |
|||
; .byte 0x57, 0x34, 0x60, 0x5c |
|||
; .byte 0x57, 0x70, 0x08, 0xcc |
|||
; .byte 0x27, 0x04, 0x05, 0x02 |
|||
; ld ra, 8(sp) |
|||
; ld s0, 0(sp) |
|||
; addi sp, sp, 0x10 |
|||
; ret |
|||
|
@ -0,0 +1,49 @@ |
|||
test compile precise-output |
|||
set unwind_info=false |
|||
target riscv64 has_v |
|||
|
|||
function %fvdemote(f64x2) -> f32x4 { |
|||
block0(v0: f64x2): |
|||
v1 = fvdemote v0 |
|||
return v1 |
|||
} |
|||
|
|||
; VCode: |
|||
; add sp,-16 |
|||
; sd ra,8(sp) |
|||
; sd fp,0(sp) |
|||
; mv fp,sp |
|||
; block0: |
|||
; vle8.v v1,16(fp) #avl=16, #vtype=(e8, m1, ta, ma) |
|||
; vfncvt.f.f.w v4,v1 #avl=4, #vtype=(e32, mf2, ta, ma) |
|||
; vmv.v.i v0,12 #avl=2, #vtype=(e64, m1, ta, ma) |
|||
; vmerge.vim v8,v4,0,v0.t #avl=4, #vtype=(e32, m1, ta, ma) |
|||
; vse8.v v8,0(a0) #avl=16, #vtype=(e8, m1, ta, ma) |
|||
; ld ra,8(sp) |
|||
; ld fp,0(sp) |
|||
; add sp,+16 |
|||
; ret |
|||
; |
|||
; Disassembled: |
|||
; block0: ; offset 0x0 |
|||
; addi sp, sp, -0x10 |
|||
; sd ra, 8(sp) |
|||
; sd s0, 0(sp) |
|||
; ori s0, sp, 0 |
|||
; block1: ; offset 0x10 |
|||
; .byte 0x57, 0x70, 0x08, 0xcc |
|||
; addi t6, s0, 0x10 |
|||
; .byte 0x87, 0x80, 0x0f, 0x02 |
|||
; .byte 0x57, 0x70, 0x72, 0xcd |
|||
; .byte 0x57, 0x12, 0x1a, 0x4a |
|||
; .byte 0x57, 0x70, 0x81, 0xcd |
|||
; .byte 0x57, 0x30, 0x06, 0x5e |
|||
; .byte 0x57, 0x70, 0x02, 0xcd |
|||
; .byte 0x57, 0x34, 0x40, 0x5c |
|||
; .byte 0x57, 0x70, 0x08, 0xcc |
|||
; .byte 0x27, 0x04, 0x05, 0x02 |
|||
; ld ra, 8(sp) |
|||
; ld s0, 0(sp) |
|||
; addi sp, sp, 0x10 |
|||
; ret |
|||
|
@ -0,0 +1,43 @@ |
|||
test compile precise-output |
|||
set unwind_info=false |
|||
target riscv64 has_v |
|||
|
|||
function %fvpromote_low(f32x4) -> f64x2 { |
|||
block0(v0: f32x4): |
|||
v1 = fvpromote_low v0 |
|||
return v1 |
|||
} |
|||
|
|||
; VCode: |
|||
; add sp,-16 |
|||
; sd ra,8(sp) |
|||
; sd fp,0(sp) |
|||
; mv fp,sp |
|||
; block0: |
|||
; vle8.v v1,16(fp) #avl=16, #vtype=(e8, m1, ta, ma) |
|||
; vfwcvt.f.f.v v4,v1 #avl=2, #vtype=(e32, mf2, ta, ma) |
|||
; vse8.v v4,0(a0) #avl=16, #vtype=(e8, m1, ta, ma) |
|||
; ld ra,8(sp) |
|||
; ld fp,0(sp) |
|||
; add sp,+16 |
|||
; ret |
|||
; |
|||
; Disassembled: |
|||
; block0: ; offset 0x0 |
|||
; addi sp, sp, -0x10 |
|||
; sd ra, 8(sp) |
|||
; sd s0, 0(sp) |
|||
; ori s0, sp, 0 |
|||
; block1: ; offset 0x10 |
|||
; .byte 0x57, 0x70, 0x08, 0xcc |
|||
; addi t6, s0, 0x10 |
|||
; .byte 0x87, 0x80, 0x0f, 0x02 |
|||
; .byte 0x57, 0x70, 0x71, 0xcd |
|||
; .byte 0x57, 0x12, 0x16, 0x4a |
|||
; .byte 0x57, 0x70, 0x08, 0xcc |
|||
; .byte 0x27, 0x02, 0x05, 0x02 |
|||
; ld ra, 8(sp) |
|||
; ld s0, 0(sp) |
|||
; addi sp, sp, 0x10 |
|||
; ret |
|||
|
@ -1,79 +0,0 @@ |
|||
test interpret |
|||
test run |
|||
target aarch64 |
|||
target s390x |
|||
target x86_64 |
|||
target x86_64 sse41 |
|||
target x86_64 sse42 |
|||
target x86_64 sse42 has_avx |
|||
|
|||
function %fcvt_from_sint(i32x4) -> f32x4 { |
|||
block0(v0: i32x4): |
|||
v1 = fcvt_from_sint.f32x4 v0 |
|||
return v1 |
|||
} |
|||
; run: %fcvt_from_sint([-1 0 1 123456789]) == [-0x1.0 0.0 0x1.0 0x75bcd18.0] |
|||
; Note that 123456789 rounds to 123456792.0, an error of 3 |
|||
|
|||
function %fcvt_from_uint(i32x4) -> f32x4 { |
|||
block0(v0: i32x4): |
|||
v1 = fcvt_from_uint.f32x4 v0 |
|||
return v1 |
|||
} |
|||
; run: %fcvt_from_uint([0 0 0 0]) == [0x0.0 0x0.0 0x0.0 0x0.0] |
|||
; run: %fcvt_from_uint([0xFFFFFFFF 0 1 123456789]) == [0x100000000.0 0.0 0x1.0 0x75bcd18.0] |
|||
; Note that 0xFFFFFFFF is decimal 4,294,967,295 and is rounded up 1 to 4,294,967,296 in f32x4. |
|||
|
|||
function %fcvt_to_sint_sat(f32x4) -> i32x4 { |
|||
block0(v0:f32x4): |
|||
v1 = fcvt_to_sint_sat.i32x4 v0 |
|||
return v1 |
|||
} |
|||
; run: %fcvt_to_sint_sat([0x0.0 -0x1.0 0x1.0 0x1.0p100]) == [0 -1 1 0x7FFFFFFF] |
|||
; run: %fcvt_to_sint_sat([-0x8.1 0x0.0 0x0.0 -0x1.0p100]) == [-8 0 0 0x80000000] |
|||
; run: %fcvt_to_sint_sat([+NaN +NaN +NaN +NaN]) == [0 0 0 0] |
|||
|
|||
function %fcvt_to_uint_sat(f32x4) -> i32x4 { |
|||
block0(v0:f32x4): |
|||
v1 = fcvt_to_uint_sat.i32x4 v0 |
|||
return v1 |
|||
} |
|||
; run: %fcvt_to_uint_sat([0x1.0 0x4.2 0x4.6 0x1.0p100]) == [1 4 4 0xFFFFFFFF] |
|||
; run: %fcvt_to_uint_sat([-0x8.1 -0x0.0 0x0.0 -0x1.0p100]) == [0 0 0 0] |
|||
; run: %fcvt_to_uint_sat([0xB2D05E00.0 0.0 0.0 0.0]) == [3000000000 0 0 0] |
|||
; run: %fcvt_to_uint_sat([+NaN +NaN +NaN +NaN]) == [0 0 0 0] |
|||
|
|||
function %fcvt_low_from_sint(i32x4) -> f64x2 { |
|||
block0(v0: i32x4): |
|||
v1 = swiden_low v0 |
|||
v2 = fcvt_from_sint.f64x2 v1 |
|||
return v2 |
|||
} |
|||
; run: %fcvt_low_from_sint([0 1 -1 65535]) == [0x0.0 0x1.0] |
|||
; run: %fcvt_low_from_sint([-1 123456789 0 1]) == [-0x1.0 0x1.d6f3454p26] |
|||
|
|||
function %fvdemote(f64x2) -> f32x4 { |
|||
block0(v0: f64x2): |
|||
v1 = fvdemote v0 |
|||
return v1 |
|||
} |
|||
|
|||
; run: %fvdemote([0x0.0 0x0.0]) == [0x0.0 0x0.0 0x0.0 0x0.0] |
|||
; run: %fvdemote([0x0.1 0x0.2]) == [0x0.1 0x0.2 0x0.0 0x0.0] |
|||
; run: %fvdemote([0x2.1 0x1.2]) == [0x2.1 0x1.2 0x0.0 0x0.0] |
|||
; run: %fvdemote([0x2.1 0x1.2]) == [0x2.1 0x1.2 0x0.0 0x0.0] |
|||
; run: %fvdemote([0x2.1 0x1.2]) == [0x2.1 0x1.2 0x0.0 0x0.0] |
|||
|
|||
|
|||
function %fvpromote_low(f32x4) -> f64x2 { |
|||
block0(v0: f32x4): |
|||
v1 = fvpromote_low v0 |
|||
return v1 |
|||
} |
|||
|
|||
; run: %fvpromote_low([0x0.0 0x0.0 0x0.0 0x0.0]) == [0x0.0 0x0.0] |
|||
; run: %fvpromote_low([0x0.1 0x0.2 0x0.0 0x0.0]) == [0x0.1 0x0.2] |
|||
; run: %fvpromote_low([0x2.1 0x1.2 0x0.0 0x0.0]) == [0x2.1 0x1.2] |
|||
; run: %fvpromote_low([0x0.0 0x0.0 0x2.1 0x1.2]) == [0x0.0 0x0.0] |
|||
; run: %fvpromote_low([0x0.0 0x0.0 0x2.1 0x1.2]) == [0x0.0 0x0.0] |
|||
|
@ -0,0 +1,17 @@ |
|||
test interpret |
|||
test run |
|||
target aarch64 |
|||
target s390x |
|||
target x86_64 |
|||
target x86_64 sse41 |
|||
target x86_64 sse42 |
|||
target x86_64 sse42 has_avx |
|||
target riscv64 has_v |
|||
|
|||
function %fcvt_from_sint(i32x4) -> f32x4 { |
|||
block0(v0: i32x4): |
|||
v1 = fcvt_from_sint.f32x4 v0 |
|||
return v1 |
|||
} |
|||
; run: %fcvt_from_sint([-1 0 1 123456789]) == [-0x1.0 0.0 0x1.0 0x75bcd18.0] |
|||
; Note that 123456789 rounds to 123456792.0, an error of 3 |
@ -0,0 +1,18 @@ |
|||
test interpret |
|||
test run |
|||
target aarch64 |
|||
target s390x |
|||
target x86_64 |
|||
target x86_64 sse41 |
|||
target x86_64 sse42 |
|||
target x86_64 sse42 has_avx |
|||
target riscv64 has_v |
|||
|
|||
function %fcvt_from_uint(i32x4) -> f32x4 { |
|||
block0(v0: i32x4): |
|||
v1 = fcvt_from_uint.f32x4 v0 |
|||
return v1 |
|||
} |
|||
; run: %fcvt_from_uint([0 0 0 0]) == [0x0.0 0x0.0 0x0.0 0x0.0] |
|||
; run: %fcvt_from_uint([0xFFFFFFFF 0 1 123456789]) == [0x100000000.0 0.0 0x1.0 0x75bcd18.0] |
|||
; Note that 0xFFFFFFFF is decimal 4,294,967,295 and is rounded up 1 to 4,294,967,296 in f32x4. |
@ -0,0 +1,18 @@ |
|||
test interpret |
|||
test run |
|||
target aarch64 |
|||
target s390x |
|||
target x86_64 |
|||
target x86_64 sse41 |
|||
target x86_64 sse42 |
|||
target x86_64 sse42 has_avx |
|||
target riscv64 has_v |
|||
|
|||
function %fcvt_to_sint_sat(f32x4) -> i32x4 { |
|||
block0(v0:f32x4): |
|||
v1 = fcvt_to_sint_sat.i32x4 v0 |
|||
return v1 |
|||
} |
|||
; run: %fcvt_to_sint_sat([0x0.0 -0x1.0 0x1.0 0x1.0p100]) == [0 -1 1 0x7FFFFFFF] |
|||
; run: %fcvt_to_sint_sat([-0x8.1 0x0.0 0x0.0 -0x1.0p100]) == [-8 0 0 0x80000000] |
|||
; run: %fcvt_to_sint_sat([+NaN +NaN +NaN +NaN]) == [0 0 0 0] |
@ -0,0 +1,28 @@ |
|||
test interpret |
|||
test run |
|||
target aarch64 |
|||
target s390x |
|||
target x86_64 |
|||
target x86_64 sse41 |
|||
target x86_64 sse42 |
|||
target x86_64 sse42 has_avx |
|||
target riscv64 has_v |
|||
|
|||
function %fcvt_to_uint_sat(f32x4) -> i32x4 { |
|||
block0(v0:f32x4): |
|||
v1 = fcvt_to_uint_sat.i32x4 v0 |
|||
return v1 |
|||
} |
|||
; run: %fcvt_to_uint_sat([0x1.0 0x4.2 0x4.6 0x1.0p100]) == [1 4 4 0xFFFFFFFF] |
|||
; run: %fcvt_to_uint_sat([-0x8.1 -0x0.0 0x0.0 -0x1.0p100]) == [0 0 0 0] |
|||
; run: %fcvt_to_uint_sat([0xB2D05E00.0 0.0 0.0 0.0]) == [3000000000 0 0 0] |
|||
; run: %fcvt_to_uint_sat([+NaN +NaN +NaN +NaN]) == [0 0 0 0] |
|||
|
|||
function %fcvt_low_from_sint(i32x4) -> f64x2 { |
|||
block0(v0: i32x4): |
|||
v1 = swiden_low v0 |
|||
v2 = fcvt_from_sint.f64x2 v1 |
|||
return v2 |
|||
} |
|||
; run: %fcvt_low_from_sint([0 1 -1 65535]) == [0x0.0 0x1.0] |
|||
; run: %fcvt_low_from_sint([-1 123456789 0 1]) == [-0x1.0 0x1.d6f3454p26] |
@ -0,0 +1,22 @@ |
|||
test interpret |
|||
test run |
|||
target aarch64 |
|||
target s390x |
|||
target x86_64 |
|||
target x86_64 sse41 |
|||
target x86_64 sse42 |
|||
target x86_64 sse42 has_avx |
|||
target riscv64 has_v |
|||
|
|||
function %fvdemote(f64x2) -> f32x4 { |
|||
block0(v0: f64x2): |
|||
v1 = fvdemote v0 |
|||
return v1 |
|||
} |
|||
|
|||
; run: %fvdemote([0x0.0 0x0.0]) == [0x0.0 0x0.0 0x0.0 0x0.0] |
|||
; run: %fvdemote([0x0.1 0x0.2]) == [0x0.1 0x0.2 0x0.0 0x0.0] |
|||
; run: %fvdemote([0x2.1 0x1.2]) == [0x2.1 0x1.2 0x0.0 0x0.0] |
|||
; run: %fvdemote([0x2.1 0x1.2]) == [0x2.1 0x1.2 0x0.0 0x0.0] |
|||
; run: %fvdemote([0x2.1 0x1.2]) == [0x2.1 0x1.2 0x0.0 0x0.0] |
|||
|
@ -0,0 +1,21 @@ |
|||
test interpret |
|||
test run |
|||
target aarch64 |
|||
target s390x |
|||
target x86_64 |
|||
target x86_64 sse41 |
|||
target x86_64 sse42 |
|||
target x86_64 sse42 has_avx |
|||
target riscv64 has_v |
|||
|
|||
function %fvpromote_low(f32x4) -> f64x2 { |
|||
block0(v0: f32x4): |
|||
v1 = fvpromote_low v0 |
|||
return v1 |
|||
} |
|||
|
|||
; run: %fvpromote_low([0x0.0 0x0.0 0x0.0 0x0.0]) == [0x0.0 0x0.0] |
|||
; run: %fvpromote_low([0x0.1 0x0.2 0x0.0 0x0.0]) == [0x0.1 0x0.2] |
|||
; run: %fvpromote_low([0x2.1 0x1.2 0x0.0 0x0.0]) == [0x2.1 0x1.2] |
|||
; run: %fvpromote_low([0x0.0 0x0.0 0x2.1 0x1.2]) == [0x0.0 0x0.0] |
|||
; run: %fvpromote_low([0x0.0 0x0.0 0x2.1 0x1.2]) == [0x0.0 0x0.0] |
Loading…
Reference in new issue