mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Add exact and overflow builtins.
This commit is contained in:
committed by
Christoffer Lerno
parent
d9ea953b5c
commit
98ae13c03d
24
test/test_suite/builtins/exacts.c3t
Normal file
24
test/test_suite/builtins/exacts.c3t
Normal file
@@ -0,0 +1,24 @@
|
||||
// #target: macos-x64
|
||||
module test;
|
||||
import std::io;
|
||||
fn void main()
|
||||
{
|
||||
ichar x = 23;
|
||||
ichar y = 121;
|
||||
int z1 = $$mul(x, y);
|
||||
ichar z2 = $$div(y, x);
|
||||
ichar z3 = $$mod(y, x);
|
||||
int z4 = $$add(x, y);
|
||||
int z5 = $$sub(x, y);
|
||||
int z6 = $$neg(x);
|
||||
io::printfln("%s %s %s %s %s %s", z1, z2, z3, z4, z5, z6);
|
||||
}
|
||||
|
||||
/* #expect: test.ll
|
||||
|
||||
%emul = mul i8 %0, %1
|
||||
%esdiv = sdiv i8 %2, %3
|
||||
%eumod = srem i8 %4, %5
|
||||
%eadd = add i8 %6, %7
|
||||
%esub = sub i8 %8, %9
|
||||
%eneg = sub i8 0, %10
|
||||
66
test/test_suite/builtins/overflows.c3t
Normal file
66
test/test_suite/builtins/overflows.c3t
Normal file
@@ -0,0 +1,66 @@
|
||||
module test;
|
||||
import std::io;
|
||||
fn void main()
|
||||
{
|
||||
ichar x = 23;
|
||||
ichar y = 121;
|
||||
ichar z1;
|
||||
ichar z2;
|
||||
ichar z3;
|
||||
ichar z4;
|
||||
ichar z5;
|
||||
bool success1 = $$overflow_mul(x, y, &z1);
|
||||
bool success2 = $$overflow_add(x, y, &z2);
|
||||
bool success3 = $$overflow_add(x, x, &z3);
|
||||
bool success4 = $$overflow_sub($$neg(y), y, &z4);
|
||||
bool success5 = $$overflow_sub(x, y, &z5);
|
||||
io::printfln("%s %s", success1, z1);
|
||||
io::printfln("%s %s", success2, z2);
|
||||
io::printfln("%s %s", success3, z3);
|
||||
io::printfln("%s %s", success4, z4);
|
||||
io::printfln("%s %s", success5, z5);
|
||||
}
|
||||
|
||||
/* #expect: test.ll
|
||||
|
||||
%0 = load i8, i8* %x, align 1
|
||||
%1 = load i8, i8* %y, align 1
|
||||
%2 = call { i8, i1 } @llvm.smul.with.overflow.i8(i8 %0, i8 %1)
|
||||
%3 = extractvalue { i8, i1 } %2, 1
|
||||
%4 = extractvalue { i8, i1 } %2, 0
|
||||
store i8 %4, i8* %z1, align 1
|
||||
%5 = zext i1 %3 to i8
|
||||
store i8 %5, i8* %success1, align 1
|
||||
%6 = load i8, i8* %x, align 1
|
||||
%7 = load i8, i8* %y, align 1
|
||||
%8 = call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %6, i8 %7)
|
||||
%9 = extractvalue { i8, i1 } %8, 1
|
||||
%10 = extractvalue { i8, i1 } %8, 0
|
||||
store i8 %10, i8* %z2, align 1
|
||||
%11 = zext i1 %9 to i8
|
||||
store i8 %11, i8* %success2, align 1
|
||||
%12 = load i8, i8* %x, align 1
|
||||
%13 = load i8, i8* %x, align 1
|
||||
%14 = call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %12, i8 %13)
|
||||
%15 = extractvalue { i8, i1 } %14, 1
|
||||
%16 = extractvalue { i8, i1 } %14, 0
|
||||
store i8 %16, i8* %z3, align 1
|
||||
%17 = zext i1 %15 to i8
|
||||
store i8 %17, i8* %success3, align 1
|
||||
%18 = load i8, i8* %y, align 1
|
||||
%eneg = sub i8 0, %18
|
||||
%19 = load i8, i8* %y, align 1
|
||||
%20 = call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %eneg, i8 %19)
|
||||
%21 = extractvalue { i8, i1 } %20, 1
|
||||
%22 = extractvalue { i8, i1 } %20, 0
|
||||
store i8 %22, i8* %z4, align 1
|
||||
%23 = zext i1 %21 to i8
|
||||
store i8 %23, i8* %success4, align 1
|
||||
%24 = load i8, i8* %x, align 1
|
||||
%25 = load i8, i8* %y, align 1
|
||||
%26 = call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %24, i8 %25)
|
||||
%27 = extractvalue { i8, i1 } %26, 1
|
||||
%28 = extractvalue { i8, i1 } %26, 0
|
||||
store i8 %28, i8* %z5, align 1
|
||||
%29 = zext i1 %27 to i8
|
||||
store i8 %29, i8* %success5, align 1
|
||||
24
test/test_suite2/builtins/exacts.c3t
Normal file
24
test/test_suite2/builtins/exacts.c3t
Normal file
@@ -0,0 +1,24 @@
|
||||
// #target: macos-x64
|
||||
module test;
|
||||
import std::io;
|
||||
fn void main()
|
||||
{
|
||||
ichar x = 23;
|
||||
ichar y = 121;
|
||||
int z1 = $$mul(x, y);
|
||||
ichar z2 = $$div(y, x);
|
||||
ichar z3 = $$mod(y, x);
|
||||
int z4 = $$add(x, y);
|
||||
int z5 = $$sub(x, y);
|
||||
int z6 = $$neg(x);
|
||||
io::printfln("%s %s %s %s %s %s", z1, z2, z3, z4, z5, z6);
|
||||
}
|
||||
|
||||
/* #expect: test.ll
|
||||
|
||||
%emul = mul i8 %0, %1
|
||||
%esdiv = sdiv i8 %2, %3
|
||||
%eumod = srem i8 %4, %5
|
||||
%eadd = add i8 %6, %7
|
||||
%esub = sub i8 %8, %9
|
||||
%eneg = sub i8 0, %10
|
||||
66
test/test_suite2/builtins/overflows.c3t
Normal file
66
test/test_suite2/builtins/overflows.c3t
Normal file
@@ -0,0 +1,66 @@
|
||||
module test;
|
||||
import std::io;
|
||||
fn void main()
|
||||
{
|
||||
ichar x = 23;
|
||||
ichar y = 121;
|
||||
ichar z1;
|
||||
ichar z2;
|
||||
ichar z3;
|
||||
ichar z4;
|
||||
ichar z5;
|
||||
bool success1 = $$overflow_mul(x, y, &z1);
|
||||
bool success2 = $$overflow_add(x, y, &z2);
|
||||
bool success3 = $$overflow_add(x, x, &z3);
|
||||
bool success4 = $$overflow_sub($$neg(y), y, &z4);
|
||||
bool success5 = $$overflow_sub(x, y, &z5);
|
||||
io::printfln("%s %s", success1, z1);
|
||||
io::printfln("%s %s", success2, z2);
|
||||
io::printfln("%s %s", success3, z3);
|
||||
io::printfln("%s %s", success4, z4);
|
||||
io::printfln("%s %s", success5, z5);
|
||||
}
|
||||
|
||||
/* #expect: test.ll
|
||||
|
||||
%0 = load i8, ptr %x, align 1
|
||||
%1 = load i8, ptr %y, align 1
|
||||
%2 = call { i8, i1 } @llvm.smul.with.overflow.i8(i8 %0, i8 %1)
|
||||
%3 = extractvalue { i8, i1 } %2, 1
|
||||
%4 = extractvalue { i8, i1 } %2, 0
|
||||
store i8 %4, ptr %z1, align 1
|
||||
%5 = zext i1 %3 to i8
|
||||
store i8 %5, ptr %success1, align 1
|
||||
%6 = load i8, ptr %x, align 1
|
||||
%7 = load i8, ptr %y, align 1
|
||||
%8 = call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %6, i8 %7)
|
||||
%9 = extractvalue { i8, i1 } %8, 1
|
||||
%10 = extractvalue { i8, i1 } %8, 0
|
||||
store i8 %10, ptr %z2, align 1
|
||||
%11 = zext i1 %9 to i8
|
||||
store i8 %11, ptr %success2, align 1
|
||||
%12 = load i8, ptr %x, align 1
|
||||
%13 = load i8, ptr %x, align 1
|
||||
%14 = call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %12, i8 %13)
|
||||
%15 = extractvalue { i8, i1 } %14, 1
|
||||
%16 = extractvalue { i8, i1 } %14, 0
|
||||
store i8 %16, ptr %z3, align 1
|
||||
%17 = zext i1 %15 to i8
|
||||
store i8 %17, ptr %success3, align 1
|
||||
%18 = load i8, ptr %y, align 1
|
||||
%eneg = sub i8 0, %18
|
||||
%19 = load i8, ptr %y, align 1
|
||||
%20 = call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %eneg, i8 %19)
|
||||
%21 = extractvalue { i8, i1 } %20, 1
|
||||
%22 = extractvalue { i8, i1 } %20, 0
|
||||
store i8 %22, ptr %z4, align 1
|
||||
%23 = zext i1 %21 to i8
|
||||
store i8 %23, ptr %success4, align 1
|
||||
%24 = load i8, ptr %x, align 1
|
||||
%25 = load i8, ptr %y, align 1
|
||||
%26 = call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %24, i8 %25)
|
||||
%27 = extractvalue { i8, i1 } %26, 1
|
||||
%28 = extractvalue { i8, i1 } %26, 0
|
||||
store i8 %28, ptr %z5, align 1
|
||||
%29 = zext i1 %27 to i8
|
||||
store i8 %29, ptr %success5, align 1
|
||||
Reference in New Issue
Block a user