blob: 6ef2cc6878a6ec6ef1a19dd9c90486144120e2b6 [file] [log] [blame]
Jim Stichnoth7da431b2014-08-05 11:22:37 -07001//===- subzero/crosstest/test_arith.cpp - Arithmetic operator tests -------===//
2//
3// The Subzero Code Generator
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Implementation for crosstesting arithmetic operations.
11//
12//===----------------------------------------------------------------------===//
13
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070014// This aims to test all the arithmetic bitcode instructions across
15// all PNaCl primitive data types.
16
17#include <stdint.h>
18
19#include "test_arith.h"
John Porto1d235422015-08-12 12:37:53 -070020#include "xdefs.h"
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070021
Matt Walaafeaee42014-08-07 13:47:30 -070022#define X(inst, op, isdiv, isshift) \
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070023 bool test##inst(bool a, bool b) { return a op b; } \
24 uint8_t test##inst(uint8_t a, uint8_t b) { return a op b; } \
25 uint16_t test##inst(uint16_t a, uint16_t b) { return a op b; } \
26 uint32_t test##inst(uint32_t a, uint32_t b) { return a op b; } \
John Porto1d235422015-08-12 12:37:53 -070027 uint64 test##inst(uint64 a, uint64 b) { return a op b; } \
Matt Wala7fa22d82014-07-17 12:41:31 -070028 v4ui32 test##inst(v4ui32 a, v4ui32 b) { return a op b; } \
29 v8ui16 test##inst(v8ui16 a, v8ui16 b) { return a op b; } \
30 v16ui8 test##inst(v16ui8 a, v16ui8 b) { return a op b; }
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070031UINTOP_TABLE
32#undef X
33
Matt Walaafeaee42014-08-07 13:47:30 -070034#define X(inst, op, isdiv, isshift) \
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070035 bool test##inst(bool a, bool b) { return a op b; } \
Jim Stichnoth7da431b2014-08-05 11:22:37 -070036 myint8_t test##inst(myint8_t a, myint8_t b) { return a op b; } \
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070037 int16_t test##inst(int16_t a, int16_t b) { return a op b; } \
38 int32_t test##inst(int32_t a, int32_t b) { return a op b; } \
John Porto1d235422015-08-12 12:37:53 -070039 int64 test##inst(int64 a, int64 b) { return a op b; } \
Matt Wala7fa22d82014-07-17 12:41:31 -070040 v4si32 test##inst(v4si32 a, v4si32 b) { return a op b; } \
41 v8si16 test##inst(v8si16 a, v8si16 b) { return a op b; } \
42 v16si8 test##inst(v16si8 a, v16si8 b) { return a op b; }
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070043SINTOP_TABLE
44#undef X
45
46#define X(inst, op, func) \
47 float test##inst(float a, float b) { return func(a op b); } \
Matt Wala7fa22d82014-07-17 12:41:31 -070048 double test##inst(double a, double b) { return func(a op b); } \
49 v4f32 test##inst(v4f32 a, v4f32 b) { return func(a op b); }
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -070050FPOP_TABLE
51#undef X
John Porto98cc08c2015-11-24 12:30:01 -080052
53#define X(mult_by) \
54 bool testMultiplyBy##mult_by(bool a, bool /*unused*/) { \
55 return a * (mult_by); \
56 } \
57 bool testMultiplyByNeg##mult_by(bool a, bool /*unused*/) { \
58 return a * (-(mult_by)); \
59 } \
60 uint8_t testMultiplyBy##mult_by(uint8_t a, uint8_t /*unused*/) { \
61 return a * (mult_by); \
62 } \
63 uint8_t testMultiplyByNeg##mult_by(uint8_t a, uint8_t /*unused*/) { \
64 return a * (-(mult_by)); \
65 } \
66 uint16_t testMultiplyBy##mult_by(uint16_t a, uint16_t /*unused*/) { \
67 return a * (mult_by); \
68 } \
69 uint16_t testMultiplyByNeg##mult_by(uint16_t a, uint16_t /*unused*/) { \
70 return a * (-(mult_by)); \
71 } \
72 uint32_t testMultiplyBy##mult_by(uint32_t a, uint32_t /*unused*/) { \
73 return a * (mult_by); \
74 } \
75 uint32_t testMultiplyByNeg##mult_by(uint32_t a, uint32_t /*unused*/) { \
76 return a * (-(mult_by)); \
77 } \
78 uint64_t testMultiplyBy##mult_by(uint64_t a, uint64_t /*unused*/) { \
79 return a * (mult_by); \
80 } \
81 uint64_t testMultiplyByNeg##mult_by(uint64_t a, uint64_t /*unused*/) { \
82 return a * (-(mult_by)); \
83 }
84MULIMM_TABLE
85#undef X